From 5e7071e466f545362bf5bcc297ef49f53a41730f Mon Sep 17 00:00:00 2001 From: ADS Merger Date: Thu, 18 Jun 2020 04:32:54 +0000 Subject: [PATCH] Merge from vscode 4d91d96e5e121b38d33508cdef17868bab255eae --- .eslintrc.json | 10 +- .github/workflows/deep-classifier-monitor.yml | 23 + .github/workflows/deep-classifier-runner.yml | 49 + .github/workflows/deep-classifier-scraper.yml | 27 + .github/workflows/latest-release-monitor.yml | 25 + .../workflows/release-pipeline-labeler.yml | 32 + .github/workflows/rich-navigation.yml | 19 + .vscode/extensions.json | 3 +- .vscode/launch.json | 15 +- .vscode/notebooks/inbox.github-issues | 36 + .vscode/notebooks/my-work.github-issues | 98 + .vscode/searches/es6.code-search | 10 +- .vscode/settings.json | 2 +- .vscode/tasks.json | 2 +- .yarnrc | 2 +- .../darwin/continuous-build-darwin.yml | 10 +- .../win32/continuous-build-win32.yml | 10 +- build/builtin/main.js | 2 +- build/gulpfile.hygiene.js | 1 + build/lib/extensions.js | 118 +- build/lib/extensions.ts | 129 +- build/lib/i18n.js | 293 +- build/lib/util.js | 2 +- build/lib/util.ts | 2 +- build/package.json | 4 +- build/polyfills/vscode-extension-telemetry.js | 26 + build/polyfills/vscode-nls.js | 79 + build/win32/code.iss | 6 +- build/yarn.lock | 16 +- cgmanifest.json | 4 +- .../configuration-editing/.vscodeignore | 1 + .../extension-browser.webpack.config.js | 33 + .../extension.webpack.config.js | 5 +- extensions/configuration-editing/package.json | 3 +- .../schemas/attachContainer.schema.json | 10 + .../schemas/devContainer.schema.json | 24 + ...tension.ts => configurationEditingMain.ts} | 0 extensions/dacpac/src/test/testContext.ts | 3 +- .../extension-editing/src/extensionLinter.ts | 7 +- extensions/git/package.json | 7 +- extensions/git/src/api/git.d.ts | 2 + extensions/git/src/fileSystemProvider.ts | 4 + extensions/git/src/git.ts | 22 +- extensions/git/src/model.ts | 18 +- extensions/git/src/staging.ts | 2 +- extensions/git/yarn.lock | 8 +- .../extension-browser.webpack.config.js | 49 + extensions/github-authentication/package.json | 13 +- .../src/common/keychain.ts | 2 +- .../github-authentication/src/github.ts | 2 +- .../github-authentication/src/githubServer.ts | 101 +- extensions/github-authentication/yarn.lock | 232 +- extensions/github-browser/.gitignore | 3 + extensions/github-browser/.vscodeignore | 11 + extensions/github-browser/README.md | 7 + .../extension-browser.webpack.config.js | 24 + .../extension.webpack.config.js | 17 + extensions/github-browser/package.json | 60 + extensions/github-browser/package.nls.json | 4 + extensions/github-browser/src/extension.ts | 11 + extensions/github-browser/src/githubfs.ts | 496 +++ extensions/github-browser/src/iterables.ts | 28 + .../github-browser/src/typings/ref.d.ts | 8 + extensions/github-browser/tsconfig.json | 13 + extensions/github-browser/yarn.lock | 2975 +++++++++++++++++ extensions/github/src/auth.ts | 2 +- extensions/github/src/extension.ts | 14 +- .../extension-browser.webpack.config.js | 29 + extensions/image-preview/package.json | 10 +- extensions/image-preview/src/extension.ts | 6 +- .../json-language-features/.vscodeignore | 4 +- .../client/src/browser/jsonClientMain.ts | 40 + .../client/src/{jsonMain.ts => jsonClient.ts} | 127 +- .../client/src/node/jsonClientMain.ts | 76 + .../client/src/requests.ts | 68 + .../extension-browser.webpack.config.js | 34 + .../extension.webpack.config.js | 6 +- .../json-language-features/package.json | 5 +- .../extension-browser.webpack.config.js | 35 + .../server/extension.webpack.config.js | 4 +- .../server/package.json | 6 +- .../server/src/browser/jsonServerMain.ts | 16 + .../server/src/jsonServer.ts | 504 +++ .../server/src/jsonServerMain.ts | 532 --- .../server/src/node/jsonServerMain.ts | 55 + .../server/src/requests.ts | 87 + .../json-language-features/server/yarn.lock | 55 +- extensions/json-language-features/yarn.lock | 38 +- .../src/test/mainController.test.ts | 3 +- .../syntaxes/markdown.tmLanguage.json | 74 +- .../markdown-language-features/.vscodeignore | 1 + .../extension-browser.webpack.config.js | 32 + .../markdown-language-features/media/index.js | 3 +- .../media/markdown.css | 4 +- .../markdown-language-features/media/pre.js | 3 +- .../media/preview-right-dark.svg | 4 - .../media/preview-right-light.svg | 4 - .../media/view-source-dark.svg | 3 - .../media/view-source-light.svg | 3 - .../markdown-language-features/package.json | 22 +- .../src/features/preview.ts | 6 +- .../src/features/previewContentProvider.ts | 4 +- .../src/markdownEngine.ts | 12 +- .../src/markdownExtensions.ts | 16 +- .../src/test/engine.ts | 2 +- .../src/util/hash.ts | 58 + .../webpack.config.js | 3 +- .../extension-browser.webpack.config.js | 33 + .../extension.webpack.config.js | 7 +- extensions/merge-conflict/package.json | 3 +- .../merge-conflict/src/commandHandler.ts | 6 +- .../{extension.ts => mergeConflictMain.ts} | 0 .../microsoft-authentication/src/AADHelper.ts | 10 +- extensions/notebook/src/test/common/stubs.ts | 1 + extensions/package.json | 5 +- extensions/postinstall.js | 63 +- .../extension-browser.webpack.config.js | 33 + extensions/python/package.json | 1 + .../schema-compare/src/test/testContext.ts | 3 +- .../src/test/testContext.ts | 3 +- extensions/vscode-web-playground/.gitignore | 3 +- .../vscode-web-playground/.vscodeignore | 9 +- .../extension-browser.webpack.config.js | 19 + .../extension.webpack.config.js | 17 + extensions/vscode-web-playground/package.json | 20 +- .../vscode-web-playground/src/exampleFiles.ts | 304 ++ .../vscode-web-playground/src/extension.ts | 707 +--- extensions/vscode-web-playground/src/memfs.ts | 436 +++ .../vscode-web-playground/tsconfig.json | 9 +- extensions/vscode-web-playground/yarn.lock | 46 +- extensions/yarn.lock | 87 +- package.json | 12 +- remote/package.json | 2 +- remote/yarn.lock | 8 +- resources/linux/bin/code.sh | 6 +- resources/linux/debian/control.template | 2 +- resources/serverless/callback.html | 81 + {scripts => resources/serverless}/code-web.js | 140 +- resources/win32/bin/code.sh | 8 +- scripts/code-cli.bat | 1 - scripts/code.bat | 1 - scripts/test-integration.bat | 27 +- scripts/test-integration.sh | 19 +- src/bootstrap-fork.js | 6 + src/bootstrap-window.js | 7 +- src/bootstrap.js | 29 +- src/main.js | 69 +- src/paths.js | 1 - .../clipboard/browser/clipboardService.ts | 5 - .../modelComponents/diffeditor.component.ts | 4 +- .../workbench/browser/parts/views/treeView.ts | 6 +- .../test/electron-browser/commandLine.test.ts | 2 +- .../contents/webviewContent.component.ts | 2 +- .../webview/webviewWidget.component.ts | 2 +- .../editorReplacerContribution.test.ts | 12 +- .../modelView/browser/webview.component.ts | 2 +- .../notebookEditorModel.test.ts | 4 +- .../query/common/fileQueryEditorInput.ts | 8 +- .../test/browser/queryInputFactory.test.ts | 12 +- .../contrib/webview/browser/webViewDialog.ts | 2 +- .../editor/editorStatusModeSelect.test.ts | 32 +- src/vs/base/browser/markdownRenderer.ts | 20 +- src/vs/base/browser/ui/actionbar/actionbar.ts | 27 +- src/vs/base/browser/ui/aria/aria.ts | 70 +- src/vs/base/browser/ui/button/button.ts | 35 +- src/vs/base/browser/ui/checkbox/checkbox.ts | 6 + .../browser/ui/codicons/codicon/codicon.ttf | Bin 60144 -> 60140 bytes src/vs/base/browser/ui/dialog/dialog.ts | 25 +- src/vs/base/browser/ui/dropdown/dropdown.ts | 16 +- src/vs/base/browser/ui/findinput/findInput.ts | 8 + .../ui/findinput/findInputCheckboxes.ts | 4 + .../base/browser/ui/findinput/replaceInput.ts | 7 + src/vs/base/browser/ui/hover/hover.css | 5 +- .../base/browser/ui/iconLabel/iconlabel.css | 4 + src/vs/base/browser/ui/list/listPaging.ts | 39 +- src/vs/base/browser/ui/list/listView.ts | 60 +- src/vs/base/browser/ui/list/listWidget.ts | 76 +- src/vs/base/browser/ui/menu/menubar.ts | 10 + .../browser/ui/scrollbar/scrollableElement.ts | 8 +- .../browser/ui/selectBox/selectBoxCustom.css | 2 +- .../browser/ui/selectBox/selectBoxCustom.ts | 2 + src/vs/base/browser/ui/splitview/paneview.css | 1 + src/vs/base/browser/ui/toolbar/toolbar.ts | 3 +- src/vs/base/browser/ui/tree/abstractTree.ts | 44 +- src/vs/base/browser/ui/tree/asyncDataTree.ts | 16 +- src/vs/base/common/arrays.ts | 21 +- src/vs/base/common/buffer.ts | 21 +- src/vs/base/common/codicons.ts | 1 + src/vs/base/common/collections.ts | 19 - src/vs/base/common/event.ts | 6 +- src/vs/base/common/extpath.ts | 2 +- src/vs/base/common/keybindingLabels.ts | 4 +- src/vs/base/common/lifecycle.ts | 8 +- src/vs/base/common/map.ts | 36 +- src/vs/base/common/network.ts | 7 + src/vs/base/common/performance.d.ts | 4 +- src/vs/base/common/performance.js | 15 +- src/vs/base/common/resourceTree.ts | 4 +- src/vs/base/common/resources.ts | 110 +- src/vs/base/common/severity.ts | 6 - src/vs/base/common/stream.ts | 181 +- src/vs/base/common/strings.ts | 4 +- src/vs/base/common/types.ts | 7 + src/vs/base/common/uri.ts | 2 +- src/vs/base/node/encoding.ts | 229 +- src/vs/base/node/stream.ts | 112 - .../parts/quickinput/browser/quickInput.ts | 4 +- .../quickinput/browser/quickInputList.ts | 1 - src/vs/base/test/common/arrays.test.ts | 9 + src/vs/base/test/common/lifecycle.test.ts | 15 + src/vs/base/test/common/map.test.ts | 39 +- src/vs/base/test/common/stream.test.ts | 193 +- src/vs/base/test/node/buffer.test.ts | 10 +- .../base/test/node/encoding/encoding.test.ts | 176 +- src/vs/base/test/node/path.test.ts | 16 +- src/vs/code/browser/workbench/callback.html | 2 +- .../issue/issueReporterMain.ts | 5 +- .../issue/media/issueReporter.css | 30 +- .../processExplorer/media/processExplorer.css | 30 +- .../processExplorer/processExplorerMain.ts | 5 +- src/vs/code/electron-browser/proxy/auth.html | 4 +- .../sharedProcess/sharedProcessMain.ts | 21 +- .../electron-browser/workbench/workbench.js | 26 +- src/vs/code/electron-main/app.ts | 47 +- src/vs/code/electron-main/auth.ts | 5 +- src/vs/code/electron-main/main.ts | 5 + src/vs/code/electron-main/sharedProcess.ts | 1 + src/vs/code/electron-main/window.ts | 41 +- src/vs/code/node/cliProcessMain.ts | 16 +- .../editor/browser/controller/coreCommands.ts | 36 +- .../browser/controller/textAreaInput.ts | 6 +- .../browser/core/keybindingCancellation.ts | 4 +- src/vs/editor/browser/editorExtensions.ts | 5 + .../services/abstractCodeEditorService.ts | 26 +- .../browser/services/bulkEditService.ts | 2 +- .../browser/services/codeEditorService.ts | 6 +- .../editor/browser/services/openerService.ts | 2 +- src/vs/editor/browser/widget/diffReview.ts | 2 +- src/vs/editor/common/config/editorOptions.ts | 25 +- .../common/controller/cursorMoveCommands.ts | 27 +- .../common/controller/cursorMoveOperations.ts | 4 +- src/vs/editor/common/editorContextKeys.ts | 2 + src/vs/editor/common/model.ts | 2 +- src/vs/editor/common/model/editStack.ts | 21 +- .../pieceTreeTextBuffer.ts | 26 + src/vs/editor/common/model/textChange.ts | 10 + src/vs/editor/common/model/textModel.ts | 3 +- .../common/services/editorWorkerService.ts | 2 +- .../services/editorWorkerServiceImpl.ts | 2 +- .../services/markerDecorationsServiceImpl.ts | 2 +- .../services/markersDecorationService.ts | 2 +- src/vs/editor/common/services/modeService.ts | 2 +- src/vs/editor/common/services/modelService.ts | 2 +- .../common/services/modelServiceImpl.ts | 58 +- .../editor/common/services/resolverService.ts | 2 +- .../textResourceConfigurationService.ts | 4 +- .../textResourceConfigurationServiceImpl.ts | 8 +- .../common/standalone/standaloneEnums.ts | 60 +- .../editor/contrib/codelens/codeLensCache.ts | 8 +- src/vs/editor/contrib/find/findModel.ts | 12 +- .../editor/contrib/find/findOptionsWidget.ts | 7 +- src/vs/editor/contrib/find/findWidget.ts | 3 +- src/vs/editor/contrib/find/replacePattern.ts | 83 +- .../contrib/find/test/replacePattern.test.ts | 32 + .../editor/contrib/gotoSymbol/goToCommands.ts | 16 +- .../contrib/gotoSymbol/peek/referencesTree.ts | 4 +- .../gotoSymbol/peek/referencesWidget.ts | 45 +- .../contrib/gotoSymbol/symbolNavigation.ts | 6 +- src/vs/editor/contrib/hover/hover.ts | 10 +- src/vs/editor/contrib/hover/hoverWidgets.ts | 9 + .../editor/contrib/hover/modesContentHover.ts | 4 +- src/vs/editor/contrib/peekView/peekView.ts | 6 +- .../editor/contrib/snippet/snippetParser.ts | 4 + .../editor/contrib/snippet/snippetSession.ts | 31 +- .../snippet/test/snippetVariables.test.ts | 2 +- .../editor/contrib/suggest/completionModel.ts | 6 +- src/vs/editor/contrib/suggest/suggest.ts | 50 +- .../contrib/suggest/suggestController.ts | 7 +- .../editor/contrib/suggest/suggestMemory.ts | 8 +- src/vs/editor/contrib/suggest/suggestModel.ts | 27 +- .../editor/contrib/suggest/suggestWidget.ts | 5 +- .../suggest/test/completionModel.test.ts | 28 +- .../contrib/suggest/test/suggest.test.ts | 12 +- .../contrib/suggest/test/suggestModel.test.ts | 20 +- .../contrib/suggest/test/wordDistance.test.ts | 2 +- .../unusualLineTerminators.ts | 28 +- .../browser/inspectTokens/inspectTokens.css | 6 +- .../standaloneQuickInputServiceImpl.ts | 2 +- .../standalone/browser/simpleServices.ts | 18 +- .../standalone/browser/standalone-tokens.css | 5 +- .../browser/standaloneThemeServiceImpl.ts | 2 +- .../common/monarch/monarchCommon.ts | 2 + .../common/monarch/monarchCompile.ts | 7 +- .../standalone/common/monarch/monarchLexer.ts | 3 +- .../standalone/common/monarch/monarchTypes.ts | 4 + .../common/standaloneThemeService.ts | 2 +- .../test/browser/standaloneLanguages.test.ts | 2 +- .../test/browser/controller/cursor.test.ts | 64 + .../editor/test/browser/editorTestServices.ts | 2 +- .../browser/services/openerService.test.ts | 2 +- .../modes/supports/javascriptOnEnterRules.ts | 2 +- .../common/modes/supports/onEnter.test.ts | 1 + .../test/common/services/modelService.test.ts | 2 +- src/vs/monaco.d.ts | 72 +- .../accessibility/common/accessibility.ts | 2 +- .../common/accessibilityService.ts | 2 +- src/vs/platform/actions/common/actions.ts | 3 +- src/vs/platform/actions/common/menuService.ts | 2 +- .../authentication/common/authentication.ts | 54 - .../electron-browser/authenticationIpc.ts | 27 - .../platform/backup/electron-main/backup.ts | 2 +- .../backup/electron-main/backupMainService.ts | 24 +- .../clipboard/browser/clipboardService.ts | 7 +- .../clipboard/common/clipboardService.ts | 4 +- src/vs/platform/commands/common/commands.ts | 2 +- .../configuration/common/configuration.ts | 16 +- .../common/configurationService.ts | 2 +- .../platform/contextkey/common/contextkey.ts | 2 +- .../contextview/browser/contextMenuService.ts | 2 +- .../contextview/browser/contextView.ts | 4 +- .../contextview/browser/contextViewService.ts | 2 +- .../credentials/common/credentials.ts | 2 +- .../credentials/node/credentialsService.ts | 2 +- .../debug/common/extensionHostDebug.ts | 2 +- .../debug/common/extensionHostDebugIpc.ts | 2 +- .../diagnostics/node/diagnosticsIpc.ts | 2 +- .../diagnostics/node/diagnosticsService.ts | 4 +- src/vs/platform/dialogs/common/dialogs.ts | 4 +- .../platform/dialogs/electron-main/dialogs.ts | 4 +- .../dialogs/test/common/testDialogService.ts | 2 +- src/vs/platform/download/common/download.ts | 2 +- .../platform/download/common/downloadIpc.ts | 4 +- .../download/common/downloadService.ts | 2 +- src/vs/platform/driver/common/driver.ts | 2 +- .../platform/driver/electron-main/driver.ts | 2 +- src/vs/platform/driver/node/driver.ts | 6 +- src/vs/platform/editor/common/editor.ts | 7 +- src/vs/platform/electron/common/electron.ts | 6 +- .../electron-main/electronMainService.ts | 32 +- .../electron/electron-sandbox/electron.ts | 2 +- .../environment/common/environment.ts | 2 +- src/vs/platform/environment/node/argv.ts | 6 +- .../environment/node/environmentService.ts | 13 +- .../common/configRemotes.ts | 17 +- .../common/extensionEnablementService.ts | 2 +- .../common/extensionGalleryService.ts | 4 +- .../common/extensionManagement.ts | 10 +- .../common/extensionManagementIpc.ts | 2 +- .../node/extensionDownloader.ts | 20 +- .../node/extensionManagementService.ts | 10 +- .../test/common/configRemotes.test.ts | 32 +- .../test/common/extensionManagement.test.ts | 2 + src/vs/platform/files/common/fileService.ts | 195 +- src/vs/platform/files/common/files.ts | 66 +- .../common/inMemoryFilesystemProvider.ts | 4 +- src/vs/platform/files/common/io.ts | 46 +- .../files/node/diskFileSystemProvider.ts | 17 +- .../platform/files/test/common/files.test.ts | 4 +- .../electron-browser/diskFileService.test.ts | 62 +- .../test/electron-browser/normalizer.test.ts | 3 +- .../instantiation/common/instantiation.ts | 2 +- .../common/instantiationService.ts | 5 +- .../instantiation/common/serviceCollection.ts | 4 - .../test/common/instantiationService.test.ts | 22 +- .../electron-browser/sharedProcessService.ts | 2 +- .../electron-main/sharedProcessMainService.ts | 4 +- .../electron-sandbox/mainProcessService.ts | 4 +- src/vs/platform/issue/common/issue.ts | 2 +- .../issue/electron-main/issueMainService.ts | 8 +- .../platform/keybinding/common/keybinding.ts | 2 +- .../test/common/keybindingLabels.test.ts | 3 + src/vs/platform/label/common/label.ts | 14 +- .../launch/electron-main/launchMainService.ts | 4 +- .../platform/layout/browser/layoutService.ts | 2 +- src/vs/platform/lifecycle/common/lifecycle.ts | 2 +- .../lifecycle/common/lifecycleService.ts | 2 +- .../electron-main/lifecycleMainService.ts | 4 +- src/vs/platform/list/browser/listService.ts | 496 +-- .../localizations/common/localizations.ts | 11 +- .../localizations/node/localizations.ts | 18 +- src/vs/platform/log/browser/log.ts | 2 +- src/vs/platform/log/common/bufferLog.ts | 2 +- src/vs/platform/log/common/fileLogService.ts | 4 +- src/vs/platform/log/common/log.ts | 18 +- src/vs/platform/log/common/logIpc.ts | 2 +- src/vs/platform/log/node/loggerService.ts | 2 +- src/vs/platform/log/node/spdlogService.ts | 2 +- .../platform/markers/common/markerService.ts | 2 +- src/vs/platform/markers/common/markers.ts | 2 +- .../platform/menubar/electron-main/menubar.ts | 8 +- .../electron-main/menubarMainService.ts | 4 +- .../menubar/electron-sandbox/menubar.ts | 2 +- .../notification/common/notification.ts | 2 +- .../test/common/testNotificationService.ts | 2 +- src/vs/platform/opener/common/opener.ts | 2 +- src/vs/platform/product/common/product.ts | 2 +- .../platform/product/common/productService.ts | 16 +- src/vs/platform/progress/common/progress.ts | 4 +- .../platform/quickinput/browser/quickInput.ts | 2 +- .../platform/quickinput/common/quickInput.ts | 2 +- .../browser/remoteAuthorityResolverService.ts | 63 +- .../remote/common/remoteAuthorityResolver.ts | 19 +- src/vs/platform/remote/common/tunnel.ts | 153 +- .../remoteAuthorityResolverService.ts | 86 +- .../remote/node/tunnelService.ts | 28 +- .../request/browser/requestService.ts | 2 +- src/vs/platform/request/common/request.ts | 2 +- src/vs/platform/request/common/requestIpc.ts | 2 +- .../platform/request/node/requestService.ts | 2 +- .../common/resourceIdentityService.ts | 4 +- .../node/resourceIdentityServiceImpl.ts | 2 +- src/vs/platform/sign/browser/signService.ts | 2 +- src/vs/platform/sign/common/sign.ts | 2 +- src/vs/platform/sign/node/signService.ts | 4 +- src/vs/platform/state/node/state.ts | 4 +- src/vs/platform/state/node/stateService.ts | 2 +- .../storage/browser/storageService.ts | 11 +- src/vs/platform/storage/common/storage.ts | 8 +- src/vs/platform/storage/node/storageIpc.ts | 2 +- .../storage/node/storageMainService.ts | 4 +- .../platform/storage/node/storageService.ts | 11 +- src/vs/platform/telemetry/common/telemetry.ts | 3 +- .../telemetry/common/telemetryService.ts | 10 +- .../telemetry/common/telemetryUtils.ts | 6 +- .../appInsightsAppender.test.ts | 2 +- src/vs/platform/theme/common/colorRegistry.ts | 9 +- src/vs/platform/theme/common/styler.ts | 12 +- src/vs/platform/theme/common/themeService.ts | 2 +- .../theme/electron-main/themeMainService.ts | 4 +- .../theme/test/common/testThemeService.ts | 2 +- src/vs/platform/undoRedo/common/undoRedo.ts | 6 +- .../undoRedo/common/undoRedoService.ts | 134 +- src/vs/platform/update/common/update.ts | 2 +- .../electron-main/abstractUpdateService.ts | 2 +- .../electron-main/updateService.darwin.ts | 2 +- .../electron-main/updateService.linux.ts | 2 +- .../electron-main/updateService.snap.ts | 4 +- .../electron-main/updateService.win32.ts | 2 +- src/vs/platform/url/common/url.ts | 2 +- src/vs/platform/url/common/urlService.ts | 5 +- .../common/abstractSynchronizer.ts | 322 +- .../userDataSync/common/extensionsSync.ts | 291 +- .../userDataSync/common/globalStateSync.ts | 264 +- .../userDataSync/common/keybindingsSync.ts | 390 +-- .../userDataSync/common/settingsSync.ts | 425 +-- .../userDataSync/common/snippetsSync.ts | 416 +-- .../common/userDataAutoSyncService.ts | 301 +- .../userDataSync/common/userDataSync.ts | 82 +- .../common/userDataSyncAccount.ts | 64 + .../userDataSync/common/userDataSyncIpc.ts | 37 +- .../userDataSync/common/userDataSyncLog.ts | 2 +- .../common/userDataSyncMachines.ts | 64 +- ... userDataSyncResourceEnablementService.ts} | 36 +- .../common/userDataSyncService.ts | 169 +- .../common/userDataSyncStoreService.ts | 44 +- .../userDataAutoSyncService.ts | 24 +- .../test/common/globalStateSync.test.ts | 3 +- .../test/common/settingsSync.test.ts | 3 +- .../test/common/snippetsSync.test.ts | 3 +- .../test/common/synchronizer.test.ts | 63 +- .../common/userDataAutoSyncService.test.ts | 310 +- .../test/common/userDataSyncClient.ts | 25 +- .../test/common/userDataSyncService.test.ts | 136 +- .../platform/webview/common/resourceLoader.ts | 74 +- .../webview/common/webviewManagerService.ts | 8 +- .../webview/common/webviewPortMapping.ts} | 38 +- .../electron-main/webviewMainService.ts | 60 +- .../webviewPortMappingProvider.ts | 87 + .../electron-main/webviewProtocolProvider.ts | 91 +- src/vs/platform/windows/common/windows.ts | 3 + .../platform/windows/electron-main/windows.ts | 5 +- .../electron-main/windowsMainService.ts | 42 +- src/vs/platform/windows/node/window.ts | 14 +- src/vs/platform/workspace/common/workspace.ts | 2 +- .../platform/workspaces/common/workspaces.ts | 2 +- .../workspacesHistoryMainService.ts | 14 +- .../electron-main/workspacesMainService.ts | 17 +- .../electron-main/workspacesService.ts | 2 +- .../workspacesMainService.test.ts | 4 +- src/vs/vscode.d.ts | 373 ++- src/vs/vscode.proposed.d.ts | 492 +-- .../api/browser/extensionHost.contribution.ts | 1 + .../api/browser/mainThreadAuthentication.ts | 96 +- .../api/browser/mainThreadCodeInsets.ts | 2 +- .../api/browser/mainThreadCommands.ts | 4 +- .../api/browser/mainThreadComments.ts | 3 + .../api/browser/mainThreadDebugService.ts | 2 +- .../mainThreadDocumentContentProviders.ts | 6 +- .../api/browser/mainThreadDocuments.ts | 12 +- .../browser/mainThreadDocumentsAndEditors.ts | 24 +- .../workbench/api/browser/mainThreadEditor.ts | 29 +- .../api/browser/mainThreadEditors.ts | 4 +- .../api/browser/mainThreadFileSystem.ts | 2 +- .../api/browser/mainThreadNotebook.ts | 269 +- .../browser/mainThreadRemoteConnectionData.ts | 35 + .../workbench/api/browser/mainThreadSearch.ts | 3 +- .../api/browser/mainThreadStatusBar.ts | 2 +- .../workbench/api/browser/mainThreadTask.ts | 64 +- .../api/browser/mainThreadTerminalService.ts | 62 +- .../api/browser/mainThreadWebview.ts | 15 +- src/vs/workbench/api/common/apiCommands.ts | 12 +- .../api/common/configurationExtensionPoint.ts | 6 +- .../workbench/api/common/extHost.api.impl.ts | 34 +- .../workbench/api/common/extHost.protocol.ts | 31 +- .../common/extHostApiDeprecationService.ts | 6 +- .../workbench/api/common/extHostCodeInsets.ts | 4 +- .../workbench/api/common/extHostCommands.ts | 4 +- .../api/common/extHostDebugService.ts | 41 +- .../api/common/extHostDiagnostics.ts | 12 +- .../api/common/extHostDocumentsAndEditors.ts | 26 +- .../api/common/extHostExtensionService.ts | 73 +- .../api/common/extHostInitDataService.ts | 2 +- .../workbench/api/common/extHostNotebook.ts | 378 ++- .../workbench/api/common/extHostRpcService.ts | 2 +- .../api/common/extHostStoragePaths.ts | 2 +- src/vs/workbench/api/common/extHostTask.ts | 37 +- .../api/common/extHostTerminalService.ts | 26 +- .../api/common/extHostTextEditors.ts | 22 +- .../workbench/api/common/extHostTimeline.ts | 2 +- .../api/common/extHostTunnelService.ts | 2 +- .../api/common/extHostTypeConverters.ts | 13 +- src/vs/workbench/api/common/extHostTypes.ts | 2 +- .../common/extHostUriTransformerService.ts | 4 +- src/vs/workbench/api/common/extHostWebview.ts | 17 +- .../api/common/menusExtensionPoint.ts | 1 + .../workbench/api/node/extHostDebugService.ts | 10 +- src/vs/workbench/api/node/extHostTask.ts | 15 +- .../api/node/extHostTerminalService.ts | 14 +- .../api/node/extHostTunnelService.ts | 2 +- .../workbench/api/worker/extHostLogService.ts | 2 +- .../workbench/browser/actions/listCommands.ts | 274 +- .../browser/actions/navigationActions.ts | 6 +- src/vs/workbench/browser/composite.ts | 1 + src/vs/workbench/browser/dnd.ts | 8 + src/vs/workbench/browser/layout.ts | 190 +- src/vs/workbench/browser/media/style.css | 21 +- src/vs/workbench/browser/panel.ts | 8 +- .../parts/activitybar/activitybarActions.ts | 56 +- .../parts/activitybar/activitybarPart.ts | 48 +- .../activitybar/media/activityaction.css | 3 +- .../workbench/browser/parts/compositeBar.ts | 91 +- .../browser/parts/compositeBarActions.ts | 3 +- .../browser/parts/editor/baseEditor.ts | 61 +- .../browser/parts/editor/binaryEditor.ts | 28 +- .../browser/parts/editor/breadcrumbs.ts | 4 +- .../parts/editor/breadcrumbsControl.ts | 10 +- .../parts/editor/editor.contribution.ts | 62 +- .../workbench/browser/parts/editor/editor.ts | 44 +- .../browser/parts/editor/editorActions.ts | 17 +- .../browser/parts/editor/editorCommands.ts | 4 +- .../browser/parts/editor/editorControl.ts | 14 +- .../browser/parts/editor/editorGroupView.ts | 37 +- .../browser/parts/editor/editorPart.ts | 32 +- .../parts/editor/media/tabstitlecontrol.css | 6 +- .../browser/parts/editor/tabsTitleControl.ts | 20 +- .../browser/parts/editor/textDiffEditor.ts | 37 +- .../browser/parts/editor/textEditor.ts | 43 +- .../notifications/media/notificationsList.css | 12 + .../browser/parts/panel/media/panelpart.css | 7 +- .../browser/parts/panel/panelPart.ts | 28 +- .../browser/parts/sidebar/sidebarPart.ts | 2 +- .../browser/parts/statusbar/statusbarPart.ts | 40 +- .../browser/parts/titlebar/menubarControl.ts | 33 +- .../browser/parts/titlebar/titlebarPart.ts | 2 +- .../workbench/browser/parts/views/treeView.ts | 8 +- .../browser/parts/views/viewPaneContainer.ts | 30 +- .../browser/parts/views/viewsService.ts | 4 +- src/vs/workbench/browser/style.ts | 12 +- src/vs/workbench/browser/viewlet.ts | 6 +- src/vs/workbench/browser/web.main.ts | 13 +- src/vs/workbench/browser/workbench.ts | 90 +- src/vs/workbench/common/editor.ts | 166 +- src/vs/workbench/common/editor/editorGroup.ts | 14 +- .../common/editor/resourceEditorInput.ts | 4 +- .../common/editor/textEditorModel.ts | 2 +- .../common/editor/textResourceEditorInput.ts | 55 +- src/vs/workbench/common/theme.ts | 4 +- src/vs/workbench/common/views.ts | 10 +- .../contrib/backup/common/backupRestorer.ts | 14 +- .../bulkEdit/browser/bulkEdit.contribution.ts | 4 + .../contrib/bulkEdit/browser/bulkEditPane.ts | 10 +- .../bulkEdit/browser/bulkEditPreview.ts | 24 +- .../contrib/bulkEdit/browser/bulkEditTree.ts | 24 +- .../browser/callHierarchyTree.ts | 2 +- .../browser/find/simpleFindReplaceWidget.ts | 4 +- .../browser/find/simpleFindWidget.ts | 3 +- .../suggestEnabledInput.ts | 3 +- .../sleepResumeRepaintMinimap.ts | 14 +- .../comments/browser/commentService.ts | 4 +- .../comments/browser/commentsTreeViewer.ts | 4 +- .../contrib/comments/browser/commentsView.ts | 14 +- .../browser/customEditor.contribution.ts | 3 +- .../customEditor/browser/customEditorInput.ts | 4 +- .../browser/customEditorInputFactory.ts | 15 +- .../customEditor/browser/customEditors.ts | 97 +- .../customEditor/common/customEditor.ts | 10 + .../customEditor/common/extensionPoint.ts | 8 +- .../contrib/debug/browser/breakpointWidget.ts | 6 +- .../contrib/debug/browser/breakpointsView.ts | 58 +- .../contrib/debug/browser/callStackView.ts | 96 +- .../debug/browser/debug.contribution.ts | 3 +- .../contrib/debug/browser/debugActions.ts | 4 +- .../browser/debugConfigurationManager.ts | 39 +- .../debug/browser/debugEditorActions.ts | 8 +- .../contrib/debug/browser/debugQuickAccess.ts | 13 +- .../contrib/debug/browser/debugService.ts | 15 +- .../browser/extensionHostDebugService.ts | 7 +- .../debug/browser/loadedScriptsView.ts | 6 +- .../debug/browser/media/debugHover.css | 1 + .../workbench/contrib/debug/browser/repl.ts | 9 +- .../contrib/debug/browser/variablesView.ts | 85 +- .../debug/browser/watchExpressionsView.ts | 9 + .../workbench/contrib/debug/common/debug.ts | 4 +- .../contrib/debug/common/debugModel.ts | 2 +- .../contrib/debug/common/debugProtocol.d.ts | 79 +- .../contrib/debug/common/debugger.ts | 26 +- .../contrib/debug/node/debugHelperService.ts | 2 +- .../workbench/contrib/debug/node/terminals.ts | 57 +- .../debug/test/common/debugViewModel.test.ts | 8 +- .../experiments/common/experimentService.ts | 4 +- .../extensions/browser/extensionEditor.ts | 2 +- .../extensionRecommendationsService.ts | 2 +- .../extensions/browser/extensionsActions.ts | 10 +- .../extensions/browser/extensionsList.ts | 61 +- .../extensions/browser/extensionsViewlet.ts | 2 +- .../extensions/browser/extensionsViews.ts | 52 +- .../browser/extensionsWorkbenchService.ts | 54 +- .../extensions/browser/media/extension.css | 1 - .../browser/media/extensionActions.css | 1 - .../browser/media/extensionsViewlet.css | 15 +- .../contrib/extensions/common/extensions.ts | 2 +- .../extensions/common/extensionsInput.ts | 36 +- .../extensionProfileService.ts | 9 +- .../extensions.contribution.ts | 2 +- .../extensionsAutoProfiler.ts | 2 +- .../electron-browser/extensionsSlowActions.ts | 7 +- .../runtimeExtensionsEditor.ts | 28 +- .../runtimeExtensionsInput.ts | 24 +- .../extensionsActions.test.ts | 6 +- .../electron-browser/extensionsViews.test.ts | 4 +- .../browser/externalTerminal.contribution.ts | 130 +- .../common/externalTerminal.ts | 4 +- .../node/externalTerminal.contribution.ts | 106 + .../externalTerminal/node/externalTerminal.ts | 6 + .../node/externalTerminalService.test.ts | 3 +- .../node/externalTerminalService.ts | 57 +- .../files/browser/editors/textFileEditor.ts | 61 +- .../editors/textFileSaveErrorHandler.ts | 14 +- .../contrib/files/browser/explorerViewlet.ts | 2 +- .../files/browser/fileActions.contribution.ts | 18 +- .../contrib/files/browser/fileActions.ts | 65 +- .../contrib/files/browser/fileCommands.ts | 69 +- .../files/browser/files.contribution.ts | 19 +- .../files/browser/media/explorerviewlet.css | 1 + .../files/browser/views/explorerView.ts | 54 +- .../files/browser/views/explorerViewer.ts | 153 +- .../files/browser/views/openEditorsView.ts | 42 +- .../files/common/editors/fileEditorInput.ts | 99 +- .../contrib/files/common/explorerService.ts | 6 +- .../workbench/contrib/files/common/files.ts | 2 +- .../contrib/files/common/openWith.ts | 6 +- .../files/electron-sandbox/textFileEditor.ts | 6 +- .../test/browser/fileEditorInput.test.ts | 69 +- .../files/test/browser/textFileEditor.test.ts | 5 +- .../browser/textFileEditorTracker.test.ts | 4 +- .../hover/browser/hover.contribution.ts | 43 + .../workbench/contrib/hover/browser/hover.ts | 105 + .../contrib/hover/browser/hoverService.ts | 55 + .../widgets => hover/browser}/hoverWidget.ts | 158 +- .../contrib/hover/browser/media/hover.css | 28 + .../contrib/issue/browser/issueService.ts | 4 +- .../contrib/issue/electron-browser/issue.ts | 2 +- .../issue/electron-browser/issueService.ts | 2 +- .../browser/localizations.contribution.ts | 2 +- .../browser/localizationsActions.ts | 7 +- .../contrib/markers/browser/markers.ts | 4 +- .../contrib/markers/browser/markersModel.ts | 34 +- .../contrib/markers/browser/markersView.ts | 28 +- .../markers/browser/markersViewActions.ts | 6 +- .../markers/test/browser/markersModel.test.ts | 23 + .../contrib/notebook/browser/constants.ts | 4 +- .../notebook/browser/contrib/coreActions.ts | 330 +- .../browser/contrib/find/findController.ts | 2 +- .../notebook/browser/extensionPoint.ts | 20 +- .../notebook/browser/media/notebook.css | 419 +-- .../notebook/browser/notebook.contribution.ts | 275 +- .../notebook/browser/notebookBrowser.ts | 44 +- .../notebook/browser/notebookEditor.ts | 205 +- .../notebook/browser/notebookEditorInput.ts | 116 +- .../notebook/browser/notebookEditorWidget.ts | 960 +++--- .../browser/notebookEditorWidgetService.ts | 158 + .../notebook/browser/notebookRegistry.ts | 50 +- .../notebook/browser/notebookServiceImpl.ts | 256 +- .../notebook/browser/view/notebookCellList.ts | 168 +- .../view/output/transforms/errorTransform.ts | 4 +- .../view/output/transforms/richTransform.ts | 4 +- .../view/output/transforms/streamTransform.ts | 4 +- .../view/renderers/backLayerWebView.ts | 498 +-- .../browser/view/renderers/cellContextKeys.ts | 101 + .../browser/view/renderers/cellMenus.ts | 4 + .../browser/view/renderers/cellRenderer.ts | 292 +- .../browser/view/renderers/codeCell.ts | 47 +- .../browser/view/renderers/markdownCell.ts | 325 +- .../browser/view/renderers/webviewPreloads.ts | 418 +++ .../browser/viewModel/baseCellViewModel.ts | 37 +- .../notebook/browser/viewModel/cellEdit.ts | 127 +- .../browser/viewModel/codeCellViewModel.ts | 9 +- .../viewModel/markdownCellViewModel.ts | 5 +- .../browser/viewModel/notebookViewModel.ts | 333 +- .../common/model/notebookCellTextModel.ts | 4 + .../common/model/notebookTextModel.ts | 80 +- .../contrib/notebook/common/notebookCommon.ts | 60 +- .../notebook/common/notebookEditorModel.ts | 221 +- .../notebookEditorModelResolverService.ts | 71 + .../notebook/common/notebookOutputRenderer.ts | 6 +- .../notebook/common/notebookProvider.ts | 30 +- .../notebook/common/notebookService.ts | 17 +- .../notebook/test/notebookViewModel.test.ts | 2 +- .../notebook/test/testNotebookEditor.ts | 51 +- .../contrib/outline/browser/outlinePane.ts | 23 +- .../contrib/output/browser/logViewer.ts | 2 +- .../contrib/output/browser/outputServices.ts | 2 +- .../contrib/output/browser/outputView.ts | 2 +- .../workbench/contrib/output/common/output.ts | 2 +- .../electron-browser/perfviewEditor.ts | 9 +- .../electron-browser/startupProfiler.ts | 3 +- .../electron-browser/startupTimings.ts | 10 +- .../preferences/browser/keybindingsEditor.ts | 55 +- .../browser/media/keybindingsEditor.css | 8 - .../browser/media/settingsWidgets.css | 70 +- .../browser/preferences.contribution.ts | 75 +- .../preferences/browser/preferencesEditor.ts | 2 +- .../preferences/browser/preferencesSearch.ts | 2 +- .../preferences/browser/settingsEditor2.ts | 18 +- .../preferences/browser/settingsTree.ts | 243 +- .../preferences/browser/settingsTreeModels.ts | 42 +- .../preferences/browser/settingsWidgets.ts | 697 +++- .../contrib/preferences/common/preferences.ts | 2 +- .../browser/relauncher.contribution.ts | 8 - .../remote/browser/explorerViewItems.ts | 4 +- .../contrib/remote/browser/remote.ts | 6 +- .../contrib/remote/browser/tunnelView.ts | 6 +- .../contrib/sash/browser/sash.contribution.ts | 2 +- src/vs/workbench/contrib/sash/browser/sash.ts | 27 +- .../contrib/scm/browser/media/scmViewlet.css | 6 - .../contrib/scm/browser/repositoryPane.ts | 225 +- .../contrib/scm/common/scmService.ts | 2 +- .../search/browser/anythingQuickAccess.ts | 36 +- .../contrib/search/browser/replaceService.ts | 2 +- .../search/browser/search.contribution.ts | 40 +- .../contrib/search/browser/searchView.ts | 6 +- .../contrib/search/browser/searchWidget.ts | 2 +- .../contrib/search/common/queryBuilder.ts | 3 +- .../contrib/search/common/replace.ts | 2 +- .../search/common/searchHistoryService.ts | 6 +- .../contrib/search/common/searchModel.ts | 10 +- .../browser/searchEditor.contribution.ts | 28 +- .../searchEditor/browser/searchEditor.ts | 7 +- .../browser/searchEditorActions.ts | 39 +- .../searchEditor/browser/searchEditorInput.ts | 26 +- .../contrib/snippets/browser/insertSnippet.ts | 29 +- .../snippets/browser/snippets.contribution.ts | 2 +- .../snippets/browser/snippetsService.ts | 12 +- .../contrib/snippets/browser/tabCompletion.ts | 22 +- .../snippets/test/browser/snippetFile.test.ts | 3 + .../test/browser/snippetsService.test.ts | 2 +- .../tags/browser/workspaceTagsService.ts | 2 +- .../contrib/tags/common/workspaceTags.ts | 2 +- .../tags/electron-browser/workspaceTags.ts | 4 +- .../electron-browser/workspaceTagsService.ts | 15 +- .../tasks/browser/abstractTaskService.ts | 67 +- .../tasks/browser/terminalTaskSystem.ts | 24 +- .../contrib/tasks/common/problemMatcher.ts | 2 +- .../contrib/tasks/common/taskService.ts | 2 +- .../terminal/browser/links/terminalLink.ts | 32 +- .../terminal/browser/media/widgets.css | 32 +- .../contrib/terminal/browser/terminal.ts | 10 +- .../terminal/browser/terminalActions.ts | 14 + .../terminal/browser/terminalInstance.ts | 115 +- .../browser/terminalProcessExtHostProxy.ts | 59 +- .../browser/terminalProcessManager.ts | 16 +- .../terminal/browser/terminalService.ts | 15 +- .../widgets/environmentVariableInfoWidget.ts | 60 +- .../browser/widgets/terminalHoverWidget.ts | 96 +- .../terminal/browser/widgets/widgets.ts | 29 - .../terminal/common/environmentVariable.ts | 2 +- .../common/environmentVariableService.ts | 2 +- .../contrib/terminal/common/terminal.ts | 23 +- .../electron-browser/terminalNativeService.ts | 15 +- .../contrib/terminal/node/terminalProcess.ts | 135 +- .../browser/links/terminalLinkManager.test.ts | 2 +- .../timeline/browser/timeline.contribution.ts | 13 +- .../contrib/timeline/browser/timelinePane.ts | 42 +- .../timeline/common/timelineService.ts | 2 +- .../update/browser/releaseNotesEditor.ts | 5 +- .../contrib/url/browser/trustedDomains.ts | 56 +- .../url/browser/trustedDomainsValidator.ts | 20 +- .../url/test/browser/trustedDomains.test.ts | 29 + .../browser/userDataAutoSyncService.ts | 24 +- .../browser/userDataSync.contribution.ts | 1 + .../userDataSync/browser/userDataSync.ts | 145 +- .../userDataSync/browser/userDataSyncViews.ts | 270 +- .../userDataAutoSyncService.ts | 27 +- .../userDataSync.contribution.ts | 1 + .../contrib/watermark/browser/watermark.ts | 6 +- .../webview/browser/baseWebviewElement.ts | 80 +- .../browser/dynamicWebviewEditorOverlay.ts | 12 +- .../contrib/webview/browser/pre/host.js | 2 +- .../contrib/webview/browser/pre/main.js | 4 +- .../webview/browser/pre/service-worker.js | 4 +- .../webview/{common => browser}/themeing.ts | 3 +- .../contrib/webview/browser/webview.ts | 4 +- .../webview/browser/webviewEditorInput.ts | 4 - .../browser/webviewEditorInputFactory.ts | 4 +- .../contrib/webview/browser/webviewElement.ts | 33 +- .../contrib/webview/browser/webviewService.ts | 4 +- .../browser/webviewWorkbenchService.ts | 4 +- .../electron-browser/pre/electron-index.js | 1 - .../electron-browser/webviewElement.ts | 265 +- .../electron-browser/webviewService.ts | 4 +- .../welcome/overlay/browser/welcomeOverlay.ts | 2 +- .../page/browser/vs_code_welcome_page.ts | 4 +- .../walkThrough/browser/walkThroughPart.ts | 2 +- .../electron-browser/desktop.main.ts | 5 +- src/vs/workbench/electron-browser/window.ts | 33 +- .../electron-sandbox/desktop.contribution.ts | 7 + .../electron-browser/accessibilityService.ts | 4 +- .../services/activity/common/activity.ts | 2 +- .../activityBar/browser/activityBarService.ts | 2 +- .../browser/authenticationService.ts | 25 +- .../authenticationTokenService.ts | 45 - .../services/backup/common/backup.ts | 2 +- .../backup/common/backupFileService.ts | 6 +- .../bulkEdit/browser/bulkEditService.ts | 14 +- .../electron-browser/clipboardService.ts | 7 +- .../commands/common/commandService.ts | 2 +- .../configuration/browser/configuration.ts | 2 +- .../browser/configurationService.ts | 12 +- .../configuration/common/jsonEditing.ts | 5 +- .../common/jsonEditingService.ts | 8 +- .../configurationService.test.ts | 72 +- .../common/configurationResolver.ts | 2 +- .../common/variableResolver.ts | 32 +- .../configurationResolverService.test.ts | 2 +- .../electron-sandbox/contextmenuService.ts | 4 +- .../credentials/browser/credentialsService.ts | 2 +- .../credentials/common/credentials.ts | 2 +- .../decorations/browser/decorationsService.ts | 2 +- .../browser/abstractFileDialogService.ts | 2 +- .../services/dialogs/browser/dialogService.ts | 2 +- .../dialogs/browser/simpleFileDialog.ts | 31 +- .../dialogs/electron-browser/dialogService.ts | 26 +- .../electron-browser/fileDialogService.ts | 2 +- .../services/editor/browser/editorService.ts | 113 +- .../editor/common/editorGroupsService.ts | 9 +- .../services/editor/common/editorService.ts | 11 +- .../test/browser/editorGroupsService.test.ts | 28 + .../editor/test/browser/editorService.test.ts | 4 +- .../environment/browser/environmentService.ts | 5 +- .../environment/common/environmentService.ts | 2 +- .../electron-browser/environmentService.ts | 2 +- .../common/extensionEnablementService.ts | 12 +- .../common/extensionManagement.ts | 14 +- .../extensionManagementServerService.ts | 2 +- .../common/extensionManagementService.ts | 2 +- .../extensionManagementServerService.ts | 9 +- .../browser/extensionResourceLoaderService.ts | 2 +- .../common/extensionResourceLoader.ts | 2 +- .../extensionResourceLoaderService.ts | 2 +- .../extensions/browser/extensionService.ts | 11 +- .../browser/webWorkerExtensionHostStarter.ts | 1 + .../services/extensions/common/extensions.ts | 4 +- .../extensions/common/extensionsRegistry.ts | 5 + .../common/remoteExtensionHostClient.ts | 31 +- .../extensions/common/staticExtensions.ts | 5 +- .../cachedExtensionScanner.ts | 16 +- .../electron-browser/extensionHost.ts | 22 +- .../electron-browser/extensionService.ts | 36 +- .../remoteExtensionManagementIpc.ts | 2 +- .../node/extensionHostProcessSetup.ts | 2 +- .../extensions/worker/extensionHostWorker.ts | 2 +- .../common/filesConfigurationService.ts | 4 +- .../services/history/browser/history.ts | 204 +- .../services/history/common/history.ts | 2 +- .../host/browser/browserHostService.ts | 4 +- .../workbench/services/host/browser/host.ts | 2 +- .../electron-sandbox/desktopHostService.ts | 2 +- .../integrity/browser/integrityService.ts | 2 +- .../services/integrity/common/integrity.ts | 2 +- .../integrity/node/integrityService.ts | 17 +- .../issue/electron-sandbox/issueService.ts | 2 +- .../keybinding/common/keybindingEditing.ts | 2 +- .../services/keybinding/common/keymapInfo.ts | 2 +- .../keybindingEditing.test.ts | 3 + .../macLinuxFallbackKeyboardMapper.test.ts | 10 +- .../macLinuxKeyboardMapper.test.ts | 40 +- .../windowsKeyboardMapper.test.ts | 12 +- .../services/label/common/labelService.ts | 13 +- .../services/layout/browser/layoutService.ts | 2 +- .../lifecycle/browser/lifecycleService.ts | 2 +- .../electron-sandbox/lifecycleService.ts | 2 +- .../electron-browser/localizationsService.ts | 2 +- .../log/common/keyValueLogProvider.ts | 4 +- .../electron-sandbox/menubarService.ts | 2 +- .../common/notificationService.ts | 2 +- .../output/common/outputChannelModel.ts | 2 +- .../common/outputChannelModelService.ts | 2 +- .../outputChannelModelService.ts | 2 +- .../services/panel/common/panelService.ts | 2 +- .../services/path/common/pathService.ts | 4 +- .../preferences/browser/preferencesService.ts | 9 +- .../preferences/common/preferences.ts | 9 +- .../common/preferencesEditorInput.ts | 23 +- .../preferences/common/preferencesModels.ts | 7 + .../progress/browser/progressIndicator.ts | 2 +- .../progress/browser/progressService.ts | 2 +- .../remote/browser/remoteAgentServiceImpl.ts | 2 +- .../common/abstractRemoteAgentService.ts | 11 +- .../common/remoteAgentEnvironmentChannel.ts | 3 - .../common/remoteAgentFileSystemChannel.ts | 28 +- .../remote/common/remoteAgentService.ts | 2 +- .../remote/common/remoteExplorerService.ts | 23 +- .../services/remote/common/tunnelService.ts | 151 - .../remoteAgentServiceImpl.ts | 9 +- .../services/search/common/search.ts | 16 +- .../services/search/common/searchService.ts | 12 +- .../search/test/common/replace.test.ts | 10 +- .../test/node/textSearch.integrationTest.ts | 8 +- .../electron-browser/sharedProcessService.ts | 2 +- .../services/statusbar/common/statusbar.ts | 2 +- .../telemetry/browser/telemetryService.ts | 2 +- .../electron-browser/telemetryService.ts | 2 +- .../textMate/common/textMateService.ts | 2 +- .../browser/browserTextFileService.ts | 2 +- .../textfile/browser/textFileService.ts | 23 +- .../textfile/common/textFileEditorModel.ts | 3 +- .../common/textFileEditorModelManager.ts | 70 +- .../services/textfile/common/textfiles.ts | 17 +- .../electron-browser/nativeTextFileService.ts | 101 +- .../textFileEditorModelManager.test.ts | 40 +- .../test/browser/textFileService.test.ts | 17 +- .../common/textModelResolverService.ts | 107 +- .../browser/textModelResolverService.test.ts | 64 +- .../common/textResourcePropertiesService.ts | 2 +- .../themes/browser/workbenchThemeService.ts | 2 +- .../themes/common/workbenchThemeService.ts | 2 +- .../timer/electron-browser/timerService.ts | 4 +- .../services/title/common/titleService.ts | 2 +- .../common/untitledTextEditorInput.ts | 7 +- .../common/untitledTextEditorService.ts | 4 +- .../services/update/browser/updateService.ts | 2 +- .../update/electron-sandbox/updateService.ts | 2 +- .../uriIdentity/common/uriIdentity.ts | 6 +- .../uriIdentity/common/uriIdentityService.ts | 49 +- .../test/common/uriIdentityService.test.ts | 4 + .../services/url/browser/urlService.ts | 2 +- .../url/electron-sandbox/urlService.ts | 7 +- .../userData/common/fileUserDataProvider.ts | 29 +- .../browser/userDataSyncWorkbenchService.ts | 99 +- .../userDataSync/common/userDataSync.ts | 3 +- .../userDataSync/common/userDataSyncUtil.ts | 2 +- .../userDataSyncAccountService.ts | 47 + .../userDataSyncMachinesService.ts | 10 +- .../electron-browser/userDataSyncService.ts | 16 +- .../services/viewlet/browser/viewlet.ts | 2 +- .../views/browser/viewDescriptorService.ts | 11 +- .../common/workingCopyFileService.ts | 37 +- .../workingCopy/common/workingCopyService.ts | 6 +- .../browser/workingCopyFileService.test.ts | 14 +- .../abstractWorkspaceEditingService.ts | 58 +- .../browser/workspaceEditingService.ts | 8 +- .../workspaces/browser/workspacesService.ts | 2 +- .../workspaces/common/workspaceEditing.ts | 2 +- .../workspaceEditingService.ts | 10 +- .../electron-sandbox/workspacesService.ts | 2 +- .../browser/api/extHostDocumentData.test.ts | 2 +- .../api/extHostLanguageFeatures.test.ts | 28 +- .../api/extHostMessagerService.test.ts | 6 +- .../api/extHostNotebookConcatDocument.test.ts | 2 +- .../browser/api/extHostTypeConverter.test.ts | 11 +- .../browser/api/mainThreadDocuments.test.ts | 3 +- .../api/mainThreadDocumentsAndEditors.test.ts | 10 +- .../browser/api/mainThreadEditors.test.ts | 7 +- .../browser/parts/editor/baseEditor.test.ts | 11 +- .../parts/editor/editorDiffModel.test.ts | 4 +- .../browser/parts/editor/editorGroups.test.ts | 21 +- .../parts/editor/resourceEditorInput.test.ts | 4 +- .../test/browser/workbenchTestServices.ts | 86 +- .../test/common/workbenchTestServices.ts | 6 +- .../api/extHostSearch.test.ts | 2 +- .../electron-browser/workbenchTestServices.ts | 16 +- src/vs/workbench/workbench.common.main.ts | 10 +- src/vs/workbench/workbench.desktop.main.ts | 11 +- src/vs/workbench/workbench.web.api.ts | 30 +- src/vs/workbench/workbench.web.main.ts | 9 +- test/automation/src/code.ts | 7 +- test/automation/src/notebook.ts | 2 +- test/automation/src/playwrightDriver.ts | 7 +- test/automation/src/statusbar.ts | 2 +- test/smoke/src/main.ts | 2 +- test/unit/electron/index.js | 3 +- yarn.lock | 116 +- 1002 files changed, 24201 insertions(+), 13193 deletions(-) create mode 100644 .github/workflows/deep-classifier-monitor.yml create mode 100644 .github/workflows/deep-classifier-runner.yml create mode 100644 .github/workflows/deep-classifier-scraper.yml create mode 100644 .github/workflows/latest-release-monitor.yml create mode 100644 .github/workflows/release-pipeline-labeler.yml create mode 100644 .github/workflows/rich-navigation.yml create mode 100644 .vscode/notebooks/inbox.github-issues create mode 100644 .vscode/notebooks/my-work.github-issues create mode 100644 build/polyfills/vscode-extension-telemetry.js create mode 100644 build/polyfills/vscode-nls.js create mode 100644 extensions/configuration-editing/extension-browser.webpack.config.js rename extensions/configuration-editing/src/{extension.ts => configurationEditingMain.ts} (100%) create mode 100644 extensions/github-authentication/extension-browser.webpack.config.js create mode 100644 extensions/github-browser/.gitignore create mode 100644 extensions/github-browser/.vscodeignore create mode 100644 extensions/github-browser/README.md create mode 100644 extensions/github-browser/extension-browser.webpack.config.js create mode 100644 extensions/github-browser/extension.webpack.config.js create mode 100644 extensions/github-browser/package.json create mode 100644 extensions/github-browser/package.nls.json create mode 100644 extensions/github-browser/src/extension.ts create mode 100644 extensions/github-browser/src/githubfs.ts create mode 100644 extensions/github-browser/src/iterables.ts create mode 100644 extensions/github-browser/src/typings/ref.d.ts create mode 100644 extensions/github-browser/tsconfig.json create mode 100644 extensions/github-browser/yarn.lock create mode 100644 extensions/image-preview/extension-browser.webpack.config.js create mode 100644 extensions/json-language-features/client/src/browser/jsonClientMain.ts rename extensions/json-language-features/client/src/{jsonMain.ts => jsonClient.ts} (82%) create mode 100644 extensions/json-language-features/client/src/node/jsonClientMain.ts create mode 100644 extensions/json-language-features/client/src/requests.ts create mode 100644 extensions/json-language-features/extension-browser.webpack.config.js create mode 100644 extensions/json-language-features/server/extension-browser.webpack.config.js create mode 100644 extensions/json-language-features/server/src/browser/jsonServerMain.ts create mode 100644 extensions/json-language-features/server/src/jsonServer.ts delete mode 100644 extensions/json-language-features/server/src/jsonServerMain.ts create mode 100644 extensions/json-language-features/server/src/node/jsonServerMain.ts create mode 100644 extensions/json-language-features/server/src/requests.ts create mode 100644 extensions/markdown-language-features/extension-browser.webpack.config.js delete mode 100644 extensions/markdown-language-features/media/preview-right-dark.svg delete mode 100644 extensions/markdown-language-features/media/preview-right-light.svg delete mode 100644 extensions/markdown-language-features/media/view-source-dark.svg delete mode 100644 extensions/markdown-language-features/media/view-source-light.svg create mode 100644 extensions/markdown-language-features/src/util/hash.ts create mode 100644 extensions/merge-conflict/extension-browser.webpack.config.js rename extensions/merge-conflict/src/{extension.ts => mergeConflictMain.ts} (100%) create mode 100644 extensions/python/extension-browser.webpack.config.js create mode 100644 extensions/vscode-web-playground/extension-browser.webpack.config.js create mode 100644 extensions/vscode-web-playground/extension.webpack.config.js create mode 100644 extensions/vscode-web-playground/src/exampleFiles.ts create mode 100644 extensions/vscode-web-playground/src/memfs.ts create mode 100644 resources/serverless/callback.html rename {scripts => resources/serverless}/code-web.js (69%) mode change 100755 => 100644 delete mode 100644 src/vs/base/node/stream.ts delete mode 100644 src/vs/platform/authentication/common/authentication.ts delete mode 100644 src/vs/platform/authentication/electron-browser/authenticationIpc.ts rename src/vs/{workbench/services => platform}/remote/node/tunnelService.ts (81%) create mode 100644 src/vs/platform/userDataSync/common/userDataSyncAccount.ts rename src/vs/platform/userDataSync/common/{userDataSyncEnablementService.ts => userDataSyncResourceEnablementService.ts} (64%) rename src/vs/{workbench/contrib/webview/common/portMapping.ts => platform/webview/common/webviewPortMapping.ts} (60%) create mode 100644 src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts create mode 100644 src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts create mode 100644 src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts create mode 100644 src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts create mode 100644 src/vs/workbench/contrib/hover/browser/hover.contribution.ts create mode 100644 src/vs/workbench/contrib/hover/browser/hover.ts create mode 100644 src/vs/workbench/contrib/hover/browser/hoverService.ts rename src/vs/workbench/contrib/{terminal/browser/widgets => hover/browser}/hoverWidget.ts (51%) create mode 100644 src/vs/workbench/contrib/hover/browser/media/hover.css create mode 100644 src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts create mode 100644 src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts create mode 100644 src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts create mode 100644 src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts rename src/vs/workbench/contrib/webview/{common => browser}/themeing.ts (96%) delete mode 100644 src/vs/workbench/services/authentication/electron-browser/authenticationTokenService.ts delete mode 100644 src/vs/workbench/services/remote/common/tunnelService.ts create mode 100644 src/vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService.ts diff --git a/.eslintrc.json b/.eslintrc.json index 4078165212..d0c68fddfa 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -42,7 +42,15 @@ "jsdoc/no-types": "warn", "semi": "off", "@typescript-eslint/semi": "warn", - "@typescript-eslint/class-name-casing": "warn", + "@typescript-eslint/naming-convention": [ + "warn", + { + "selector": "class", + "format": [ + "PascalCase" + ] + } + ], "code-no-unused-expressions": [ "warn", { diff --git a/.github/workflows/deep-classifier-monitor.yml b/.github/workflows/deep-classifier-monitor.yml new file mode 100644 index 0000000000..b74d4abca3 --- /dev/null +++ b/.github/workflows/deep-classifier-monitor.yml @@ -0,0 +1,23 @@ +name: "Deep Classifier: Monitor" +on: + issues: + types: [unassigned] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: master + path: ./actions + - name: Install Actions + run: npm install --production --prefix ./actions + - name: "Run Classifier: Scraper" + uses: ./actions/classifier-deep/monitor + with: + botName: vscode-triage-bot + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/deep-classifier-runner.yml b/.github/workflows/deep-classifier-runner.yml new file mode 100644 index 0000000000..418723c1ba --- /dev/null +++ b/.github/workflows/deep-classifier-runner.yml @@ -0,0 +1,49 @@ +name: "Deep Classifier: Runner" +on: + schedule: + - cron: 0/30 * * * * + repository_dispatch: + types: [trigger-deep-classifier-runner] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v30 + 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 + - name: "Run Classifier: Scraper" + uses: ./actions/classifier-deep/apply/fetch-sources + with: + # slightly overlapping to protect against issues slipping through the cracks if a run is delayed + from: 40 + until: 5 + configPath: classifier + blobContainerName: vscode-issue-classifier + blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + - name: Set up Python 3.7 + uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install --upgrade numpy scipy scikit-learn joblib nltk simpletransformers torch torchvision + - name: "Run Classifier: Generator" + run: python ./actions/classifier-deep/apply/generate-labels/main.py + - name: "Run Classifier: Labeler" + uses: ./actions/classifier-deep/apply/apply-labels + with: + configPath: classifier + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} diff --git a/.github/workflows/deep-classifier-scraper.yml b/.github/workflows/deep-classifier-scraper.yml new file mode 100644 index 0000000000..5cbd74a9a1 --- /dev/null +++ b/.github/workflows/deep-classifier-scraper.yml @@ -0,0 +1,27 @@ +name: "Deep Classifier: Scraper" +on: + repository_dispatch: + types: [trigger-deep-classifier-scraper] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: master + 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 + - name: "Run Classifier: Scraper" + uses: ./actions/classifier-deep/train/fetch-issues + with: + blobContainerName: vscode-issue-classifier + blobStorageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} + token: ${{secrets.ISSUE_SCRAPER_TOKEN}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} diff --git a/.github/workflows/latest-release-monitor.yml b/.github/workflows/latest-release-monitor.yml new file mode 100644 index 0000000000..14e20555f6 --- /dev/null +++ b/.github/workflows/latest-release-monitor.yml @@ -0,0 +1,25 @@ +name: Latest Release Monitor +on: + schedule: + - cron: 0/5 * * * * + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + path: ./actions + ref: v30 + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Install Storage Module + run: npm install @azure/storage-blob + - name: Run Latest Release Monitor + uses: ./actions/latest-release-monitor + with: + storageKey: ${{secrets.AZURE_BLOB_STORAGE_CONNECTION_STRING}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} diff --git a/.github/workflows/release-pipeline-labeler.yml b/.github/workflows/release-pipeline-labeler.yml new file mode 100644 index 0000000000..13e06dde56 --- /dev/null +++ b/.github/workflows/release-pipeline-labeler.yml @@ -0,0 +1,32 @@ +name: "Release Pipeline Labeler" +on: + issues: + types: [closed, reopened] + repository_dispatch: + types: [released-insider] + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: 'microsoft/vscode-github-triage-actions' + ref: v30 + path: ./actions + - name: Checkout Repo + if: github.event_name != 'issues' + uses: actions/checkout@v2 + with: + path: ./repo + fetch-depth: 0 + - name: Install Actions + run: npm install --production --prefix ./actions + - name: "Run Release Pipeline Labeler" + uses: ./actions/release-pipeline + with: + token: ${{secrets.VSCODE_ISSUE_TRIAGE_BOT_PAT}} + appInsightsKey: ${{secrets.TRIAGE_ACTIONS_APP_INSIGHTS}} + notYetReleasedLabel: unreleased + insidersReleasedLabel: insiders-released diff --git a/.github/workflows/rich-navigation.yml b/.github/workflows/rich-navigation.yml new file mode 100644 index 0000000000..0becba360d --- /dev/null +++ b/.github/workflows/rich-navigation.yml @@ -0,0 +1,19 @@ +name: "Rich Navigation Indexing" +on: + pull_request: + push: + branches: + - master + +jobs: + richnav: + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + - name: Install dependencies + run: yarn install + - uses: microsoft/RichCodeNavIndexer@master + with: + languages: typescript diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 2cd0a32b9c..76f0aeadfa 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,6 +4,7 @@ "recommendations": [ "dbaeumer.vscode-eslint", "EditorConfig.EditorConfig", - "msjsdiag.debugger-for-chrome" + "msjsdiag.debugger-for-chrome", + "ms-vscode.vscode-github-issue-notebooks" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json index 9fc255d056..0df90399ae 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -109,7 +109,7 @@ "type": "chrome", "request": "launch", "name": "Launch ADS (Web) (TBD)", - "program": "${workspaceFolder}/scripts/code-web.js", + "program": "${workspaceFolder}/resources/serverless/code-web.js", "presentation": { "group": "0_vscode", "order": 2 @@ -145,6 +145,18 @@ "order": 3 } }, + { + "type": "pwa-msedge", + "request": "launch", + "name": "VS Code (Web, Edge)", + "url": "http://localhost:8080", + "pauseForSourceMap": false, + "preLaunchTask": "Run web", + "presentation": { + "group": "0_vscode", + "order": 3 + } + }, { "type": "node", "request": "launch", @@ -251,6 +263,7 @@ }, { "name": "Azure Data Studio", + "stopAll": true, "configurations": [ "Launch azuredatastudio", "Attach to Main Process", diff --git a/.vscode/notebooks/inbox.github-issues b/.vscode/notebooks/inbox.github-issues new file mode 100644 index 0000000000..9edd342251 --- /dev/null +++ b/.vscode/notebooks/inbox.github-issues @@ -0,0 +1,36 @@ +[ + { + "kind": 1, + "language": "markdown", + "value": "##### `Config`: defines the inbox query" + }, + { + "kind": 2, + "language": "github-issues", + "value": "$inbox=repo:microsoft/vscode is:open no:assignee -label:feature-request -label:testplan-item -label:plan-item " + }, + { + "kind": 1, + "language": "markdown", + "value": "## Triage Inbox\n\nAll inbox issues but not those that need more information. These issues need to be triaged, e.g assigned to a user or ask for more information", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$inbox -label:\"needs more info\"", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "## Inbox\n\nAll issues that have no assignee and that have neither **feature requests** nor **test plan items** nor **plan items**.", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$inbox", + "editable": true + } +] \ No newline at end of file diff --git a/.vscode/notebooks/my-work.github-issues b/.vscode/notebooks/my-work.github-issues new file mode 100644 index 0000000000..c6d2309b39 --- /dev/null +++ b/.vscode/notebooks/my-work.github-issues @@ -0,0 +1,98 @@ +[ + { + "kind": 1, + "language": "markdown", + "value": "##### `Config`: This should be changed every month/milestone", + "editable": true + }, + { + "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\n\n// current milestone name\n$milestone=milestone:\"June 2020\"", + "editable": true + }, + { + "kind": 1, + "language": "github-issues", + "value": "## Milestone Work", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos $milestone assignee:@me is:open\n", + "editable": false + }, + { + "kind": 1, + "language": "github-issues", + "value": "## Bugs, Debt, Features...", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "#### My Bugs", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open label:bug", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "#### Debt & Engineering", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open label:debt OR $repos assignee:@me is:open label:engineering", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "#### Performance 🐌 🔜 🏎", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open label:perf OR $repos assignee:@me is:open label:perf-startup OR $repos assignee:@me is:open label:perf-bloat OR $repos assignee:@me is:open label:freeze-slow-crash-leak", + "editable": true + }, + { + "kind": 1, + "language": "markdown", + "value": "#### Feature Requests", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open label:feature-request milestone:Backlog sort:reactions-+1-desc", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open milestone:\"Backlog Candidates\"", + "editable": false + }, + { + "kind": 1, + "language": "markdown", + "value": "#### Not Actionable", + "editable": true + }, + { + "kind": 2, + "language": "github-issues", + "value": "$repos assignee:@me is:open label:\"needs more info\"", + "editable": false + } +] \ No newline at end of file diff --git a/.vscode/searches/es6.code-search b/.vscode/searches/es6.code-search index 3a708a4879..c89264a3cf 100644 --- a/.vscode/searches/es6.code-search +++ b/.vscode/searches/es6.code-search @@ -79,8 +79,8 @@ src/vs/base/common/strings.ts: 170 */ 171 export function endsWith(haystack: string, needle: string): boolean { - 853 - 854 /** - 855: * @deprecated ES6 - 856 */ - 857 export function repeat(s: string, count: number): string { + 861 + 862 /** + 863: * @deprecated ES6 + 864 */ + 865 export function repeat(s: string, count: number): string { diff --git a/.vscode/settings.json b/.vscode/settings.json index 1ffd534543..fb0e408051 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -72,7 +72,7 @@ }, "gulp.autoDetect": "off", "files.insertFinalNewline": true, - "[typescript]": { + "[typescript]": { "editor.defaultFormatter": "vscode.typescript-language-features" }, "typescript.tsc.autoDetect": "off" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b57b80fd84..2a0a50fa29 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -89,7 +89,7 @@ }, { "type": "shell", - "command": "yarn web -- --no-launch", + "command": "yarn web --no-launch", "label": "Run web", "isBackground": true, "problemMatcher": { diff --git a/.yarnrc b/.yarnrc index 00b2ebda69..1406d749d7 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "7.3.0" +target "7.3.1" runtime "electron" diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index 4961bfa344..e758389603 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -29,15 +29,7 @@ steps: yarn electron x64 displayName: Download Electron -- script: | - yarn gulp hygiene - displayName: Run Hygiene Checks - -- script: | # {{SQL CARBON EDIT}} add step - yarn strict-vscode - displayName: Run Strict Null Check. - -# - script: | {{SQL CARBON EDIT}} remove step +# - script: | {{SQL CARBON EDIT}} remove editor checks # yarn monaco-compile-check # displayName: Run Monaco Editor Checks diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index c404caa6e6..0e4045639e 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -36,15 +36,7 @@ steps: yarn electron displayName: Download Electron -- script: | - yarn gulp hygiene - displayName: Run Hygiene Checks - -- script: | # {{SQL CARBON EDIT}} add step - yarn strict-vscode - displayName: Run Strict Null Check - -# - powershell: | {{SQL CARBON EDIT}} remove step +# - powershell: | {{SQL CARBON EDIT}} remove editor check # yarn monaco-compile-check # displayName: Run Monaco Editor Checks diff --git a/build/builtin/main.js b/build/builtin/main.js index 65c8a28380..4b241776d5 100644 --- a/build/builtin/main.js +++ b/build/builtin/main.js @@ -10,7 +10,7 @@ const path = require('path'); let window = null; app.once('ready', () => { - window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true, enableWebSQL: false } }); + window = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true, webviewTag: true, enableWebSQL: false, nativeWindowOpen: true } }); window.setMenuBarVisibility(false); window.loadURL(url.format({ pathname: path.join(__dirname, 'index.html'), protocol: 'file:', slashes: true })); // window.webContents.openDevTools(); diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index 54d4dbd5c8..3a49ec83be 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -144,6 +144,7 @@ const copyrightFilter = [ '!extensions/*/server/bin/*', '!src/vs/editor/test/node/classification/typescript-test.ts', '!scripts/code-web.js', + '!resources/serverless/code-web.js', // {{SQL CARBON EDIT}} '!extensions/notebook/src/intellisense/text.ts', '!extensions/mssql/src/hdfs/webhdfs.ts', diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 90dca3bd61..2e0a9e4fd8 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -4,7 +4,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ Object.defineProperty(exports, "__esModule", { value: true }); -exports.packageRebuildExtensionsStream = exports.cleanRebuildExtensions = exports.packageExternalExtensionsStream = exports.packageMarketplaceExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0; +exports.packageRebuildExtensionsStream = exports.cleanRebuildExtensions = exports.packageExternalExtensionsStream = exports.packageMarketplaceWebExtensionsStream = exports.packageMarketplaceExtensionsStream = exports.packageLocalWebExtensionsStream = exports.packageLocalExtensionsStream = exports.fromMarketplace = void 0; const es = require("event-stream"); const fs = require("fs"); const glob = require("glob"); @@ -28,11 +28,7 @@ const util = require('./util'); const root = path.dirname(path.dirname(__dirname)); const commit = util.getVersion(root); const sourceMappingURLBase = `https://sqlopsbuilds.blob.core.windows.net/sourcemaps/${commit}`; -function fromLocal(extensionPath) { - const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js'); - const input = fs.existsSync(webpackFilename) - ? fromLocalWebpack(extensionPath) - : fromLocalNormal(extensionPath); +function minimizeLanguageJSON(input) { const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true }); return input .pipe(tmLanguageJsonFilter) @@ -43,12 +39,49 @@ function fromLocal(extensionPath) { })) .pipe(tmLanguageJsonFilter.restore); } -function fromLocalWebpack(extensionPath) { +function updateExtensionPackageJSON(input, update) { + const packageJsonFilter = filter('extensions/*/package.json', { restore: true }); + return input + .pipe(packageJsonFilter) + .pipe(buffer()) + .pipe(es.mapSync((f) => { + const data = JSON.parse(f.contents.toString('utf8')); + f.contents = Buffer.from(JSON.stringify(update(data))); + return f; + })) + .pipe(packageJsonFilter.restore); +} +function fromLocal(extensionPath, forWeb) { + const webpackConfigFileName = forWeb ? 'extension-browser.webpack.config.js' : 'extension.webpack.config.js'; + const isWebPacked = fs.existsSync(path.join(extensionPath, webpackConfigFileName)); + let input = isWebPacked + ? fromLocalWebpack(extensionPath, webpackConfigFileName) + : fromLocalNormal(extensionPath); + if (forWeb) { + input = updateExtensionPackageJSON(input, (data) => { + if (data.browser) { + data.main = data.browser; + } + data.extensionKind = ['web']; + return data; + }); + } + else if (isWebPacked) { + input = updateExtensionPackageJSON(input, (data) => { + if (data.main) { + data.main = data.main.replace('/out/', /dist/); + } + return data; + }); + } + return minimizeLanguageJSON(input); +} +function fromLocalWebpack(extensionPath, webpackConfigFileName) { const result = es.through(); const packagedDependencies = []; const packageJsonConfig = require(path.join(extensionPath, 'package.json')); if (packageJsonConfig.dependencies) { - const webpackRootConfig = require(path.join(extensionPath, 'extension.webpack.config.js')); + const webpackRootConfig = require(path.join(extensionPath, webpackConfigFileName)); for (const key in webpackRootConfig.externals) { if (key in packageJsonConfig.dependencies) { packagedDependencies.push(key); @@ -64,30 +97,9 @@ function fromLocalWebpack(extensionPath) { base: extensionPath, contents: fs.createReadStream(filePath) })); - const filesStream = es.readArray(files); // check for a webpack configuration files, then invoke webpack - // and merge its output with the files stream. also rewrite the package.json - // file to a new entry point - const webpackConfigLocations = glob.sync(path.join(extensionPath, '/**/extension.webpack.config.js'), { ignore: ['**/node_modules'] }); - const packageJsonFilter = filter(f => { - if (path.basename(f.path) === 'package.json') { - // only modify package.json's next to the webpack file. - // to be safe, use existsSync instead of path comparison. - return fs.existsSync(path.join(path.dirname(f.path), 'extension.webpack.config.js')); - } - return false; - }, { restore: true }); - const patchFilesStream = filesStream - .pipe(packageJsonFilter) - .pipe(buffer()) - .pipe(json((data) => { - if (data.main) { - // hardcoded entry point directory! - data.main = data.main.replace('/out/', /dist/); - } - return data; - })) - .pipe(packageJsonFilter.restore); + // and merge its output with the files stream. + const webpackConfigLocations = glob.sync(path.join(extensionPath, '**', webpackConfigFileName), { ignore: ['**/node_modules'] }); const webpackStreams = webpackConfigLocations.map(webpackConfigPath => { const webpackDone = (err, stats) => { fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); @@ -121,7 +133,7 @@ function fromLocalWebpack(extensionPath) { this.emit('data', data); })); }); - es.merge(...webpackStreams, patchFilesStream) + es.merge(...webpackStreams, es.readArray(files)) // .pipe(es.through(function (data) { // // debug // console.log('out', data.path, data.contents.length); @@ -228,15 +240,32 @@ function packageLocalExtensionsStream() { .filter(({ name }) => excludedExtensions.indexOf(name) === -1) .filter(({ name }) => builtInExtensions.every(b => b.name !== name)) .filter(({ name }) => externalExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} Remove external Extensions with separate package - const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' }); const localExtensions = localExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); + const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' }); return es.merge(nodeModules, ...localExtensions) .pipe(util2.setExecutableBit(['**/*.sh'])); } exports.packageLocalExtensionsStream = packageLocalExtensionsStream; +function packageLocalWebExtensionsStream() { + const localExtensionDescriptions = glob.sync('extensions/*/package.json') + .filter(manifestPath => { + const packageJsonConfig = require(path.join(root, manifestPath)); + return !packageJsonConfig.main || packageJsonConfig.browser; + }) + .map(manifestPath => { + const extensionPath = path.dirname(path.join(root, manifestPath)); + const extensionName = path.basename(extensionPath); + return { name: extensionName, path: extensionPath }; + }); + return es.merge(...localExtensionDescriptions.map(extension => { + return fromLocal(extension.path, true) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + })); +} +exports.packageLocalWebExtensionsStream = packageLocalWebExtensionsStream; function packageMarketplaceExtensionsStream() { const extensions = builtInExtensions.map(extension => { return fromMarketplace(extension.name, extension.version, extension.metadata) @@ -246,6 +275,22 @@ function packageMarketplaceExtensionsStream() { .pipe(util2.setExecutableBit(['**/*.sh'])); } exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream; +function packageMarketplaceWebExtensionsStream(builtInExtensions) { + const extensions = builtInExtensions + .map(extension => { + const input = fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + return updateExtensionPackageJSON(input, (data) => { + if (data.main) { + data.browser = data.main; + } + data.extensionKind = ['web']; + return data; + }); + }); + return es.merge(extensions); +} +exports.packageMarketplaceWebExtensionsStream = packageMarketplaceWebExtensionsStream; function packageExternalExtensionsStream() { const extenalExtensionDescriptions = glob.sync('extensions/*/package.json') .map(manifestPath => { @@ -255,13 +300,12 @@ function packageExternalExtensionsStream() { }) .filter(({ name }) => externalExtensions.indexOf(name) >= 0); const builtExtensions = extenalExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); return es.merge(builtExtensions); } exports.packageExternalExtensionsStream = packageExternalExtensionsStream; -// {{SQL CARBON EDIT}} - End function cleanRebuildExtensions(root) { return Promise.all(rebuildExtensions.map(async (e) => { await util2.rimraf(path.join(root, e))(); @@ -277,7 +321,7 @@ function packageRebuildExtensionsStream() { }) .filter(({ name }) => rebuildExtensions.indexOf(name) >= 0); const builtExtensions = extenalExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); return es.merge(builtExtensions); diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 755f7af2c6..589b5a8e64 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -28,14 +28,8 @@ const root = path.dirname(path.dirname(__dirname)); const commit = util.getVersion(root); const sourceMappingURLBase = `https://sqlopsbuilds.blob.core.windows.net/sourcemaps/${commit}`; -function fromLocal(extensionPath: string): Stream { - const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js'); - const input = fs.existsSync(webpackFilename) - ? fromLocalWebpack(extensionPath) - : fromLocalNormal(extensionPath); - +function minimizeLanguageJSON(input: Stream): Stream { const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true }); - return input .pipe(tmLanguageJsonFilter) .pipe(buffer()) @@ -46,13 +40,55 @@ function fromLocal(extensionPath: string): Stream { .pipe(tmLanguageJsonFilter.restore); } -function fromLocalWebpack(extensionPath: string): Stream { +function updateExtensionPackageJSON(input: Stream, update: (data: any) => any): Stream { + const packageJsonFilter = filter('extensions/*/package.json', { restore: true }); + return input + .pipe(packageJsonFilter) + .pipe(buffer()) + .pipe(es.mapSync((f: File) => { + const data = JSON.parse(f.contents.toString('utf8')); + f.contents = Buffer.from(JSON.stringify(update(data))); + return f; + })) + .pipe(packageJsonFilter.restore); +} + +function fromLocal(extensionPath: string, forWeb: boolean): Stream { + const webpackConfigFileName = forWeb ? 'extension-browser.webpack.config.js' : 'extension.webpack.config.js'; + + const isWebPacked = fs.existsSync(path.join(extensionPath, webpackConfigFileName)); + let input = isWebPacked + ? fromLocalWebpack(extensionPath, webpackConfigFileName) + : fromLocalNormal(extensionPath); + + if (forWeb) { + input = updateExtensionPackageJSON(input, (data: any) => { + if (data.browser) { + data.main = data.browser; + } + data.extensionKind = ['web']; + return data; + }); + } else if (isWebPacked) { + input = updateExtensionPackageJSON(input, (data: any) => { + if (data.main) { + data.main = data.main.replace('/out/', /dist/); + } + return data; + }); + } + + return minimizeLanguageJSON(input); +} + + +function fromLocalWebpack(extensionPath: string, webpackConfigFileName: string): Stream { const result = es.through(); const packagedDependencies: string[] = []; const packageJsonConfig = require(path.join(extensionPath, 'package.json')); if (packageJsonConfig.dependencies) { - const webpackRootConfig = require(path.join(extensionPath, 'extension.webpack.config.js')); + const webpackRootConfig = require(path.join(extensionPath, webpackConfigFileName)); for (const key in webpackRootConfig.externals) { if (key in packageJsonConfig.dependencies) { packagedDependencies.push(key); @@ -70,38 +106,13 @@ function fromLocalWebpack(extensionPath: string): Stream { contents: fs.createReadStream(filePath) as any })); - const filesStream = es.readArray(files); - // check for a webpack configuration files, then invoke webpack - // and merge its output with the files stream. also rewrite the package.json - // file to a new entry point + // and merge its output with the files stream. const webpackConfigLocations = (glob.sync( - path.join(extensionPath, '/**/extension.webpack.config.js'), + path.join(extensionPath, '**', webpackConfigFileName), { ignore: ['**/node_modules'] } )); - const packageJsonFilter = filter(f => { - if (path.basename(f.path) === 'package.json') { - // only modify package.json's next to the webpack file. - // to be safe, use existsSync instead of path comparison. - return fs.existsSync(path.join(path.dirname(f.path), 'extension.webpack.config.js')); - } - return false; - }, { restore: true }); - - const patchFilesStream = filesStream - .pipe(packageJsonFilter) - .pipe(buffer()) - .pipe(json((data: any) => { - if (data.main) { - // hardcoded entry point directory! - data.main = data.main.replace('/out/', /dist/); - } - return data; - })) - .pipe(packageJsonFilter.restore); - - const webpackStreams = webpackConfigLocations.map(webpackConfigPath => { const webpackDone = (err: any, stats: any) => { @@ -143,7 +154,7 @@ function fromLocalWebpack(extensionPath: string): Stream { })); }); - es.merge(...webpackStreams, patchFilesStream) + es.merge(...webpackStreams, es.readArray(files)) // .pipe(es.through(function (data) { // // debug // console.log('out', data.path, data.contents.length); @@ -274,16 +285,35 @@ export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream { .filter(({ name }) => builtInExtensions.every(b => b.name !== name)) .filter(({ name }) => externalExtensions.indexOf(name) === -1); // {{SQL CARBON EDIT}} Remove external Extensions with separate package - const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' }); + const localExtensions = localExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); + const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' }); return es.merge(nodeModules, ...localExtensions) .pipe(util2.setExecutableBit(['**/*.sh'])); } +export function packageLocalWebExtensionsStream(): NodeJS.ReadWriteStream { + const localExtensionDescriptions = (glob.sync('extensions/*/package.json')) + .filter(manifestPath => { + const packageJsonConfig = require(path.join(root, manifestPath)); + return !packageJsonConfig.main || packageJsonConfig.browser; + }) + .map(manifestPath => { + const extensionPath = path.dirname(path.join(root, manifestPath)); + const extensionName = path.basename(extensionPath); + return { name: extensionName, path: extensionPath }; + }); + + return es.merge(...localExtensionDescriptions.map(extension => { + return fromLocal(extension.path, true) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + })); +} + export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream { const extensions = builtInExtensions.map(extension => { return fromMarketplace(extension.name, extension.version, extension.metadata) @@ -294,6 +324,22 @@ export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream { .pipe(util2.setExecutableBit(['**/*.sh'])); } +export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltInExtension[]): NodeJS.ReadWriteStream { + const extensions = builtInExtensions + .map(extension => { + const input = fromMarketplace(extension.name, extension.version, extension.metadata) + .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); + return updateExtensionPackageJSON(input, (data: any) => { + if (data.main) { + data.browser = data.main; + } + data.extensionKind = ['web']; + return data; + }); + }); + return es.merge(extensions); +} + export function packageExternalExtensionsStream(): NodeJS.ReadWriteStream { const extenalExtensionDescriptions = (glob.sync('extensions/*/package.json')) .map(manifestPath => { @@ -304,13 +350,12 @@ export function packageExternalExtensionsStream(): NodeJS.ReadWriteStream { .filter(({ name }) => externalExtensions.indexOf(name) >= 0); const builtExtensions = extenalExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); return es.merge(builtExtensions); } -// {{SQL CARBON EDIT}} - End export function cleanRebuildExtensions(root: string): Promise { return Promise.all(rebuildExtensions.map(async e => { @@ -328,7 +373,7 @@ export function packageRebuildExtensionsStream(): NodeJS.ReadWriteStream { .filter(({ name }) => rebuildExtensions.indexOf(name) >= 0); const builtExtensions = extenalExtensionDescriptions.map(extension => { - return fromLocal(extension.path) + return fromLocal(extension.path, false) .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`)); }); diff --git a/build/lib/i18n.js b/build/lib/i18n.js index d214a27fc8..9906ed3bd3 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -101,161 +101,158 @@ class TextModel { return this._lines; } } -let XLF = /** @class */ (() => { - class XLF { - constructor(project) { - this.project = project; - this.buffer = []; - this.files = Object.create(null); - this.numberOfMessages = 0; +class XLF { + constructor(project) { + this.project = project; + this.buffer = []; + this.files = Object.create(null); + this.numberOfMessages = 0; + } + toString() { + this.appendHeader(); + for (let file in this.files) { + this.appendNewLine(``, 2); + for (let item of this.files[file]) { + this.addStringItem(file, item); + } + this.appendNewLine('', 2); } - toString() { - this.appendHeader(); - for (let file in this.files) { - this.appendNewLine(``, 2); - for (let item of this.files[file]) { - this.addStringItem(file, item); + this.appendFooter(); + return this.buffer.join('\r\n'); + } + addFile(original, keys, messages) { + if (keys.length === 0) { + console.log('No keys in ' + original); + return; + } + if (keys.length !== messages.length) { + throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`); + } + this.numberOfMessages += keys.length; + this.files[original] = []; + let existingKeys = new Set(); + for (let i = 0; i < keys.length; i++) { + let key = keys[i]; + let realKey; + let comment; + if (Is.string(key)) { + realKey = key; + comment = undefined; + } + else if (LocalizeInfo.is(key)) { + realKey = key.key; + if (key.comment && key.comment.length > 0) { + comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n'); } - this.appendNewLine('', 2); } - this.appendFooter(); - return this.buffer.join('\r\n'); - } - addFile(original, keys, messages) { - if (keys.length === 0) { - console.log('No keys in ' + original); - return; + if (!realKey || existingKeys.has(realKey)) { + continue; } - if (keys.length !== messages.length) { - throw new Error(`Unmatching keys(${keys.length}) and messages(${messages.length}).`); - } - this.numberOfMessages += keys.length; - this.files[original] = []; - let existingKeys = new Set(); - for (let i = 0; i < keys.length; i++) { - let key = keys[i]; - let realKey; - let comment; - if (Is.string(key)) { - realKey = key; - comment = undefined; - } - else if (LocalizeInfo.is(key)) { - realKey = key.key; - if (key.comment && key.comment.length > 0) { - comment = key.comment.map(comment => encodeEntities(comment)).join('\r\n'); - } - } - if (!realKey || existingKeys.has(realKey)) { - continue; - } - existingKeys.add(realKey); - let message = encodeEntities(messages[i]); - this.files[original].push({ id: realKey, message: message, comment: comment }); - } - } - addStringItem(file, item) { - if (!item.id || item.message === undefined || item.message === null) { - throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`); - } - if (item.message.length === 0) { - log(`Item with id ${item.id} in file ${file} has an empty message.`); - } - this.appendNewLine(``, 4); - this.appendNewLine(`${item.message}`, 6); - if (item.comment) { - this.appendNewLine(`${item.comment}`, 6); - } - this.appendNewLine('', 4); - } - appendHeader() { - this.appendNewLine('', 0); - this.appendNewLine('', 0); - } - appendFooter() { - this.appendNewLine('', 0); - } - appendNewLine(content, indent) { - let line = new Line(indent); - line.append(content); - this.buffer.push(line.toString()); + existingKeys.add(realKey); + let message = encodeEntities(messages[i]); + this.files[original].push({ id: realKey, message: message, comment: comment }); } } - XLF.parsePseudo = function (xlfString) { - return new Promise((resolve) => { - let parser = new xml2js.Parser(); - let files = []; - parser.parseString(xlfString, function (_err, result) { - const fileNodes = result['xliff']['file']; - fileNodes.forEach(file => { - const originalFilePath = file.$.original; - const messages = {}; - const transUnits = file.body[0]['trans-unit']; - if (transUnits) { - transUnits.forEach((unit) => { - const key = unit.$.id; - const val = pseudify(unit.source[0]['_'].toString()); - if (key && val) { - messages[key] = decodeEntities(val); - } - }); - files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' }); - } - }); - resolve(files); - }); - }); - }; - XLF.parse = function (xlfString) { - return new Promise((resolve, reject) => { - let parser = new xml2js.Parser(); - let files = []; - parser.parseString(xlfString, function (err, result) { - if (err) { - reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); - } - const fileNodes = result['xliff']['file']; - if (!fileNodes) { - reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); - } - fileNodes.forEach((file) => { - const originalFilePath = file.$.original; - if (!originalFilePath) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); - } - let language = file.$['target-language']; - if (!language) { - reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); - } - const messages = {}; - const transUnits = file.body[0]['trans-unit']; - if (transUnits) { - transUnits.forEach((unit) => { - const key = unit.$.id; - if (!unit.target) { - return; // No translation available - } - let val = unit.target[0]; - if (typeof val !== 'string') { - val = val._; - } - if (key && val) { - messages[key] = decodeEntities(val); - } - else { - reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`)); - } - }); - files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() }); - } - }); - resolve(files); - }); - }); - }; - return XLF; -})(); + addStringItem(file, item) { + if (!item.id || item.message === undefined || item.message === null) { + throw new Error(`No item ID or value specified: ${JSON.stringify(item)}. File: ${file}`); + } + if (item.message.length === 0) { + log(`Item with id ${item.id} in file ${file} has an empty message.`); + } + this.appendNewLine(``, 4); + this.appendNewLine(`${item.message}`, 6); + if (item.comment) { + this.appendNewLine(`${item.comment}`, 6); + } + this.appendNewLine('', 4); + } + appendHeader() { + this.appendNewLine('', 0); + this.appendNewLine('', 0); + } + appendFooter() { + this.appendNewLine('', 0); + } + appendNewLine(content, indent) { + let line = new Line(indent); + line.append(content); + this.buffer.push(line.toString()); + } +} exports.XLF = XLF; +XLF.parsePseudo = function (xlfString) { + return new Promise((resolve) => { + let parser = new xml2js.Parser(); + let files = []; + parser.parseString(xlfString, function (_err, result) { + const fileNodes = result['xliff']['file']; + fileNodes.forEach(file => { + const originalFilePath = file.$.original; + const messages = {}; + const transUnits = file.body[0]['trans-unit']; + if (transUnits) { + transUnits.forEach((unit) => { + const key = unit.$.id; + const val = pseudify(unit.source[0]['_'].toString()); + if (key && val) { + messages[key] = decodeEntities(val); + } + }); + files.push({ messages: messages, originalFilePath: originalFilePath, language: 'ps' }); + } + }); + resolve(files); + }); + }); +}; +XLF.parse = function (xlfString) { + return new Promise((resolve, reject) => { + let parser = new xml2js.Parser(); + let files = []; + parser.parseString(xlfString, function (err, result) { + if (err) { + reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`)); + } + const fileNodes = result['xliff']['file']; + if (!fileNodes) { + reject(new Error(`XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.`)); + } + fileNodes.forEach((file) => { + const originalFilePath = file.$.original; + if (!originalFilePath) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.`)); + } + let language = file.$['target-language']; + if (!language) { + reject(new Error(`XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.`)); + } + const messages = {}; + const transUnits = file.body[0]['trans-unit']; + if (transUnits) { + transUnits.forEach((unit) => { + const key = unit.$.id; + if (!unit.target) { + return; // No translation available + } + let val = unit.target[0]; + if (typeof val !== 'string') { + val = val._; + } + if (key && val) { + messages[key] = decodeEntities(val); + } + else { + reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`)); + } + }); + files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() }); + } + }); + resolve(files); + }); + }); +}; class Limiter { constructor(maxDegreeOfParalellism) { this.maxDegreeOfParalellism = maxDegreeOfParalellism; diff --git a/build/lib/util.js b/build/lib/util.js index fa80fc7f32..17e538a69a 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -138,7 +138,7 @@ function loadSourcemaps() { version: '3', names: [], mappings: '', - sources: [f.relative.replace(/\//g, '/')], + sources: [f.relative], sourcesContent: [contents] }; cb(undefined, f); diff --git a/build/lib/util.ts b/build/lib/util.ts index bd4eee5395..b3d8330688 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -186,7 +186,7 @@ export function loadSourcemaps(): NodeJS.ReadWriteStream { version: '3', names: [], mappings: '', - sources: [f.relative.replace(/\//g, '/')], + sources: [f.relative], sourcesContent: [contents] }; diff --git a/build/package.json b/build/package.json index 300c1355d3..1081867e6e 100644 --- a/build/package.json +++ b/build/package.json @@ -40,7 +40,7 @@ "gulp-bom": "^1.0.0", "gulp-sourcemaps": "^1.11.0", "gulp-uglify": "^3.0.0", - "iconv-lite": "0.4.23", + "iconv-lite": "0.6.0", "mime": "^1.3.4", "minimatch": "3.0.4", "minimist": "^1.2.3", @@ -49,7 +49,7 @@ "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-node-resolve": "^5.2.0", "terser": "4.3.8", - "typescript": "^3.9.3", + "typescript": "^4.0.0-dev.20200615", "vsce": "1.48.0", "vscode-telemetry-extractor": "^1.5.4", "xml2js": "^0.4.17" diff --git a/build/polyfills/vscode-extension-telemetry.js b/build/polyfills/vscode-extension-telemetry.js new file mode 100644 index 0000000000..583364cde2 --- /dev/null +++ b/build/polyfills/vscode-extension-telemetry.js @@ -0,0 +1,26 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); + +let TelemetryReporter = (function () { + function TelemetryReporter(extensionId, extensionVersion, key) { + } + TelemetryReporter.prototype.updateUserOptIn = function (key) { + }; + TelemetryReporter.prototype.createAppInsightsClient = function (key) { + }; + TelemetryReporter.prototype.getCommonProperties = function () { + }; + TelemetryReporter.prototype.sendTelemetryEvent = function (eventName, properties, measurements) { + }; + TelemetryReporter.prototype.dispose = function () { + }; + TelemetryReporter.TELEMETRY_CONFIG_ID = 'telemetry'; + TelemetryReporter.TELEMETRY_CONFIG_ENABLED_ID = 'enableTelemetry'; + return TelemetryReporter; +}()); +exports.default = TelemetryReporter; diff --git a/build/polyfills/vscode-nls.js b/build/polyfills/vscode-nls.js new file mode 100644 index 0000000000..452a0d1a20 --- /dev/null +++ b/build/polyfills/vscode-nls.js @@ -0,0 +1,79 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +Object.defineProperty(exports, "__esModule", { value: true }); + +function format(message, args) { + let result; + // if (isPseudo) { + // // FF3B and FF3D is the Unicode zenkaku representation for [ and ] + // message = '\uFF3B' + message.replace(/[aouei]/g, '$&$&') + '\uFF3D'; + // } + if (args.length === 0) { + result = message; + } + else { + result = message.replace(/\{(\d+)\}/g, function (match, rest) { + let index = rest[0]; + let arg = args[index]; + let replacement = match; + if (typeof arg === 'string') { + replacement = arg; + } + else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) { + replacement = String(arg); + } + return replacement; + }); + } + return result; +} + +function localize(key, message) { + let args = []; + for (let _i = 2; _i < arguments.length; _i++) { + args[_i - 2] = arguments[_i]; + } + return format(message, args); +} + +function loadMessageBundle(file) { + return localize; +} + +let MessageFormat; +(function (MessageFormat) { + MessageFormat["file"] = "file"; + MessageFormat["bundle"] = "bundle"; + MessageFormat["both"] = "both"; +})(MessageFormat = exports.MessageFormat || (exports.MessageFormat = {})); +let BundleFormat; +(function (BundleFormat) { + // the nls.bundle format + BundleFormat["standalone"] = "standalone"; + BundleFormat["languagePack"] = "languagePack"; +})(BundleFormat = exports.BundleFormat || (exports.BundleFormat = {})); + +exports.loadMessageBundle = loadMessageBundle; +function config(opts) { + if (opts) { + if (isString(opts.locale)) { + options.locale = opts.locale.toLowerCase(); + options.language = options.locale; + resolvedLanguage = undefined; + resolvedBundles = Object.create(null); + } + if (opts.messageFormat !== undefined) { + options.messageFormat = opts.messageFormat; + } + if (opts.bundleFormat === BundleFormat.standalone && options.languagePackSupport === true) { + options.languagePackSupport = false; + } + } + isPseudo = options.locale === 'pseudo'; + return loadMessageBundle; +} +exports.config = config; diff --git a/build/win32/code.iss b/build/win32/code.iss index 2b54228502..ed22782db3 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -1,7 +1,8 @@ +#define RootLicenseFileName FileExists(RepoDir + '\LICENSE.rtf') ? 'LICENSE.rtf' : 'LICENSE.txt' #define LocalizedLanguageFile(Language = "") \ DirExists(RepoDir + "\licenses") && Language != "" \ ? ('; LicenseFile: "' + RepoDir + '\licenses\LICENSE-' + Language + '.txt"') \ - : '; LicenseFile: "' + RepoDir + '\LICENSE.txt"' + : '; LicenseFile: "' + RepoDir + '\' + RootLicenseFileName + '"' [Setup] AppId={#AppId} @@ -56,6 +57,9 @@ Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl,{#RepoDir}\build\ Name: "korean"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.ko.isl,{#RepoDir}\build\win32\i18n\messages.ko.isl" {#LocalizedLanguageFile("kor")} Name: "simplifiedChinese"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.zh-cn.isl,{#RepoDir}\build\win32\i18n\messages.zh-cn.isl" {#LocalizedLanguageFile("chs")} Name: "traditionalChinese"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.zh-tw.isl,{#RepoDir}\build\win32\i18n\messages.zh-tw.isl" {#LocalizedLanguageFile("cht")} +Name: "brazilianPortuguese"; MessagesFile: "compiler:Languages\BrazilianPortuguese.isl,{#RepoDir}\build\win32\i18n\messages.pt-br.isl" {#LocalizedLanguageFile("ptb")} +Name: "hungarian"; MessagesFile: "compiler:Languages\Hungarian.isl,{#RepoDir}\build\win32\i18n\messages.hu.isl" {#LocalizedLanguageFile("hun")} +Name: "turkish"; MessagesFile: "compiler:Languages\Turkish.isl,{#RepoDir}\build\win32\i18n\messages.tr.isl" {#LocalizedLanguageFile("trk")} [InstallDelete] Type: filesandordirs; Name: "{app}\resources\app\out"; Check: IsNotUpdate diff --git a/build/yarn.lock b/build/yarn.lock index aa7a66fab9..56b3835ef2 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -1804,10 +1804,10 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== +iconv-lite@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.0.tgz#66a93b80df0bd05d2a43a7426296b7f91073f125" + integrity sha512-43ZpGYZ9QtuutX5l6WC1DSO8ane9N+Ct5qPLF2OV7vM9abM69gnAbVkh66ibaZd3aOGkoP1ZmringlKhLBkw2Q== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -3523,10 +3523,10 @@ typescript@^3.0.1: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977" integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g== -typescript@^3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== +typescript@^4.0.0-dev.20200615: + version "4.0.0-dev.20200615" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.0-dev.20200615.tgz#5c06a0d5f25a29a018767970c6531fbbed7240e3" + integrity sha512-OD7KRTLimUwW5E1xHsAqXNjw0O0Krk9CgRVFYkqANv4fZisaN1LJI06u30D5QiNnHBzm2nBSzZIAhjj4MUqaRA== typical@^4.0.0: version "4.0.0" diff --git a/cgmanifest.json b/cgmanifest.json index f1ce13c720..b1fd733d7e 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -60,12 +60,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "8f502de1dc5b6df4218a900d0857de7a40301d98" + "commitHash": "bc8fc0d406d32e4c02f3ec9f161deaacbe4f5989" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "7.3.0" + "version": "7.3.1" }, { "component": { diff --git a/extensions/configuration-editing/.vscodeignore b/extensions/configuration-editing/.vscodeignore index f12c396fd0..de8e6dc591 100644 --- a/extensions/configuration-editing/.vscodeignore +++ b/extensions/configuration-editing/.vscodeignore @@ -3,4 +3,5 @@ src/** tsconfig.json out/** extension.webpack.config.js +extension-browser.webpack.config.js yarn.lock diff --git a/extensions/configuration-editing/extension-browser.webpack.config.js b/extensions/configuration-editing/extension-browser.webpack.config.js new file mode 100644 index 0000000000..cd76f68c8c --- /dev/null +++ b/extensions/configuration-editing/extension-browser.webpack.config.js @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + target: 'webworker', + context: __dirname, + entry: { + extension: './src/configurationEditingMain.ts' + }, + output: { + filename: 'configurationEditingMain.js' + }, + performance: { + hints: false + }, + resolve: { + alias: { + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') + } + } +}); +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/configuration-editing/extension.webpack.config.js b/extensions/configuration-editing/extension.webpack.config.js index 45f3d0ac4c..1d82036dc8 100644 --- a/extensions/configuration-editing/extension.webpack.config.js +++ b/extensions/configuration-editing/extension.webpack.config.js @@ -12,7 +12,10 @@ const withDefaults = require('../shared.webpack.config'); module.exports = withDefaults({ context: __dirname, entry: { - extension: './src/extension.ts', + extension: './src/configurationEditingMain.ts', + }, + output: { + filename: 'configurationEditingMain.js' }, resolve: { mainFields: ['module', 'main'] diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index f929c260fd..023745d0c2 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -12,7 +12,8 @@ "onLanguage:json", "onLanguage:jsonc" ], - "main": "./out/extension", + "main": "./out/configurationEditingMain", + "browser": "./dist/configurationEditingMain", "scripts": { "compile": "gulp compile-extension:configuration-editing", "watch": "gulp watch-extension:configuration-editing" diff --git a/extensions/configuration-editing/schemas/attachContainer.schema.json b/extensions/configuration-editing/schemas/attachContainer.schema.json index 015e32e801..c5d46bb836 100644 --- a/extensions/configuration-editing/schemas/attachContainer.schema.json +++ b/extensions/configuration-editing/schemas/attachContainer.schema.json @@ -45,6 +45,16 @@ "pattern": "^([a-z0-9A-Z][a-z0-9\\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\\-A-Z]*)$", "errorMessage": "Expected format '${publisher}.${name}'. Example: 'vscode.csharp'." } + }, + "postAttachCommand": { + "type": [ + "string", + "array" + ], + "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.", + "items": { + "type": "string" + } } } } diff --git a/extensions/configuration-editing/schemas/devContainer.schema.json b/extensions/configuration-editing/schemas/devContainer.schema.json index 5a69d57057..abf7469d35 100644 --- a/extensions/configuration-editing/schemas/devContainer.schema.json +++ b/extensions/configuration-editing/schemas/devContainer.schema.json @@ -68,9 +68,33 @@ "type": "string" } }, + "postStartCommand": { + "type": [ + "string", + "array" + ], + "description": "A command to run after starting the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.", + "items": { + "type": "string" + } + }, + "postAttachCommand": { + "type": [ + "string", + "array" + ], + "description": "A command to run after attaching to the container. If this is a single string, it will be run in a shell. If this is an array of strings, it will be run as a single command without shell.", + "items": { + "type": "string" + } + }, "devPort": { "type": "integer", "description": "The port VS Code can use to connect to its backend." + }, + "codespaces": { + "type": "object", + "description": "Codespaces-specific configuration." } } }, diff --git a/extensions/configuration-editing/src/extension.ts b/extensions/configuration-editing/src/configurationEditingMain.ts similarity index 100% rename from extensions/configuration-editing/src/extension.ts rename to extensions/configuration-editing/src/configurationEditingMain.ts diff --git a/extensions/dacpac/src/test/testContext.ts b/extensions/dacpac/src/test/testContext.ts index 813db94065..4f0285aee6 100644 --- a/extensions/dacpac/src/test/testContext.ts +++ b/extensions/dacpac/src/test/testContext.ts @@ -30,7 +30,8 @@ export function createContext(): TestContext { globalStoragePath: '', logPath: '', extensionUri: vscode.Uri.parse(''), - environmentVariableCollection: undefined as any + environmentVariableCollection: undefined as any, + extensionMode: undefined as any } }; } diff --git a/extensions/extension-editing/src/extensionLinter.ts b/extensions/extension-editing/src/extensionLinter.ts index 4e0e0cc69f..b52cdeec79 100644 --- a/extensions/extension-editing/src/extensionLinter.ts +++ b/extensions/extension-editing/src/extensionLinter.ts @@ -16,6 +16,11 @@ import { languages, workspace, Disposable, TextDocument, Uri, Diagnostic, Range, const product = JSON.parse(fs.readFileSync(path.join(env.appRoot, 'product.json'), { encoding: 'utf-8' })); const allowedBadgeProviders: string[] = (product.extensionAllowedBadgeProviders || []).map((s: string) => s.toLowerCase()); +const allowedBadgeProvidersRegex: RegExp[] = (product.extensionAllowedBadgeProvidersRegex || []).map((r: string) => new RegExp(r)); + +function isTrustedSVGSource(uri: Uri): boolean { + return allowedBadgeProviders.includes(uri.authority.toLowerCase()) || allowedBadgeProvidersRegex.some(r => r.test(uri.toString())); +} const httpsRequired = localize('httpsRequired', "Images must use the HTTPS protocol."); const svgsNotValid = localize('svgsNotValid', "SVGs are not a valid image source."); @@ -321,7 +326,7 @@ export class ExtensionLinter { diagnostics.push(new Diagnostic(range, message, DiagnosticSeverity.Warning)); } - if (endsWith(uri.path.toLowerCase(), '.svg') && allowedBadgeProviders.indexOf(uri.authority.toLowerCase()) === -1) { + if (endsWith(uri.path.toLowerCase(), '.svg') && !isTrustedSVGSource(uri)) { const range = new Range(document.positionAt(begin), document.positionAt(end)); diagnostics.push(new Diagnostic(range, svgsNotValid, DiagnosticSeverity.Warning)); } diff --git a/extensions/git/package.json b/extensions/git/package.json index d33bafbad5..318c6e733c 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -14,7 +14,8 @@ "Other" ], "activationEvents": [ - "*" + "*", + "onFileSystem:git" ], "main": "./out/main", "icon": "resources/icons/git.png", @@ -1870,14 +1871,14 @@ { "view": "explorer", "contents": "%view.workbench.cloneRepository%", - "when": "config.git.enabled" + "when": "config.git.enabled && git.state == initialized" } ] }, "dependencies": { "byline": "^5.0.0", "file-type": "^7.2.0", - "iconv-lite": "^0.4.24", + "iconv-lite": "0.6.0", "jschardet": "2.1.1", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.0.0", diff --git a/extensions/git/src/api/git.d.ts b/extensions/git/src/api/git.d.ts index 2a8d1cdf9b..6f7c8eb674 100644 --- a/extensions/git/src/api/git.d.ts +++ b/extensions/git/src/api/git.d.ts @@ -134,6 +134,8 @@ export interface CommitOptions { export interface BranchQuery { readonly remote?: boolean; + readonly pattern?: string; + readonly count?: number; readonly contains?: string; } diff --git a/extensions/git/src/fileSystemProvider.ts b/extensions/git/src/fileSystemProvider.ts index 74c50982b4..202e8f45f8 100644 --- a/extensions/git/src/fileSystemProvider.ts +++ b/extensions/git/src/fileSystemProvider.ts @@ -133,6 +133,8 @@ export class GitFileSystemProvider implements FileSystemProvider { } async stat(uri: Uri): Promise { + await this.model.isInitialized; + const { submoduleOf, path, ref } = fromGitUri(uri); const repository = submoduleOf ? this.model.getRepository(submoduleOf) : this.model.getRepository(uri); if (!repository) { @@ -158,6 +160,8 @@ export class GitFileSystemProvider implements FileSystemProvider { } async readFile(uri: Uri): Promise { + await this.model.isInitialized; + const { path, ref, submoduleOf } = fromGitUri(uri); if (submoduleOf) { diff --git a/extensions/git/src/git.ts b/extensions/git/src/git.ts index 5ebff9c193..55d9d12b50 100644 --- a/extensions/git/src/git.ts +++ b/extensions/git/src/git.ts @@ -422,7 +422,7 @@ export class Git { const result = await this.exec(repositoryPath, ['rev-parse', '--show-toplevel']); // Keep trailing spaces which are part of the directory name - const repoPath = path.normalize(result.stdout.trimLeft().replace(/(\r\n|\r|\n)+$/, '')); + const repoPath = path.normalize(result.stdout.trimLeft().replace(/[\r\n]+$/, '')); if (isWindows) { // On Git 2.25+ if you call `rev-parse --show-toplevel` on a mapped drive, instead of getting the mapped drive path back, you get the UNC path for the mapped drive. @@ -905,7 +905,7 @@ export class Repository { } async buffer(object: string): Promise { - const child = this.stream(['show', object]); + const child = this.stream(['show', '--textconv', object]); if (!child.stdout) { return Promise.reject('Can\'t open file from git'); @@ -978,7 +978,7 @@ export class Repository { } async detectObjectType(object: string): Promise<{ mimetype: string, encoding?: string }> { - const child = await this.stream(['show', object]); + const child = await this.stream(['show', '--textconv', object]); const buffer = await readBytes(child.stdout!, 4100); try { @@ -1791,13 +1791,23 @@ export class Repository { .map(([ref]) => ({ name: ref, type: RefType.Head } as Branch)); } - async getRefs(opts?: { sort?: 'alphabetically' | 'committerdate', contains?: string }): Promise { - const args = ['for-each-ref', '--format', '%(refname) %(objectname)']; + async getRefs(opts?: { sort?: 'alphabetically' | 'committerdate', contains?: string, pattern?: string, count?: number }): Promise { + const args = ['for-each-ref']; + + if (opts?.count) { + args.push(`--count=${opts.count}`); + } if (opts && opts.sort && opts.sort !== 'alphabetically') { args.push('--sort', `-${opts.sort}`); } + args.push('--format', '%(refname) %(objectname)'); + + if (opts?.pattern) { + args.push(opts.pattern); + } + if (opts?.contains) { args.push('--contains', opts.contains); } @@ -1920,7 +1930,7 @@ export class Repository { } async getBranches(query: BranchQuery): Promise { - const refs = await this.getRefs({ contains: query.contains }); + const refs = await this.getRefs({ contains: query.contains, pattern: query.pattern ? `refs/${query.pattern}` : undefined, count: query.count }); return refs.filter(value => (value.type !== RefType.Tag) && (query.remote || !value.remote)); } diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index e698782f19..d41e202ebf 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -6,7 +6,7 @@ import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento, OutputChannel, commands } from 'vscode'; import { Repository, RepositoryState } from './repository'; import { memoize, sequentialize, debounce } from './decorators'; -import { dispose, anyEvent, filterEvent, isDescendant, firstIndex, pathEquals, toDisposable } from './util'; +import { dispose, anyEvent, filterEvent, isDescendant, firstIndex, pathEquals, toDisposable, eventToPromise } from './util'; import { Git } from './git'; import * as path from 'path'; import * as fs from 'fs'; @@ -77,6 +77,15 @@ export class Model implements IRemoteSourceProviderRegistry { commands.executeCommand('setContext', 'git.state', state); } + @memoize + get isInitialized(): Promise { + if (this._state === 'initialized') { + return Promise.resolve(); + } + + return eventToPromise(filterEvent(this.onDidChangeState, s => s === 'initialized')) as Promise; + } + private remoteSourceProviders = new Set(); private _onDidAddRemoteSourceProvider = new EventEmitter(); @@ -148,6 +157,13 @@ export class Model implements IRemoteSourceProviderRegistry { } private onPossibleGitRepositoryChange(uri: Uri): void { + const config = workspace.getConfiguration('git'); + const autoRepositoryDetection = config.get('autoRepositoryDetection'); + + if (autoRepositoryDetection === false) { + return; + } + this.eventuallyScanPossibleGitRepository(uri.fsPath.replace(/\.git.*$/, '')); } diff --git a/extensions/git/src/staging.ts b/extensions/git/src/staging.ts index f415420668..f20243f550 100644 --- a/extensions/git/src/staging.ts +++ b/extensions/git/src/staging.ts @@ -19,7 +19,7 @@ export function applyLineChanges(original: TextDocument, modified: TextDocument, // if this is a deletion at the very end of the document,then we need to account // for a newline at the end of the last line which may have been deleted // https://github.com/Microsoft/vscode/issues/59670 - if (isDeletion && diff.originalStartLineNumber === original.lineCount) { + if (isDeletion && diff.originalEndLineNumber === original.lineCount) { endLine -= 1; endCharacter = original.lineAt(endLine).range.end.character; } diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index f72600de7b..f03bee0ad5 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -425,10 +425,10 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.0.tgz#66a93b80df0bd05d2a43a7426296b7f91073f125" + integrity sha512-43ZpGYZ9QtuutX5l6WC1DSO8ane9N+Ct5qPLF2OV7vM9abM69gnAbVkh66ibaZd3aOGkoP1ZmringlKhLBkw2Q== dependencies: safer-buffer ">= 2.1.2 < 3" diff --git a/extensions/github-authentication/extension-browser.webpack.config.js b/extensions/github-authentication/extension-browser.webpack.config.js new file mode 100644 index 0000000000..9c37802ab9 --- /dev/null +++ b/extensions/github-authentication/extension-browser.webpack.config.js @@ -0,0 +1,49 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const path = require('path'); +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + target: 'webworker', + node: false, + entry: { + extension: './src/extension.ts', + }, + externals: { + 'keytar': 'commonjs keytar', + }, + // TODO@eamodio Deal with nls properly for the browser + // Specify module here, so we can stop the vscode-nls-dev loader from overwriting nls calls + module: { + rules: [{ + test: /\.ts$/, + exclude: /node_modules/, + use: [{ + // configure TypeScript loader: + // * enable sources maps for end-to-end source maps + loader: 'ts-loader', + options: { + compilerOptions: { + 'sourceMap': true, + } + } + }] + }] + }, + resolve: { + alias: { + 'node-fetch': path.resolve(__dirname, 'node_modules/node-fetch/browser.js'), + 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), + 'uuid': path.resolve(__dirname, 'node_modules/uuid/dist/esm-browser/index.js') + }, + } +}); diff --git a/extensions/github-authentication/package.json b/extensions/github-authentication/package.json index 6dab089127..b526e92146 100644 --- a/extensions/github-authentication/package.json +++ b/extensions/github-authentication/package.json @@ -32,20 +32,25 @@ }, "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "main": "./out/extension.js", + "browser": "./dist/extension.js", "scripts": { - "vscode:prepublish": "npm run compile", "compile": "gulp compile-extension:github-authentication", - "watch": "gulp watch-extension:github-authentication" + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch": "gulp watch-extension:github-authentication", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose", + "vscode:prepublish": "npm run compile" }, "dependencies": { - "uuid": "^3.3.3", + "node-fetch": "2.6.0", + "uuid": "8.1.0", "vscode-extension-telemetry": "0.1.1", "vscode-nls": "^4.1.2" }, "devDependencies": { "@types/keytar": "^4.4.2", "@types/node": "^10.12.21", - "@types/uuid": "^3.4.6", + "@types/node-fetch": "2.5.7", + "@types/uuid": "8.0.0", "typescript": "^3.7.5" } } diff --git a/extensions/github-authentication/src/common/keychain.ts b/extensions/github-authentication/src/common/keychain.ts index 3f33793c81..fc4d4d7320 100644 --- a/extensions/github-authentication/src/common/keychain.ts +++ b/extensions/github-authentication/src/common/keychain.ts @@ -5,7 +5,7 @@ // keytar depends on a native module shipped in vscode, so this is // how we load it -import * as keytarType from 'keytar'; +import type * as keytarType from 'keytar'; import * as vscode from 'vscode'; import Logger from './logger'; import * as nls from 'vscode-nls'; diff --git a/extensions/github-authentication/src/github.ts b/extensions/github-authentication/src/github.ts index 34fff37b46..252ac0aaf4 100644 --- a/extensions/github-authentication/src/github.ts +++ b/extensions/github-authentication/src/github.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as uuid from 'uuid'; +import { v4 as uuid } from 'uuid'; import { keychain } from './common/keychain'; import { GitHubServer, NETWORK_ERROR } from './githubServer'; import Logger from './common/logger'; diff --git a/extensions/github-authentication/src/githubServer.ts b/extensions/github-authentication/src/githubServer.ts index e2e252e8ee..ca174b92ad 100644 --- a/extensions/github-authentication/src/githubServer.ts +++ b/extensions/github-authentication/src/githubServer.ts @@ -3,10 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as https from 'https'; import * as nls from 'vscode-nls'; import * as vscode from 'vscode'; -import * as uuid from 'uuid'; +import fetch from 'node-fetch'; +import { v4 as uuid } from 'uuid'; import { PromiseAdapter, promiseFromEvent } from './common/utils'; import Logger from './common/logger'; @@ -23,6 +23,8 @@ class UriEventHandler extends vscode.EventEmitter implements vscode. export const uriHandler = new UriEventHandler; +const onDidManuallyProvideToken = new vscode.EventEmitter(); + const exchangeCodeForToken: (state: string) => PromiseAdapter = (state) => async (uri, resolve, reject) => { Logger.info('Exchanging code for token...'); @@ -34,33 +36,24 @@ const exchangeCodeForToken: (state: string) => PromiseAdapter { - const buffer: Buffer[] = []; - result.on('data', (chunk: Buffer) => { - buffer.push(chunk); - }); - result.on('end', () => { - if (result.statusCode === 200) { - const json = JSON.parse(Buffer.concat(buffer).toString()); - Logger.info('Token exchange success!'); - resolve(json.access_token); - } else { - reject(new Error(result.statusMessage)); + try { + const result = await fetch(`https://${AUTH_RELAY_SERVER}/token?code=${code}&state=${state}`, { + method: 'POST', + headers: { + Accept: 'application/json' } }); - }); - post.end(); - post.on('error', err => { - reject(err); - }); + if (result.ok) { + const json = await result.json(); + Logger.info('Token exchange success!'); + resolve(json.access_token); + } else { + reject(result.statusText); + } + } catch (ex) { + reject(ex); + } }; function parseQuery(uri: vscode.Uri) { @@ -80,11 +73,14 @@ export class GitHubServer { const state = uuid(); const callbackUri = await vscode.env.asExternalUri(vscode.Uri.parse(`${vscode.env.uriScheme}://vscode.github-authentication/did-authenticate`)); - const uri = vscode.Uri.parse(`https://${AUTH_RELAY_SERVER}/authorize/?callbackUri=${encodeURIComponent(callbackUri.toString())}&scope=${scopes}&state=${state}&responseType=code`); + const uri = vscode.Uri.parse(`https://${AUTH_RELAY_SERVER}/authorize/?callbackUri=${encodeURIComponent(callbackUri.toString())}&scope=${scopes}&state=${state}&responseType=code&authServer=https://github.com`); - vscode.env.openExternal(uri); + await vscode.env.openExternal(uri); - return promiseFromEvent(uriHandler.event, exchangeCodeForToken(state)).finally(() => { + return Promise.race([ + promiseFromEvent(uriHandler.event, exchangeCodeForToken(state)), + promiseFromEvent(onDidManuallyProvideToken.event) + ]).finally(() => { this.updateStatusBarItem(false); }); } @@ -111,44 +107,33 @@ export class GitHubServer { if (!uri.scheme || uri.scheme === 'file') { throw new Error; } uriHandler.handleUri(uri); } catch (e) { - Logger.error(e); - vscode.window.showErrorMessage(localize('unexpectedInput', "The input did not matched the expected format")); + // If it doesn't look like a URI, treat it as a token. + Logger.info('Treating input as token'); + onDidManuallyProvideToken.fire(uriOrToken); } } public async getUserInfo(token: string): Promise<{ id: string, accountName: string }> { - return new Promise((resolve, reject) => { - Logger.info('Getting account info...'); - const post = https.request({ - host: 'api.github.com', - path: `/user`, - method: 'GET', + try { + Logger.info('Getting user info...'); + const result = await fetch('https://api.github.com/user', { headers: { Authorization: `token ${token}`, 'User-Agent': 'Visual-Studio-Code' } - }, result => { - const buffer: Buffer[] = []; - result.on('data', (chunk: Buffer) => { - buffer.push(chunk); - }); - result.on('end', () => { - if (result.statusCode === 200) { - const json = JSON.parse(Buffer.concat(buffer).toString()); - Logger.info('Got account info!'); - resolve({ id: json.id, accountName: json.login }); - } else { - Logger.error(`Getting account info failed: ${result.statusMessage}`); - reject(new Error(result.statusMessage)); - } - }); }); - post.end(); - post.on('error', err => { - Logger.error(err.message); - reject(new Error(NETWORK_ERROR)); - }); - }); + if (result.ok) { + const json = await result.json(); + Logger.info('Got account info!'); + return { id: json.id, accountName: json.login }; + } else { + Logger.error(`Getting account info failed: ${result.statusText}`); + throw new Error(result.statusText); + } + } catch (ex) { + Logger.error(ex.message); + throw new Error(NETWORK_ERROR); + } } } diff --git a/extensions/github-authentication/yarn.lock b/extensions/github-authentication/yarn.lock index 5734d746bc..50f97842aa 100644 --- a/extensions/github-authentication/yarn.lock +++ b/extensions/github-authentication/yarn.lock @@ -9,15 +9,28 @@ dependencies: keytar "*" -"@types/node@^10.12.21": - version "10.17.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.14.tgz#b6c60ebf2fb5e4229fdd751ff9ddfae0f5f31541" - integrity sha512-G0UmX5uKEmW+ZAhmZ6PLTQ5eu/VPaT+d/tdLd5IFsKRPcbe6lPxocBtcYBFSaLaCW8O60AX90e91Nsp8lVHCNw== +"@types/node-fetch@2.5.7": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" -"@types/uuid@^3.4.6": - version "3.4.7" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-3.4.7.tgz#51d42247473bc00e38cc8dfaf70d936842a36c03" - integrity sha512-C2j2FWgQkF1ru12SjZJyMaTPxs/f6n90+5G5qNakBxKXjTBc/YTSelHh4Pz1HUDwxFXD9WvpQhOGCDC+/Y4mIQ== +"@types/node@*": + version "14.0.5" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.5.tgz#3d03acd3b3414cf67faf999aed11682ed121f22b" + integrity sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA== + +"@types/node@^10.12.21": + version "10.17.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.24.tgz#c57511e3a19c4b5e9692bb2995c40a3a52167944" + integrity sha512-5SCfvCxV74kzR3uWgTYiGxrd69TbT1I6+cMx1A5kEly/IVveJBimtAMlXiEyVFn5DvUFewQWxOOiJhlxeQwxgA== + +"@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== ansi-regex@^2.0.0: version "2.1.1" @@ -51,23 +64,50 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -bl@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.0.tgz#3611ec00579fd18561754360b21e9f784500ff88" - integrity sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +bl@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a" + integrity sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ== dependencies: - readable-stream "^3.0.1" + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +buffer@^5.5.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" @@ -90,6 +130,11 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -124,6 +169,15 @@ expand-template@^2.0.3: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -153,7 +207,12 @@ has-unicode@^2.0.0: resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= -inherits@^2.0.3, inherits@~2.0.3: +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +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== @@ -181,52 +240,69 @@ isarray@~1.0.0: integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= keytar@*: - version "5.1.0" - resolved "https://registry.yarnpkg.com/keytar/-/keytar-5.1.0.tgz#d572ed9250ff2b4c8d729621397e00b17bfa5581" - integrity sha512-SptCrRDqLbTeOMB2Z9UmVOS+OKguIrMft+EUaCB8xJPiFMjy6Jnmjgv/LA0rg1ENgLelzwSsC5PSQXF0uoqNDQ== + version "6.0.1" + resolved "https://registry.yarnpkg.com/keytar/-/keytar-6.0.1.tgz#996961abdebf300b2d34bb2eab6e42a8096b1ed8" + integrity sha512-1Ihpf2tdM3sLwGMkYHXYhVC/hx5BDR7CWFL4IrBA3IDZo0xHhS2nM+tU9Y+u/U7okNfbVkwmKsieLkcWRMh93g== dependencies: - nan "2.14.0" - prebuild-install "5.3.3" + node-addon-api "^3.0.0" + prebuild-install "5.3.4" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" mimic-response@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.0.0.tgz#996a51c60adf12cb8a87d7fb8ef24c2f3d5ebb46" - integrity sha512-8ilDoEapqA4uQ3TwS0jakGONKXVJqpy+RpM+3b7pLdOjghCrEiGp9SRkFbUHAmZW9vdnrENWHjaweIoTIJExSQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" + integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" - -nan@2.14.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + minimist "^1.2.5" napi-build-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.1.tgz#1381a0f92c39d66bf19852e7873432fc2123e508" - integrity sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA== + version "1.0.2" + resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== node-abi@^2.7.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.14.0.tgz#24650e24e8ffad2b61352519263f0cf4e2ddbfe9" - integrity sha512-y54KGgEOHnRHlGQi7E5UiryRkH8bmksmQLj/9iLAjoje743YS+KaKB/sDYXgqtT0J16JT3c3AYJZNI98aU/kYg== + version "2.17.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.17.0.tgz#f167c92780497ff01eeaf473fcf8138e0fcc87fa" + integrity sha512-dFRAA0ACk/aBo0TIXQMEWMLUTyWYYT8OBYIzLmEUrQTElGRjxDCvyBZIsDL0QA7QCaj9PrawhOmTEdsuLY4uOQ== dependencies: semver "^5.4.1" +node-addon-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.0.0.tgz#812446a1001a54f71663bed188314bba07e09247" + integrity sha512-sSHCgWfJ+Lui/u+0msF3oyCgvdkhxDbkCS6Q8uiJquzOimkJBvX6hl5aSSA7DR1XbMpdM8r7phjcF63sF4rkKg== + +node-fetch@2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + noop-logger@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" @@ -259,15 +335,15 @@ once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -prebuild-install@5.3.3: - version "5.3.3" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.3.tgz#ef4052baac60d465f5ba6bf003c9c1de79b9da8e" - integrity sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g== +prebuild-install@5.3.4: + version "5.3.4" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.3.4.tgz#6982d10084269d364c1856550b7d090ea31fa293" + integrity sha512-AkKN+pf4fSEihjapLEEj8n85YIw/tN6BQqkhzbDc0RvEZGdkpJBGMUYx66AAMcPG2KzmPQS7Cm16an4HVBRRMA== dependencies: detect-libc "^1.0.3" expand-template "^2.0.3" github-from-package "0.0.0" - minimist "^1.2.0" + minimist "^1.2.3" mkdirp "^0.5.1" napi-build-utils "^1.0.1" node-abi "^2.7.0" @@ -316,19 +392,19 @@ readable-stream@^2.0.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.1, readable-stream@^3.1.1: - version "3.5.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606" - integrity sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA== +readable-stream@^3.1.1, readable-stream@^3.4.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" safe-buffer@^5.0.1, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + 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: version "5.1.2" @@ -346,9 +422,9 @@ set-blocking@~2.0.0: integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== simple-concat@^1.0.0: version "1.0.0" @@ -415,21 +491,21 @@ strip-json-comments@~2.0.1: integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= tar-fs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.0.tgz#677700fc0c8b337a78bee3623fdc235f21d7afad" - integrity sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5" + integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg== dependencies: chownr "^1.1.1" - mkdirp "^0.5.1" + mkdirp-classic "^0.5.2" pump "^3.0.0" tar-stream "^2.0.0" tar-stream@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.0.tgz#d1aaa3661f05b38b5acc9b7020efdca5179a2cc3" - integrity sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.1.2.tgz#6d5ef1a7e5783a95ff70b69b97455a5968dc1325" + integrity sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q== dependencies: - bl "^3.0.0" + bl "^4.0.1" end-of-stream "^1.4.1" fs-constants "^1.0.0" inherits "^2.0.3" @@ -443,19 +519,19 @@ tunnel-agent@^0.6.0: safe-buffer "^5.0.1" typescript@^3.7.5: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== + version "3.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" + integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== 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" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -uuid@^3.3.3: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +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.1.1: version "0.1.1" diff --git a/extensions/github-browser/.gitignore b/extensions/github-browser/.gitignore new file mode 100644 index 0000000000..c19bd94aaa --- /dev/null +++ b/extensions/github-browser/.gitignore @@ -0,0 +1,3 @@ +dist +out +node_modules diff --git a/extensions/github-browser/.vscodeignore b/extensions/github-browser/.vscodeignore new file mode 100644 index 0000000000..32fe3f0369 --- /dev/null +++ b/extensions/github-browser/.vscodeignore @@ -0,0 +1,11 @@ +.vscode/** +build/** +dist/** +out/** +src/** +typings/** +.gitignore +extension-browser.webpack.config.js +extension.webpack.config.js +tsconfig.json +yarn.lock diff --git a/extensions/github-browser/README.md b/extensions/github-browser/README.md new file mode 100644 index 0000000000..ef4d6f58e8 --- /dev/null +++ b/extensions/github-browser/README.md @@ -0,0 +1,7 @@ +# GitHub FileSystem for Visual Studio Code + +**Notice:** This extension is bundled with Visual Studio Code. It can be disabled but not uninstalled. + +## Features + +This extension provides remote GitHub repository features for VS Code. diff --git a/extensions/github-browser/extension-browser.webpack.config.js b/extensions/github-browser/extension-browser.webpack.config.js new file mode 100644 index 0000000000..f60d4b688f --- /dev/null +++ b/extensions/github-browser/extension-browser.webpack.config.js @@ -0,0 +1,24 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; +const path = require('path'); +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + target: 'webworker', + node: false, + entry: { + extension: './src/extension.ts', + }, + resolve: { + alias: { + 'node-fetch': path.resolve(__dirname, 'node_modules/node-fetch/browser.js'), + }, + } +}); diff --git a/extensions/github-browser/extension.webpack.config.js b/extensions/github-browser/extension.webpack.config.js new file mode 100644 index 0000000000..35b95ccffc --- /dev/null +++ b/extensions/github-browser/extension.webpack.config.js @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + entry: { + extension: './src/extension.ts' + } +}); diff --git a/extensions/github-browser/package.json b/extensions/github-browser/package.json new file mode 100644 index 0000000000..c5228c0a17 --- /dev/null +++ b/extensions/github-browser/package.json @@ -0,0 +1,60 @@ +{ + "name": "github-browser", + "displayName": "%displayName%", + "description": "%description%", + "publisher": "vscode", + "version": "0.0.1", + "engines": { + "vscode": "^1.45.0" + }, + "enableProposedApi": true, + "private": true, + "categories": [ + "Other" + ], + "activationEvents": [ + "onFileSystem:github" + ], + "browser": "./dist/extension.js", + "main": "./out/extension.js", + "contributes": { + "resourceLabelFormatters": [ + { + "scheme": "github", + "authority": "HEAD", + "formatting": { + "label": "github.com${path}", + "separator": "/", + "workspaceSuffix": "GitHub" + } + }, + { + "scheme": "github", + "authority": "*", + "formatting": { + "label": "github.com${path} (${authority})", + "separator": "/", + "workspaceSuffix": "GitHub" + } + } + ] + }, + "scripts": { + "compile": "gulp compile-extension:github-browser", + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch": "gulp watch-extension:github-browser", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose", + "vscode:prepublish": "npm run compile" + }, + "dependencies": { + "@octokit/graphql": "4.5.0", + "@octokit/rest": "17.11.0", + "fuzzysort": "1.1.4", + "node-fetch": "2.6.0" + }, + "devDependencies": { + "@types/node-fetch": "2.5.7", + "webpack": "4.43.0", + "webpack-cli": "3.3.11" + } +} diff --git a/extensions/github-browser/package.nls.json b/extensions/github-browser/package.nls.json new file mode 100644 index 0000000000..69f0f91177 --- /dev/null +++ b/extensions/github-browser/package.nls.json @@ -0,0 +1,4 @@ +{ + "displayName": "GitHub Browser", + "description": "Remotely browse a GitHub repository" +} diff --git a/extensions/github-browser/src/extension.ts b/extensions/github-browser/src/extension.ts new file mode 100644 index 0000000000..d50d04c19c --- /dev/null +++ b/extensions/github-browser/src/extension.ts @@ -0,0 +1,11 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as vscode from 'vscode'; +import { GitHubFS } from './githubfs'; + +export function activate(context: vscode.ExtensionContext) { + context.subscriptions.push(new GitHubFS()); +} diff --git a/extensions/github-browser/src/githubfs.ts b/extensions/github-browser/src/githubfs.ts new file mode 100644 index 0000000000..f35fde146e --- /dev/null +++ b/extensions/github-browser/src/githubfs.ts @@ -0,0 +1,496 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import { + authentication, + AuthenticationSession2, + CancellationToken, + Disposable, + Event, + EventEmitter, + FileChangeEvent, + FileSearchOptions, + FileSearchProvider, + FileSearchQuery, + FileStat, + FileSystemError, + FileSystemProvider, + FileType, + Progress, + Range, + TextSearchComplete, + TextSearchOptions, + TextSearchProvider, + TextSearchQuery, + TextSearchResult, + Uri, + workspace, +} from 'vscode'; +import { Octokit } from '@octokit/rest'; +import { graphql } from '@octokit/graphql/'; +import * as fuzzySort from 'fuzzysort'; +import fetch from 'node-fetch'; +import { Iterables } from './iterables'; + +const emptyDisposable = { dispose: () => { /* noop */ } }; +const replaceBackslashRegex = /(\/|\\)/g; +const textEncoder = new TextEncoder(); + +interface Fuzzysort extends Fuzzysort.Fuzzysort { + prepareSlow(target: string): Fuzzysort.Prepared; + cleanup(): void; +} + +export class GitHubFS implements FileSystemProvider, FileSearchProvider, TextSearchProvider, Disposable { + static scheme = 'github'; + + private _onDidChangeFile = new EventEmitter(); + get onDidChangeFile(): Event { + return this._onDidChangeFile.event; + } + + private readonly disposable: Disposable; + private fsCache = new Map(); + + constructor() { + this.disposable = Disposable.from( + workspace.registerFileSystemProvider(GitHubFS.scheme, this, { + isCaseSensitive: true, + isReadonly: true, + }), + workspace.registerFileSearchProvider(GitHubFS.scheme, this), + workspace.registerTextSearchProvider(GitHubFS.scheme, this), + ); + } + + dispose() { + this.disposable?.dispose(); + } + + private _github: Promise | undefined; + get github(): Promise { + if (this._github === undefined) { + this._github = this.getGitHubApi(); + } + return this._github; + } + + private async getGitHubApi(): Promise { + try { + const session = await authentication.getSession('github', ['repo'], { createIfNone: true }); + return new GitHubApi(session); + } catch (ex) { + this._github = undefined; + throw ex; + } + } + + //#region FileSystemProvider + + watch(): Disposable { + return emptyDisposable; + } + + async stat(uri: Uri): Promise { + if (uri.path === '' || uri.path.lastIndexOf('/') === 0) { + return { type: FileType.Directory, size: 0, ctime: 0, mtime: 0 }; + } + + const data = await this.fsQuery<{ + __typename: string; + byteSize: number | undefined; + }>( + uri, + `__typename + ...on Blob { + byteSize + }`, + this.fsCache, + ); + + return { + type: typenameToFileType(data?.__typename), + size: data?.byteSize ?? 0, + ctime: 0, + mtime: 0, + }; + } + + async readDirectory(uri: Uri): Promise<[string, FileType][]> { + const data = await this.fsQuery<{ + entries: { name: string; type: string }[]; + }>( + uri, + `... on Tree { + entries { + name + type + } + }`, + this.fsCache, + ); + + return (data?.entries ?? []).map<[string, FileType]>(e => [ + e.name, + typenameToFileType(e.type), + ]); + } + + createDirectory(): void | Thenable { + throw FileSystemError.NoPermissions; + } + + async readFile(uri: Uri): Promise { + const data = await this.fsQuery<{ + oid: string; + isBinary: boolean; + text: string; + }>( + uri, + `... on Blob { + oid, + isBinary, + text + }`, + ); + + if (data?.isBinary) { + const { owner, repo, path } = fromGitHubUri(uri); + // e.g. https://raw.githubusercontent.com/eamodio/vscode-gitlens/HEAD/images/gitlens-icon.png + const downloadUri = uri.with({ + scheme: 'https', + authority: 'raw.githubusercontent.com', + path: `/${owner}/${repo}/HEAD/${path}`, + }); + + return downloadBinary(downloadUri); + } + + return textEncoder.encode(data?.text ?? ''); + } + + writeFile(): void | Thenable { + throw FileSystemError.NoPermissions; + } + + delete(): void | Thenable { + throw FileSystemError.NoPermissions; + } + + rename(): void | Thenable { + throw FileSystemError.NoPermissions; + } + + copy?(): void | Thenable { + throw FileSystemError.NoPermissions; + } + + //#endregion + + //#region FileSearchProvider + + private fileSearchCache = new Map(); + + async provideFileSearchResults( + query: FileSearchQuery, + options: FileSearchOptions, + token: CancellationToken, + ): Promise { + let searchable = this.fileSearchCache.get(options.folder.toString(true)); + if (searchable === undefined) { + const matches = await (await this.github)?.filesQuery(options.folder); + if (matches === undefined || token.isCancellationRequested) { return []; } + + searchable = [...Iterables.map(matches, m => (fuzzySort as Fuzzysort).prepareSlow(m))]; + this.fileSearchCache.set(options.folder.toString(true), searchable); + } + + if (options.maxResults === undefined || options.maxResults === 0 || options.maxResults >= searchable.length) { + const results = searchable.map(m => Uri.joinPath(options.folder, m.target)); + return results; + } + + const results = fuzzySort + .go(query.pattern.replace(replaceBackslashRegex, '/'), searchable, { + allowTypo: true, + limit: options.maxResults, + }) + .map(m => Uri.joinPath(options.folder, m.target)); + + (fuzzySort as Fuzzysort).cleanup(); + + return results; + } + + //#endregion + + //#region TextSearchProvider + + async provideTextSearchResults( + query: TextSearchQuery, + options: TextSearchOptions, + progress: Progress, + token: CancellationToken, + ): Promise { + const results = await (await this.github)?.searchQuery( + query.pattern, + options.folder, + { maxResults: options.maxResults, context: { before: options.beforeContext, after: options.afterContext } }, + token, + ); + if (results === undefined) { return { limitHit: true }; } + + let uri; + for (const m of results.matches) { + uri = Uri.joinPath(options.folder, m.path); + + progress.report({ + uri: uri, + ranges: m.ranges, + preview: { + text: m.preview, + matches: m.matches, + }, + }); + } + + return { limitHit: false }; + } + + //#endregion + + private async fsQuery(uri: Uri, query: string, cache?: Map): Promise { + const key = `${uri.toString()}:${getHashCode(query)}`; + + let data = cache?.get(key); + if (data !== undefined) { return data as T; } + + data = await (await this.github)?.fsQuery(uri, query); + cache?.set(key, data); + return data; + } +} + +async function downloadBinary(uri: Uri) { + const resp = await fetch(uri.toString()); + const array = new Uint8Array(await resp.arrayBuffer()); + return array; +} + +function typenameToFileType(typename: string | undefined | null) { + if (typename) { + typename = typename.toLocaleLowerCase(); + } + + switch (typename) { + case 'blob': + return FileType.File; + case 'tree': + return FileType.Directory; + default: + return FileType.Unknown; + } +} + +type RepoInfo = { owner: string; repo: string; path: string | undefined; ref?: string }; +function fromGitHubUri(uri: Uri): RepoInfo { + const [, owner, repo, ...rest] = uri.path.split('/'); + + let ref; + if (uri.authority) { + ref = uri.authority; + } + return { owner: owner, repo: repo, path: rest.join('/'), ref: ref }; +} + +function getHashCode(s: string): number { + let hash = 0; + + if (s.length === 0) { + return hash; + } + + let char; + const len = s.length; + for (let i = 0; i < len; i++) { + char = s.charCodeAt(i); + hash = ((hash << 5) - hash) + char; + hash |= 0; // Convert to 32bit integer + } + return hash; +} + +interface SearchQueryMatch { + path: string; + ranges: Range[]; + preview: string; + matches: Range[]; +} + +interface SearchQueryResults { + matches: SearchQueryMatch[]; + limitHit: boolean; +} + +class GitHubApi { + constructor(private readonly session: AuthenticationSession2) { } + + private _graphql: typeof graphql | undefined; + private get graphql() { + if (this._graphql === undefined) { + this._graphql = graphql.defaults({ + headers: { + Authorization: `Bearer ${this.token}`, + } + }); + } + + return this._graphql; + } + + get token() { + return this.session.accessToken; + } + + async filesQuery(uri: Uri) { + const { owner, repo, ref } = fromGitHubUri(uri); + try { + const resp = await new Octokit({ + auth: `token ${this.token}`, + }).git.getTree({ + owner: owner, + repo: repo, + recursive: '1', + tree_sha: ref ?? 'HEAD', + }); + return Iterables.filterMap(resp.data.tree, p => p.type === 'blob' ? p.path : undefined); + } catch (ex) { + return []; + } + } + + async searchQuery( + query: string, + uri: Uri, + options: { maxResults?: number; context?: { before?: number; after?: number } }, + _token: CancellationToken, + ): Promise { + const { owner, repo, ref } = fromGitHubUri(uri); + + // If we have a specific ref, don't try to search, because GitHub search only works against the default branch + if (ref === undefined) { + return { matches: [], limitHit: true }; + } + + try { + const resp = await new Octokit({ + auth: `token ${this.token}`, + request: { + headers: { + accept: 'application/vnd.github.v3.text-match+json', + }, + } + }).search.code({ + q: `${query} repo:${owner}/${repo}`, + }); + + // Since GitHub doesn't return ANY line numbers just fake it at the top of the file 😢 + const range = new Range(0, 0, 0, 0); + + const matches: SearchQueryMatch[] = []; + + console.log(resp.data.items.length, resp.data.items); + + let counter = 0; + let match: SearchQueryMatch; + for (const item of resp.data.items) { + for (const m of (item as typeof item & { text_matches: GitHubSearchTextMatch[] }).text_matches) { + counter++; + if (options.maxResults !== undefined && counter > options.maxResults) { + return { matches: matches, limitHit: true }; + } + + match = { + path: item.path, + ranges: [], + preview: m.fragment, + matches: [], + }; + + for (const lm of m.matches) { + let line = 0; + let shartChar = 0; + let endChar = 0; + for (let i = 0; i < lm.indices[1]; i++) { + if (i === lm.indices[0]) { + shartChar = endChar; + } + + if (m.fragment[i] === '\n') { + line++; + endChar = 0; + } else { + endChar++; + } + } + + match.ranges.push(range); + match.matches.push(new Range(line, shartChar, line, endChar)); + } + + matches.push(match); + } + } + + return { matches: matches, limitHit: false }; + } catch (ex) { + return { matches: [], limitHit: true }; + } + } + + async fsQuery(uri: Uri, innerQuery: string): Promise { + try { + const query = `query fs($owner: String!, $repo: String!, $path: String) { + repository(owner: $owner, name: $repo) { + object(expression: $path) { + ${innerQuery} + } + } +}`; + + const { owner, repo, path, ref } = fromGitHubUri(uri); + const variables = { + owner: owner, + repo: repo, + path: `${ref ?? 'HEAD'}:${path}`, + }; + + const rsp = await this.query<{ + repository: { object: T | null | undefined }; + }>(query, variables); + return rsp?.repository?.object ?? undefined; + } catch (ex) { + return undefined; + } + } + + query(query: string, variables: { [key: string]: string | number }): Promise { + return this.graphql(query, variables) as Promise; + } +} + +interface GitHubSearchTextMatch { + object_url: string; + object_type: string; + property: string; + fragment: string; + matches: GitHubSearchMatch[]; +} + +interface GitHubSearchMatch { + text: string; + indices: number[]; +} diff --git a/extensions/github-browser/src/iterables.ts b/extensions/github-browser/src/iterables.ts new file mode 100644 index 0000000000..0545b2bd70 --- /dev/null +++ b/extensions/github-browser/src/iterables.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +export namespace Iterables { + export function* filterMap( + source: Iterable | IterableIterator, + predicateMapper: (item: T) => TMapped | undefined | null, + ): Iterable { + for (const item of source) { + const mapped = predicateMapper(item); + // eslint-disable-next-line eqeqeq + if (mapped != null) { yield mapped; } + } + } + + export function* map( + source: Iterable | IterableIterator, + mapper: (item: T) => TMapped, + ): Iterable { + for (const item of source) { + yield mapper(item); + } + } +} diff --git a/extensions/github-browser/src/typings/ref.d.ts b/extensions/github-browser/src/typings/ref.d.ts new file mode 100644 index 0000000000..ffe0c6c693 --- /dev/null +++ b/extensions/github-browser/src/typings/ref.d.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/// +/// +/// diff --git a/extensions/github-browser/tsconfig.json b/extensions/github-browser/tsconfig.json new file mode 100644 index 0000000000..c88427aef8 --- /dev/null +++ b/extensions/github-browser/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../shared.tsconfig.json", + "compilerOptions": { + "outDir": "./out", + // "experimentalDecorators": true, + // "typeRoots": [ + // "./node_modules/@types" + // ] + }, + "include": [ + "src/**/*" + ] +} diff --git a/extensions/github-browser/yarn.lock b/extensions/github-browser/yarn.lock new file mode 100644 index 0000000000..bda914f9b1 --- /dev/null +++ b/extensions/github-browser/yarn.lock @@ -0,0 +1,2975 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@octokit/auth-token@^2.4.0": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.1.tgz#375d79eebd03750e6a9b0299e80b8167c7c85655" + integrity sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA== + dependencies: + "@octokit/types" "^4.0.1" + +"@octokit/core@^2.4.3": + version "2.5.3" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-2.5.3.tgz#dd754e6f5ad9b15631e9b276ae4f00ac2ea2cf9b" + integrity sha512-23AHK9xBW0v79Ck8h5U+5iA4MW7aosqv+Yr6uZXolVGNzzHwryNH5wM386/6+etiKUTwLFZTqyMU9oQpIBZcFA== + dependencies: + "@octokit/auth-token" "^2.4.0" + "@octokit/graphql" "^4.3.1" + "@octokit/request" "^5.4.0" + "@octokit/types" "^4.0.1" + before-after-hook "^2.1.0" + universal-user-agent "^5.0.0" + +"@octokit/endpoint@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.2.tgz#e876aafe68d7f9b6c6d80bf29458403f9afe7b2b" + integrity sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ== + dependencies: + "@octokit/types" "^4.0.1" + is-plain-object "^3.0.0" + universal-user-agent "^5.0.0" + +"@octokit/graphql@4.5.0", "@octokit/graphql@^4.3.1": + version "4.5.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.5.0.tgz#e111f841bc15722b1e9887f447fccab700cacdad" + integrity sha512-StJWfn0M1QfhL3NKBz31e1TdDNZrHLLS57J2hin92SIfzlOVBuUaRkp31AGkGOAFOAVtyEX6ZiZcsjcJDjeb5g== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^4.0.1" + universal-user-agent "^5.0.0" + +"@octokit/plugin-paginate-rest@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.1.tgz#b95ec46c841d51e5e625f383c579d132ab216d05" + integrity sha512-/tHpIF2XpN40AyhIq295YRjb4g7Q5eKob0qM3thYJ0Z+CgmNsWKM/fWse/SUR8+LdprP1O4ZzSKQE+71TCwK+w== + dependencies: + "@octokit/types" "^4.0.1" + +"@octokit/plugin-request-log@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" + integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== + +"@octokit/plugin-rest-endpoint-methods@3.17.0": + version "3.17.0" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz#d8ba04eb883849dd98666c55bf49d8c9fe7be055" + integrity sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg== + dependencies: + "@octokit/types" "^4.1.6" + deprecation "^2.3.1" + +"@octokit/request-error@^2.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.1.tgz#49bd71e811daffd5bdd06ef514ca47b5039682d1" + integrity sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ== + dependencies: + "@octokit/types" "^4.0.1" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^5.3.0", "@octokit/request@^5.4.0": + version "5.4.4" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.4.tgz#dc57e85e86284fa016d0c1a2701a70a10cec4ff2" + integrity sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^4.0.1" + deprecation "^2.0.0" + is-plain-object "^3.0.0" + node-fetch "^2.3.0" + once "^1.4.0" + universal-user-agent "^5.0.0" + +"@octokit/rest@17.11.0": + version "17.11.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-17.11.0.tgz#80db76d7d3442c998de5483575975f5591da84b8" + integrity sha512-WqXmm37uCGP1NxYxSc27hd5pYNLdksuUsjR8vaNS8fCy6kyxZFy+Dbh/AzqKGj2mOdbnt7dILoGHfzsA4IIm4A== + dependencies: + "@octokit/core" "^2.4.3" + "@octokit/plugin-paginate-rest" "^2.2.0" + "@octokit/plugin-request-log" "^1.0.0" + "@octokit/plugin-rest-endpoint-methods" "3.17.0" + +"@octokit/types@^4.0.1", "@octokit/types@^4.1.6": + version "4.1.9" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-4.1.9.tgz#a3e1ff1a15637ab830fbab0268c2d7ca824bc969" + integrity sha512-hinM/BA2c1vebN2HSR3JtVdYtrSbmvn/doUBZXXuQuh/9o60hYwitQQAGTpJu+k6pjtjURskDHQxUFvqLvYCeA== + dependencies: + "@types/node" ">= 8" + +"@types/node-fetch@2.5.7": + version "2.5.7" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c" + integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + +"@types/node@*", "@types/node@>= 8": + version "14.0.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.12.tgz#9c1d8ffb8084e8936603a6122a7649e40e68e04b" + integrity sha512-/sjzehvjkkpvLpYtN6/2dv5kg41otMGuHQUt9T2aiAuIfleCQRQHXXzF1eAw/qkZTj5Kcf4JSTf7EIizHocy6Q== + +"@webassemblyjs/ast@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" + integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== + dependencies: + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + +"@webassemblyjs/floating-point-hex-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" + integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== + +"@webassemblyjs/helper-api-error@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" + integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== + +"@webassemblyjs/helper-buffer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" + integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== + +"@webassemblyjs/helper-code-frame@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" + integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== + dependencies: + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/helper-fsm@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" + integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== + +"@webassemblyjs/helper-module-context@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" + integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + +"@webassemblyjs/helper-wasm-bytecode@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" + integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== + +"@webassemblyjs/helper-wasm-section@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" + integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + +"@webassemblyjs/ieee754@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" + integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" + integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" + integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== + +"@webassemblyjs/wasm-edit@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" + integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/helper-wasm-section" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-opt" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + "@webassemblyjs/wast-printer" "1.9.0" + +"@webassemblyjs/wasm-gen@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" + integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wasm-opt@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" + integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-buffer" "1.9.0" + "@webassemblyjs/wasm-gen" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + +"@webassemblyjs/wasm-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" + integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-wasm-bytecode" "1.9.0" + "@webassemblyjs/ieee754" "1.9.0" + "@webassemblyjs/leb128" "1.9.0" + "@webassemblyjs/utf8" "1.9.0" + +"@webassemblyjs/wast-parser@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" + integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/floating-point-hex-parser" "1.9.0" + "@webassemblyjs/helper-api-error" "1.9.0" + "@webassemblyjs/helper-code-frame" "1.9.0" + "@webassemblyjs/helper-fsm" "1.9.0" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/wast-printer@1.9.0": + version "1.9.0" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" + integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/wast-parser" "1.9.0" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +acorn@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" + integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== + +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + +ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" + integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== + +ajv@^6.1.0, ajv@^6.10.2: + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +anymatch@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" + integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +aproba@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + +arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +asn1.js@^4.0.0: + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +assert@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" + integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== + dependencies: + object-assign "^4.1.1" + util "0.10.3" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + +async-each@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +base64-js@^1.0.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" + integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +before-after-hook@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" + integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== + +binary-extensions@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" + integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: + version "4.11.9" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" + integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== + +bn.js@^5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@~3.0.2: + 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" + +brorand@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browserify-aes@^1.0.0, browserify-aes@^1.0.4: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + dependencies: + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" + +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= + dependencies: + bn.js "^4.1.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== + dependencies: + pako "~1.0.5" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer@^4.3.0: + version "4.9.2" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +builtin-status-codes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= + +cacache@^12.0.2: + version "12.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" + integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== + dependencies: + bluebird "^3.5.5" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.4" + graceful-fs "^4.1.15" + infer-owner "^1.0.3" + lru-cache "^5.1.1" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.3" + ssri "^6.0.1" + unique-filename "^1.1.1" + y18n "^4.0.0" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +chalk@2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chokidar@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + +chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" + integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== + dependencies: + tslib "^1.9.0" + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@^2.20.0: + 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== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + +component-emitter@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +console-browserify@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" + integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== + +constants-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= + +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + +create-ecdh@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + dependencies: + bn.js "^4.1.0" + elliptic "^6.0.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@6.0.5, cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +crypto-browserify@^3.11.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +cyclist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" + integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= + +debug@^2.2.0, debug@^2.3.3: + 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" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + +define-property@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + +deprecation@^2.0.0, deprecation@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= + +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + +domain-browser@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +elliptic@^6.0.0, elliptic@^6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emojis-list@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enhanced-resolve@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" + integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.5.0" + tapable "^1.0.0" + +errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + dependencies: + prr "~1.0.1" + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +eslint-scope@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" + integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +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: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +events@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59" + integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extglob@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +fast-deep-equal@^3.1.1: + 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== + +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" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +figgy-pudding@^3.5.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" + integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== + +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== + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.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" + +find-cache-dir@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" + integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== + dependencies: + commondir "^1.0.1" + make-dir "^2.0.0" + pkg-dir "^3.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +findup-sync@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" + integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + +fs-write-stream-atomic@^1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@^1.2.7: + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fuzzysort@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/fuzzysort/-/fuzzysort-1.1.4.tgz#a0510206ed44532cbb52cf797bf5a3cb12acd4ba" + integrity sha512-JzK/lHjVZ6joAg3OnCjylwYXYVjRiwTY6Yb25LvfpJHK8bjisfnZJ5bY8aVWwTwCXgxPNgLAtmHL+Hs5q1ddLQ== + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +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" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-parent@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + +glob@^7.1.3, glob@^7.1.4: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hmac-drbg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= + +ieee754@^1.1.4: + version "1.1.13" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +iferr@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= + +import-local@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== + dependencies: + pkg-dir "^3.0.0" + resolve-cwd "^2.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +infer-owner@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" + integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, 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== + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +ini@^1.3.4, ini@^1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +interpret@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== + dependencies: + kind-of "^6.0.0" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== + dependencies: + kind-of "^6.0.0" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + +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.3, 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" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-plain-object@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" + integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== + dependencies: + isobject "^4.0.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-windows@^1.0.1, is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + +isobject@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" + integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== + +json-parse-better-errors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +loader-runner@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== + dependencies: + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +loader-utils@^1.2.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" + integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^1.0.1" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +macos-release@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" + integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + +make-dir@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" + integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +memory-fs@^0.4.0, memory-fs@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +memory-fs@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" + integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== + dependencies: + errno "^0.1.3" + readable-stream "^2.0.1" + +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" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +mime-db@1.44.0: + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== + +mime-types@^2.1.12: + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== + dependencies: + mime-db "1.44.0" + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.1, mkdirp@^0.5.3: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +move-concurrently@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +nan@^2.12.1: + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== + +nanomatch@^1.2.9: + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +neo-async@^2.5.0, neo-async@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" + integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-fetch@2.6.0, node-fetch@^2.3.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" + integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== + +node-libs-browser@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" + integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== + dependencies: + assert "^1.1.1" + browserify-zlib "^0.2.0" + buffer "^4.3.0" + console-browserify "^1.1.0" + constants-browserify "^1.0.0" + crypto-browserify "^3.11.0" + domain-browser "^1.1.1" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" + path-browserify "0.0.1" + process "^0.11.10" + punycode "^1.2.4" + querystring-es3 "^0.2.0" + readable-stream "^2.3.3" + stream-browserify "^2.0.1" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" + tty-browserify "0.0.0" + url "^0.11.0" + util "^0.11.0" + vm-browserify "^1.0.1" + +normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +os-name@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" + integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== + dependencies: + macos-release "^2.2.0" + windows-release "^3.1.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +pako@~1.0.5: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +parallel-transform@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" + integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== + dependencies: + cyclist "^1.0.1" + inherits "^2.0.3" + readable-stream "^2.1.5" + +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.5" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" + integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== + dependencies: + asn1.js "^4.0.0" + browserify-aes "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + +path-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" + integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +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= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pbkdf2@^3.0.3: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" + integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pkg-dir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== + dependencies: + find-up "^3.0.0" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" + +pump@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + dependencies: + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= + +punycode@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +querystring-es3@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= + +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, 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== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + +regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + +repeat-element@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + +repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= + dependencies: + resolve-from "^3.0.0" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + +ret@~0.1.10: + version "0.1.15" + resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== + +rimraf@^2.5.4, rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= + dependencies: + aproba "^1.1.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-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-regex@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== + dependencies: + ajv "^6.1.0" + ajv-errors "^1.0.0" + ajv-keywords "^3.1.0" + +semver@^5.5.0, semver@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +serialize-javascript@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea" + integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +setimmediate@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +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" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +signal-exit@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + +source-list-map@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@~0.5.12: + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + +source-map@^0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== + dependencies: + extend-shallow "^3.0.0" + +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + dependencies: + figgy-pudding "^3.5.1" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-browserify@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + dependencies: + inherits "~2.0.1" + readable-stream "^2.0.2" + +stream-each@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== + dependencies: + builtin-status-codes "^3.0.0" + inherits "^2.0.1" + readable-stream "^2.3.6" + to-arraybuffer "^1.0.0" + xtend "^4.0.0" + +stream-shift@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" + integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +supports-color@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +tapable@^1.0.0, tapable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +terser-webpack-plugin@^1.4.3: + version "1.4.4" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f" + integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA== + dependencies: + cacache "^12.0.2" + find-cache-dir "^2.1.0" + is-wsl "^1.1.0" + schema-utils "^1.0.0" + serialize-javascript "^3.1.0" + source-map "^0.6.1" + terser "^4.1.2" + webpack-sources "^1.4.0" + worker-farm "^1.7.0" + +terser@^4.1.2: + version "4.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" + integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== + dependencies: + commander "^2.20.0" + source-map "~0.6.1" + source-map-support "~0.5.12" + +through2@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + +timers-browserify@^2.0.4: + version "2.0.11" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" + integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== + dependencies: + setimmediate "^1.0.4" + +to-arraybuffer@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +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" + +to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + +tslib@^1.9.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tty-browserify@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + +union-value@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + +unique-filename@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" + integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" + integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== + dependencies: + imurmurhash "^0.1.4" + +universal-user-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-5.0.0.tgz#a3182aa758069bf0e79952570ca757de3579c1d9" + integrity sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q== + dependencies: + os-name "^3.1.0" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +upath@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +uri-js@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + dependencies: + punycode "^2.1.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + +url@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== + +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" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= + dependencies: + inherits "2.0.1" + +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" + +v8-compile-cache@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" + integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== + +vm-browserify@^1.0.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" + integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== + +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== + dependencies: + chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== + dependencies: + graceful-fs "^4.1.2" + neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" + +webpack-cli@3.3.11: + version "3.3.11" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.11.tgz#3bf21889bf597b5d82c38f215135a411edfdc631" + integrity sha512-dXlfuml7xvAFwYUPsrtQAA9e4DOe58gnzSxhgrO/ZM/gyXTBowrsYeubyN4mqGhYdpXMFNyQ6emjJS9M7OBd4g== + dependencies: + chalk "2.4.2" + cross-spawn "6.0.5" + enhanced-resolve "4.1.0" + findup-sync "3.0.0" + global-modules "2.0.0" + import-local "2.0.0" + interpret "1.2.0" + loader-utils "1.2.3" + supports-color "6.1.0" + v8-compile-cache "2.0.3" + yargs "13.2.4" + +webpack-sources@^1.4.0, webpack-sources@^1.4.1: + version "1.4.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack@4.43.0: + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== + dependencies: + "@webassemblyjs/ast" "1.9.0" + "@webassemblyjs/helper-module-context" "1.9.0" + "@webassemblyjs/wasm-edit" "1.9.0" + "@webassemblyjs/wasm-parser" "1.9.0" + acorn "^6.4.1" + ajv "^6.10.2" + ajv-keywords "^3.4.1" + chrome-trace-event "^1.0.2" + enhanced-resolve "^4.1.0" + eslint-scope "^4.0.3" + json-parse-better-errors "^1.0.2" + loader-runner "^2.4.0" + loader-utils "^1.2.3" + memory-fs "^0.4.1" + micromatch "^3.1.10" + mkdirp "^0.5.3" + neo-async "^2.6.1" + node-libs-browser "^2.2.1" + schema-utils "^1.0.0" + tapable "^1.1.3" + terser-webpack-plugin "^1.4.3" + watchpack "^1.6.1" + webpack-sources "^1.4.1" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +windows-release@^3.1.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.1.tgz#cb4e80385f8550f709727287bf71035e209c4ace" + integrity sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A== + dependencies: + execa "^1.0.0" + +worker-farm@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" + integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== + dependencies: + errno "~0.1.7" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +xtend@^4.0.0, xtend@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^13.1.0: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0" diff --git a/extensions/github/src/auth.ts b/extensions/github/src/auth.ts index df4bf778d1..77027e1829 100644 --- a/extensions/github/src/auth.ts +++ b/extensions/github/src/auth.ts @@ -24,7 +24,7 @@ function getAgent(url: string | undefined = process.env.HTTPS_PROXY): Agent { } } -const scopes = ['repo']; +const scopes = ['repo', 'workflow']; export async function getSession(): Promise { const authenticationSessions = await authentication.getSessions('github', scopes); diff --git a/extensions/github/src/extension.ts b/extensions/github/src/extension.ts index 41a8e541bc..ae43f9177f 100644 --- a/extensions/github/src/extension.ts +++ b/extensions/github/src/extension.ts @@ -11,9 +11,15 @@ import { GithubCredentialProviderManager } from './credentialProvider'; export async function activate(context: vscode.ExtensionContext) { const gitExtension = vscode.extensions.getExtension('vscode.git')!.exports; - const gitAPI = gitExtension.getAPI(1); - context.subscriptions.push(...registerCommands(gitAPI)); - context.subscriptions.push(gitAPI.registerRemoteSourceProvider(new GithubRemoteSourceProvider(gitAPI))); - context.subscriptions.push(new GithubCredentialProviderManager(gitAPI)); + try { + const gitAPI = gitExtension.getAPI(1); + + context.subscriptions.push(...registerCommands(gitAPI)); + context.subscriptions.push(gitAPI.registerRemoteSourceProvider(new GithubRemoteSourceProvider(gitAPI))); + context.subscriptions.push(new GithubCredentialProviderManager(gitAPI)); + } catch (err) { + console.error('Could not initialize GitHub extension'); + console.warn(err); + } } diff --git a/extensions/image-preview/extension-browser.webpack.config.js b/extensions/image-preview/extension-browser.webpack.config.js new file mode 100644 index 0000000000..b2f0995024 --- /dev/null +++ b/extensions/image-preview/extension-browser.webpack.config.js @@ -0,0 +1,29 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + context: __dirname, + target: 'webworker', + entry: { + extension: './src/extension.ts' + }, + resolve: { + alias: { + 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), + }, + } +}); + +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/image-preview/package.json b/extensions/image-preview/package.json index 48c7ae314a..2284ceb2ef 100644 --- a/extensions/image-preview/package.json +++ b/extensions/image-preview/package.json @@ -2,7 +2,10 @@ "name": "image-preview", "displayName": "%displayName%", "description": "%description%", - "extensionKind": ["ui", "workspace"], + "extensionKind": [ + "ui", + "workspace" + ], "version": "1.0.0", "publisher": "vscode", "icon": "icon.png", @@ -13,6 +16,7 @@ "vscode": "^1.39.0" }, "main": "./out/extension", + "browser": "./dist/extension.js", "categories": [ "Other" ], @@ -65,7 +69,9 @@ "compile": "gulp compile-extension:image-preview", "watch": "npm run build-preview && gulp watch-extension:image-preview", "vscode:prepublish": "npm run build-ext", - "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:image-preview ./tsconfig.json" + "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:image-preview ./tsconfig.json", + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { "vscode-extension-telemetry": "0.1.1", diff --git a/extensions/image-preview/src/extension.ts b/extensions/image-preview/src/extension.ts index ff91e5a909..22a9daeeec 100644 --- a/extensions/image-preview/src/extension.ts +++ b/extensions/image-preview/src/extension.ts @@ -10,8 +10,6 @@ import { BinarySizeStatusBarEntry } from './binarySizeStatusBarEntry'; import { ZoomStatusBarEntry } from './zoomStatusBarEntry'; export function activate(context: vscode.ExtensionContext) { - const extensionRoot = vscode.Uri.file(context.extensionPath); - const sizeStatusBarEntry = new SizeStatusBarEntry(); context.subscriptions.push(sizeStatusBarEntry); @@ -21,9 +19,9 @@ export function activate(context: vscode.ExtensionContext) { const zoomStatusBarEntry = new ZoomStatusBarEntry(); context.subscriptions.push(zoomStatusBarEntry); - const previewManager = new PreviewManager(extensionRoot, sizeStatusBarEntry, binarySizeStatusBarEntry, zoomStatusBarEntry); + const previewManager = new PreviewManager(context.extensionUri, sizeStatusBarEntry, binarySizeStatusBarEntry, zoomStatusBarEntry); - context.subscriptions.push(vscode.window.registerCustomEditorProvider2(PreviewManager.viewType, previewManager, { + context.subscriptions.push(vscode.window.registerCustomEditorProvider(PreviewManager.viewType, previewManager, { supportsMultipleEditorsPerDocument: true, })); diff --git a/extensions/json-language-features/.vscodeignore b/extensions/json-language-features/.vscodeignore index 3011e9dcd0..4b7f857a0e 100644 --- a/extensions/json-language-features/.vscodeignore +++ b/extensions/json-language-features/.vscodeignore @@ -15,4 +15,6 @@ server/.npmignore yarn.lock CONTRIBUTING.md server/extension.webpack.config.js -extension.webpack.config.js \ No newline at end of file +extension.webpack.config.js +server/extension-browser.webpack.config.js +extension-browser.webpack.config.js diff --git a/extensions/json-language-features/client/src/browser/jsonClientMain.ts b/extensions/json-language-features/client/src/browser/jsonClientMain.ts new file mode 100644 index 0000000000..c985f4dd22 --- /dev/null +++ b/extensions/json-language-features/client/src/browser/jsonClientMain.ts @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtensionContext } from 'vscode'; +import { LanguageClientOptions } from 'vscode-languageclient'; +import { startClient, LanguageClientConstructor } from '../jsonClient'; +import { LanguageClient } from 'vscode-languageclient/browser'; +import { RequestService } from '../requests'; + +declare const Worker: { + new(stringUrl: string): any; +}; + +declare function fetch(uri: string, options: any): any; + +// this method is called when vs code is activated +export function activate(context: ExtensionContext) { + const serverMain = context.asAbsolutePath('server/dist/browser/jsonServerMain.js'); + try { + const worker = new Worker(serverMain); + const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { + return new LanguageClient(id, name, clientOptions, worker); + }; + + const http: RequestService = { + getContent(uri: string) { + return fetch(uri, { mode: 'cors' }) + .then(function (response: any) { + return response.text(); + }); + } + }; + startClient(context, newLanguageClient, { http }); + + } catch (e) { + console.log(e); + } +} diff --git a/extensions/json-language-features/client/src/jsonMain.ts b/extensions/json-language-features/client/src/jsonClient.ts similarity index 82% rename from extensions/json-language-features/client/src/jsonMain.ts rename to extensions/json-language-features/client/src/jsonClient.ts index 3d0ea7060e..4249e4ea9d 100644 --- a/extensions/json-language-features/client/src/jsonMain.ts +++ b/extensions/json-language-features/client/src/jsonClient.ts @@ -2,11 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ - -import * as path from 'path'; -import * as fs from 'fs'; import * as nls from 'vscode-nls'; -import { xhr, XHRResponse, getErrorStatusDescription } from 'request-light'; const localize = nls.loadMessageBundle(); @@ -16,13 +12,13 @@ import { ProviderResult, TextEdit, Range, Position, Disposable, CompletionItem, CompletionList, CompletionContext, Hover, MarkdownString, } from 'vscode'; import { - LanguageClient, LanguageClientOptions, RequestType, ServerOptions, TransportKind, NotificationType, + LanguageClientOptions, RequestType, NotificationType, DidChangeConfigurationNotification, HandleDiagnosticsSignature, ResponseError, DocumentRangeFormattingParams, - DocumentRangeFormattingRequest, ProvideCompletionItemsSignature, ProvideHoverSignature + DocumentRangeFormattingRequest, ProvideCompletionItemsSignature, ProvideHoverSignature, CommonLanguageClient } from 'vscode-languageclient'; -import TelemetryReporter from 'vscode-extension-telemetry'; import { hash } from './utils/hash'; +import { RequestService, joinPath } from './requests'; namespace VSCodeContentRequest { export const type: RequestType = new RequestType('vscode/content'); @@ -53,12 +49,6 @@ namespace ResultLimitReachedNotification { export const type: NotificationType = new NotificationType('json/resultLimitReached'); } -interface IPackageInfo { - name: string; - version: string; - aiKey: string; -} - interface Settings { json?: { schemas?: JSONSchemaSettings[]; @@ -83,29 +73,27 @@ namespace SettingIds { export const maxItemsComputed = 'json.maxItemsComputed'; } -let telemetryReporter: TelemetryReporter | undefined; +export interface TelemetryReporter { + sendTelemetryEvent(eventName: string, properties?: { + [key: string]: string; + }, measurements?: { + [key: string]: number; + }): void; +} -export function activate(context: ExtensionContext) { +export type LanguageClientConstructor = (name: string, description: string, clientOptions: LanguageClientOptions) => CommonLanguageClient; + +export interface Runtime { + http: RequestService; + telemetry?: TelemetryReporter +} + +export function startClient(context: ExtensionContext, newLanguageClient: LanguageClientConstructor, runtime: Runtime) { const toDispose = context.subscriptions; let rangeFormatting: Disposable | undefined = undefined; - const packageInfo = getPackageInfo(context); - telemetryReporter = packageInfo && new TelemetryReporter(packageInfo.name, packageInfo.version, packageInfo.aiKey); - - const serverMain = readJSONFile(context.asAbsolutePath('./server/package.json')).main; - const serverModule = context.asAbsolutePath(path.join('server', serverMain)); - - // The debug options for the server - const debugOptions = { execArgv: ['--nolazy', '--inspect=' + (9000 + Math.round(Math.random() * 10000))] }; - - // If the extension is launch in debug mode the debug server options are use - // Otherwise the run options are used - const serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc }, - debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } - }; const documentSelector = ['json', 'jsonc']; @@ -119,6 +107,7 @@ export function activate(context: ExtensionContext) { toDispose.push(schemaResolutionErrorStatusBarItem); const fileSchemaErrors = new Map(); + let schemaDownloadEnabled = true; // Options to control the language client const clientOptions: LanguageClientOptions = { @@ -139,7 +128,7 @@ export function activate(context: ExtensionContext) { didChangeConfiguration: () => client.sendNotification(DidChangeConfigurationNotification.type, { settings: getSettings() }) }, handleDiagnostics: (uri: Uri, diagnostics: Diagnostic[], next: HandleDiagnosticsSignature) => { - const schemaErrorIndex = diagnostics.findIndex(candidate => candidate.code === /* SchemaResolveError */ 0x300); + const schemaErrorIndex = diagnostics.findIndex(isSchemaResolveError); if (schemaErrorIndex === -1) { fileSchemaErrors.delete(uri.toString()); @@ -149,6 +138,10 @@ export function activate(context: ExtensionContext) { const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; fileSchemaErrors.set(uri.toString(), schemaResolveDiagnostic.message); + if (!schemaDownloadEnabled) { + diagnostics = diagnostics.filter(d => !isSchemaResolveError(d)); + } + if (window.activeTextEditor && window.activeTextEditor.document.uri.toString() === uri.toString()) { schemaResolutionErrorStatusBarItem.show(); } @@ -197,49 +190,39 @@ export function activate(context: ExtensionContext) { }; // Create the language client and start the client. - const client = new LanguageClient('json', localize('jsonserver.name', 'JSON Language Server'), serverOptions, clientOptions); + const client = newLanguageClient('json', localize('jsonserver.name', 'JSON Language Server'), clientOptions); client.registerProposedFeatures(); const disposable = client.start(); toDispose.push(disposable); client.onReady().then(() => { const schemaDocuments: { [uri: string]: boolean } = {}; - let schemaDownloadEnabled = true; // handle content request client.onRequest(VSCodeContentRequest.type, (uriPath: string) => { const uri = Uri.parse(uriPath); if (uri.scheme === 'untitled') { - return Promise.reject(new Error(localize('untitled.schema', 'Unable to load {0}', uri.toString()))); + return Promise.reject(new ResponseError(3, localize('untitled.schema', 'Unable to load {0}', uri.toString()))); } if (uri.scheme !== 'http' && uri.scheme !== 'https') { return workspace.openTextDocument(uri).then(doc => { schemaDocuments[uri.toString()] = true; return doc.getText(); }, error => { - return Promise.reject(error); + return Promise.reject(new ResponseError(2, error.toString())); }); } else if (schemaDownloadEnabled) { - if (telemetryReporter && uri.authority === 'schema.management.azure.com') { + if (runtime.telemetry && uri.authority === 'schema.management.azure.com') { /* __GDPR__ "json.schema" : { "schemaURL" : { "classification": "SystemMetaData", "purpose": "FeatureInsight" } } */ - telemetryReporter.sendTelemetryEvent('json.schema', { schemaURL: uriPath }); + runtime.telemetry.sendTelemetryEvent('json.schema', { schemaURL: uriPath }); } - const headers = { 'Accept-Encoding': 'gzip, deflate' }; - return xhr({ url: uriPath, followRedirects: 5, headers }).then(response => { - return response.responseText; - }, (error: XHRResponse) => { - let extraInfo = error.responseText || error.toString(); - if (extraInfo.length > 256) { - extraInfo = `${extraInfo.substr(0, 256)}...`; - } - return Promise.reject(new ResponseError(error.status, getErrorStatusDescription(error.status) + '\n' + extraInfo)); - }); + return runtime.http.getContent(uriPath); } else { - return Promise.reject(localize('schemaDownloadDisabled', 'Downloading schemas is disabled through setting \'{0}\'', SettingIds.enableSchemaDownload)); + return Promise.reject(new ResponseError(1, localize('schemaDownloadDisabled', 'Downloading schemas is disabled through setting \'{0}\'', SettingIds.enableSchemaDownload))); } }); @@ -280,7 +263,7 @@ export function activate(context: ExtensionContext) { schemaResolutionErrorStatusBarItem.text = '$(watch)'; const activeDocUri = window.activeTextEditor.document.uri.toString(); client.sendRequest(ForceValidateRequest.type, activeDocUri).then((diagnostics) => { - const schemaErrorIndex = diagnostics.findIndex(candidate => candidate.code === /* SchemaResolveError */ 0x300); + const schemaErrorIndex = diagnostics.findIndex(isSchemaResolveError); if (schemaErrorIndex !== -1) { // Show schema resolution errors in status bar only; ref: #51032 const schemaResolveDiagnostic = diagnostics[schemaErrorIndex]; @@ -335,7 +318,7 @@ export function activate(context: ExtensionContext) { return client.sendRequest(DocumentRangeFormattingRequest.type, params, token).then( client.protocol2CodeConverter.asTextEdits, (error) => { - client.logFailedRequest(DocumentRangeFormattingRequest.type, error); + client.handleFailedRequest(DocumentRangeFormattingRequest.type, error, []); return Promise.resolve([]); } ); @@ -370,12 +353,6 @@ export function activate(context: ExtensionContext) { } - - -export function deactivate(): Promise { - return telemetryReporter ? telemetryReporter.dispose() : Promise.resolve(null); -} - function getSchemaAssociations(_context: ExtensionContext): ISchemaAssociation[] { const associations: ISchemaAssociation[] = []; extensions.all.forEach(extension => { @@ -388,9 +365,10 @@ function getSchemaAssociations(_context: ExtensionContext): ISchemaAssociation[] if (typeof fileMatch === 'string') { fileMatch = [fileMatch]; } - if (Array.isArray(fileMatch) && url) { - if (url[0] === '.' && url[1] === '/') { - url = Uri.file(path.join(extension.extensionPath, url)).toString(); + if (Array.isArray(fileMatch) && typeof url === 'string') { + let uri: string = url; + if (uri[0] === '.' && uri[1] === '/') { + uri = joinPath(extension.extensionUri, uri).toString(); } fileMatch = fileMatch.map(fm => { if (fm[0] === '%') { @@ -402,7 +380,7 @@ function getSchemaAssociations(_context: ExtensionContext): ISchemaAssociation[] } return fm; }); - associations.push({ fileMatch, uri: url }); + associations.push({ fileMatch, uri }); } }); } @@ -504,39 +482,18 @@ function getSettings(): Settings { return settings; } -function getSchemaId(schema: JSONSchemaSettings, folderUri?: Uri) { +function getSchemaId(schema: JSONSchemaSettings, folderUri?: Uri): string | undefined { let url = schema.url; if (!url) { if (schema.schema) { url = schema.schema.id || `vscode://schemas/custom/${encodeURIComponent(hash(schema.schema).toString(16))}`; } } else if (folderUri && (url[0] === '.' || url[0] === '/')) { - url = folderUri.with({ path: path.posix.join(folderUri.path, url) }).toString(); + url = joinPath(folderUri, url).toString(); } return url; } -function getPackageInfo(context: ExtensionContext): IPackageInfo | undefined { - const extensionPackage = readJSONFile(context.asAbsolutePath('./package.json')); - if (extensionPackage) { - return { - name: extensionPackage.name, - version: extensionPackage.version, - aiKey: extensionPackage.aiKey - }; - } - return undefined; -} - -function readJSONFile(location: string) { - try { - return JSON.parse(fs.readFileSync(location).toString()); - } catch (e) { - console.log(`Problems reading ${location}: ${e}`); - return {}; - } -} - function isThenable(obj: ProviderResult): obj is Thenable { return obj && (obj)['then']; } @@ -546,3 +503,7 @@ function updateMarkdownString(h: MarkdownString): MarkdownString { n.isTrusted = h.isTrusted; return n; } + +function isSchemaResolveError(d: Diagnostic) { + return d.code === /* SchemaResolveError */ 0x300; +} diff --git a/extensions/json-language-features/client/src/node/jsonClientMain.ts b/extensions/json-language-features/client/src/node/jsonClientMain.ts new file mode 100644 index 0000000000..a39aa0581e --- /dev/null +++ b/extensions/json-language-features/client/src/node/jsonClientMain.ts @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ExtensionContext } from 'vscode'; +import { startClient, LanguageClientConstructor } from '../jsonClient'; +import { ServerOptions, TransportKind, LanguageClientOptions, LanguageClient } from 'vscode-languageclient/node'; + +import * as fs from 'fs'; +import { xhr, XHRResponse, getErrorStatusDescription } from 'request-light'; + +import TelemetryReporter from 'vscode-extension-telemetry'; +import { RequestService } from '../requests'; + +let telemetry: TelemetryReporter | undefined; + +// this method is called when vs code is activated +export function activate(context: ExtensionContext) { + + const clientPackageJSON = getPackageInfo(context); + telemetry = new TelemetryReporter(clientPackageJSON.name, clientPackageJSON.version, clientPackageJSON.aiKey); + + const serverMain = `./server/${clientPackageJSON.main.indexOf('/dist/') !== -1 ? 'dist' : 'out'}/node/jsonServerMain`; + const serverModule = context.asAbsolutePath(serverMain); + + // The debug options for the server + const debugOptions = { execArgv: ['--nolazy', '--inspect=6044'] }; + + // If the extension is launch in debug mode the debug server options are use + // Otherwise the run options are used + const serverOptions: ServerOptions = { + run: { module: serverModule, transport: TransportKind.ipc }, + debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions } + }; + + const newLanguageClient: LanguageClientConstructor = (id: string, name: string, clientOptions: LanguageClientOptions) => { + return new LanguageClient(id, name, serverOptions, clientOptions); + }; + + startClient(context, newLanguageClient, { http: getHTTPRequestService(), telemetry }); +} + +export function deactivate(): Promise { + return telemetry ? telemetry.dispose() : Promise.resolve(null); +} + +interface IPackageInfo { + name: string; + version: string; + aiKey: string; + main: string; +} + +function getPackageInfo(context: ExtensionContext): IPackageInfo { + const location = context.asAbsolutePath('./package.json'); + try { + return JSON.parse(fs.readFileSync(location).toString()); + } catch (e) { + console.log(`Problems reading ${location}: ${e}`); + return { name: '', version: '', aiKey: '', main: '' }; + } +} + +function getHTTPRequestService(): RequestService { + return { + getContent(uri: string, _encoding?: string) { + const headers = { 'Accept-Encoding': 'gzip, deflate' }; + return xhr({ url: uri, followRedirects: 5, headers }).then(response => { + return response.responseText; + }, (error: XHRResponse) => { + return Promise.reject(error.responseText || getErrorStatusDescription(error.status) || error.toString()); + }); + } + }; +} diff --git a/extensions/json-language-features/client/src/requests.ts b/extensions/json-language-features/client/src/requests.ts new file mode 100644 index 0000000000..f4ad69adc4 --- /dev/null +++ b/extensions/json-language-features/client/src/requests.ts @@ -0,0 +1,68 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Uri } from 'vscode'; + +export interface RequestService { + getContent(uri: string, encoding?: string): Thenable; +} + +export function getScheme(uri: string) { + return uri.substr(0, uri.indexOf(':')); +} + +export function dirname(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return lastIndexOfSlash !== -1 ? uri.substr(0, lastIndexOfSlash) : ''; +} + +export function basename(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return uri.substr(lastIndexOfSlash + 1); +} + +const Slash = '/'.charCodeAt(0); +const Dot = '.'.charCodeAt(0); + +export function isAbsolutePath(path: string) { + return path.charCodeAt(0) === Slash; +} + +export function resolvePath(uri: Uri, path: string): Uri { + if (isAbsolutePath(path)) { + return uri.with({ path: normalizePath(path.split('/')) }); + } + return joinPath(uri, path); +} + +export function normalizePath(parts: string[]): string { + const newParts: string[] = []; + for (const part of parts) { + if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) { + // ignore + } else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) { + newParts.pop(); + } else { + newParts.push(part); + } + } + if (parts.length > 1 && parts[parts.length - 1].length === 0) { + newParts.push(''); + } + let res = newParts.join('/'); + if (parts[0].length === 0) { + res = '/' + res; + } + return res; +} + + +export function joinPath(uri: Uri, ...paths: string[]): Uri { + const parts = uri.path.split('/'); + for (let path of paths) { + parts.push(...path.split('/')); + } + return uri.with({ path: normalizePath(parts) }); +} diff --git a/extensions/json-language-features/extension-browser.webpack.config.js b/extensions/json-language-features/extension-browser.webpack.config.js new file mode 100644 index 0000000000..82d2212771 --- /dev/null +++ b/extensions/json-language-features/extension-browser.webpack.config.js @@ -0,0 +1,34 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + target: 'webworker', + context: path.join(__dirname, 'client'), + entry: { + extension: './src/browser/jsonClientMain.ts' + }, + output: { + filename: 'jsonClientMain.js', + path: path.join(__dirname, 'client', 'dist', 'browser') + }, + performance: { + hints: false + }, + resolve: { + alias: { + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') + } + } +}); +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/json-language-features/extension.webpack.config.js b/extensions/json-language-features/extension.webpack.config.js index d9262dca0d..12a74047e5 100644 --- a/extensions/json-language-features/extension.webpack.config.js +++ b/extensions/json-language-features/extension.webpack.config.js @@ -14,11 +14,11 @@ const webpack = require('webpack'); const config = withDefaults({ context: path.join(__dirname, 'client'), entry: { - extension: './src/jsonMain.ts', + extension: './src/node/jsonClientMain.ts' }, output: { - filename: 'jsonMain.js', - path: path.join(__dirname, 'client', 'dist') + filename: 'jsonClientMain.js', + path: path.join(__dirname, 'client', 'dist', 'node') } }); diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 2868c0c01a..6c7e2d7cf7 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -14,7 +14,8 @@ "onLanguage:json", "onLanguage:jsonc" ], - "main": "./client/out/jsonMain", + "main": "./client/out/node/jsonClientMain", + "browser": "./client/dist/browser/jsonClientMain", "enableProposedApi": true, "scripts": { "compile": "gulp compile-extension:json-language-features-client compile-extension:json-language-features-server", @@ -128,7 +129,7 @@ "dependencies": { "request-light": "^0.3.0", "vscode-extension-telemetry": "0.1.1", - "vscode-languageclient": "^6.1.3", + "vscode-languageclient": "7.0.0-next.5", "vscode-nls": "^4.1.2" }, "devDependencies": { diff --git a/extensions/json-language-features/server/extension-browser.webpack.config.js b/extensions/json-language-features/server/extension-browser.webpack.config.js new file mode 100644 index 0000000000..f9b229e163 --- /dev/null +++ b/extensions/json-language-features/server/extension-browser.webpack.config.js @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../../shared.webpack.config'); +const path = require('path'); + +const serverConfig = withDefaults({ + target: 'webworker', + context: __dirname, + entry: { + extension: './src/browser/jsonServerMain.ts', + }, + output: { + filename: 'jsonServerMain.js', + path: path.join(__dirname, 'dist', 'browser'), + libraryTarget: 'var' + }, + performance: { + hints: false + }, + resolve: { + alias: { + 'vscode-nls': path.resolve(__dirname, '../../../build/polyfills/vscode-nls.js') + } + } +}); +serverConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = serverConfig; diff --git a/extensions/json-language-features/server/extension.webpack.config.js b/extensions/json-language-features/server/extension.webpack.config.js index bc1319ac35..5fd446d440 100644 --- a/extensions/json-language-features/server/extension.webpack.config.js +++ b/extensions/json-language-features/server/extension.webpack.config.js @@ -14,11 +14,11 @@ const webpack = require('webpack'); const config = withDefaults({ context: path.join(__dirname), entry: { - extension: './src/jsonServerMain.ts', + extension: './src/node/jsonServerMain.ts', }, output: { filename: 'jsonServerMain.js', - path: path.join(__dirname, 'dist') + path: path.join(__dirname, 'dist', 'node'), } }); diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index b48b844c03..751e1dd5c3 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -14,9 +14,9 @@ "dependencies": { "jsonc-parser": "^2.2.1", "request-light": "^0.3.0", - "vscode-json-languageservice": "^3.6.0", - "vscode-languageserver": "^6.1.1", - "vscode-uri": "^2.1.1" + "vscode-json-languageservice": "^3.7.0", + "vscode-languageserver": "7.0.0-next.3", + "vscode-uri": "^2.1.2" }, "devDependencies": { "@types/mocha": "2.2.33", diff --git a/extensions/json-language-features/server/src/browser/jsonServerMain.ts b/extensions/json-language-features/server/src/browser/jsonServerMain.ts new file mode 100644 index 0000000000..5730a3cc5d --- /dev/null +++ b/extensions/json-language-features/server/src/browser/jsonServerMain.ts @@ -0,0 +1,16 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createConnection, BrowserMessageReader, BrowserMessageWriter } from 'vscode-languageserver/browser'; +import { startServer } from '../jsonServer'; + +declare let self: any; + +const messageReader = new BrowserMessageReader(self); +const messageWriter = new BrowserMessageWriter(self); + +const connection = createConnection(messageReader, messageWriter); + +startServer(connection, {}); diff --git a/extensions/json-language-features/server/src/jsonServer.ts b/extensions/json-language-features/server/src/jsonServer.ts new file mode 100644 index 0000000000..b9f6a8875e --- /dev/null +++ b/extensions/json-language-features/server/src/jsonServer.ts @@ -0,0 +1,504 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { + Connection, + TextDocuments, InitializeParams, InitializeResult, NotificationType, RequestType, + DocumentRangeFormattingRequest, Disposable, ServerCapabilities, TextDocumentSyncKind, TextEdit +} from 'vscode-languageserver'; + +import { formatError, runSafe, runSafeAsync } from './utils/runner'; +import { TextDocument, JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration, ClientCapabilities, Diagnostic, Range, Position } from 'vscode-json-languageservice'; +import { getLanguageModelCache } from './languageModelCache'; +import { RequestService, basename, resolvePath } from './requests'; + +interface ISchemaAssociations { + [pattern: string]: string[]; +} + +interface ISchemaAssociation { + fileMatch: string[]; + uri: string; +} + +namespace SchemaAssociationNotification { + export const type: NotificationType = new NotificationType('json/schemaAssociations'); +} + +namespace VSCodeContentRequest { + export const type: RequestType = new RequestType('vscode/content'); +} + +namespace SchemaContentChangeNotification { + export const type: NotificationType = new NotificationType('json/schemaContent'); +} + +namespace ResultLimitReachedNotification { + export const type: NotificationType = new NotificationType('json/resultLimitReached'); +} + +namespace ForceValidateRequest { + export const type: RequestType = new RequestType('json/validate'); +} + + +const workspaceContext = { + resolveRelativePath: (relativePath: string, resource: string) => { + const base = resource.substr(0, resource.lastIndexOf('/') + 1); + return resolvePath(base, relativePath); + } +}; + +export interface RuntimeEnvironment { + file?: RequestService; + http?: RequestService + configureHttpRequests?(proxy: string, strictSSL: boolean): void; +} + +export function startServer(connection: Connection, runtime: RuntimeEnvironment) { + + function getSchemaRequestService(handledSchemas: string[] = ['https', 'http', 'file']) { + const builtInHandlers: { [protocol: string]: RequestService | undefined } = {}; + for (let protocol of handledSchemas) { + if (protocol === 'file') { + builtInHandlers[protocol] = runtime.file; + } else if (protocol === 'http' || protocol === 'https') { + builtInHandlers[protocol] = runtime.http; + } + } + return (uri: string): Thenable => { + const protocol = uri.substr(0, uri.indexOf(':')); + + const builtInHandler = builtInHandlers[protocol]; + if (builtInHandler) { + return builtInHandler.getContent(uri); + } + return connection.sendRequest(VSCodeContentRequest.type, uri).then(responseText => { + return responseText; + }, error => { + return Promise.reject(error.message); + }); + }; + } + + // create the JSON language service + let languageService = getLanguageService({ + workspaceContext, + contributions: [], + clientCapabilities: ClientCapabilities.LATEST + }); + + // Create a text document manager. + const documents = new TextDocuments(TextDocument); + + // Make the text document manager listen on the connection + // for open, change and close text document events + documents.listen(connection); + + let clientSnippetSupport = false; + let dynamicFormatterRegistration = false; + let hierarchicalDocumentSymbolSupport = false; + + let foldingRangeLimitDefault = Number.MAX_VALUE; + let foldingRangeLimit = Number.MAX_VALUE; + let resultLimit = Number.MAX_VALUE; + let formatterMaxNumberOfEdits = Number.MAX_VALUE; + + // After the server has started the client sends an initialize request. The server receives + // in the passed params the rootPath of the workspace plus the client capabilities. + connection.onInitialize((params: InitializeParams): InitializeResult => { + + const handledProtocols = params.initializationOptions?.handledSchemaProtocols; + + languageService = getLanguageService({ + schemaRequestService: getSchemaRequestService(handledProtocols), + workspaceContext, + contributions: [], + clientCapabilities: params.capabilities + }); + + function getClientCapability(name: string, def: T) { + const keys = name.split('.'); + let c: any = params.capabilities; + for (let i = 0; c && i < keys.length; i++) { + if (!c.hasOwnProperty(keys[i])) { + return def; + } + c = c[keys[i]]; + } + return c; + } + + clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); + dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof params.initializationOptions?.provideFormatter !== 'boolean'); + foldingRangeLimitDefault = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); + hierarchicalDocumentSymbolSupport = getClientCapability('textDocument.documentSymbol.hierarchicalDocumentSymbolSupport', false); + formatterMaxNumberOfEdits = params.initializationOptions?.customCapabilities?.rangeFormatting?.editLimit || Number.MAX_VALUE; + const capabilities: ServerCapabilities = { + textDocumentSync: TextDocumentSyncKind.Incremental, + completionProvider: clientSnippetSupport ? { + resolveProvider: false, // turn off resolving as the current language service doesn't do anything on resolve. Also fixes #91747 + triggerCharacters: ['"', ':'] + } : undefined, + hoverProvider: true, + documentSymbolProvider: true, + documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true, + colorProvider: {}, + foldingRangeProvider: true, + selectionRangeProvider: true, + definitionProvider: true + }; + + return { capabilities }; + }); + + + + // The settings interface describes the server relevant settings part + interface Settings { + json: { + schemas: JSONSchemaSettings[]; + format: { enable: boolean; }; + resultLimit?: number; + }; + http: { + proxy: string; + proxyStrictSSL: boolean; + }; + } + + interface JSONSchemaSettings { + fileMatch?: string[]; + url?: string; + schema?: JSONSchema; + } + + + const limitExceededWarnings = function () { + const pendingWarnings: { [uri: string]: { features: { [name: string]: string }; timeout?: NodeJS.Timeout; } } = {}; + + return { + cancel(uri: string) { + const warning = pendingWarnings[uri]; + if (warning && warning.timeout) { + clearTimeout(warning.timeout); + delete pendingWarnings[uri]; + } + }, + + onResultLimitExceeded(uri: string, resultLimit: number, name: string) { + return () => { + let warning = pendingWarnings[uri]; + if (warning) { + if (!warning.timeout) { + // already shown + return; + } + warning.features[name] = name; + warning.timeout.refresh(); + } else { + warning = { features: { [name]: name } }; + warning.timeout = setTimeout(() => { + connection.sendNotification(ResultLimitReachedNotification.type, `${basename(uri)}: For performance reasons, ${Object.keys(warning.features).join(' and ')} have been limited to ${resultLimit} items.`); + warning.timeout = undefined; + }, 2000); + pendingWarnings[uri] = warning; + } + }; + } + }; + }(); + + let jsonConfigurationSettings: JSONSchemaSettings[] | undefined = undefined; + let schemaAssociations: ISchemaAssociations | ISchemaAssociation[] | undefined = undefined; + let formatterRegistration: Thenable | null = null; + + // The settings have changed. Is send on server activation as well. + connection.onDidChangeConfiguration((change) => { + let settings = change.settings; + if (runtime.configureHttpRequests) { + runtime.configureHttpRequests(settings.http && settings.http.proxy, settings.http && settings.http.proxyStrictSSL); + } + jsonConfigurationSettings = settings.json && settings.json.schemas; + updateConfiguration(); + + foldingRangeLimit = Math.trunc(Math.max(settings.json && settings.json.resultLimit || foldingRangeLimitDefault, 0)); + resultLimit = Math.trunc(Math.max(settings.json && settings.json.resultLimit || Number.MAX_VALUE, 0)); + + // dynamically enable & disable the formatter + if (dynamicFormatterRegistration) { + const enableFormatter = settings && settings.json && settings.json.format && settings.json.format.enable; + if (enableFormatter) { + if (!formatterRegistration) { + formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector: [{ language: 'json' }, { language: 'jsonc' }] }); + } + } else if (formatterRegistration) { + formatterRegistration.then(r => r.dispose()); + formatterRegistration = null; + } + } + }); + + // The jsonValidation extension configuration has changed + connection.onNotification(SchemaAssociationNotification.type, associations => { + schemaAssociations = associations; + updateConfiguration(); + }); + + // A schema has changed + connection.onNotification(SchemaContentChangeNotification.type, uri => { + languageService.resetSchema(uri); + }); + + // Retry schema validation on all open documents + connection.onRequest(ForceValidateRequest.type, uri => { + return new Promise(resolve => { + const document = documents.get(uri); + if (document) { + updateConfiguration(); + validateTextDocument(document, diagnostics => { + resolve(diagnostics); + }); + } else { + resolve([]); + } + }); + }); + + function updateConfiguration() { + const languageSettings = { + validate: true, + allowComments: true, + schemas: new Array() + }; + if (schemaAssociations) { + if (Array.isArray(schemaAssociations)) { + Array.prototype.push.apply(languageSettings.schemas, schemaAssociations); + } else { + for (const pattern in schemaAssociations) { + const association = schemaAssociations[pattern]; + if (Array.isArray(association)) { + association.forEach(uri => { + languageSettings.schemas.push({ uri, fileMatch: [pattern] }); + }); + } + } + } + } + if (jsonConfigurationSettings) { + jsonConfigurationSettings.forEach((schema, index) => { + let uri = schema.url; + if (!uri && schema.schema) { + uri = schema.schema.id || `vscode://schemas/custom/${index}`; + } + if (uri) { + languageSettings.schemas.push({ uri, fileMatch: schema.fileMatch, schema: schema.schema }); + } + }); + } + languageService.configure(languageSettings); + + // Revalidate any open text documents + documents.all().forEach(triggerValidation); + } + + // The content of a text document has changed. This event is emitted + // when the text document first opened or when its content has changed. + documents.onDidChangeContent((change) => { + limitExceededWarnings.cancel(change.document.uri); + triggerValidation(change.document); + }); + + // a document has closed: clear all diagnostics + documents.onDidClose(event => { + limitExceededWarnings.cancel(event.document.uri); + cleanPendingValidation(event.document); + connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); + }); + + const pendingValidationRequests: { [uri: string]: NodeJS.Timer; } = {}; + const validationDelayMs = 300; + + function cleanPendingValidation(textDocument: TextDocument): void { + const request = pendingValidationRequests[textDocument.uri]; + if (request) { + clearTimeout(request); + delete pendingValidationRequests[textDocument.uri]; + } + } + + function triggerValidation(textDocument: TextDocument): void { + cleanPendingValidation(textDocument); + pendingValidationRequests[textDocument.uri] = setTimeout(() => { + delete pendingValidationRequests[textDocument.uri]; + validateTextDocument(textDocument); + }, validationDelayMs); + } + + function validateTextDocument(textDocument: TextDocument, callback?: (diagnostics: Diagnostic[]) => void): void { + const respond = (diagnostics: Diagnostic[]) => { + connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); + if (callback) { + callback(diagnostics); + } + }; + if (textDocument.getText().length === 0) { + respond([]); // ignore empty documents + return; + } + const jsonDocument = getJSONDocument(textDocument); + const version = textDocument.version; + + const documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'warning' } : { comments: 'error', trailingCommas: 'error' }; + languageService.doValidation(textDocument, jsonDocument, documentSettings).then(diagnostics => { + setImmediate(() => { + const currDocument = documents.get(textDocument.uri); + if (currDocument && currDocument.version === version) { + respond(diagnostics); // Send the computed diagnostics to VSCode. + } + }); + }, error => { + connection.console.error(formatError(`Error while validating ${textDocument.uri}`, error)); + }); + } + + connection.onDidChangeWatchedFiles((change) => { + // Monitored files have changed in VSCode + let hasChanges = false; + change.changes.forEach(c => { + if (languageService.resetSchema(c.uri)) { + hasChanges = true; + } + }); + if (hasChanges) { + documents.all().forEach(triggerValidation); + } + }); + + const jsonDocuments = getLanguageModelCache(10, 60, document => languageService.parseJSONDocument(document)); + documents.onDidClose(e => { + jsonDocuments.onDocumentRemoved(e.document); + }); + connection.onShutdown(() => { + jsonDocuments.dispose(); + }); + + function getJSONDocument(document: TextDocument): JSONDocument { + return jsonDocuments.get(document); + } + + connection.onCompletion((textDocumentPosition, token) => { + return runSafeAsync(async () => { + const document = documents.get(textDocumentPosition.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); + } + return null; + }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); + }); + + connection.onHover((textDocumentPositionParams, token) => { + return runSafeAsync(async () => { + const document = documents.get(textDocumentPositionParams.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); + } + return null; + }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`, token); + }); + + connection.onDocumentSymbol((documentSymbolParams, token) => { + return runSafe(() => { + const document = documents.get(documentSymbolParams.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + const onResultLimitExceeded = limitExceededWarnings.onResultLimitExceeded(document.uri, resultLimit, 'document symbols'); + if (hierarchicalDocumentSymbolSupport) { + return languageService.findDocumentSymbols2(document, jsonDocument, { resultLimit, onResultLimitExceeded }); + } else { + return languageService.findDocumentSymbols(document, jsonDocument, { resultLimit, onResultLimitExceeded }); + } + } + return []; + }, [], `Error while computing document symbols for ${documentSymbolParams.textDocument.uri}`, token); + }); + + connection.onDocumentRangeFormatting((formatParams, token) => { + return runSafe(() => { + const document = documents.get(formatParams.textDocument.uri); + if (document) { + const edits = languageService.format(document, formatParams.range, formatParams.options); + if (edits.length > formatterMaxNumberOfEdits) { + const newText = TextDocument.applyEdits(document, edits); + return [TextEdit.replace(Range.create(Position.create(0, 0), document.positionAt(document.getText().length)), newText)]; + } + return edits; + } + return []; + }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); + }); + + connection.onDocumentColor((params, token) => { + return runSafeAsync(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + const onResultLimitExceeded = limitExceededWarnings.onResultLimitExceeded(document.uri, resultLimit, 'document colors'); + const jsonDocument = getJSONDocument(document); + return languageService.findDocumentColors(document, jsonDocument, { resultLimit, onResultLimitExceeded }); + } + return []; + }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); + }); + + connection.onColorPresentation((params, token) => { + return runSafe(() => { + const document = documents.get(params.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.getColorPresentations(document, jsonDocument, params.color, params.range); + } + return []; + }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); + }); + + connection.onFoldingRanges((params, token) => { + return runSafe(() => { + const document = documents.get(params.textDocument.uri); + if (document) { + const onRangeLimitExceeded = limitExceededWarnings.onResultLimitExceeded(document.uri, foldingRangeLimit, 'folding ranges'); + return languageService.getFoldingRanges(document, { rangeLimit: foldingRangeLimit, onRangeLimitExceeded }); + } + return null; + }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); + }); + + + connection.onSelectionRanges((params, token) => { + return runSafe(() => { + const document = documents.get(params.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.getSelectionRanges(document, params.positions, jsonDocument); + } + return []; + }, [], `Error while computing selection ranges for ${params.textDocument.uri}`, token); + }); + + connection.onDefinition((params, token) => { + return runSafeAsync(async () => { + const document = documents.get(params.textDocument.uri); + if (document) { + const jsonDocument = getJSONDocument(document); + return languageService.findDefinition(document, params.position, jsonDocument); + } + return []; + }, [], `Error while computing definitions for ${params.textDocument.uri}`, token); + }); + + // Listen on the connection + connection.listen(); +} diff --git a/extensions/json-language-features/server/src/jsonServerMain.ts b/extensions/json-language-features/server/src/jsonServerMain.ts deleted file mode 100644 index 2c8cd6ee48..0000000000 --- a/extensions/json-language-features/server/src/jsonServerMain.ts +++ /dev/null @@ -1,532 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { - createConnection, IConnection, - TextDocuments, InitializeParams, InitializeResult, NotificationType, RequestType, - DocumentRangeFormattingRequest, Disposable, ServerCapabilities, TextDocumentSyncKind, TextEdit -} from 'vscode-languageserver'; - -import { xhr, XHRResponse, configure as configureHttpRequests, getErrorStatusDescription } from 'request-light'; -import * as fs from 'fs'; -import { URI } from 'vscode-uri'; -import * as URL from 'url'; -import { posix } from 'path'; -import { setTimeout, clearTimeout } from 'timers'; -import { formatError, runSafe, runSafeAsync } from './utils/runner'; -import { TextDocument, JSONDocument, JSONSchema, getLanguageService, DocumentLanguageSettings, SchemaConfiguration, ClientCapabilities, SchemaRequestService, Diagnostic, Range, Position } from 'vscode-json-languageservice'; -import { getLanguageModelCache } from './languageModelCache'; - -interface ISchemaAssociations { - [pattern: string]: string[]; -} - -interface ISchemaAssociation { - fileMatch: string[]; - uri: string; -} - -namespace SchemaAssociationNotification { - export const type: NotificationType = new NotificationType('json/schemaAssociations'); -} - -namespace VSCodeContentRequest { - export const type: RequestType = new RequestType('vscode/content'); -} - -namespace SchemaContentChangeNotification { - export const type: NotificationType = new NotificationType('json/schemaContent'); -} - -namespace ResultLimitReachedNotification { - export const type: NotificationType = new NotificationType('json/resultLimitReached'); -} - -namespace ForceValidateRequest { - export const type: RequestType = new RequestType('json/validate'); -} - -// Create a connection for the server -const connection: IConnection = createConnection(); - -process.on('unhandledRejection', (e: any) => { - console.error(formatError(`Unhandled exception`, e)); -}); -process.on('uncaughtException', (e: any) => { - console.error(formatError(`Unhandled exception`, e)); -}); - - -console.log = connection.console.log.bind(connection.console); -console.error = connection.console.error.bind(connection.console); - -const workspaceContext = { - resolveRelativePath: (relativePath: string, resource: string) => { - return URL.resolve(resource, relativePath); - } -}; - -const fileRequestService: SchemaRequestService = (uri: string) => { - const fsPath = URI.parse(uri).fsPath; - return new Promise((c, e) => { - fs.readFile(fsPath, 'UTF-8', (err, result) => { - err ? e(err.message || err.toString()) : c(result.toString()); - }); - }); -}; - -const httpRequestService: SchemaRequestService = (uri: string) => { - const headers = { 'Accept-Encoding': 'gzip, deflate' }; - return xhr({ url: uri, followRedirects: 5, headers }).then(response => { - return response.responseText; - }, (error: XHRResponse) => { - return Promise.reject(error.responseText || getErrorStatusDescription(error.status) || error.toString()); - }); -}; - -function getSchemaRequestService(handledSchemas: string[] = ['https', 'http', 'file']) { - const builtInHandlers: { [protocol: string]: SchemaRequestService } = {}; - for (let protocol of handledSchemas) { - if (protocol === 'file') { - builtInHandlers[protocol] = fileRequestService; - } else if (protocol === 'http' || protocol === 'https') { - builtInHandlers[protocol] = httpRequestService; - } - } - return (uri: string): Thenable => { - const protocol = uri.substr(0, uri.indexOf(':')); - - const builtInHandler = builtInHandlers[protocol]; - if (builtInHandler) { - return builtInHandler(uri); - } - return connection.sendRequest(VSCodeContentRequest.type, uri).then(responseText => { - return responseText; - }, error => { - return Promise.reject(error.message); - }); - }; -} - -// create the JSON language service -let languageService = getLanguageService({ - workspaceContext, - contributions: [], - clientCapabilities: ClientCapabilities.LATEST -}); - -// Create a text document manager. -const documents = new TextDocuments(TextDocument); - -// Make the text document manager listen on the connection -// for open, change and close text document events -documents.listen(connection); - -let clientSnippetSupport = false; -let dynamicFormatterRegistration = false; -let hierarchicalDocumentSymbolSupport = false; - -let foldingRangeLimitDefault = Number.MAX_VALUE; -let foldingRangeLimit = Number.MAX_VALUE; -let resultLimit = Number.MAX_VALUE; -let formatterMaxNumberOfEdits = Number.MAX_VALUE; - -// After the server has started the client sends an initialize request. The server receives -// in the passed params the rootPath of the workspace plus the client capabilities. -connection.onInitialize((params: InitializeParams): InitializeResult => { - - const handledProtocols = params.initializationOptions?.handledSchemaProtocols; - - languageService = getLanguageService({ - schemaRequestService: getSchemaRequestService(handledProtocols), - workspaceContext, - contributions: [], - clientCapabilities: params.capabilities - }); - - function getClientCapability(name: string, def: T) { - const keys = name.split('.'); - let c: any = params.capabilities; - for (let i = 0; c && i < keys.length; i++) { - if (!c.hasOwnProperty(keys[i])) { - return def; - } - c = c[keys[i]]; - } - return c; - } - - clientSnippetSupport = getClientCapability('textDocument.completion.completionItem.snippetSupport', false); - dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof params.initializationOptions?.provideFormatter !== 'boolean'); - foldingRangeLimitDefault = getClientCapability('textDocument.foldingRange.rangeLimit', Number.MAX_VALUE); - hierarchicalDocumentSymbolSupport = getClientCapability('textDocument.documentSymbol.hierarchicalDocumentSymbolSupport', false); - formatterMaxNumberOfEdits = params.initializationOptions?.customCapabilities?.rangeFormatting?.editLimit || Number.MAX_VALUE; - const capabilities: ServerCapabilities = { - textDocumentSync: TextDocumentSyncKind.Incremental, - completionProvider: clientSnippetSupport ? { - resolveProvider: false, // turn off resolving as the current language service doesn't do anything on resolve. Also fixes #91747 - triggerCharacters: ['"', ':'] - } : undefined, - hoverProvider: true, - documentSymbolProvider: true, - documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true, - colorProvider: {}, - foldingRangeProvider: true, - selectionRangeProvider: true, - definitionProvider: true - }; - - return { capabilities }; -}); - - - -// The settings interface describes the server relevant settings part -interface Settings { - json: { - schemas: JSONSchemaSettings[]; - format: { enable: boolean; }; - resultLimit?: number; - }; - http: { - proxy: string; - proxyStrictSSL: boolean; - }; -} - -interface JSONSchemaSettings { - fileMatch?: string[]; - url?: string; - schema?: JSONSchema; -} - -namespace LimitExceededWarnings { - const pendingWarnings: { [uri: string]: { features: { [name: string]: string }; timeout?: NodeJS.Timeout; } } = {}; - - export function cancel(uri: string) { - const warning = pendingWarnings[uri]; - if (warning && warning.timeout) { - clearTimeout(warning.timeout); - delete pendingWarnings[uri]; - } - } - - export function onResultLimitExceeded(uri: string, resultLimit: number, name: string) { - return () => { - let warning = pendingWarnings[uri]; - if (warning) { - if (!warning.timeout) { - // already shown - return; - } - warning.features[name] = name; - warning.timeout.refresh(); - } else { - warning = { features: { [name]: name } }; - warning.timeout = setTimeout(() => { - connection.sendNotification(ResultLimitReachedNotification.type, `${posix.basename(uri)}: For performance reasons, ${Object.keys(warning.features).join(' and ')} have been limited to ${resultLimit} items.`); - warning.timeout = undefined; - }, 2000); - pendingWarnings[uri] = warning; - } - }; - } -} - -let jsonConfigurationSettings: JSONSchemaSettings[] | undefined = undefined; -let schemaAssociations: ISchemaAssociations | ISchemaAssociation[] | undefined = undefined; -let formatterRegistration: Thenable | null = null; - -// The settings have changed. Is send on server activation as well. -connection.onDidChangeConfiguration((change) => { - let settings = change.settings; - configureHttpRequests(settings.http && settings.http.proxy, settings.http && settings.http.proxyStrictSSL); - - jsonConfigurationSettings = settings.json && settings.json.schemas; - updateConfiguration(); - - foldingRangeLimit = Math.trunc(Math.max(settings.json && settings.json.resultLimit || foldingRangeLimitDefault, 0)); - resultLimit = Math.trunc(Math.max(settings.json && settings.json.resultLimit || Number.MAX_VALUE, 0)); - - // dynamically enable & disable the formatter - if (dynamicFormatterRegistration) { - const enableFormatter = settings && settings.json && settings.json.format && settings.json.format.enable; - if (enableFormatter) { - if (!formatterRegistration) { - formatterRegistration = connection.client.register(DocumentRangeFormattingRequest.type, { documentSelector: [{ language: 'json' }, { language: 'jsonc' }] }); - } - } else if (formatterRegistration) { - formatterRegistration.then(r => r.dispose()); - formatterRegistration = null; - } - } -}); - -// The jsonValidation extension configuration has changed -connection.onNotification(SchemaAssociationNotification.type, associations => { - schemaAssociations = associations; - updateConfiguration(); -}); - -// A schema has changed -connection.onNotification(SchemaContentChangeNotification.type, uri => { - languageService.resetSchema(uri); -}); - -// Retry schema validation on all open documents -connection.onRequest(ForceValidateRequest.type, uri => { - return new Promise(resolve => { - const document = documents.get(uri); - if (document) { - updateConfiguration(); - validateTextDocument(document, diagnostics => { - resolve(diagnostics); - }); - } else { - resolve([]); - } - }); -}); - -function updateConfiguration() { - const languageSettings = { - validate: true, - allowComments: true, - schemas: new Array() - }; - if (schemaAssociations) { - if (Array.isArray(schemaAssociations)) { - Array.prototype.push.apply(languageSettings.schemas, schemaAssociations); - } else { - for (const pattern in schemaAssociations) { - const association = schemaAssociations[pattern]; - if (Array.isArray(association)) { - association.forEach(uri => { - languageSettings.schemas.push({ uri, fileMatch: [pattern] }); - }); - } - } - } - } - if (jsonConfigurationSettings) { - jsonConfigurationSettings.forEach((schema, index) => { - let uri = schema.url; - if (!uri && schema.schema) { - uri = schema.schema.id || `vscode://schemas/custom/${index}`; - } - if (uri) { - languageSettings.schemas.push({ uri, fileMatch: schema.fileMatch, schema: schema.schema }); - } - }); - } - languageService.configure(languageSettings); - - // Revalidate any open text documents - documents.all().forEach(triggerValidation); -} - -// The content of a text document has changed. This event is emitted -// when the text document first opened or when its content has changed. -documents.onDidChangeContent((change) => { - LimitExceededWarnings.cancel(change.document.uri); - triggerValidation(change.document); -}); - -// a document has closed: clear all diagnostics -documents.onDidClose(event => { - LimitExceededWarnings.cancel(event.document.uri); - cleanPendingValidation(event.document); - connection.sendDiagnostics({ uri: event.document.uri, diagnostics: [] }); -}); - -const pendingValidationRequests: { [uri: string]: NodeJS.Timer; } = {}; -const validationDelayMs = 300; - -function cleanPendingValidation(textDocument: TextDocument): void { - const request = pendingValidationRequests[textDocument.uri]; - if (request) { - clearTimeout(request); - delete pendingValidationRequests[textDocument.uri]; - } -} - -function triggerValidation(textDocument: TextDocument): void { - cleanPendingValidation(textDocument); - pendingValidationRequests[textDocument.uri] = setTimeout(() => { - delete pendingValidationRequests[textDocument.uri]; - validateTextDocument(textDocument); - }, validationDelayMs); -} - -function validateTextDocument(textDocument: TextDocument, callback?: (diagnostics: Diagnostic[]) => void): void { - const respond = (diagnostics: Diagnostic[]) => { - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); - if (callback) { - callback(diagnostics); - } - }; - if (textDocument.getText().length === 0) { - respond([]); // ignore empty documents - return; - } - const jsonDocument = getJSONDocument(textDocument); - const version = textDocument.version; - - const documentSettings: DocumentLanguageSettings = textDocument.languageId === 'jsonc' ? { comments: 'ignore', trailingCommas: 'warning' } : { comments: 'error', trailingCommas: 'error' }; - languageService.doValidation(textDocument, jsonDocument, documentSettings).then(diagnostics => { - setImmediate(() => { - const currDocument = documents.get(textDocument.uri); - if (currDocument && currDocument.version === version) { - respond(diagnostics); // Send the computed diagnostics to VSCode. - } - }); - }, error => { - connection.console.error(formatError(`Error while validating ${textDocument.uri}`, error)); - }); -} - -connection.onDidChangeWatchedFiles((change) => { - // Monitored files have changed in VSCode - let hasChanges = false; - change.changes.forEach(c => { - if (languageService.resetSchema(c.uri)) { - hasChanges = true; - } - }); - if (hasChanges) { - documents.all().forEach(triggerValidation); - } -}); - -const jsonDocuments = getLanguageModelCache(10, 60, document => languageService.parseJSONDocument(document)); -documents.onDidClose(e => { - jsonDocuments.onDocumentRemoved(e.document); -}); -connection.onShutdown(() => { - jsonDocuments.dispose(); -}); - -function getJSONDocument(document: TextDocument): JSONDocument { - return jsonDocuments.get(document); -} - -connection.onCompletion((textDocumentPosition, token) => { - return runSafeAsync(async () => { - const document = documents.get(textDocumentPosition.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - return languageService.doComplete(document, textDocumentPosition.position, jsonDocument); - } - return null; - }, null, `Error while computing completions for ${textDocumentPosition.textDocument.uri}`, token); -}); - -connection.onCompletionResolve((completionItem, token) => { - return runSafeAsync(() => { - return languageService.doResolve(completionItem); - }, completionItem, `Error while resolving completion proposal`, token); -}); - -connection.onHover((textDocumentPositionParams, token) => { - return runSafeAsync(async () => { - const document = documents.get(textDocumentPositionParams.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - return languageService.doHover(document, textDocumentPositionParams.position, jsonDocument); - } - return null; - }, null, `Error while computing hover for ${textDocumentPositionParams.textDocument.uri}`, token); -}); - -connection.onDocumentSymbol((documentSymbolParams, token) => { - return runSafe(() => { - const document = documents.get(documentSymbolParams.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - const onResultLimitExceeded = LimitExceededWarnings.onResultLimitExceeded(document.uri, resultLimit, 'document symbols'); - if (hierarchicalDocumentSymbolSupport) { - return languageService.findDocumentSymbols2(document, jsonDocument, { resultLimit, onResultLimitExceeded }); - } else { - return languageService.findDocumentSymbols(document, jsonDocument, { resultLimit, onResultLimitExceeded }); - } - } - return []; - }, [], `Error while computing document symbols for ${documentSymbolParams.textDocument.uri}`, token); -}); - -connection.onDocumentRangeFormatting((formatParams, token) => { - return runSafe(() => { - const document = documents.get(formatParams.textDocument.uri); - if (document) { - const edits = languageService.format(document, formatParams.range, formatParams.options); - if (edits.length > formatterMaxNumberOfEdits) { - const newText = TextDocument.applyEdits(document, edits); - return [TextEdit.replace(Range.create(Position.create(0, 0), document.positionAt(document.getText().length)), newText)]; - } - return edits; - } - return []; - }, [], `Error while formatting range for ${formatParams.textDocument.uri}`, token); -}); - -connection.onDocumentColor((params, token) => { - return runSafeAsync(async () => { - const document = documents.get(params.textDocument.uri); - if (document) { - const onResultLimitExceeded = LimitExceededWarnings.onResultLimitExceeded(document.uri, resultLimit, 'document colors'); - const jsonDocument = getJSONDocument(document); - return languageService.findDocumentColors(document, jsonDocument, { resultLimit, onResultLimitExceeded }); - } - return []; - }, [], `Error while computing document colors for ${params.textDocument.uri}`, token); -}); - -connection.onColorPresentation((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - return languageService.getColorPresentations(document, jsonDocument, params.color, params.range); - } - return []; - }, [], `Error while computing color presentations for ${params.textDocument.uri}`, token); -}); - -connection.onFoldingRanges((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const onRangeLimitExceeded = LimitExceededWarnings.onResultLimitExceeded(document.uri, foldingRangeLimit, 'folding ranges'); - return languageService.getFoldingRanges(document, { rangeLimit: foldingRangeLimit, onRangeLimitExceeded }); - } - return null; - }, null, `Error while computing folding ranges for ${params.textDocument.uri}`, token); -}); - - -connection.onSelectionRanges((params, token) => { - return runSafe(() => { - const document = documents.get(params.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - return languageService.getSelectionRanges(document, params.positions, jsonDocument); - } - return []; - }, [], `Error while computing selection ranges for ${params.textDocument.uri}`, token); -}); - -connection.onDefinition((params, token) => { - return runSafeAsync(async () => { - const document = documents.get(params.textDocument.uri); - if (document) { - const jsonDocument = getJSONDocument(document); - return languageService.findDefinition(document, params.position, jsonDocument); - } - return []; - }, [], `Error while computing definitions for ${params.textDocument.uri}`, token); -}); - -// Listen on the connection -connection.listen(); diff --git a/extensions/json-language-features/server/src/node/jsonServerMain.ts b/extensions/json-language-features/server/src/node/jsonServerMain.ts new file mode 100644 index 0000000000..20972538a9 --- /dev/null +++ b/extensions/json-language-features/server/src/node/jsonServerMain.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createConnection, Connection } from 'vscode-languageserver/node'; +import { formatError } from '../utils/runner'; +import { startServer } from '../jsonServer'; +import { RequestService } from '../requests'; + +import { xhr, XHRResponse, configure as configureHttpRequests, getErrorStatusDescription } from 'request-light'; +import { URI as Uri } from 'vscode-uri'; +import * as fs from 'fs'; + +// Create a connection for the server. +const connection: Connection = createConnection(); + +console.log = connection.console.log.bind(connection.console); +console.error = connection.console.error.bind(connection.console); + +process.on('unhandledRejection', (e: any) => { + connection.console.error(formatError(`Unhandled exception`, e)); +}); + +function getHTTPRequestService(): RequestService { + return { + getContent(uri: string, _encoding?: string) { + const headers = { 'Accept-Encoding': 'gzip, deflate' }; + return xhr({ url: uri, followRedirects: 5, headers }).then(response => { + return response.responseText; + }, (error: XHRResponse) => { + return Promise.reject(error.responseText || getErrorStatusDescription(error.status) || error.toString()); + }); + } + }; +} + +function getFileRequestService(): RequestService { + return { + getContent(location: string, encoding?: string) { + return new Promise((c, e) => { + const uri = Uri.parse(location); + fs.readFile(uri.fsPath, encoding, (err, buf) => { + if (err) { + return e(err); + } + c(buf.toString()); + }); + }); + } + }; +} + + +startServer(connection, { file: getFileRequestService(), http: getHTTPRequestService(), configureHttpRequests }); diff --git a/extensions/json-language-features/server/src/requests.ts b/extensions/json-language-features/server/src/requests.ts new file mode 100644 index 0000000000..2c904c78f9 --- /dev/null +++ b/extensions/json-language-features/server/src/requests.ts @@ -0,0 +1,87 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI } from 'vscode-uri'; + +export interface RequestService { + getContent(uri: string, encoding?: string): Promise; +} + +export function getScheme(uri: string) { + return uri.substr(0, uri.indexOf(':')); +} + +export function dirname(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return lastIndexOfSlash !== -1 ? uri.substr(0, lastIndexOfSlash) : ''; +} + +export function basename(uri: string) { + const lastIndexOfSlash = uri.lastIndexOf('/'); + return uri.substr(lastIndexOfSlash + 1); +} + + +const Slash = '/'.charCodeAt(0); +const Dot = '.'.charCodeAt(0); + +export function extname(uri: string) { + for (let i = uri.length - 1; i >= 0; i--) { + const ch = uri.charCodeAt(i); + if (ch === Dot) { + if (i > 0 && uri.charCodeAt(i - 1) !== Slash) { + return uri.substr(i); + } else { + break; + } + } else if (ch === Slash) { + break; + } + } + return ''; +} + +export function isAbsolutePath(path: string) { + return path.charCodeAt(0) === Slash; +} + +export function resolvePath(uriString: string, path: string): string { + if (isAbsolutePath(path)) { + const uri = URI.parse(uriString); + const parts = path.split('/'); + return uri.with({ path: normalizePath(parts) }).toString(); + } + return joinPath(uriString, path); +} + +export function normalizePath(parts: string[]): string { + const newParts: string[] = []; + for (const part of parts) { + if (part.length === 0 || part.length === 1 && part.charCodeAt(0) === Dot) { + // ignore + } else if (part.length === 2 && part.charCodeAt(0) === Dot && part.charCodeAt(1) === Dot) { + newParts.pop(); + } else { + newParts.push(part); + } + } + if (parts.length > 1 && parts[parts.length - 1].length === 0) { + newParts.push(''); + } + let res = newParts.join('/'); + if (parts[0].length === 0) { + res = '/' + res; + } + return res; +} + +export function joinPath(uriString: string, ...paths: string[]): string { + const uri = URI.parse(uriString); + const parts = uri.path.split('/'); + for (let path of paths) { + parts.push(...path.split('/')); + } + return uri.with({ path: normalizePath(parts) }).toString(); +} diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 4d15a61184..e7dffe1d70 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -80,46 +80,51 @@ request-light@^0.3.0: https-proxy-agent "^2.2.4" vscode-nls "^4.1.1" -vscode-json-languageservice@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.6.0.tgz#133a1e2c3a3dffe38564a1ba948516805c3c1869" - integrity sha512-dXzFywypUZ9T0tjr4fREZiknXDz6vAGx1zsxbQY1+9DOpjMfbz0VLP873KmcbuvL4K3nseKTxc4TKHu8kLXRMw== +vscode-json-languageservice@^3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/vscode-json-languageservice/-/vscode-json-languageservice-3.7.0.tgz#0174417f139cf41dd60c84538fd052385bfb46f6" + integrity sha512-nGLqcBhTjdfkl8Dz9sYGK/ZCTjscYFoIjYw+qqkWB+vyNfM0k/AyIoT73DQvB/PArteCKjEVfQUF72GRZEDSbQ== dependencies: jsonc-parser "^2.2.1" vscode-languageserver-textdocument "^1.0.1" vscode-languageserver-types "^3.15.1" vscode-nls "^4.1.2" - vscode-uri "^2.1.1" + vscode-uri "^2.1.2" -vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@6.0.0-next.2: + version "6.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" + integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageserver-protocol@^3.15.3: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@3.16.0-next.4: + version "3.16.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.4.tgz#8f8b1b831d4dfd9b26aa1ba3d2a32c427a91c99f" + integrity sha512-6GmPUp2MhJy2H1CTWp2B40Pa9BeC9glrXWmQWVG6A/0V9UbcAjVC9m56znm2GL32iyLDIprTBe8gBvvvcjbpaQ== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "6.0.0-next.2" + vscode-languageserver-types "3.16.0-next.2" 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-types@3.15.1, vscode-languageserver-types@^3.15.1: +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== + +vscode-languageserver-types@^3.15.1: version "3.15.1" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== -vscode-languageserver@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz#d76afc68172c27d4327ee74332b468fbc740d762" - integrity sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ== +vscode-languageserver@7.0.0-next.3: + version "7.0.0-next.3" + resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-7.0.0-next.3.tgz#3833bd09259a4a085baeba90783f1e4d06d81095" + integrity sha512-qSt8eb546iFuoFIN+9MPl4Avru6Iz2/JP0UmS/3djf40ICa31Np/yJ7anX2j0Az5rCzb0fak8oeKwDioGeVOYg== dependencies: - vscode-languageserver-protocol "^3.15.3" + vscode-languageserver-protocol "3.16.0-next.4" vscode-nls@^4.1.1: version "4.1.1" @@ -131,7 +136,7 @@ vscode-nls@^4.1.2: resolved "https://registry.yarnpkg.com/vscode-nls/-/vscode-nls-4.1.2.tgz#ca8bf8bb82a0987b32801f9fddfdd2fb9fd3c167" integrity sha512-7bOHxPsfyuCqmP+hZXscLhiHwe7CSuFE4hyhbs22xPIhQ4jv99FcR4eBzfYYVLP356HNFpdvz63FFb/xw6T4Iw== -vscode-uri@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.1.tgz#5aa1803391b6ebdd17d047f51365cf62c38f6e90" - integrity sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A== +vscode-uri@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-2.1.2.tgz#c8d40de93eb57af31f3c715dd650e2ca2c096f1c" + integrity sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A== diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 93d78c8c00..237cddb80f 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -120,31 +120,31 @@ vscode-extension-telemetry@0.1.1: dependencies: applicationinsights "1.0.8" -vscode-jsonrpc@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz#9bab9c330d89f43fc8c1e8702b5c36e058a01794" - integrity sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A== +vscode-jsonrpc@6.0.0-next.2: + version "6.0.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.2.tgz#3d73f86d812304cb91b9fb1efee40ec60b09ed7f" + integrity sha512-dKQXRYNUY6BHALQJBJlyZyv9oWlYpbJ2vVoQNNVNPLAYQ3hzNp4zy+iSo7zGx1BPXByArJQDWTKLQh8dz3dnNw== -vscode-languageclient@^6.1.3: - version "6.1.3" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-6.1.3.tgz#c979c5bb5855714a0307e998c18ca827c1b3953a" - integrity sha512-YciJxk08iU5LmWu7j5dUt9/1OLjokKET6rME3cI4BRpiF6HZlusm2ZwPt0MYJ0lV5y43sZsQHhyon2xBg4ZJVA== +vscode-languageclient@7.0.0-next.5: + version "7.0.0-next.5" + resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-7.0.0-next.5.tgz#7ae84c598dff360bd2bc64322b74e10e5d0b9cd6" + integrity sha512-ec+fJg+JiNBIdbeKbzssSuORUaVdtLValtiYdNEUCUjpYE+Y6xXPtXwiZOlS/0OB9pC/RLCMxsj16UwWncQhYQ== dependencies: semver "^6.3.0" - vscode-languageserver-protocol "^3.15.3" + vscode-languageserver-protocol "3.16.0-next.4" -vscode-languageserver-protocol@^3.15.3: - version "3.15.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz#3fa9a0702d742cf7883cb6182a6212fcd0a1d8bb" - integrity sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw== +vscode-languageserver-protocol@3.16.0-next.4: + version "3.16.0-next.4" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.4.tgz#8f8b1b831d4dfd9b26aa1ba3d2a32c427a91c99f" + integrity sha512-6GmPUp2MhJy2H1CTWp2B40Pa9BeC9glrXWmQWVG6A/0V9UbcAjVC9m56znm2GL32iyLDIprTBe8gBvvvcjbpaQ== dependencies: - vscode-jsonrpc "^5.0.1" - vscode-languageserver-types "3.15.1" + vscode-jsonrpc "6.0.0-next.2" + vscode-languageserver-types "3.16.0-next.2" -vscode-languageserver-types@3.15.1: - version "3.15.1" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" - integrity sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ== +vscode-languageserver-types@3.16.0-next.2: + version "3.16.0-next.2" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.2.tgz#940bd15c992295a65eae8ab6b8568a1e8daa3083" + integrity sha512-QjXB7CKIfFzKbiCJC4OWC8xUncLsxo19FzGVp/ADFvvi87PlmBSCAtZI5xwGjF5qE0xkLf0jjKUn3DzmpDP52Q== vscode-nls@^4.1.1: version "4.1.1" diff --git a/extensions/machine-learning/src/test/mainController.test.ts b/extensions/machine-learning/src/test/mainController.test.ts index 88abbe7cfd..a56287d3f7 100644 --- a/extensions/machine-learning/src/test/mainController.test.ts +++ b/extensions/machine-learning/src/test/mainController.test.ts @@ -91,7 +91,8 @@ function createContext(): TestContext { globalStoragePath: '', logPath: '', extensionUri: vscode.Uri.parse(''), - environmentVariableCollection: { } as any + environmentVariableCollection: { } as any, + extensionMode: undefined as any }, outputChannel: { name: '', diff --git a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json index af6042b559..0df87e91d3 100644 --- a/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json +++ b/extensions/markdown-basics/syntaxes/markdown.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/7cf9aa7bb76c55428063383610edc0a631230d58", + "version": "https://github.com/microsoft/vscode-markdown-tm-grammar/commit/a7e4475626a505472c76d18e0a1b3cfcf46f9cf9", "name": "Markdown", "scopeName": "text.html.markdown", "patterns": [ @@ -1715,6 +1715,72 @@ } ] }, + "fenced_code_block_erlang": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(erlang)((\\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.erlang", + "patterns": [ + { + "include": "source.erlang" + } + ] + } + ] + }, + "fenced_code_block_elixir": { + "begin": "(^|\\G)(\\s*)(`{3,}|~{3,})\\s*(?i:(elixir)((\\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.elixir", + "patterns": [ + { + "include": "source.elixir" + } + ] + } + ] + }, "fenced_code_block": { "patterns": [ { @@ -1867,6 +1933,12 @@ { "include": "#fenced_code_block_log" }, + { + "include": "#fenced_code_block_erlang" + }, + { + "include": "#fenced_code_block_elixir" + }, { "include": "#fenced_code_block_unknown" } diff --git a/extensions/markdown-language-features/.vscodeignore b/extensions/markdown-language-features/.vscodeignore index 30d948fbc6..bcb886a094 100644 --- a/extensions/markdown-language-features/.vscodeignore +++ b/extensions/markdown-language-features/.vscodeignore @@ -4,6 +4,7 @@ tsconfig.json out/test/** out/** extension.webpack.config.js +extension-browser.webpack.config.js cgmanifest.json yarn.lock preview-src/** diff --git a/extensions/markdown-language-features/extension-browser.webpack.config.js b/extensions/markdown-language-features/extension-browser.webpack.config.js new file mode 100644 index 0000000000..7566ffd33b --- /dev/null +++ b/extensions/markdown-language-features/extension-browser.webpack.config.js @@ -0,0 +1,32 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + context: __dirname, + target: 'webworker', + entry: { + extension: './src/extension.ts' + }, + resolve: { + alias: { + 'vscode-extension-telemetry': path.resolve(__dirname, '../../build/polyfills/vscode-extension-telemetry.js'), + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js'), + }, + }, + performance: { + hints: false + }, +}); + +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/markdown-language-features/media/index.js b/extensions/markdown-language-features/media/index.js index 0762949b41..12b9b68f88 100644 --- a/extensions/markdown-language-features/media/index.js +++ b/extensions/markdown-language-features/media/index.js @@ -1,2 +1 @@ -!function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let o=void 0;function i(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=i,t.getSettings=function(){if(o)return o;if(o=i("data-settings"))return o;throw new Error("Could not load settings")}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(0),i="code-line";function r(e){return t=0,n=o.getSettings().lineCount-1,i=e,Math.min(n,Math.max(t,i));var t,n,i}const c=(()=>{let e;return()=>{if(!e){e=[{element:document.body,line:0}];for(const t of document.getElementsByClassName(i)){const n=+t.getAttribute("data-line");isNaN(n)||("CODE"===t.tagName&&t.parentElement&&"PRE"===t.parentElement.tagName?e.push({element:t.parentElement,line:n}):e.push({element:t,line:n}))}}return e}})();function s(e){const t=Math.floor(e),n=c();let o=n[0]||null;for(const e of n){if(e.line===t)return{previous:e,next:void 0};if(e.line>t)return{previous:o,next:e};o=e}return{previous:o}}function a(e){const t=c(),n=e-window.scrollY;let o=-1,i=t.length-1;for(;o+1=n?i=e:o=e}const r=t[i],s=u(r);if(i>=1&&s.top>n){return{previous:t[o],next:r}}return i>1&&in?{previous:r,next:t[i+1]}:{previous:r}}function u({element:e}){const t=e.getBoundingClientRect(),n=e.querySelector(`.${i}`);if(n){const e=n.getBoundingClientRect(),o=Math.max(1,e.top-t.top);return{top:t.top,height:o}}return t}t.getElementsForSourceLine=s,t.getLineElementsAtPageOffset=a,t.scrollToRevealSourceLine=function(e){if(!o.getSettings().scrollPreviewWithEditor)return;if(e<=0)return void window.scroll(window.scrollX,0);const{previous:t,next:n}=s(e);if(!t)return;let i=0;const r=u(t),c=r.top;if(n&&n.line!==t.line){i=c+(e-t.line)/(n.line-t.line)*(n.element.getBoundingClientRect().top-c)}else{const t=e-Math.floor(e);i=c+r.height*t}window.scroll(window.scrollX,Math.max(1,window.scrollY+i))},t.getEditorLineNumberForPageOffset=function(e){const{previous:t,next:n}=a(e);if(t){const o=u(t),i=e-window.scrollY-o.top;if(n){const e=i/(u(n).top-o.top);return r(t.line+e*(n.line-t.line))}{const e=i/o.height;return r(t.line+e)}}return null},t.getLineElementForFragment=function(e){return c().find(t=>t.element.id===e)}},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const o=n(7),i=n(8),r=n(9),c=n(2),s=n(0),a=n(10);let u=!0;const l=new o.ActiveLineMarker,f=s.getSettings(),d=acquireVsCodeApi(),m={...d.getState(),...s.getData("data-state")};d.setState(m);const p=r.createPosterForVsCode(d);window.cspAlerter.setPoster(p),window.styleLoadingMonitor.setPoster(p),window.onload=()=>{h()},i.onceDocumentLoaded(()=>{const t=m.scrollProgress;"number"!=typeof t||f.fragment?f.scrollPreviewWithEditor&&e(()=>{if(f.fragment){m.fragment=void 0,d.setState(m);const e=c.getLineElementForFragment(f.fragment);e&&(u=!0,c.scrollToRevealSourceLine(e.line))}else isNaN(f.line)||(u=!0,c.scrollToRevealSourceLine(f.line))}):e(()=>{u=!0,window.scrollTo(0,t*document.body.clientHeight)})});const g=(()=>{const e=a(e=>{u=!0,c.scrollToRevealSourceLine(e)},50);return t=>{isNaN(t)||(m.line=t,e(t))}})();let h=a(()=>{const e=[];let t=document.getElementsByTagName("img");if(t){let n;for(n=0;n{u=!0,y(),h()},!0),window.addEventListener("message",e=>{if(e.data.source===f.source)switch(e.data.type){case"onDidChangeTextEditorSelection":l.onDidChangeTextEditorSelection(e.data.line);break;case"updateView":g(e.data.line)}},!1),document.addEventListener("dblclick",e=>{if(!f.doubleClickToSwitchToEditor)return;for(let t=e.target;t;t=t.parentNode)if("A"===t.tagName)return;const t=e.pageY,n=c.getEditorLineNumberForPageOffset(t);"number"!=typeof n||isNaN(n)||p.postMessage("didClick",{line:Math.floor(n)})});const v=["http:","https:","mailto:","vscode:","vscode-insiders:"];function y(){m.scrollProgress=window.scrollY/document.body.clientHeight,d.setState(m)}document.addEventListener("click",e=>{if(!e)return;let t=e.target;for(;t;){if(t.tagName&&"A"===t.tagName&&t.href){if(t.getAttribute("href").startsWith("#"))return;if(v.some(e=>t.href.startsWith(e)))return;const n=t.getAttribute("data-href")||t.getAttribute("href");return/^[a-z\-]+:/i.test(n)?void 0:(p.postMessage("openLink",{href:n}),e.preventDefault(),void e.stopPropagation())}t=t.parentNode}},!0),window.addEventListener("scroll",a(()=>{if(y(),u)u=!1;else{const e=c.getEditorLineNumberForPageOffset(window.scrollY);"number"!=typeof e||isNaN(e)||p.postMessage("revealLine",{line:e})}},50))}).call(this,n(4).setImmediate)},function(e,t,n){(function(e){var o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(5),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var o,i,r,c,s,a=1,u={},l=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},o=function(e){r.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,o=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):o=function(e){setTimeout(p,0,e)}:(c="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(c)&&p(+t.data.slice(c.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),o=function(t){e.postMessage(c+t,"*")}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;nnew class{postMessage(t,n){e.postMessage({type:t,source:o.getSettings().source,body:n})}}},function(e,t,n){(function(t){var n="Expected a function",o=NaN,i="[object Symbol]",r=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,f="object"==typeof self&&self&&self.Object===Object&&self,d=l||f||Function("return this")(),m=Object.prototype.toString,p=Math.max,g=Math.min,h=function(){return d.Date.now()};function v(e,t,o){var i,r,c,s,a,u,l=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(n);function v(t){var n=i,o=r;return i=r=void 0,l=t,s=e.apply(o,n)}function b(e){var n=e-u;return void 0===u||n>=t||n<0||d&&e-l>=c}function T(){var e=h();if(b(e))return E(e);a=setTimeout(T,function(e){var n=t-(e-u);return d?g(n,c-(e-l)):n}(e))}function E(e){return a=void 0,m&&i?v(e):(i=r=void 0,s)}function _(){var e=h(),n=b(e);if(i=arguments,r=this,u=e,n){if(void 0===a)return function(e){return l=e,a=setTimeout(T,t),f?v(e):s}(u);if(d)return a=setTimeout(T,t),v(u)}return void 0===a&&(a=setTimeout(T,t)),s}return t=w(t)||0,y(o)&&(f=!!o.leading,c=(d="maxWait"in o)?p(w(o.maxWait)||0,t):c,m="trailing"in o?!!o.trailing:m),_.cancel=function(){void 0!==a&&clearTimeout(a),l=0,i=u=r=a=void 0},_.flush=function(){return void 0===a?s:E(h())},_}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function w(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&m.call(e)==i}(e))return o;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=s.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):c.test(e)?o:+e}e.exports=function(e,t,o){var i=!0,r=!0;if("function"!=typeof e)throw new TypeError(n);return y(o)&&(i="leading"in o?!!o.leading:i,r="trailing"in o?!!o.trailing:r),v(e,t,{leading:i,maxWait:t,trailing:r})}}).call(this,n(1))}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zY3JvbGwtc3luYy50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9pbmRleC50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvdGltZXJzLWJyb3dzZXJpZnkvbWFpbi5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvc2V0aW1tZWRpYXRlL3NldEltbWVkaWF0ZS5qcyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2FjdGl2ZUxpbmVNYXJrZXIudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvZXZlbnRzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL21lc3NhZ2luZy50cyIsIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvbG9kYXNoLnRocm90dGxlL2luZGV4LmpzIl0sIm5hbWVzIjpbImluc3RhbGxlZE1vZHVsZXMiLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJleHBvcnRzIiwibW9kdWxlIiwiaSIsImwiLCJtb2R1bGVzIiwiY2FsbCIsIm0iLCJjIiwiZCIsIm5hbWUiLCJnZXR0ZXIiLCJvIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiciIsIlN5bWJvbCIsInRvU3RyaW5nVGFnIiwidmFsdWUiLCJ0IiwibW9kZSIsIl9fZXNNb2R1bGUiLCJucyIsImNyZWF0ZSIsImtleSIsImJpbmQiLCJuIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiY2FjaGVkU2V0dGluZ3MiLCJ1bmRlZmluZWQiLCJnZXREYXRhIiwiZWxlbWVudCIsImRvY3VtZW50IiwiZ2V0RWxlbWVudEJ5SWQiLCJkYXRhIiwiZ2V0QXR0cmlidXRlIiwiSlNPTiIsInBhcnNlIiwiRXJyb3IiLCJnZXRTZXR0aW5ncyIsImciLCJ0aGlzIiwiRnVuY3Rpb24iLCJlIiwid2luZG93Iiwic2V0dGluZ3NfMSIsImNvZGVMaW5lQ2xhc3MiLCJjbGFtcExpbmUiLCJsaW5lIiwibWluIiwibWF4IiwibGluZUNvdW50IiwiTWF0aCIsImdldENvZGVMaW5lRWxlbWVudHMiLCJlbGVtZW50cyIsImJvZHkiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaXNOYU4iLCJ0YWdOYW1lIiwicGFyZW50RWxlbWVudCIsInB1c2giLCJnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUiLCJ0YXJnZXRMaW5lIiwibGluZU51bWJlciIsImZsb29yIiwibGluZXMiLCJwcmV2aW91cyIsImVudHJ5IiwibmV4dCIsImdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldCIsIm9mZnNldCIsInBvc2l0aW9uIiwic2Nyb2xsWSIsImxvIiwiaGkiLCJsZW5ndGgiLCJtaWQiLCJib3VuZHMiLCJnZXRFbGVtZW50Qm91bmRzIiwidG9wIiwiaGVpZ2h0IiwiaGlFbGVtZW50IiwiaGlCb3VuZHMiLCJteUJvdW5kcyIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImNvZGVMaW5lQ2hpbGQiLCJxdWVyeVNlbGVjdG9yIiwiY2hpbGRCb3VuZHMiLCJzY3JvbGxUb1JldmVhbFNvdXJjZUxpbmUiLCJzY3JvbGxQcmV2aWV3V2l0aEVkaXRvciIsInNjcm9sbCIsInNjcm9sbFgiLCJzY3JvbGxUbyIsInJlY3QiLCJwcmV2aW91c1RvcCIsInByb2dyZXNzSW5FbGVtZW50IiwiZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQiLCJwcmV2aW91c0JvdW5kcyIsIm9mZnNldEZyb21QcmV2aW91cyIsInByb2dyZXNzQmV0d2VlbkVsZW1lbnRzIiwicHJvZ3Jlc3NXaXRoaW5FbGVtZW50IiwiZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudCIsImZyYWdtZW50IiwiZmluZCIsImlkIiwiYWN0aXZlTGluZU1hcmtlcl8xIiwiZXZlbnRzXzEiLCJtZXNzYWdpbmdfMSIsInNjcm9sbF9zeW5jXzEiLCJ0aHJvdHRsZSIsInNjcm9sbERpc2FibGVkIiwibWFya2VyIiwiQWN0aXZlTGluZU1hcmtlciIsInNldHRpbmdzIiwidnNjb2RlIiwiYWNxdWlyZVZzQ29kZUFwaSIsInN0YXRlIiwiZ2V0U3RhdGUiLCJzZXRTdGF0ZSIsIm1lc3NhZ2luZyIsImNyZWF0ZVBvc3RlckZvclZzQ29kZSIsImNzcEFsZXJ0ZXIiLCJzZXRQb3N0ZXIiLCJzdHlsZUxvYWRpbmdNb25pdG9yIiwib25sb2FkIiwidXBkYXRlSW1hZ2VTaXplcyIsIm9uY2VEb2N1bWVudExvYWRlZCIsInNjcm9sbFByb2dyZXNzIiwic2V0SW1tZWRpYXRlIiwiY2xpZW50SGVpZ2h0Iiwib25VcGRhdGVWaWV3IiwiZG9TY3JvbGwiLCJpbWFnZUluZm8iLCJpbWFnZXMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImltZyIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwicmVtb3ZlIiwid2lkdGgiLCJwb3N0TWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ1cGRhdGVTY3JvbGxQcm9ncmVzcyIsImV2ZW50Iiwic291cmNlIiwidHlwZSIsIm9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbiIsImRvdWJsZUNsaWNrVG9Td2l0Y2hUb0VkaXRvciIsIm5vZGUiLCJ0YXJnZXQiLCJwYXJlbnROb2RlIiwicGFnZVkiLCJwYXNzVGhyb3VnaExpbmtTY2hlbWVzIiwiaHJlZiIsInN0YXJ0c1dpdGgiLCJzb21lIiwic2NoZW1lIiwiaHJlZlRleHQiLCJ0ZXN0IiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJUaW1lb3V0IiwiY2xlYXJGbiIsIl9pZCIsIl9jbGVhckZuIiwic2V0VGltZW91dCIsImFwcGx5IiwiYXJndW1lbnRzIiwiY2xlYXJUaW1lb3V0Iiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIiwidGltZW91dCIsImNsb3NlIiwidW5yZWYiLCJyZWYiLCJlbnJvbGwiLCJpdGVtIiwibXNlY3MiLCJfaWRsZVRpbWVvdXRJZCIsIl9pZGxlVGltZW91dCIsInVuZW5yb2xsIiwiX3VucmVmQWN0aXZlIiwiYWN0aXZlIiwiX29uVGltZW91dCIsInNlbGYiLCJnbG9iYWwiLCJjbGVhckltbWVkaWF0ZSIsInJlZ2lzdGVySW1tZWRpYXRlIiwiaHRtbCIsImNoYW5uZWwiLCJtZXNzYWdlUHJlZml4Iiwib25HbG9iYWxNZXNzYWdlIiwibmV4dEhhbmRsZSIsInRhc2tzQnlIYW5kbGUiLCJjdXJyZW50bHlSdW5uaW5nQVRhc2siLCJkb2MiLCJhdHRhY2hUbyIsImdldFByb3RvdHlwZU9mIiwidG9TdHJpbmciLCJwcm9jZXNzIiwiaGFuZGxlIiwibmV4dFRpY2siLCJydW5JZlByZXNlbnQiLCJpbXBvcnRTY3JpcHRzIiwicG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyIsIm9sZE9uTWVzc2FnZSIsIm9ubWVzc2FnZSIsImNhblVzZVBvc3RNZXNzYWdlIiwiTWVzc2FnZUNoYW5uZWwiLCJwb3J0MSIsInBvcnQyIiwiY3JlYXRlRWxlbWVudCIsImRvY3VtZW50RWxlbWVudCIsInNjcmlwdCIsIm9ucmVhZHlzdGF0ZWNoYW5nZSIsInJlbW92ZUNoaWxkIiwiYXBwZW5kQ2hpbGQiLCJyYW5kb20iLCJpbmRleE9mIiwic2xpY2UiLCJhdHRhY2hFdmVudCIsImNhbGxiYWNrIiwiYXJncyIsIkFycmF5IiwidGFzayIsInJ1biIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJmdW4iLCJjdXJyZW50UXVldWUiLCJxdWV1ZSIsImRyYWluaW5nIiwicXVldWVJbmRleCIsImNsZWFuVXBOZXh0VGljayIsImNvbmNhdCIsImRyYWluUXVldWUiLCJsZW4iLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwiYXJyYXkiLCJub29wIiwidGl0bGUiLCJicm93c2VyIiwiZW52IiwiYXJndiIsInZlcnNpb24iLCJ2ZXJzaW9ucyIsIm9uIiwiYWRkTGlzdGVuZXIiLCJvbmNlIiwib2ZmIiwicmVtb3ZlTGlzdGVuZXIiLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJlbWl0IiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImxpc3RlbmVycyIsImJpbmRpbmciLCJjd2QiLCJjaGRpciIsImRpciIsInVtYXNrIiwiX3VwZGF0ZSIsImJlZm9yZSIsIl91bm1hcmtBY3RpdmVFbGVtZW50IiwiX2N1cnJlbnQiLCJfbWFya0FjdGl2ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJyZXBsYWNlIiwiZiIsInJlYWR5U3RhdGUiLCJGVU5DX0VSUk9SX1RFWFQiLCJOQU4iLCJzeW1ib2xUYWciLCJyZVRyaW0iLCJyZUlzQmFkSGV4IiwicmVJc0JpbmFyeSIsInJlSXNPY3RhbCIsImZyZWVQYXJzZUludCIsInBhcnNlSW50IiwiZnJlZUdsb2JhbCIsImZyZWVTZWxmIiwicm9vdCIsIm9iamVjdFRvU3RyaW5nIiwibmF0aXZlTWF4IiwibmF0aXZlTWluIiwibm93IiwiRGF0ZSIsImRlYm91bmNlIiwiZnVuYyIsIndhaXQiLCJvcHRpb25zIiwibGFzdEFyZ3MiLCJsYXN0VGhpcyIsIm1heFdhaXQiLCJyZXN1bHQiLCJ0aW1lcklkIiwibGFzdENhbGxUaW1lIiwibGFzdEludm9rZVRpbWUiLCJsZWFkaW5nIiwibWF4aW5nIiwidHJhaWxpbmciLCJUeXBlRXJyb3IiLCJpbnZva2VGdW5jIiwidGltZSIsInRoaXNBcmciLCJzaG91bGRJbnZva2UiLCJ0aW1lU2luY2VMYXN0Q2FsbCIsInRpbWVyRXhwaXJlZCIsInRyYWlsaW5nRWRnZSIsInJlbWFpbmluZ1dhaXQiLCJkZWJvdW5jZWQiLCJpc0ludm9raW5nIiwibGVhZGluZ0VkZ2UiLCJ0b051bWJlciIsImlzT2JqZWN0IiwiY2FuY2VsIiwiZmx1c2giLCJpc09iamVjdExpa2UiLCJpc1N5bWJvbCIsIm90aGVyIiwidmFsdWVPZiIsImlzQmluYXJ5Il0sIm1hcHBpbmdzIjoiYUFDRSxJQUFJQSxFQUFtQixHQUd2QixTQUFTQyxFQUFvQkMsR0FHNUIsR0FBR0YsRUFBaUJFLEdBQ25CLE9BQU9GLEVBQWlCRSxHQUFVQyxRQUduQyxJQUFJQyxFQUFTSixFQUFpQkUsR0FBWSxDQUN6Q0csRUFBR0gsRUFDSEksR0FBRyxFQUNISCxRQUFTLElBVVYsT0FOQUksRUFBUUwsR0FBVU0sS0FBS0osRUFBT0QsUUFBU0MsRUFBUUEsRUFBT0QsUUFBU0YsR0FHL0RHLEVBQU9FLEdBQUksRUFHSkYsRUFBT0QsUUFLZkYsRUFBb0JRLEVBQUlGLEVBR3hCTixFQUFvQlMsRUFBSVYsRUFHeEJDLEVBQW9CVSxFQUFJLFNBQVNSLEVBQVNTLEVBQU1DLEdBQzNDWixFQUFvQmEsRUFBRVgsRUFBU1MsSUFDbENHLE9BQU9DLGVBQWViLEVBQVNTLEVBQU0sQ0FBRUssWUFBWSxFQUFNQyxJQUFLTCxLQUtoRVosRUFBb0JrQixFQUFJLFNBQVNoQixHQUNYLG9CQUFYaUIsUUFBMEJBLE9BQU9DLGFBQzFDTixPQUFPQyxlQUFlYixFQUFTaUIsT0FBT0MsWUFBYSxDQUFFQyxNQUFPLFdBRTdEUCxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sS0FRdkRyQixFQUFvQnNCLEVBQUksU0FBU0QsRUFBT0UsR0FFdkMsR0FEVSxFQUFQQSxJQUFVRixFQUFRckIsRUFBb0JxQixJQUMvQixFQUFQRSxFQUFVLE9BQU9GLEVBQ3BCLEdBQVcsRUFBUEUsR0FBOEIsaUJBQVZGLEdBQXNCQSxHQUFTQSxFQUFNRyxXQUFZLE9BQU9ILEVBQ2hGLElBQUlJLEVBQUtYLE9BQU9ZLE9BQU8sTUFHdkIsR0FGQTFCLEVBQW9Ca0IsRUFBRU8sR0FDdEJYLE9BQU9DLGVBQWVVLEVBQUksVUFBVyxDQUFFVCxZQUFZLEVBQU1LLE1BQU9BLElBQ3RELEVBQVBFLEdBQTRCLGlCQUFURixFQUFtQixJQUFJLElBQUlNLEtBQU9OLEVBQU9yQixFQUFvQlUsRUFBRWUsRUFBSUUsRUFBSyxTQUFTQSxHQUFPLE9BQU9OLEVBQU1NLElBQVFDLEtBQUssS0FBTUQsSUFDOUksT0FBT0YsR0FJUnpCLEVBQW9CNkIsRUFBSSxTQUFTMUIsR0FDaEMsSUFBSVMsRUFBU1QsR0FBVUEsRUFBT3FCLFdBQzdCLFdBQXdCLE9BQU9yQixFQUFnQixTQUMvQyxXQUE4QixPQUFPQSxHQUV0QyxPQURBSCxFQUFvQlUsRUFBRUUsRUFBUSxJQUFLQSxHQUM1QkEsR0FJUlosRUFBb0JhLEVBQUksU0FBU2lCLEVBQVFDLEdBQVksT0FBT2pCLE9BQU9rQixVQUFVQyxlQUFlMUIsS0FBS3VCLEVBQVFDLElBR3pHL0IsRUFBb0JrQyxFQUFJLEdBSWpCbEMsRUFBb0JBLEVBQW9CbUMsRUFBSSxHLCtCQzdFckRyQixPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFDdEQsSUFBSWUsT0FBaUJDLEVBQ3JCLFNBQVNDLEVBQVFYLEdBQ2IsTUFBTVksRUFBVUMsU0FBU0MsZUFBZSxnQ0FDeEMsR0FBSUYsRUFBUyxDQUNULE1BQU1HLEVBQU9ILEVBQVFJLGFBQWFoQixHQUNsQyxHQUFJZSxFQUNBLE9BQU9FLEtBQUtDLE1BQU1ILEdBRzFCLE1BQU0sSUFBSUksTUFBTSwyQkFBMkJuQixLQUUvQ3pCLEVBQVFvQyxRQUFVQSxFQVdsQnBDLEVBQVE2QyxZQVZSLFdBQ0ksR0FBSVgsRUFDQSxPQUFPQSxFQUdYLEdBREFBLEVBQWlCRSxFQUFRLGlCQUVyQixPQUFPRixFQUVYLE1BQU0sSUFBSVUsTUFBTSw2QixjQzFCcEIsSUFBSUUsRUFHSkEsRUFBSSxXQUNILE9BQU9DLEtBREosR0FJSixJQUVDRCxFQUFJQSxHQUFLLElBQUlFLFNBQVMsY0FBYixHQUNSLE1BQU9DLEdBRWMsaUJBQVhDLFNBQXFCSixFQUFJSSxRQU9yQ2pELEVBQU9ELFFBQVU4QyxHLDZCQ2RqQmxDLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxNQUFNZ0MsRUFBYSxFQUFRLEdBQ3JCQyxFQUFnQixZQUl0QixTQUFTQyxFQUFVQyxHQUNmLE9BSldDLEVBSUUsRUFKR0MsRUFJQUwsRUFBV04sY0FBY1ksVUFBWSxFQUpoQ3RDLEVBSW1DbUMsRUFIakRJLEtBQUtILElBQUlDLEVBQUtFLEtBQUtGLElBQUlELEVBQUtwQyxJQUR2QyxJQUFlb0MsRUFBS0MsRUFBS3JDLEVBTXpCLE1BQU13QyxFQUFzQixNQUN4QixJQUFJQyxFQUNKLE1BQU8sS0FDSCxJQUFLQSxFQUFVLENBQ1hBLEVBQVcsQ0FBQyxDQUFFdkIsUUFBU0MsU0FBU3VCLEtBQU1QLEtBQU0sSUFDNUMsSUFBSyxNQUFNakIsS0FBV0MsU0FBU3dCLHVCQUF1QlYsR0FBZ0IsQ0FDbEUsTUFBTUUsR0FBUWpCLEVBQVFJLGFBQWEsYUFDL0JzQixNQUFNVCxLQUdjLFNBQXBCakIsRUFBUTJCLFNBQXNCM0IsRUFBUTRCLGVBQW1ELFFBQWxDNUIsRUFBUTRCLGNBQWNELFFBRzdFSixFQUFTTSxLQUFLLENBQUU3QixRQUFTQSxFQUFRNEIsY0FBZVgsU0FHaERNLEVBQVNNLEtBQUssQ0FBRTdCLFFBQVNBLEVBQVNpQixXQUk5QyxPQUFPTSxJQXBCYSxHQTZCNUIsU0FBU08sRUFBeUJDLEdBQzlCLE1BQU1DLEVBQWFYLEtBQUtZLE1BQU1GLEdBQ3hCRyxFQUFRWixJQUNkLElBQUlhLEVBQVdELEVBQU0sSUFBTSxLQUMzQixJQUFLLE1BQU1FLEtBQVNGLEVBQU8sQ0FDdkIsR0FBSUUsRUFBTW5CLE9BQVNlLEVBQ2YsTUFBTyxDQUFFRyxTQUFVQyxFQUFPQyxVQUFNdkMsR0FFL0IsR0FBSXNDLEVBQU1uQixLQUFPZSxFQUNsQixNQUFPLENBQUVHLFdBQVVFLEtBQU1ELEdBRTdCRCxFQUFXQyxFQUVmLE1BQU8sQ0FBRUQsWUFNYixTQUFTRyxFQUE0QkMsR0FDakMsTUFBTUwsRUFBUVosSUFDUmtCLEVBQVdELEVBQVMxQixPQUFPNEIsUUFDakMsSUFBSUMsR0FBTSxFQUNOQyxFQUFLVCxFQUFNVSxPQUFTLEVBQ3hCLEtBQU9GLEVBQUssRUFBSUMsR0FBSSxDQUNoQixNQUFNRSxFQUFNeEIsS0FBS1ksT0FBT1MsRUFBS0MsR0FBTSxHQUM3QkcsRUFBU0MsRUFBaUJiLEVBQU1XLElBQ2xDQyxFQUFPRSxJQUFNRixFQUFPRyxRQUFVVCxFQUM5QkcsRUFBS0UsRUFHTEgsRUFBS0csRUFHYixNQUFNSyxFQUFZaEIsRUFBTVMsR0FDbEJRLEVBQVdKLEVBQWlCRyxHQUNsQyxHQUFJUCxHQUFNLEdBQUtRLEVBQVNILElBQU1SLEVBQVUsQ0FFcEMsTUFBTyxDQUFFTCxTQURTRCxFQUFNUSxHQUNNTCxLQUFNYSxHQUV4QyxPQUFJUCxFQUFLLEdBQUtBLEVBQUtULEVBQU1VLFFBQVVPLEVBQVNILElBQU1HLEVBQVNGLE9BQVNULEVBQ3pELENBQUVMLFNBQVVlLEVBQVdiLEtBQU1ILEVBQU1TLEVBQUssSUFFNUMsQ0FBRVIsU0FBVWUsR0FHdkIsU0FBU0gsR0FBaUIsUUFBRS9DLElBQ3hCLE1BQU1vRCxFQUFXcEQsRUFBUXFELHdCQUduQkMsRUFBZ0J0RCxFQUFRdUQsY0FBYyxJQUFJeEMsS0FDaEQsR0FBSXVDLEVBQWUsQ0FDZixNQUFNRSxFQUFjRixFQUFjRCx3QkFDNUJKLEVBQVM1QixLQUFLRixJQUFJLEVBQUlxQyxFQUFZUixJQUFNSSxFQUFTSixLQUN2RCxNQUFPLENBQ0hBLElBQUtJLEVBQVNKLElBQ2RDLE9BQVFBLEdBR2hCLE9BQU9HLEVBNUNYekYsRUFBUW1FLHlCQUEyQkEsRUE4Qm5DbkUsRUFBUTJFLDRCQUE4QkEsRUE4Q3RDM0UsRUFBUThGLHlCQTNCUixTQUFrQ3hDLEdBQzlCLElBQUtILEVBQVdOLGNBQWNrRCx3QkFDMUIsT0FFSixHQUFJekMsR0FBUSxFQUVSLFlBREFKLE9BQU84QyxPQUFPOUMsT0FBTytDLFFBQVMsR0FHbEMsTUFBTSxTQUFFekIsRUFBUSxLQUFFRSxHQUFTUCxFQUF5QmIsR0FDcEQsSUFBS2tCLEVBQ0QsT0FFSixJQUFJMEIsRUFBVyxFQUNmLE1BQU1DLEVBQU9mLEVBQWlCWixHQUN4QjRCLEVBQWNELEVBQUtkLElBQ3pCLEdBQUlYLEdBQVFBLEVBQUtwQixPQUFTa0IsRUFBU2xCLEtBQU0sQ0FJckM0QyxFQUFXRSxHQUZjOUMsRUFBT2tCLEVBQVNsQixPQUFTb0IsRUFBS3BCLEtBQU9rQixFQUFTbEIsT0FDakRvQixFQUFLckMsUUFBUXFELHdCQUF3QkwsSUFBTWUsT0FHaEUsQ0FDRCxNQUFNQyxFQUFvQi9DLEVBQU9JLEtBQUtZLE1BQU1oQixHQUM1QzRDLEVBQVdFLEVBQWVELEVBQUtiLE9BQVNlLEVBRTVDbkQsT0FBTzhDLE9BQU85QyxPQUFPK0MsUUFBU3ZDLEtBQUtGLElBQUksRUFBR04sT0FBTzRCLFFBQVVvQixLQXFCL0RsRyxFQUFRc0csaUNBbEJSLFNBQTBDMUIsR0FDdEMsTUFBTSxTQUFFSixFQUFRLEtBQUVFLEdBQVNDLEVBQTRCQyxHQUN2RCxHQUFJSixFQUFVLENBQ1YsTUFBTStCLEVBQWlCbkIsRUFBaUJaLEdBQ2xDZ0MsRUFBc0I1QixFQUFTMUIsT0FBTzRCLFFBQVV5QixFQUFlbEIsSUFDckUsR0FBSVgsRUFBTSxDQUNOLE1BQU0rQixFQUEwQkQsR0FBc0JwQixFQUFpQlYsR0FBTVcsSUFBTWtCLEVBQWVsQixLQUVsRyxPQUFPaEMsRUFETW1CLEVBQVNsQixLQUFPbUQsR0FBMkIvQixFQUFLcEIsS0FBT2tCLEVBQVNsQixPQUc1RSxDQUNELE1BQU1vRCxFQUF3QkYsRUFBc0JELEVBQXFCLE9BRXpFLE9BQU9sRCxFQURNbUIsRUFBU2xCLEtBQU9vRCxJQUlyQyxPQUFPLE1BV1gxRyxFQUFRMkcsMEJBTFIsU0FBbUNDLEdBQy9CLE9BQU9qRCxJQUFzQmtELEtBQU14RSxHQUN4QkEsRUFBUUEsUUFBUXlFLEtBQU9GLEssOEJDL0p0QyxZQUtBaEcsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBQ3RELE1BQU00RixFQUFxQixFQUFRLEdBQzdCQyxFQUFXLEVBQVEsR0FDbkJDLEVBQWMsRUFBUSxHQUN0QkMsRUFBZ0IsRUFBUSxHQUN4Qi9ELEVBQWEsRUFBUSxHQUNyQmdFLEVBQVcsRUFBUSxJQUN6QixJQUFJQyxHQUFpQixFQUNyQixNQUFNQyxFQUFTLElBQUlOLEVBQW1CTyxpQkFDaENDLEVBQVdwRSxFQUFXTixjQUN0QjJFLEVBQVNDLG1CQUNUQyxFQUFRLElBQUtGLEVBQU9HLGNBQWV4RSxFQUFXZixRQUFRLGVBRTVEb0YsRUFBT0ksU0FBU0YsR0FDaEIsTUFBTUcsRUFBWVosRUFBWWEsc0JBQXNCTixHQUNwRHRFLE9BQU82RSxXQUFXQyxVQUFVSCxHQUM1QjNFLE9BQU8rRSxvQkFBb0JELFVBQVVILEdBQ3JDM0UsT0FBT2dGLE9BQVMsS0FDWkMsS0FFSm5CLEVBQVNvQixtQkFBbUIsS0FDeEIsTUFBTUMsRUFBaUJYLEVBQU1XLGVBQ0MsaUJBQW5CQSxHQUFnQ2QsRUFBU1gsU0FPaERXLEVBQVN4Qix5QkFDVHVDLEVBQWEsS0FFVCxHQUFJZixFQUFTWCxTQUFVLENBQ25CYyxFQUFNZCxjQUFXekUsRUFDakJxRixFQUFPSSxTQUFTRixHQUNoQixNQUFNckYsRUFBVTZFLEVBQWNQLDBCQUEwQlksRUFBU1gsVUFDN0R2RSxJQUNBK0UsR0FBaUIsRUFDakJGLEVBQWNwQix5QkFBeUJ6RCxFQUFRaUIsWUFJOUNTLE1BQU13RCxFQUFTakUsUUFDaEI4RCxHQUFpQixFQUNqQkYsRUFBY3BCLHlCQUF5QnlCLEVBQVNqRSxTQXJCNURnRixFQUFhLEtBQ1RsQixHQUFpQixFQUNqQmxFLE9BQU9nRCxTQUFTLEVBQUdtQyxFQUFpQi9GLFNBQVN1QixLQUFLMEUsa0JBeUI5RCxNQUFNQyxFQUFlLE1BQ2pCLE1BQU1DLEVBQVd0QixFQUFVN0QsSUFDdkI4RCxHQUFpQixFQUNqQkYsRUFBY3BCLHlCQUF5QnhDLElBQ3hDLElBQ0gsT0FBUUEsSUFDQ1MsTUFBTVQsS0FDUG9FLEVBQU1wRSxLQUFPQSxFQUNibUYsRUFBU25GLE1BUkEsR0FZckIsSUFBSTZFLEVBQW1CaEIsRUFBUyxLQUM1QixNQUFNdUIsRUFBWSxHQUNsQixJQUFJQyxFQUFTckcsU0FBU3NHLHFCQUFxQixPQUMzQyxHQUFJRCxFQUFRLENBQ1IsSUFBSXpJLEVBQ0osSUFBS0EsRUFBSSxFQUFHQSxFQUFJeUksRUFBTzFELE9BQVEvRSxJQUFLLENBQ2hDLE1BQU0ySSxFQUFNRixFQUFPekksR0FDZjJJLEVBQUlDLFVBQVVDLFNBQVMsWUFDdkJGLEVBQUlDLFVBQVVFLE9BQU8sV0FFekJOLEVBQVV4RSxLQUFLLENBQ1g0QyxHQUFJK0IsRUFBSS9CLEdBQ1J4QixPQUFRdUQsRUFBSXZELE9BQ1oyRCxNQUFPSixFQUFJSSxRQUduQnBCLEVBQVVxQixZQUFZLGtCQUFtQlIsS0FFOUMsSUFDSHhGLE9BQU9pRyxpQkFBaUIsU0FBVSxLQUM5Qi9CLEdBQWlCLEVBQ2pCZ0MsSUFDQWpCLE1BQ0QsR0FDSGpGLE9BQU9pRyxpQkFBaUIsVUFBV0UsSUFDL0IsR0FBSUEsRUFBTTdHLEtBQUs4RyxTQUFXL0IsRUFBUytCLE9BR25DLE9BQVFELEVBQU03RyxLQUFLK0csTUFDZixJQUFLLGlDQUNEbEMsRUFBT21DLCtCQUErQkgsRUFBTTdHLEtBQUtjLE1BQ2pELE1BQ0osSUFBSyxhQUNEa0YsRUFBYWEsRUFBTTdHLEtBQUtjLFNBR2pDLEdBQ0hoQixTQUFTNkcsaUJBQWlCLFdBQVlFLElBQ2xDLElBQUs5QixFQUFTa0MsNEJBQ1YsT0FHSixJQUFLLElBQUlDLEVBQU9MLEVBQU1NLE9BQVFELEVBQU1BLEVBQU9BLEVBQUtFLFdBQzVDLEdBQXFCLE1BQWpCRixFQUFLMUYsUUFDTCxPQUdSLE1BQU1ZLEVBQVN5RSxFQUFNUSxNQUNmdkcsRUFBTzRELEVBQWNaLGlDQUFpQzFCLEdBQ3hDLGlCQUFUdEIsR0FBc0JTLE1BQU1ULElBQ25DdUUsRUFBVXFCLFlBQVksV0FBWSxDQUFFNUYsS0FBTUksS0FBS1ksTUFBTWhCLE9BRzdELE1BQU13RyxFQUF5QixDQUFDLFFBQVMsU0FBVSxVQUFXLFVBQVcsb0JBd0N6RSxTQUFTVixJQUNMMUIsRUFBTVcsZUFBaUJuRixPQUFPNEIsUUFBVXhDLFNBQVN1QixLQUFLMEUsYUFDdERmLEVBQU9JLFNBQVNGLEdBekNwQnBGLFNBQVM2RyxpQkFBaUIsUUFBU0UsSUFDL0IsSUFBS0EsRUFDRCxPQUVKLElBQUlLLEVBQU9MLEVBQU1NLE9BQ2pCLEtBQU9ELEdBQU0sQ0FDVCxHQUFJQSxFQUFLMUYsU0FBNEIsTUFBakIwRixFQUFLMUYsU0FBbUIwRixFQUFLSyxLQUFNLENBQ25ELEdBQUlMLEVBQUtqSCxhQUFhLFFBQVF1SCxXQUFXLEtBQ3JDLE9BR0osR0FBSUYsRUFBdUJHLEtBQUtDLEdBQVVSLEVBQUtLLEtBQUtDLFdBQVdFLElBQzNELE9BRUosTUFBTUMsRUFBV1QsRUFBS2pILGFBQWEsY0FBZ0JpSCxFQUFLakgsYUFBYSxRQUVyRSxNQUFLLGNBQWMySCxLQUFLRCxRQU14QixHQUxJdEMsRUFBVXFCLFlBQVksV0FBWSxDQUFFYSxLQUFNSSxJQUMxQ2QsRUFBTWdCLHNCQUNOaEIsRUFBTWlCLG1CQUtkWixFQUFPQSxFQUFLRSxjQUVqQixHQUNIMUcsT0FBT2lHLGlCQUFpQixTQUFVaEMsRUFBUyxLQUV2QyxHQURBaUMsSUFDSWhDLEVBQ0FBLEdBQWlCLE1BRWhCLENBQ0QsTUFBTTlELEVBQU80RCxFQUFjWixpQ0FBaUNwRCxPQUFPNEIsU0FDL0MsaUJBQVR4QixHQUFzQlMsTUFBTVQsSUFDbkN1RSxFQUFVcUIsWUFBWSxhQUFjLENBQUU1RixXQUcvQyxPLCtDQy9KSCwyQ0FpQkEsU0FBU2lILEVBQVF6RCxFQUFJMEQsR0FDbkJ6SCxLQUFLMEgsSUFBTTNELEVBQ1gvRCxLQUFLMkgsU0FBV0YsRUFmbEJ4SyxFQUFRMkssV0FBYSxXQUNuQixPQUFPLElBQUlKLEVBQVFLLEVBQU12SyxLQUFLc0ssV0FBWXpILE9BQVEySCxXQUFZQyxlQUVoRTlLLEVBQVErSyxZQUFjLFdBQ3BCLE9BQU8sSUFBSVIsRUFBUUssRUFBTXZLLEtBQUswSyxZQUFhN0gsT0FBUTJILFdBQVlHLGdCQUVqRWhMLEVBQVE4SyxhQUNSOUssRUFBUWdMLGNBQWdCLFNBQVNDLEdBQzNCQSxHQUNGQSxFQUFRQyxTQVFaWCxFQUFRekksVUFBVXFKLE1BQVFaLEVBQVF6SSxVQUFVc0osSUFBTSxhQUNsRGIsRUFBUXpJLFVBQVVvSixNQUFRLFdBQ3hCbkksS0FBSzJILFNBQVNySyxLQUFLNkMsT0FBUUgsS0FBSzBILE1BSWxDekssRUFBUXFMLE9BQVMsU0FBU0MsRUFBTUMsR0FDOUJULGFBQWFRLEVBQUtFLGdCQUNsQkYsRUFBS0csYUFBZUYsR0FHdEJ2TCxFQUFRMEwsU0FBVyxTQUFTSixHQUMxQlIsYUFBYVEsRUFBS0UsZ0JBQ2xCRixFQUFLRyxjQUFnQixHQUd2QnpMLEVBQVEyTCxhQUFlM0wsRUFBUTRMLE9BQVMsU0FBU04sR0FDL0NSLGFBQWFRLEVBQUtFLGdCQUVsQixJQUFJRCxFQUFRRCxFQUFLRyxhQUNiRixHQUFTLElBQ1hELEVBQUtFLGVBQWlCYixZQUFXLFdBQzNCVyxFQUFLTyxZQUNQUCxFQUFLTyxlQUNOTixLQUtQLEVBQVEsR0FJUnZMLEVBQVFzSSxhQUFnQyxvQkFBVHdELE1BQXdCQSxLQUFLeEQsbUJBQ2xCLElBQVh5RCxHQUEwQkEsRUFBT3pELGNBQ3hDdkYsTUFBUUEsS0FBS3VGLGFBQ3JDdEksRUFBUWdNLGVBQWtDLG9CQUFURixNQUF3QkEsS0FBS0UscUJBQ2xCLElBQVhELEdBQTBCQSxFQUFPQyxnQkFDeENqSixNQUFRQSxLQUFLaUosaUIsa0NDM0R2Qyw2QkFDSSxhQUVBLElBQUlELEVBQU96RCxhQUFYLENBSUEsSUFJSTJELEVBNkhJQyxFQVpBQyxFQXJCQUMsRUFDQUMsRUFqR0pDLEVBQWEsRUFDYkMsRUFBZ0IsR0FDaEJDLEdBQXdCLEVBQ3hCQyxFQUFNVixFQUFPekosU0FvSmJvSyxFQUFXOUwsT0FBTytMLGdCQUFrQi9MLE9BQU8rTCxlQUFlWixHQUM5RFcsRUFBV0EsR0FBWUEsRUFBUy9CLFdBQWErQixFQUFXWCxFQUdmLHFCQUFyQyxHQUFHYSxTQUFTdk0sS0FBSzBMLEVBQU9jLFNBcEZ4QlosRUFBb0IsU0FBU2EsR0FDekJELEVBQVFFLFVBQVMsV0FBY0MsRUFBYUYsUUFJcEQsV0FHSSxHQUFJZixFQUFPN0MsY0FBZ0I2QyxFQUFPa0IsY0FBZSxDQUM3QyxJQUFJQyxHQUE0QixFQUM1QkMsRUFBZXBCLEVBQU9xQixVQU0xQixPQUxBckIsRUFBT3FCLFVBQVksV0FDZkYsR0FBNEIsR0FFaENuQixFQUFPN0MsWUFBWSxHQUFJLEtBQ3ZCNkMsRUFBT3FCLFVBQVlELEVBQ1pELEdBd0VKRyxHQUlBdEIsRUFBT3VCLGlCQTlDVm5CLEVBQVUsSUFBSW1CLGdCQUNWQyxNQUFNSCxVQUFZLFNBQVMvRCxHQUUvQjJELEVBRGEzRCxFQUFNN0csT0FJdkJ5SixFQUFvQixTQUFTYSxHQUN6QlgsRUFBUXFCLE1BQU10RSxZQUFZNEQsS0EyQ3ZCTCxHQUFPLHVCQUF3QkEsRUFBSWdCLGNBQWMsV0F0Q3BEdkIsRUFBT08sRUFBSWlCLGdCQUNmekIsRUFBb0IsU0FBU2EsR0FHekIsSUFBSWEsRUFBU2xCLEVBQUlnQixjQUFjLFVBQy9CRSxFQUFPQyxtQkFBcUIsV0FDeEJaLEVBQWFGLEdBQ2JhLEVBQU9DLG1CQUFxQixLQUM1QjFCLEVBQUsyQixZQUFZRixHQUNqQkEsRUFBUyxNQUViekIsRUFBSzRCLFlBQVlILEtBS3JCMUIsRUFBb0IsU0FBU2EsR0FDekJuQyxXQUFXcUMsRUFBYyxFQUFHRixLQWxENUJWLEVBQWdCLGdCQUFrQjFJLEtBQUtxSyxTQUFXLElBQ2xEMUIsRUFBa0IsU0FBU2hELEdBQ3ZCQSxFQUFNQyxTQUFXeUMsR0FDSyxpQkFBZjFDLEVBQU03RyxNQUN5QixJQUF0QzZHLEVBQU03RyxLQUFLd0wsUUFBUTVCLElBQ25CWSxHQUFjM0QsRUFBTTdHLEtBQUt5TCxNQUFNN0IsRUFBY25ILFVBSWpEOEcsRUFBTzVDLGlCQUNQNEMsRUFBTzVDLGlCQUFpQixVQUFXa0QsR0FBaUIsR0FFcEROLEVBQU9tQyxZQUFZLFlBQWE3QixHQUdwQ0osRUFBb0IsU0FBU2EsR0FDekJmLEVBQU83QyxZQUFZa0QsRUFBZ0JVLEVBQVEsT0FnRW5ESixFQUFTcEUsYUExS1QsU0FBc0I2RixHQUVJLG1CQUFiQSxJQUNUQSxFQUFXLElBQUluTCxTQUFTLEdBQUttTCxJQUkvQixJQURBLElBQUlDLEVBQU8sSUFBSUMsTUFBTXhELFVBQVU1RixPQUFTLEdBQy9CL0UsRUFBSSxFQUFHQSxFQUFJa08sRUFBS25KLE9BQVEvRSxJQUM3QmtPLEVBQUtsTyxHQUFLMkssVUFBVTNLLEVBQUksR0FHNUIsSUFBSW9PLEVBQU8sQ0FBRUgsU0FBVUEsRUFBVUMsS0FBTUEsR0FHdkMsT0FGQTdCLEVBQWNELEdBQWNnQyxFQUM1QnJDLEVBQWtCSyxHQUNYQSxLQTZKVEksRUFBU1YsZUFBaUJBLEVBMUoxQixTQUFTQSxFQUFlYyxVQUNiUCxFQUFjTyxHQXlCekIsU0FBU0UsRUFBYUYsR0FHbEIsR0FBSU4sRUFHQTdCLFdBQVdxQyxFQUFjLEVBQUdGLE9BQ3pCLENBQ0gsSUFBSXdCLEVBQU8vQixFQUFjTyxHQUN6QixHQUFJd0IsRUFBTSxDQUNOOUIsR0FBd0IsRUFDeEIsS0FqQ1osU0FBYThCLEdBQ1QsSUFBSUgsRUFBV0csRUFBS0gsU0FDaEJDLEVBQU9FLEVBQUtGLEtBQ2hCLE9BQVFBLEVBQUtuSixRQUNiLEtBQUssRUFDRGtKLElBQ0EsTUFDSixLQUFLLEVBQ0RBLEVBQVNDLEVBQUssSUFDZCxNQUNKLEtBQUssRUFDREQsRUFBU0MsRUFBSyxHQUFJQSxFQUFLLElBQ3ZCLE1BQ0osS0FBSyxFQUNERCxFQUFTQyxFQUFLLEdBQUlBLEVBQUssR0FBSUEsRUFBSyxJQUNoQyxNQUNKLFFBQ0lELEVBQVN2RCxNQUFNekksRUFBV2lNLElBaUJsQkcsQ0FBSUQsR0FDTixRQUNFdEMsRUFBZWMsR0FDZk4sR0FBd0IsTUF2RTVDLENBeUxrQixvQkFBVFYsVUFBeUMsSUFBWEMsRUFBeUJoSixLQUFPZ0osRUFBU0QsUSxvQ0N4TGhGLElBT0kwQyxFQUNBQyxFQVJBNUIsRUFBVTVNLEVBQU9ELFFBQVUsR0FVL0IsU0FBUzBPLElBQ0wsTUFBTSxJQUFJOUwsTUFBTSxtQ0FFcEIsU0FBUytMLElBQ0wsTUFBTSxJQUFJL0wsTUFBTSxxQ0FzQnBCLFNBQVNnTSxFQUFXQyxHQUNoQixHQUFJTCxJQUFxQjdELFdBRXJCLE9BQU9BLFdBQVdrRSxFQUFLLEdBRzNCLElBQUtMLElBQXFCRSxJQUFxQkYsSUFBcUI3RCxXQUVoRSxPQURBNkQsRUFBbUI3RCxXQUNaQSxXQUFXa0UsRUFBSyxHQUUzQixJQUVJLE9BQU9MLEVBQWlCSyxFQUFLLEdBQy9CLE1BQU01TCxHQUNKLElBRUksT0FBT3VMLEVBQWlCbk8sS0FBSyxLQUFNd08sRUFBSyxHQUMxQyxNQUFNNUwsR0FFSixPQUFPdUwsRUFBaUJuTyxLQUFLMEMsS0FBTThMLEVBQUssTUF2Q25ELFdBQ0csSUFFUUwsRUFEc0IsbUJBQWY3RCxXQUNZQSxXQUVBK0QsRUFFekIsTUFBT3pMLEdBQ0x1TCxFQUFtQkUsRUFFdkIsSUFFUUQsRUFEd0IsbUJBQWpCM0QsYUFDY0EsYUFFQTZELEVBRTNCLE1BQU8xTCxHQUNMd0wsRUFBcUJFLEdBakI3QixHQXdFQSxJQUVJRyxFQUZBQyxFQUFRLEdBQ1JDLEdBQVcsRUFFWEMsR0FBYyxFQUVsQixTQUFTQyxJQUNBRixHQUFhRixJQUdsQkUsR0FBVyxFQUNQRixFQUFhN0osT0FDYjhKLEVBQVFELEVBQWFLLE9BQU9KLEdBRTVCRSxHQUFjLEVBRWRGLEVBQU05SixRQUNObUssS0FJUixTQUFTQSxJQUNMLElBQUlKLEVBQUosQ0FHQSxJQUFJL0QsRUFBVTJELEVBQVdNLEdBQ3pCRixHQUFXLEVBR1gsSUFEQSxJQUFJSyxFQUFNTixFQUFNOUosT0FDVm9LLEdBQUssQ0FHUCxJQUZBUCxFQUFlQyxFQUNmQSxFQUFRLEtBQ0NFLEVBQWFJLEdBQ2RQLEdBQ0FBLEVBQWFHLEdBQVlWLE1BR2pDVSxHQUFjLEVBQ2RJLEVBQU1OLEVBQU05SixPQUVoQjZKLEVBQWUsS0FDZkUsR0FBVyxFQW5FZixTQUF5QjNILEdBQ3JCLEdBQUlvSCxJQUF1QjNELGFBRXZCLE9BQU9BLGFBQWF6RCxHQUd4QixJQUFLb0gsSUFBdUJFLElBQXdCRixJQUF1QjNELGFBRXZFLE9BREEyRCxFQUFxQjNELGFBQ2RBLGFBQWF6RCxHQUV4QixJQUVXb0gsRUFBbUJwSCxHQUM1QixNQUFPcEUsR0FDTCxJQUVJLE9BQU93TCxFQUFtQnBPLEtBQUssS0FBTWdILEdBQ3ZDLE1BQU9wRSxHQUdMLE9BQU93TCxFQUFtQnBPLEtBQUswQyxLQUFNc0UsS0FnRDdDaUksQ0FBZ0JyRSxJQWlCcEIsU0FBU3NFLEVBQUtWLEVBQUtXLEdBQ2Z6TSxLQUFLOEwsSUFBTUEsRUFDWDlMLEtBQUt5TSxNQUFRQSxFQVlqQixTQUFTQyxLQTVCVDVDLEVBQVFFLFNBQVcsU0FBVThCLEdBQ3pCLElBQUlULEVBQU8sSUFBSUMsTUFBTXhELFVBQVU1RixPQUFTLEdBQ3hDLEdBQUk0RixVQUFVNUYsT0FBUyxFQUNuQixJQUFLLElBQUkvRSxFQUFJLEVBQUdBLEVBQUkySyxVQUFVNUYsT0FBUS9FLElBQ2xDa08sRUFBS2xPLEVBQUksR0FBSzJLLFVBQVUzSyxHQUdoQzZPLEVBQU03SyxLQUFLLElBQUlxTCxFQUFLVixFQUFLVCxJQUNKLElBQWpCVyxFQUFNOUosUUFBaUIrSixHQUN2QkosRUFBV1EsSUFTbkJHLEVBQUt6TixVQUFVeU0sSUFBTSxXQUNqQnhMLEtBQUs4TCxJQUFJakUsTUFBTSxLQUFNN0gsS0FBS3lNLFFBRTlCM0MsRUFBUTZDLE1BQVEsVUFDaEI3QyxFQUFROEMsU0FBVSxFQUNsQjlDLEVBQVErQyxJQUFNLEdBQ2QvQyxFQUFRZ0QsS0FBTyxHQUNmaEQsRUFBUWlELFFBQVUsR0FDbEJqRCxFQUFRa0QsU0FBVyxHQUluQmxELEVBQVFtRCxHQUFLUCxFQUNiNUMsRUFBUW9ELFlBQWNSLEVBQ3RCNUMsRUFBUXFELEtBQU9ULEVBQ2Y1QyxFQUFRc0QsSUFBTVYsRUFDZDVDLEVBQVF1RCxlQUFpQlgsRUFDekI1QyxFQUFRd0QsbUJBQXFCWixFQUM3QjVDLEVBQVF5RCxLQUFPYixFQUNmNUMsRUFBUTBELGdCQUFrQmQsRUFDMUI1QyxFQUFRMkQsb0JBQXNCZixFQUU5QjVDLEVBQVE0RCxVQUFZLFNBQVVoUSxHQUFRLE1BQU8sSUFFN0NvTSxFQUFRNkQsUUFBVSxTQUFValEsR0FDeEIsTUFBTSxJQUFJbUMsTUFBTSxxQ0FHcEJpSyxFQUFROEQsSUFBTSxXQUFjLE1BQU8sS0FDbkM5RCxFQUFRK0QsTUFBUSxTQUFVQyxHQUN0QixNQUFNLElBQUlqTyxNQUFNLG1DQUVwQmlLLEVBQVFpRSxNQUFRLFdBQWEsT0FBTyxJLDZCQ3RMcENsUSxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFLdEQsTUFBTStGLEVBQWdCLEVBQVEsR0F3QjlCbEgsRUFBUXNILGlCQXZCUixNQUNJLCtCQUErQmhFLEdBQzNCLE1BQU0sU0FBRWtCLEdBQWEwQyxFQUFjL0MseUJBQXlCYixHQUM1RFAsS0FBS2dPLFFBQVF2TSxHQUFZQSxFQUFTbkMsU0FFdEMsUUFBUTJPLEdBQ0pqTyxLQUFLa08scUJBQXFCbE8sS0FBS21PLFVBQy9Cbk8sS0FBS29PLG1CQUFtQkgsR0FDeEJqTyxLQUFLbU8sU0FBV0YsRUFFcEIscUJBQXFCM08sR0FDWkEsSUFHTEEsRUFBUStPLFVBQVkvTyxFQUFRK08sVUFBVUMsUUFBUSx3QkFBeUIsS0FFM0UsbUJBQW1CaFAsR0FDVkEsSUFHTEEsRUFBUStPLFdBQWEsd0IsNkJDdEI3QnhRLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQVN0RG5CLEVBQVFvSSxtQkFSUixTQUE0QmtKLEdBQ0ksWUFBeEJoUCxTQUFTaVAsWUFBb0Qsa0JBQXhCalAsU0FBU2lQLFdBQzlDalAsU0FBUzZHLGlCQUFpQixtQkFBb0JtSSxHQUc5Q0EsTSw2QkNOUjFRLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxNQUFNZ0MsRUFBYSxFQUFRLEdBQzNCbkQsRUFBUThILHNCQUF5Qk4sR0FDdEIsSUFBSSxNQUNQLFlBQVkrQixFQUFNMUYsR0FDZDJELEVBQU8wQixZQUFZLENBQ2ZLLE9BQ0FELE9BQVFuRyxFQUFXTixjQUFjeUcsT0FDakN6RixZLGlCQ2JoQixZQVVBLElBQUkyTixFQUFrQixzQkFHbEJDLEVBQU0sSUFHTkMsRUFBWSxrQkFHWkMsRUFBUyxhQUdUQyxFQUFhLHFCQUdiQyxFQUFhLGFBR2JDLEVBQVksY0FHWkMsRUFBZUMsU0FHZkMsRUFBOEIsaUJBQVZsRyxHQUFzQkEsR0FBVUEsRUFBT25MLFNBQVdBLFFBQVVtTCxFQUdoRm1HLEVBQTBCLGlCQUFScEcsTUFBb0JBLE1BQVFBLEtBQUtsTCxTQUFXQSxRQUFVa0wsS0FHeEVxRyxFQUFPRixHQUFjQyxHQUFZbFAsU0FBUyxjQUFUQSxHQVVqQ29QLEVBUGN4UixPQUFPa0IsVUFPUThLLFNBRzdCeUYsRUFBWTNPLEtBQUtGLElBQ2pCOE8sRUFBWTVPLEtBQUtILElBa0JqQmdQLEVBQU0sV0FDUixPQUFPSixFQUFLSyxLQUFLRCxPQXlEbkIsU0FBU0UsRUFBU0MsRUFBTUMsRUFBTUMsR0FDNUIsSUFBSUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFDQUMsRUFBaUIsRUFDakJDLEdBQVUsRUFDVkMsR0FBUyxFQUNUQyxHQUFXLEVBRWYsR0FBbUIsbUJBQVJaLEVBQ1QsTUFBTSxJQUFJYSxVQUFVL0IsR0FVdEIsU0FBU2dDLEVBQVdDLEdBQ2xCLElBQUlyRixFQUFPeUUsRUFDUGEsRUFBVVosRUFLZCxPQUhBRCxFQUFXQyxPQUFXM1EsRUFDdEJnUixFQUFpQk0sRUFDakJULEVBQVNOLEVBQUs5SCxNQUFNOEksRUFBU3RGLEdBcUIvQixTQUFTdUYsRUFBYUYsR0FDcEIsSUFBSUcsRUFBb0JILEVBQU9QLEVBTS9CLFlBQXlCL1EsSUFBakIrUSxHQUErQlUsR0FBcUJqQixHQUN6RGlCLEVBQW9CLEdBQU9QLEdBTkpJLEVBQU9OLEdBTThCSixFQUdqRSxTQUFTYyxJQUNQLElBQUlKLEVBQU9sQixJQUNYLEdBQUlvQixFQUFhRixHQUNmLE9BQU9LLEVBQWFMLEdBR3RCUixFQUFVdEksV0FBV2tKLEVBekJ2QixTQUF1QkosR0FDckIsSUFFSVQsRUFBU0wsR0FGV2MsRUFBT1AsR0FJL0IsT0FBT0csRUFBU2YsRUFBVVUsRUFBUUQsR0FIUlUsRUFBT04sSUFHa0NILEVBb0JoQ2UsQ0FBY04sSUFHbkQsU0FBU0ssRUFBYUwsR0FLcEIsT0FKQVIsT0FBVTlRLEVBSU5tUixHQUFZVCxFQUNQVyxFQUFXQyxJQUVwQlosRUFBV0MsT0FBVzNRLEVBQ2Y2USxHQWVULFNBQVNnQixJQUNQLElBQUlQLEVBQU9sQixJQUNQMEIsRUFBYU4sRUFBYUYsR0FNOUIsR0FKQVosRUFBV2hJLFVBQ1hpSSxFQUFXL1AsS0FDWG1RLEVBQWVPLEVBRVhRLEVBQVksQ0FDZCxRQUFnQjlSLElBQVo4USxFQUNGLE9BdkVOLFNBQXFCUSxHQU1uQixPQUpBTixFQUFpQk0sRUFFakJSLEVBQVV0SSxXQUFXa0osRUFBY2xCLEdBRTVCUyxFQUFVSSxFQUFXQyxHQUFRVCxFQWlFekJrQixDQUFZaEIsR0FFckIsR0FBSUcsRUFHRixPQURBSixFQUFVdEksV0FBV2tKLEVBQWNsQixHQUM1QmEsRUFBV04sR0FNdEIsWUFIZ0IvUSxJQUFaOFEsSUFDRkEsRUFBVXRJLFdBQVdrSixFQUFjbEIsSUFFOUJLLEVBSVQsT0F4R0FMLEVBQU93QixFQUFTeEIsSUFBUyxFQUNyQnlCLEVBQVN4QixLQUNYUSxJQUFZUixFQUFRUSxRQUVwQkwsR0FEQU0sRUFBUyxZQUFhVCxHQUNIUCxFQUFVOEIsRUFBU3ZCLEVBQVFHLFVBQVksRUFBR0osR0FBUUksRUFDckVPLEVBQVcsYUFBY1YsSUFBWUEsRUFBUVUsU0FBV0EsR0FpRzFEVSxFQUFVSyxPQW5DVixnQkFDa0JsUyxJQUFaOFEsR0FDRm5JLGFBQWFtSSxHQUVmRSxFQUFpQixFQUNqQk4sRUFBV0ssRUFBZUosRUFBV0csT0FBVTlRLEdBK0JqRDZSLEVBQVVNLE1BNUJWLFdBQ0UsWUFBbUJuUyxJQUFaOFEsRUFBd0JELEVBQVNjLEVBQWF2QixNQTRCaER5QixFQTBGVCxTQUFTSSxFQUFTalQsR0FDaEIsSUFBSW9JLFNBQWNwSSxFQUNsQixRQUFTQSxJQUFrQixVQUFSb0ksR0FBNEIsWUFBUkEsR0E0RXpDLFNBQVM0SyxFQUFTaFQsR0FDaEIsR0FBb0IsaUJBQVRBLEVBQ1QsT0FBT0EsRUFFVCxHQWhDRixTQUFrQkEsR0FDaEIsTUFBdUIsaUJBQVRBLEdBdEJoQixTQUFzQkEsR0FDcEIsUUFBU0EsR0FBeUIsaUJBQVRBLEVBc0J0Qm9ULENBQWFwVCxJQUFVaVIsRUFBZS9SLEtBQUtjLElBQVV1USxFQThCcEQ4QyxDQUFTclQsR0FDWCxPQUFPc1EsRUFFVCxHQUFJMkMsRUFBU2pULEdBQVEsQ0FDbkIsSUFBSXNULEVBQWdDLG1CQUFqQnRULEVBQU11VCxRQUF3QnZULEVBQU11VCxVQUFZdlQsRUFDbkVBLEVBQVFpVCxFQUFTSyxHQUFVQSxFQUFRLEdBQU1BLEVBRTNDLEdBQW9CLGlCQUFUdFQsRUFDVCxPQUFpQixJQUFWQSxFQUFjQSxHQUFTQSxFQUVoQ0EsRUFBUUEsRUFBTWtRLFFBQVFNLEVBQVEsSUFDOUIsSUFBSWdELEVBQVc5QyxFQUFXekgsS0FBS2pKLEdBQy9CLE9BQVF3VCxHQUFZN0MsRUFBVTFILEtBQUtqSixHQUMvQjRRLEVBQWE1USxFQUFNOE0sTUFBTSxHQUFJMEcsRUFBVyxFQUFJLEdBQzNDL0MsRUFBV3hILEtBQUtqSixHQUFTc1EsR0FBT3RRLEVBR3ZDbEIsRUFBT0QsUUE5SVAsU0FBa0IwUyxFQUFNQyxFQUFNQyxHQUM1QixJQUFJUSxHQUFVLEVBQ1ZFLEdBQVcsRUFFZixHQUFtQixtQkFBUlosRUFDVCxNQUFNLElBQUlhLFVBQVUvQixHQU10QixPQUpJNEMsRUFBU3hCLEtBQ1hRLEVBQVUsWUFBYVIsSUFBWUEsRUFBUVEsUUFBVUEsRUFDckRFLEVBQVcsYUFBY1YsSUFBWUEsRUFBUVUsU0FBV0EsR0FFbkRiLEVBQVNDLEVBQU1DLEVBQU0sQ0FDMUIsUUFBV1MsRUFDWCxRQUFXVCxFQUNYLFNBQVlXLE8iLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMyk7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IGNhY2hlZFNldHRpbmdzID0gdW5kZWZpbmVkO1xuZnVuY3Rpb24gZ2V0RGF0YShrZXkpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ZzY29kZS1tYXJrZG93bi1wcmV2aWV3LWRhdGEnKTtcbiAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBjb25zdCBkYXRhID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGxvYWQgZGF0YSBmb3IgJHtrZXl9YCk7XG59XG5leHBvcnRzLmdldERhdGEgPSBnZXREYXRhO1xuZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKSB7XG4gICAgaWYgKGNhY2hlZFNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRTZXR0aW5ncztcbiAgICB9XG4gICAgY2FjaGVkU2V0dGluZ3MgPSBnZXREYXRhKCdkYXRhLXNldHRpbmdzJyk7XG4gICAgaWYgKGNhY2hlZFNldHRpbmdzKSB7XG4gICAgICAgIHJldHVybiBjYWNoZWRTZXR0aW5ncztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCBzZXR0aW5ncycpO1xufVxuZXhwb3J0cy5nZXRTZXR0aW5ncyA9IGdldFNldHRpbmdzO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IGNvZGVMaW5lQ2xhc3MgPSAnY29kZS1saW5lJztcbmZ1bmN0aW9uIGNsYW1wKG1pbiwgbWF4LCB2YWx1ZSkge1xuICAgIHJldHVybiBNYXRoLm1pbihtYXgsIE1hdGgubWF4KG1pbiwgdmFsdWUpKTtcbn1cbmZ1bmN0aW9uIGNsYW1wTGluZShsaW5lKSB7XG4gICAgcmV0dXJuIGNsYW1wKDAsIHNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKS5saW5lQ291bnQgLSAxLCBsaW5lKTtcbn1cbmNvbnN0IGdldENvZGVMaW5lRWxlbWVudHMgPSAoKCkgPT4ge1xuICAgIGxldCBlbGVtZW50cztcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpZiAoIWVsZW1lbnRzKSB7XG4gICAgICAgICAgICBlbGVtZW50cyA9IFt7IGVsZW1lbnQ6IGRvY3VtZW50LmJvZHksIGxpbmU6IDAgfV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjb2RlTGluZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmUgPSArZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGluZScpO1xuICAgICAgICAgICAgICAgIGlmIChpc05hTihsaW5lKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0NPREUnICYmIGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiBlbGVtZW50LnBhcmVudEVsZW1lbnQudGFnTmFtZSA9PT0gJ1BSRScpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmVuY2hlZCBjb2RlIGJsb2NrcyBhcmUgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlIGBjb2RlLWxpbmVgIGNhbiBvbmx5IGJlIG1hcmtlZCBvblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYDxjb2RlPmAgZWxlbWVudCBhbmQgbm90IHRoZSBwYXJlbnQgYDxwcmU+YCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKHsgZWxlbWVudDogZWxlbWVudC5wYXJlbnRFbGVtZW50LCBsaW5lIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaCh7IGVsZW1lbnQ6IGVsZW1lbnQsIGxpbmUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRmluZCB0aGUgaHRtbCBlbGVtZW50cyB0aGF0IG1hcCB0byBhIHNwZWNpZmljIHRhcmdldCBsaW5lIGluIHRoZSBlZGl0b3IuXG4gKlxuICogSWYgYW4gZXhhY3QgbWF0Y2gsIHJldHVybnMgYSBzaW5nbGUgZWxlbWVudC4gSWYgdGhlIGxpbmUgaXMgYmV0d2VlbiBlbGVtZW50cyxcbiAqIHJldHVybnMgdGhlIGVsZW1lbnQgcHJpb3IgdG8gYW5kIHRoZSBlbGVtZW50IGFmdGVyIHRoZSBnaXZlbiBsaW5lLlxuICovXG5mdW5jdGlvbiBnZXRFbGVtZW50c0ZvclNvdXJjZUxpbmUodGFyZ2V0TGluZSkge1xuICAgIGNvbnN0IGxpbmVOdW1iZXIgPSBNYXRoLmZsb29yKHRhcmdldExpbmUpO1xuICAgIGNvbnN0IGxpbmVzID0gZ2V0Q29kZUxpbmVFbGVtZW50cygpO1xuICAgIGxldCBwcmV2aW91cyA9IGxpbmVzWzBdIHx8IG51bGw7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBsaW5lcykge1xuICAgICAgICBpZiAoZW50cnkubGluZSA9PT0gbGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGVudHJ5LCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChlbnRyeS5saW5lID4gbGluZU51bWJlcikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcHJldmlvdXMsIG5leHQ6IGVudHJ5IH07XG4gICAgICAgIH1cbiAgICAgICAgcHJldmlvdXMgPSBlbnRyeTtcbiAgICB9XG4gICAgcmV0dXJuIHsgcHJldmlvdXMgfTtcbn1cbmV4cG9ydHMuZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lO1xuLyoqXG4gKiBGaW5kIHRoZSBodG1sIGVsZW1lbnRzIHRoYXQgYXJlIGF0IGEgc3BlY2lmaWMgcGl4ZWwgb2Zmc2V0IG9uIHRoZSBwYWdlLlxuICovXG5mdW5jdGlvbiBnZXRMaW5lRWxlbWVudHNBdFBhZ2VPZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgbGluZXMgPSBnZXRDb2RlTGluZUVsZW1lbnRzKCk7XG4gICAgY29uc3QgcG9zaXRpb24gPSBvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWTtcbiAgICBsZXQgbG8gPSAtMTtcbiAgICBsZXQgaGkgPSBsaW5lcy5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChsbyArIDEgPCBoaSkge1xuICAgICAgICBjb25zdCBtaWQgPSBNYXRoLmZsb29yKChsbyArIGhpKSAvIDIpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBnZXRFbGVtZW50Qm91bmRzKGxpbmVzW21pZF0pO1xuICAgICAgICBpZiAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gcG9zaXRpb24pIHtcbiAgICAgICAgICAgIGhpID0gbWlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG8gPSBtaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgaGlFbGVtZW50ID0gbGluZXNbaGldO1xuICAgIGNvbnN0IGhpQm91bmRzID0gZ2V0RWxlbWVudEJvdW5kcyhoaUVsZW1lbnQpO1xuICAgIGlmIChoaSA+PSAxICYmIGhpQm91bmRzLnRvcCA+IHBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IGxvRWxlbWVudCA9IGxpbmVzW2xvXTtcbiAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGxvRWxlbWVudCwgbmV4dDogaGlFbGVtZW50IH07XG4gICAgfVxuICAgIGlmIChoaSA+IDEgJiYgaGkgPCBsaW5lcy5sZW5ndGggJiYgaGlCb3VuZHMudG9wICsgaGlCb3VuZHMuaGVpZ2h0ID4gcG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcHJldmlvdXM6IGhpRWxlbWVudCwgbmV4dDogbGluZXNbaGkgKyAxXSB9O1xuICAgIH1cbiAgICByZXR1cm4geyBwcmV2aW91czogaGlFbGVtZW50IH07XG59XG5leHBvcnRzLmdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldCA9IGdldExpbmVFbGVtZW50c0F0UGFnZU9mZnNldDtcbmZ1bmN0aW9uIGdldEVsZW1lbnRCb3VuZHMoeyBlbGVtZW50IH0pIHtcbiAgICBjb25zdCBteUJvdW5kcyA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgLy8gU29tZSBjb2RlIGxpbmUgZWxlbWVudHMgbWF5IGNvbnRhaW4gb3RoZXIgY29kZSBsaW5lIGVsZW1lbnRzLlxuICAgIC8vIEluIHRob3NlIGNhc2VzLCBvbmx5IHRha2UgdGhlIGhlaWdodCB1cCB0byB0aGF0IGNoaWxkLlxuICAgIGNvbnN0IGNvZGVMaW5lQ2hpbGQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2NvZGVMaW5lQ2xhc3N9YCk7XG4gICAgaWYgKGNvZGVMaW5lQ2hpbGQpIHtcbiAgICAgICAgY29uc3QgY2hpbGRCb3VuZHMgPSBjb2RlTGluZUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSBNYXRoLm1heCgxLCAoY2hpbGRCb3VuZHMudG9wIC0gbXlCb3VuZHMudG9wKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0b3A6IG15Qm91bmRzLnRvcCxcbiAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0XG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBteUJvdW5kcztcbn1cbi8qKlxuICogQXR0ZW1wdCB0byByZXZlYWwgdGhlIGVsZW1lbnQgZm9yIGEgc291cmNlIGxpbmUgaW4gdGhlIGVkaXRvci5cbiAqL1xuZnVuY3Rpb24gc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGxpbmUpIHtcbiAgICBpZiAoIXNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKS5zY3JvbGxQcmV2aWV3V2l0aEVkaXRvcikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChsaW5lIDw9IDApIHtcbiAgICAgICAgd2luZG93LnNjcm9sbCh3aW5kb3cuc2Nyb2xsWCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuICAgIGlmICghcHJldmlvdXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgc2Nyb2xsVG8gPSAwO1xuICAgIGNvbnN0IHJlY3QgPSBnZXRFbGVtZW50Qm91bmRzKHByZXZpb3VzKTtcbiAgICBjb25zdCBwcmV2aW91c1RvcCA9IHJlY3QudG9wO1xuICAgIGlmIChuZXh0ICYmIG5leHQubGluZSAhPT0gcHJldmlvdXMubGluZSkge1xuICAgICAgICAvLyBCZXR3ZWVuIHR3byBlbGVtZW50cy4gR28gdG8gcGVyY2VudGFnZSBvZmZzZXQgYmV0d2VlbiB0aGVtLlxuICAgICAgICBjb25zdCBiZXR3ZWVuUHJvZ3Jlc3MgPSAobGluZSAtIHByZXZpb3VzLmxpbmUpIC8gKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuICAgICAgICBjb25zdCBlbGVtZW50T2Zmc2V0ID0gbmV4dC5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCAtIHByZXZpb3VzVG9wO1xuICAgICAgICBzY3JvbGxUbyA9IHByZXZpb3VzVG9wICsgYmV0d2VlblByb2dyZXNzICogZWxlbWVudE9mZnNldDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzSW5FbGVtZW50ID0gbGluZSAtIE1hdGguZmxvb3IobGluZSk7XG4gICAgICAgIHNjcm9sbFRvID0gcHJldmlvdXNUb3AgKyAocmVjdC5oZWlnaHQgKiBwcm9ncmVzc0luRWxlbWVudCk7XG4gICAgfVxuICAgIHdpbmRvdy5zY3JvbGwod2luZG93LnNjcm9sbFgsIE1hdGgubWF4KDEsIHdpbmRvdy5zY3JvbGxZICsgc2Nyb2xsVG8pKTtcbn1cbmV4cG9ydHMuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lID0gc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lO1xuZnVuY3Rpb24gZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgeyBwcmV2aW91cywgbmV4dCB9ID0gZ2V0TGluZUVsZW1lbnRzQXRQYWdlT2Zmc2V0KG9mZnNldCk7XG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzQm91bmRzID0gZ2V0RWxlbWVudEJvdW5kcyhwcmV2aW91cyk7XG4gICAgICAgIGNvbnN0IG9mZnNldEZyb21QcmV2aW91cyA9IChvZmZzZXQgLSB3aW5kb3cuc2Nyb2xsWSAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG4gICAgICAgIGlmIChuZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzc0JldHdlZW5FbGVtZW50cyA9IG9mZnNldEZyb21QcmV2aW91cyAvIChnZXRFbGVtZW50Qm91bmRzKG5leHQpLnRvcCAtIHByZXZpb3VzQm91bmRzLnRvcCk7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcHJldmlvdXMubGluZSArIHByb2dyZXNzQmV0d2VlbkVsZW1lbnRzICogKG5leHQubGluZSAtIHByZXZpb3VzLmxpbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGNsYW1wTGluZShsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzV2l0aGluRWxlbWVudCA9IG9mZnNldEZyb21QcmV2aW91cyAvIChwcmV2aW91c0JvdW5kcy5oZWlnaHQpO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHByZXZpb3VzLmxpbmUgKyBwcm9ncmVzc1dpdGhpbkVsZW1lbnQ7XG4gICAgICAgICAgICByZXR1cm4gY2xhbXBMaW5lKGxpbmUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xufVxuZXhwb3J0cy5nZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCA9IGdldEVkaXRvckxpbmVOdW1iZXJGb3JQYWdlT2Zmc2V0O1xuLyoqXG4gKiBUcnkgdG8gZmluZCB0aGUgaHRtbCBlbGVtZW50IGJ5IHVzaW5nIGEgZnJhZ21lbnQgaWRcbiAqL1xuZnVuY3Rpb24gZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudChmcmFnbWVudCkge1xuICAgIHJldHVybiBnZXRDb2RlTGluZUVsZW1lbnRzKCkuZmluZCgoZWxlbWVudCkgPT4ge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5lbGVtZW50LmlkID09PSBmcmFnbWVudDtcbiAgICB9KTtcbn1cbmV4cG9ydHMuZ2V0TGluZUVsZW1lbnRGb3JGcmFnbWVudCA9IGdldExpbmVFbGVtZW50Rm9yRnJhZ21lbnQ7XG4iLCJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY29uc3QgYWN0aXZlTGluZU1hcmtlcl8xID0gcmVxdWlyZShcIi4vYWN0aXZlTGluZU1hcmtlclwiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3QgbWVzc2FnaW5nXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdpbmdcIik7XG5jb25zdCBzY3JvbGxfc3luY18xID0gcmVxdWlyZShcIi4vc2Nyb2xsLXN5bmNcIik7XG5jb25zdCBzZXR0aW5nc18xID0gcmVxdWlyZShcIi4vc2V0dGluZ3NcIik7XG5jb25zdCB0aHJvdHRsZSA9IHJlcXVpcmUoXCJsb2Rhc2gudGhyb3R0bGVcIik7XG5sZXQgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuY29uc3QgbWFya2VyID0gbmV3IGFjdGl2ZUxpbmVNYXJrZXJfMS5BY3RpdmVMaW5lTWFya2VyKCk7XG5jb25zdCBzZXR0aW5ncyA9IHNldHRpbmdzXzEuZ2V0U2V0dGluZ3MoKTtcbmNvbnN0IHZzY29kZSA9IGFjcXVpcmVWc0NvZGVBcGkoKTtcbmNvbnN0IHN0YXRlID0geyAuLi52c2NvZGUuZ2V0U3RhdGUoKSwgLi4uc2V0dGluZ3NfMS5nZXREYXRhKCdkYXRhLXN0YXRlJykgfTtcbi8vIE1ha2Ugc3VyZSB0byBzeW5jIFZTIENvZGUgc3RhdGUgaGVyZVxudnNjb2RlLnNldFN0YXRlKHN0YXRlKTtcbmNvbnN0IG1lc3NhZ2luZyA9IG1lc3NhZ2luZ18xLmNyZWF0ZVBvc3RlckZvclZzQ29kZSh2c2NvZGUpO1xud2luZG93LmNzcEFsZXJ0ZXIuc2V0UG9zdGVyKG1lc3NhZ2luZyk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvci5zZXRQb3N0ZXIobWVzc2FnaW5nKTtcbndpbmRvdy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgdXBkYXRlSW1hZ2VTaXplcygpO1xufTtcbmV2ZW50c18xLm9uY2VEb2N1bWVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc2Nyb2xsUHJvZ3Jlc3MgPSBzdGF0ZS5zY3JvbGxQcm9ncmVzcztcbiAgICBpZiAodHlwZW9mIHNjcm9sbFByb2dyZXNzID09PSAnbnVtYmVyJyAmJiAhc2V0dGluZ3MuZnJhZ21lbnQpIHtcbiAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcbiAgICAgICAgICAgIHNjcm9sbERpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGxQcm9ncmVzcyAqIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNldHRpbmdzLnNjcm9sbFByZXZpZXdXaXRoRWRpdG9yKSB7XG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBUcnkgdG8gc2Nyb2xsIHRvIGZyYWdtZW50IGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmZyYWdtZW50KSB7XG4gICAgICAgICAgICAgICAgc3RhdGUuZnJhZ21lbnQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdnNjb2RlLnNldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc2Nyb2xsX3N5bmNfMS5nZXRMaW5lRWxlbWVudEZvckZyYWdtZW50KHNldHRpbmdzLmZyYWdtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbF9zeW5jXzEuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKGVsZW1lbnQubGluZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc05hTihzZXR0aW5ncy5saW5lKSkge1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHNjcm9sbF9zeW5jXzEuc2Nyb2xsVG9SZXZlYWxTb3VyY2VMaW5lKHNldHRpbmdzLmxpbmUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5jb25zdCBvblVwZGF0ZVZpZXcgPSAoKCkgPT4ge1xuICAgIGNvbnN0IGRvU2Nyb2xsID0gdGhyb3R0bGUoKGxpbmUpID0+IHtcbiAgICAgICAgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICBzY3JvbGxfc3luY18xLnNjcm9sbFRvUmV2ZWFsU291cmNlTGluZShsaW5lKTtcbiAgICB9LCA1MCk7XG4gICAgcmV0dXJuIChsaW5lKSA9PiB7XG4gICAgICAgIGlmICghaXNOYU4obGluZSkpIHtcbiAgICAgICAgICAgIHN0YXRlLmxpbmUgPSBsaW5lO1xuICAgICAgICAgICAgZG9TY3JvbGwobGluZSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcbmxldCB1cGRhdGVJbWFnZVNpemVzID0gdGhyb3R0bGUoKCkgPT4ge1xuICAgIGNvbnN0IGltYWdlSW5mbyA9IFtdO1xuICAgIGxldCBpbWFnZXMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW1nJyk7XG4gICAgaWYgKGltYWdlcykge1xuICAgICAgICBsZXQgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaW1nID0gaW1hZ2VzW2ldO1xuICAgICAgICAgICAgaWYgKGltZy5jbGFzc0xpc3QuY29udGFpbnMoJ2xvYWRpbmcnKSkge1xuICAgICAgICAgICAgICAgIGltZy5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbWFnZUluZm8ucHVzaCh7XG4gICAgICAgICAgICAgICAgaWQ6IGltZy5pZCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IGltZy5oZWlnaHQsXG4gICAgICAgICAgICAgICAgd2lkdGg6IGltZy53aWR0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbWVzc2FnaW5nLnBvc3RNZXNzYWdlKCdjYWNoZUltYWdlU2l6ZXMnLCBpbWFnZUluZm8pO1xuICAgIH1cbn0sIDUwKTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgc2Nyb2xsRGlzYWJsZWQgPSB0cnVlO1xuICAgIHVwZGF0ZVNjcm9sbFByb2dyZXNzKCk7XG4gICAgdXBkYXRlSW1hZ2VTaXplcygpO1xufSwgdHJ1ZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICBpZiAoZXZlbnQuZGF0YS5zb3VyY2UgIT09IHNldHRpbmdzLnNvdXJjZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZXZlbnQuZGF0YS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ29uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbic6XG4gICAgICAgICAgICBtYXJrZXIub25EaWRDaGFuZ2VUZXh0RWRpdG9yU2VsZWN0aW9uKGV2ZW50LmRhdGEubGluZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndXBkYXRlVmlldyc6XG4gICAgICAgICAgICBvblVwZGF0ZVZpZXcoZXZlbnQuZGF0YS5saW5lKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbn0sIGZhbHNlKTtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RibGNsaWNrJywgZXZlbnQgPT4ge1xuICAgIGlmICghc2V0dGluZ3MuZG91YmxlQ2xpY2tUb1N3aXRjaFRvRWRpdG9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gSWdub3JlIGNsaWNrcyBvbiBsaW5rc1xuICAgIGZvciAobGV0IG5vZGUgPSBldmVudC50YXJnZXQ7IG5vZGU7IG5vZGUgPSBub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gZXZlbnQucGFnZVk7XG4gICAgY29uc3QgbGluZSA9IHNjcm9sbF9zeW5jXzEuZ2V0RWRpdG9yTGluZU51bWJlckZvclBhZ2VPZmZzZXQob2Zmc2V0KTtcbiAgICBpZiAodHlwZW9mIGxpbmUgPT09ICdudW1iZXInICYmICFpc05hTihsaW5lKSkge1xuICAgICAgICBtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ2RpZENsaWNrJywgeyBsaW5lOiBNYXRoLmZsb29yKGxpbmUpIH0pO1xuICAgIH1cbn0pO1xuY29uc3QgcGFzc1Rocm91Z2hMaW5rU2NoZW1lcyA9IFsnaHR0cDonLCAnaHR0cHM6JywgJ21haWx0bzonLCAndnNjb2RlOicsICd2c2NvZGUtaW5zaWRlcnM6J107XG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2ZW50ID0+IHtcbiAgICBpZiAoIWV2ZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IG5vZGUgPSBldmVudC50YXJnZXQ7XG4gICAgd2hpbGUgKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUudGFnTmFtZSAmJiBub2RlLnRhZ05hbWUgPT09ICdBJyAmJiBub2RlLmhyZWYpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFBhc3MgdGhyb3VnaCBrbm93biBzY2hlbWVzXG4gICAgICAgICAgICBpZiAocGFzc1Rocm91Z2hMaW5rU2NoZW1lcy5zb21lKHNjaGVtZSA9PiBub2RlLmhyZWYuc3RhcnRzV2l0aChzY2hlbWUpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGhyZWZUZXh0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtaHJlZicpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgICAvLyBJZiBvcmlnaW5hbCBsaW5rIGRvZXNuJ3QgbG9vayBsaWtlIGEgdXJsLCBkZWxlZ2F0ZSBiYWNrIHRvIFZTIENvZGUgdG8gcmVzb2x2ZVxuICAgICAgICAgICAgaWYgKCEvXlthLXpcXC1dKzovaS50ZXN0KGhyZWZUZXh0KSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2luZy5wb3N0TWVzc2FnZSgnb3BlbkxpbmsnLCB7IGhyZWY6IGhyZWZUZXh0IH0pO1xuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gICAgfVxufSwgdHJ1ZSk7XG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhyb3R0bGUoKCkgPT4ge1xuICAgIHVwZGF0ZVNjcm9sbFByb2dyZXNzKCk7XG4gICAgaWYgKHNjcm9sbERpc2FibGVkKSB7XG4gICAgICAgIHNjcm9sbERpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBsaW5lID0gc2Nyb2xsX3N5bmNfMS5nZXRFZGl0b3JMaW5lTnVtYmVyRm9yUGFnZU9mZnNldCh3aW5kb3cuc2Nyb2xsWSk7XG4gICAgICAgIGlmICh0eXBlb2YgbGluZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKGxpbmUpKSB7XG4gICAgICAgICAgICBtZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ3JldmVhbExpbmUnLCB7IGxpbmUgfSk7XG4gICAgICAgIH1cbiAgICB9XG59LCA1MCkpO1xuZnVuY3Rpb24gdXBkYXRlU2Nyb2xsUHJvZ3Jlc3MoKSB7XG4gICAgc3RhdGUuc2Nyb2xsUHJvZ3Jlc3MgPSB3aW5kb3cuc2Nyb2xsWSAvIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O1xuICAgIHZzY29kZS5zZXRTdGF0ZShzdGF0ZSk7XG59XG4iLCJ2YXIgYXBwbHkgPSBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7XG5cbi8vIERPTSBBUElzLCBmb3IgY29tcGxldGVuZXNzXG5cbmV4cG9ydHMuc2V0VGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRUaW1lb3V0LCB3aW5kb3csIGFyZ3VtZW50cyksIGNsZWFyVGltZW91dCk7XG59O1xuZXhwb3J0cy5zZXRJbnRlcnZhbCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gbmV3IFRpbWVvdXQoYXBwbHkuY2FsbChzZXRJbnRlcnZhbCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhckludGVydmFsKTtcbn07XG5leHBvcnRzLmNsZWFyVGltZW91dCA9XG5leHBvcnRzLmNsZWFySW50ZXJ2YWwgPSBmdW5jdGlvbih0aW1lb3V0KSB7XG4gIGlmICh0aW1lb3V0KSB7XG4gICAgdGltZW91dC5jbG9zZSgpO1xuICB9XG59O1xuXG5mdW5jdGlvbiBUaW1lb3V0KGlkLCBjbGVhckZuKSB7XG4gIHRoaXMuX2lkID0gaWQ7XG4gIHRoaXMuX2NsZWFyRm4gPSBjbGVhckZuO1xufVxuVGltZW91dC5wcm90b3R5cGUudW5yZWYgPSBUaW1lb3V0LnByb3RvdHlwZS5yZWYgPSBmdW5jdGlvbigpIHt9O1xuVGltZW91dC5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fY2xlYXJGbi5jYWxsKHdpbmRvdywgdGhpcy5faWQpO1xufTtcblxuLy8gRG9lcyBub3Qgc3RhcnQgdGhlIHRpbWUsIGp1c3Qgc2V0cyB1cCB0aGUgbWVtYmVycyBuZWVkZWQuXG5leHBvcnRzLmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0sIG1zZWNzKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSBtc2Vjcztcbn07XG5cbmV4cG9ydHMudW5lbnJvbGwgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcbiAgaXRlbS5faWRsZVRpbWVvdXQgPSAtMTtcbn07XG5cbmV4cG9ydHMuX3VucmVmQWN0aXZlID0gZXhwb3J0cy5hY3RpdmUgPSBmdW5jdGlvbihpdGVtKSB7XG4gIGNsZWFyVGltZW91dChpdGVtLl9pZGxlVGltZW91dElkKTtcblxuICB2YXIgbXNlY3MgPSBpdGVtLl9pZGxlVGltZW91dDtcbiAgaWYgKG1zZWNzID49IDApIHtcbiAgICBpdGVtLl9pZGxlVGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiBvblRpbWVvdXQoKSB7XG4gICAgICBpZiAoaXRlbS5fb25UaW1lb3V0KVxuICAgICAgICBpdGVtLl9vblRpbWVvdXQoKTtcbiAgICB9LCBtc2Vjcyk7XG4gIH1cbn07XG5cbi8vIHNldGltbWVkaWF0ZSBhdHRhY2hlcyBpdHNlbGYgdG8gdGhlIGdsb2JhbCBvYmplY3RcbnJlcXVpcmUoXCJzZXRpbW1lZGlhdGVcIik7XG4vLyBPbiBzb21lIGV4b3RpYyBlbnZpcm9ubWVudHMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9iamVjdCBgc2V0aW1tZWlkYXRlYCB3YXNcbi8vIGFibGUgdG8gaW5zdGFsbCBvbnRvLiAgU2VhcmNoIGVhY2ggcG9zc2liaWxpdHkgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlXG4vLyBgc2V0aW1tZWRpYXRlYCBsaWJyYXJ5LlxuZXhwb3J0cy5zZXRJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiICYmIGdsb2JhbC5zZXRJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICh0aGlzICYmIHRoaXMuc2V0SW1tZWRpYXRlKTtcbmV4cG9ydHMuY2xlYXJJbW1lZGlhdGUgPSAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIgJiYgc2VsZi5jbGVhckltbWVkaWF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBnbG9iYWwuY2xlYXJJbW1lZGlhdGUpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgJiYgdGhpcy5jbGVhckltbWVkaWF0ZSk7XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBpZiAoZ2xvYmFsLnNldEltbWVkaWF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG5leHRIYW5kbGUgPSAxOyAvLyBTcGVjIHNheXMgZ3JlYXRlciB0aGFuIHplcm9cbiAgICB2YXIgdGFza3NCeUhhbmRsZSA9IHt9O1xuICAgIHZhciBjdXJyZW50bHlSdW5uaW5nQVRhc2sgPSBmYWxzZTtcbiAgICB2YXIgZG9jID0gZ2xvYmFsLmRvY3VtZW50O1xuICAgIHZhciByZWdpc3RlckltbWVkaWF0ZTtcblxuICAgIGZ1bmN0aW9uIHNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuICAgICAgLy8gQ2FsbGJhY2sgY2FuIGVpdGhlciBiZSBhIGZ1bmN0aW9uIG9yIGEgc3RyaW5nXG4gICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24oXCJcIiArIGNhbGxiYWNrKTtcbiAgICAgIH1cbiAgICAgIC8vIENvcHkgZnVuY3Rpb24gYXJndW1lbnRzXG4gICAgICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAxXTtcbiAgICAgIH1cbiAgICAgIC8vIFN0b3JlIGFuZCByZWdpc3RlciB0aGUgdGFza1xuICAgICAgdmFyIHRhc2sgPSB7IGNhbGxiYWNrOiBjYWxsYmFjaywgYXJnczogYXJncyB9O1xuICAgICAgdGFza3NCeUhhbmRsZVtuZXh0SGFuZGxlXSA9IHRhc2s7XG4gICAgICByZWdpc3RlckltbWVkaWF0ZShuZXh0SGFuZGxlKTtcbiAgICAgIHJldHVybiBuZXh0SGFuZGxlKys7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaGFuZGxlKSB7XG4gICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlW2hhbmRsZV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuKHRhc2spIHtcbiAgICAgICAgdmFyIGNhbGxiYWNrID0gdGFzay5jYWxsYmFjaztcbiAgICAgICAgdmFyIGFyZ3MgPSB0YXNrLmFyZ3M7XG4gICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICBjYWxsYmFjayhhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgY2FsbGJhY2suYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcnVuSWZQcmVzZW50KGhhbmRsZSkge1xuICAgICAgICAvLyBGcm9tIHRoZSBzcGVjOiBcIldhaXQgdW50aWwgYW55IGludm9jYXRpb25zIG9mIHRoaXMgYWxnb3JpdGhtIHN0YXJ0ZWQgYmVmb3JlIHRoaXMgb25lIGhhdmUgY29tcGxldGVkLlwiXG4gICAgICAgIC8vIFNvIGlmIHdlJ3JlIGN1cnJlbnRseSBydW5uaW5nIGEgdGFzaywgd2UnbGwgbmVlZCB0byBkZWxheSB0aGlzIGludm9jYXRpb24uXG4gICAgICAgIGlmIChjdXJyZW50bHlSdW5uaW5nQVRhc2spIHtcbiAgICAgICAgICAgIC8vIERlbGF5IGJ5IGRvaW5nIGEgc2V0VGltZW91dC4gc2V0SW1tZWRpYXRlIHdhcyB0cmllZCBpbnN0ZWFkLCBidXQgaW4gRmlyZWZveCA3IGl0IGdlbmVyYXRlZCBhXG4gICAgICAgICAgICAvLyBcInRvbyBtdWNoIHJlY3Vyc2lvblwiIGVycm9yLlxuICAgICAgICAgICAgc2V0VGltZW91dChydW5JZlByZXNlbnQsIDAsIGhhbmRsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdGFzayA9IHRhc2tzQnlIYW5kbGVbaGFuZGxlXTtcbiAgICAgICAgICAgIGlmICh0YXNrKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBydW4odGFzayk7XG4gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbW1lZGlhdGUoaGFuZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5UnVubmluZ0FUYXNrID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaW5zdGFsbE5leHRUaWNrSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcnVuSWZQcmVzZW50KGhhbmRsZSk7IH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNhblVzZVBvc3RNZXNzYWdlKCkge1xuICAgICAgICAvLyBUaGUgdGVzdCBhZ2FpbnN0IGBpbXBvcnRTY3JpcHRzYCBwcmV2ZW50cyB0aGlzIGltcGxlbWVudGF0aW9uIGZyb20gYmVpbmcgaW5zdGFsbGVkIGluc2lkZSBhIHdlYiB3b3JrZXIsXG4gICAgICAgIC8vIHdoZXJlIGBnbG9iYWwucG9zdE1lc3NhZ2VgIG1lYW5zIHNvbWV0aGluZyBjb21wbGV0ZWx5IGRpZmZlcmVudCBhbmQgY2FuJ3QgYmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLlxuICAgICAgICBpZiAoZ2xvYmFsLnBvc3RNZXNzYWdlICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgICAgICAgICAgdmFyIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXMgPSB0cnVlO1xuICAgICAgICAgICAgdmFyIG9sZE9uTWVzc2FnZSA9IGdsb2JhbC5vbm1lc3NhZ2U7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcG9zdE1lc3NhZ2VJc0FzeW5jaHJvbm91cyA9IGZhbHNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShcIlwiLCBcIipcIik7XG4gICAgICAgICAgICBnbG9iYWwub25tZXNzYWdlID0gb2xkT25NZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlSXNBc3luY2hyb25vdXM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgLy8gSW5zdGFsbHMgYW4gZXZlbnQgaGFuZGxlciBvbiBgZ2xvYmFsYCBmb3IgdGhlIGBtZXNzYWdlYCBldmVudDogc2VlXG4gICAgICAgIC8vICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vRE9NL3dpbmRvdy5wb3N0TWVzc2FnZVxuICAgICAgICAvLyAqIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL2NvbW1zLmh0bWwjY3Jvc3NEb2N1bWVudE1lc3NhZ2VzXG5cbiAgICAgICAgdmFyIG1lc3NhZ2VQcmVmaXggPSBcInNldEltbWVkaWF0ZSRcIiArIE1hdGgucmFuZG9tKCkgKyBcIiRcIjtcbiAgICAgICAgdmFyIG9uR2xvYmFsTWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgICAgICAgIGV2ZW50LmRhdGEuaW5kZXhPZihtZXNzYWdlUHJlZml4KSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJ1bklmUHJlc2VudCgrZXZlbnQuZGF0YS5zbGljZShtZXNzYWdlUHJlZml4Lmxlbmd0aCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICAgICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSwgZmFsc2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZ2xvYmFsLmF0dGFjaEV2ZW50KFwib25tZXNzYWdlXCIsIG9uR2xvYmFsTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgZ2xvYmFsLnBvc3RNZXNzYWdlKG1lc3NhZ2VQcmVmaXggKyBoYW5kbGUsIFwiKlwiKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnN0YWxsTWVzc2FnZUNoYW5uZWxJbXBsZW1lbnRhdGlvbigpIHtcbiAgICAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbiAgICAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgdmFyIGhhbmRsZSA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBydW5JZlByZXNlbnQoaGFuZGxlKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZWdpc3RlckltbWVkaWF0ZSA9IGZ1bmN0aW9uKGhhbmRsZSkge1xuICAgICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZShoYW5kbGUpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHZhciBodG1sID0gZG9jLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgcmVnaXN0ZXJJbW1lZGlhdGUgPSBmdW5jdGlvbihoYW5kbGUpIHtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDxzY3JpcHQ+IGVsZW1lbnQ7IGl0cyByZWFkeXN0YXRlY2hhbmdlIGV2ZW50IHdpbGwgYmUgZmlyZWQgYXN5bmNocm9ub3VzbHkgb25jZSBpdCBpcyBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gaW50byB0aGUgZG9jdW1lbnQuIERvIHNvLCB0aHVzIHF1ZXVpbmcgdXAgdGhlIHRhc2suIFJlbWVtYmVyIHRvIGNsZWFuIHVwIG9uY2UgaXQncyBiZWVuIGNhbGxlZC5cbiAgICAgICAgICAgIHZhciBzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcbiAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcnVuSWZQcmVzZW50KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgaHRtbC5yZW1vdmVDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgICAgIHNjcmlwdCA9IG51bGw7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaHRtbC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc3RhbGxTZXRUaW1lb3V0SW1wbGVtZW50YXRpb24oKSB7XG4gICAgICAgIHJlZ2lzdGVySW1tZWRpYXRlID0gZnVuY3Rpb24oaGFuZGxlKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KHJ1bklmUHJlc2VudCwgMCwgaGFuZGxlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBJZiBzdXBwb3J0ZWQsIHdlIHNob3VsZCBhdHRhY2ggdG8gdGhlIHByb3RvdHlwZSBvZiBnbG9iYWwsIHNpbmNlIHRoYXQgaXMgd2hlcmUgc2V0VGltZW91dCBldCBhbC4gbGl2ZS5cbiAgICB2YXIgYXR0YWNoVG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgJiYgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCk7XG4gICAgYXR0YWNoVG8gPSBhdHRhY2hUbyAmJiBhdHRhY2hUby5zZXRUaW1lb3V0ID8gYXR0YWNoVG8gOiBnbG9iYWw7XG5cbiAgICAvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IGUuZy4gYnJvd3NlcmlmeSBlbnZpcm9ubWVudHMuXG4gICAgaWYgKHt9LnRvU3RyaW5nLmNhbGwoZ2xvYmFsLnByb2Nlc3MpID09PSBcIltvYmplY3QgcHJvY2Vzc11cIikge1xuICAgICAgICAvLyBGb3IgTm9kZS5qcyBiZWZvcmUgMC45XG4gICAgICAgIGluc3RhbGxOZXh0VGlja0ltcGxlbWVudGF0aW9uKCk7XG5cbiAgICB9IGVsc2UgaWYgKGNhblVzZVBvc3RNZXNzYWdlKCkpIHtcbiAgICAgICAgLy8gRm9yIG5vbi1JRTEwIG1vZGVybiBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsUG9zdE1lc3NhZ2VJbXBsZW1lbnRhdGlvbigpO1xuXG4gICAgfSBlbHNlIGlmIChnbG9iYWwuTWVzc2FnZUNoYW5uZWwpIHtcbiAgICAgICAgLy8gRm9yIHdlYiB3b3JrZXJzLCB3aGVyZSBzdXBwb3J0ZWRcbiAgICAgICAgaW5zdGFsbE1lc3NhZ2VDaGFubmVsSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSBpZiAoZG9jICYmIFwib25yZWFkeXN0YXRlY2hhbmdlXCIgaW4gZG9jLmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIikpIHtcbiAgICAgICAgLy8gRm9yIElFIDbigJM4XG4gICAgICAgIGluc3RhbGxSZWFkeVN0YXRlQ2hhbmdlSW1wbGVtZW50YXRpb24oKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciBvbGRlciBicm93c2Vyc1xuICAgICAgICBpbnN0YWxsU2V0VGltZW91dEltcGxlbWVudGF0aW9uKCk7XG4gICAgfVxuXG4gICAgYXR0YWNoVG8uc2V0SW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlO1xuICAgIGF0dGFjaFRvLmNsZWFySW1tZWRpYXRlID0gY2xlYXJJbW1lZGlhdGU7XG59KHR5cGVvZiBzZWxmID09PSBcInVuZGVmaW5lZFwiID8gdHlwZW9mIGdsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiA/IHRoaXMgOiBnbG9iYWwgOiBzZWxmKSk7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbmNvbnN0IHNjcm9sbF9zeW5jXzEgPSByZXF1aXJlKFwiLi9zY3JvbGwtc3luY1wiKTtcbmNsYXNzIEFjdGl2ZUxpbmVNYXJrZXIge1xuICAgIG9uRGlkQ2hhbmdlVGV4dEVkaXRvclNlbGVjdGlvbihsaW5lKSB7XG4gICAgICAgIGNvbnN0IHsgcHJldmlvdXMgfSA9IHNjcm9sbF9zeW5jXzEuZ2V0RWxlbWVudHNGb3JTb3VyY2VMaW5lKGxpbmUpO1xuICAgICAgICB0aGlzLl91cGRhdGUocHJldmlvdXMgJiYgcHJldmlvdXMuZWxlbWVudCk7XG4gICAgfVxuICAgIF91cGRhdGUoYmVmb3JlKSB7XG4gICAgICAgIHRoaXMuX3VubWFya0FjdGl2ZUVsZW1lbnQodGhpcy5fY3VycmVudCk7XG4gICAgICAgIHRoaXMuX21hcmtBY3RpdmVFbGVtZW50KGJlZm9yZSk7XG4gICAgICAgIHRoaXMuX2N1cnJlbnQgPSBiZWZvcmU7XG4gICAgfVxuICAgIF91bm1hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgPSBlbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKC9cXGJjb2RlLWFjdGl2ZS1saW5lXFxiL2csICcnKTtcbiAgICB9XG4gICAgX21hcmtBY3RpdmVFbGVtZW50KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudC5jbGFzc05hbWUgKz0gJyBjb2RlLWFjdGl2ZS1saW5lJztcbiAgICB9XG59XG5leHBvcnRzLkFjdGl2ZUxpbmVNYXJrZXIgPSBBY3RpdmVMaW5lTWFya2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIG9uY2VEb2N1bWVudExvYWRlZChmKSB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAndW5pbml0aWFsaXplZCcpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGYpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZigpO1xuICAgIH1cbn1cbmV4cG9ydHMub25jZURvY3VtZW50TG9hZGVkID0gb25jZURvY3VtZW50TG9hZGVkO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmV4cG9ydHMuY3JlYXRlUG9zdGVyRm9yVnNDb2RlID0gKHZzY29kZSkgPT4ge1xuICAgIHJldHVybiBuZXcgY2xhc3Mge1xuICAgICAgICBwb3N0TWVzc2FnZSh0eXBlLCBib2R5KSB7XG4gICAgICAgICAgICB2c2NvZGUucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgc291cmNlOiBzZXR0aW5nc18xLmdldFNldHRpbmdzKCkuc291cmNlLFxuICAgICAgICAgICAgICAgIGJvZHlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbn07XG4iLCIvKipcbiAqIGxvZGFzaCAoQ3VzdG9tIEJ1aWxkKSA8aHR0cHM6Ly9sb2Rhc2guY29tLz5cbiAqIEJ1aWxkOiBgbG9kYXNoIG1vZHVsYXJpemUgZXhwb3J0cz1cIm5wbVwiIC1vIC4vYFxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanF1ZXJ5Lm9yZy8+XG4gKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+XG4gKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPlxuICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzXG4gKi9cblxuLyoqIFVzZWQgYXMgdGhlIGBUeXBlRXJyb3JgIG1lc3NhZ2UgZm9yIFwiRnVuY3Rpb25zXCIgbWV0aG9kcy4gKi9cbnZhciBGVU5DX0VSUk9SX1RFWFQgPSAnRXhwZWN0ZWQgYSBmdW5jdGlvbic7XG5cbi8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqL1xudmFyIE5BTiA9IDAgLyAwO1xuXG4vKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovXG52YXIgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7XG5cbi8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovXG52YXIgcmVUcmltID0gL15cXHMrfFxccyskL2c7XG5cbi8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pO1xuXG4vKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc0JpbmFyeSA9IC9eMGJbMDFdKyQvaTtcblxuLyoqIFVzZWQgdG8gZGV0ZWN0IG9jdGFsIHN0cmluZyB2YWx1ZXMuICovXG52YXIgcmVJc09jdGFsID0gL14wb1swLTddKyQvaTtcblxuLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi9cbnZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBnbG9iYWxgIGZyb20gTm9kZS5qcy4gKi9cbnZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwgJiYgZ2xvYmFsLk9iamVjdCA9PT0gT2JqZWN0ICYmIGdsb2JhbDtcblxuLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBzZWxmYC4gKi9cbnZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmO1xuXG4vKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi9cbnZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXG4vKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovXG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xuXG4vKipcbiAqIFVzZWQgdG8gcmVzb2x2ZSB0aGVcbiAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKVxuICogb2YgdmFsdWVzLlxuICovXG52YXIgb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcblxuLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqL1xudmFyIG5hdGl2ZU1heCA9IE1hdGgubWF4LFxuICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluO1xuXG4vKipcbiAqIEdldHMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0aGF0IGhhdmUgZWxhcHNlZCBzaW5jZVxuICogdGhlIFVuaXggZXBvY2ggKDEgSmFudWFyeSAxOTcwIDAwOjAwOjAwIFVUQykuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAyLjQuMFxuICogQGNhdGVnb3J5IERhdGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVzdGFtcC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5kZWZlcihmdW5jdGlvbihzdGFtcCkge1xuICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApO1xuICogfSwgXy5ub3coKSk7XG4gKiAvLyA9PiBMb2dzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGl0IHRvb2sgZm9yIHRoZSBkZWZlcnJlZCBpbnZvY2F0aW9uLlxuICovXG52YXIgbm93ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiByb290LkRhdGUubm93KCk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgZnVuY3Rpb24gdGhhdCBkZWxheXMgaW52b2tpbmcgYGZ1bmNgIHVudGlsIGFmdGVyIGB3YWl0YFxuICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzXG4gKiBpbnZva2VkLiBUaGUgZGVib3VuY2VkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYCBtZXRob2QgdG8gY2FuY2VsXG4gKiBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0byBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS5cbiAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZVxuICogbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgIHRpbWVvdXQuIFRoZSBgZnVuY2AgaXMgaW52b2tlZFxuICogd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbi4gU3Vic2VxdWVudFxuICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2BcbiAqIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8uZGVib3VuY2VgIGFuZCBgXy50aHJvdHRsZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWJvdW5jZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPWZhbHNlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbb3B0aW9ucy5tYXhXYWl0XVxuICogIFRoZSBtYXhpbXVtIHRpbWUgYGZ1bmNgIGlzIGFsbG93ZWQgdG8gYmUgZGVsYXllZCBiZWZvcmUgaXQncyBpbnZva2VkLlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBkZWJvdW5jZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGNvc3RseSBjYWxjdWxhdGlvbnMgd2hpbGUgdGhlIHdpbmRvdyBzaXplIGlzIGluIGZsdXguXG4gKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpO1xuICpcbiAqIC8vIEludm9rZSBgc2VuZE1haWxgIHdoZW4gY2xpY2tlZCwgZGVib3VuY2luZyBzdWJzZXF1ZW50IGNhbGxzLlxuICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwge1xuICogICAnbGVhZGluZyc6IHRydWUsXG4gKiAgICd0cmFpbGluZyc6IGZhbHNlXG4gKiB9KSk7XG4gKlxuICogLy8gRW5zdXJlIGBiYXRjaExvZ2AgaXMgaW52b2tlZCBvbmNlIGFmdGVyIDEgc2Vjb25kIG9mIGRlYm91bmNlZCBjYWxscy5cbiAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pO1xuICogdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL3N0cmVhbScpO1xuICogalF1ZXJ5KHNvdXJjZSkub24oJ21lc3NhZ2UnLCBkZWJvdW5jZWQpO1xuICpcbiAqIC8vIENhbmNlbCB0aGUgdHJhaWxpbmcgZGVib3VuY2VkIGludm9jYXRpb24uXG4gKiBqUXVlcnkod2luZG93KS5vbigncG9wc3RhdGUnLCBkZWJvdW5jZWQuY2FuY2VsKTtcbiAqL1xuZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgb3B0aW9ucykge1xuICB2YXIgbGFzdEFyZ3MsXG4gICAgICBsYXN0VGhpcyxcbiAgICAgIG1heFdhaXQsXG4gICAgICByZXN1bHQsXG4gICAgICB0aW1lcklkLFxuICAgICAgbGFzdENhbGxUaW1lLFxuICAgICAgbGFzdEludm9rZVRpbWUgPSAwLFxuICAgICAgbGVhZGluZyA9IGZhbHNlLFxuICAgICAgbWF4aW5nID0gZmFsc2UsXG4gICAgICB0cmFpbGluZyA9IHRydWU7XG5cbiAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7XG4gIH1cbiAgd2FpdCA9IHRvTnVtYmVyKHdhaXQpIHx8IDA7XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAhIW9wdGlvbnMubGVhZGluZztcbiAgICBtYXhpbmcgPSAnbWF4V2FpdCcgaW4gb3B0aW9ucztcbiAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0O1xuICAgIHRyYWlsaW5nID0gJ3RyYWlsaW5nJyBpbiBvcHRpb25zID8gISFvcHRpb25zLnRyYWlsaW5nIDogdHJhaWxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VGdW5jKHRpbWUpIHtcbiAgICB2YXIgYXJncyA9IGxhc3RBcmdzLFxuICAgICAgICB0aGlzQXJnID0gbGFzdFRoaXM7XG5cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIGxhc3RJbnZva2VUaW1lID0gdGltZTtcbiAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXNBcmcsIGFyZ3MpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKSB7XG4gICAgLy8gUmVzZXQgYW55IGBtYXhXYWl0YCB0aW1lci5cbiAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7XG4gICAgLy8gU3RhcnQgdGhlIHRpbWVyIGZvciB0aGUgdHJhaWxpbmcgZWRnZS5cbiAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpO1xuICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLlxuICAgIHJldHVybiBsZWFkaW5nID8gaW52b2tlRnVuYyh0aW1lKSA6IHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWUsXG4gICAgICAgIHJlc3VsdCA9IHdhaXQgLSB0aW1lU2luY2VMYXN0Q2FsbDtcblxuICAgIHJldHVybiBtYXhpbmcgPyBuYXRpdmVNaW4ocmVzdWx0LCBtYXhXYWl0IC0gdGltZVNpbmNlTGFzdEludm9rZSkgOiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRJbnZva2UodGltZSkge1xuICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsXG4gICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7XG5cbiAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZVxuICAgIC8vIHRyYWlsaW5nIGVkZ2UsIHRoZSBzeXN0ZW0gdGltZSBoYXMgZ29uZSBiYWNrd2FyZHMgYW5kIHdlJ3JlIHRyZWF0aW5nXG4gICAgLy8gaXQgYXMgdGhlIHRyYWlsaW5nIGVkZ2UsIG9yIHdlJ3ZlIGhpdCB0aGUgYG1heFdhaXRgIGxpbWl0LlxuICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQgfHwgKHRpbWVTaW5jZUxhc3RDYWxsID49IHdhaXQpIHx8XG4gICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gdGltZXJFeHBpcmVkKCkge1xuICAgIHZhciB0aW1lID0gbm93KCk7XG4gICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkge1xuICAgICAgcmV0dXJuIHRyYWlsaW5nRWRnZSh0aW1lKTtcbiAgICB9XG4gICAgLy8gUmVzdGFydCB0aGUgdGltZXIuXG4gICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCByZW1haW5pbmdXYWl0KHRpbWUpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYWlsaW5nRWRnZSh0aW1lKSB7XG4gICAgdGltZXJJZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIE9ubHkgaW52b2tlIGlmIHdlIGhhdmUgYGxhc3RBcmdzYCB3aGljaCBtZWFucyBgZnVuY2AgaGFzIGJlZW5cbiAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS5cbiAgICBpZiAodHJhaWxpbmcgJiYgbGFzdEFyZ3MpIHtcbiAgICAgIHJldHVybiBpbnZva2VGdW5jKHRpbWUpO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGxhc3RUaGlzID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBmdW5jdGlvbiBjYW5jZWwoKSB7XG4gICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpO1xuICAgIH1cbiAgICBsYXN0SW52b2tlVGltZSA9IDA7XG4gICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICByZXR1cm4gdGltZXJJZCA9PT0gdW5kZWZpbmVkID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlYm91bmNlZCgpIHtcbiAgICB2YXIgdGltZSA9IG5vdygpLFxuICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpO1xuXG4gICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7XG4gICAgbGFzdFRoaXMgPSB0aGlzO1xuICAgIGxhc3RDYWxsVGltZSA9IHRpbWU7XG5cbiAgICBpZiAoaXNJbnZva2luZykge1xuICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICAgIGlmIChtYXhpbmcpIHtcbiAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC5cbiAgICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICAgICAgcmV0dXJuIGludm9rZUZ1bmMobGFzdENhbGxUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZXJJZCA9IHNldFRpbWVvdXQodGltZXJFeHBpcmVkLCB3YWl0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsO1xuICBkZWJvdW5jZWQuZmx1c2ggPSBmbHVzaDtcbiAgcmV0dXJuIGRlYm91bmNlZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGhyb3R0bGVkIGZ1bmN0aW9uIHRoYXQgb25seSBpbnZva2VzIGBmdW5jYCBhdCBtb3N0IG9uY2UgcGVyXG4gKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYFxuICogbWV0aG9kIHRvIGNhbmNlbCBkZWxheWVkIGBmdW5jYCBpbnZvY2F0aW9ucyBhbmQgYSBgZmx1c2hgIG1ldGhvZCB0b1xuICogaW1tZWRpYXRlbHkgaW52b2tlIHRoZW0uIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgXG4gKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgXG4gKiB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlXG4gKiB0aHJvdHRsZWQgZnVuY3Rpb24uIFN1YnNlcXVlbnQgY2FsbHMgdG8gdGhlIHRocm90dGxlZCBmdW5jdGlvbiByZXR1cm4gdGhlXG4gKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uXG4gKlxuICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpc1xuICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb25cbiAqIGlzIGludm9rZWQgbW9yZSB0aGFuIG9uY2UgZHVyaW5nIHRoZSBgd2FpdGAgdGltZW91dC5cbiAqXG4gKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWRcbiAqIHVudGlsIHRvIHRoZSBuZXh0IHRpY2ssIHNpbWlsYXIgdG8gYHNldFRpbWVvdXRgIHdpdGggYSB0aW1lb3V0IG9mIGAwYC5cbiAqXG4gKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLylcbiAqIGZvciBkZXRhaWxzIG92ZXIgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gYF8udGhyb3R0bGVgIGFuZCBgXy5kZWJvdW5jZWAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjEuMFxuICogQGNhdGVnb3J5IEZ1bmN0aW9uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSBpbnZvY2F0aW9ucyB0by5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5sZWFkaW5nPXRydWVdXG4gKiAgU3BlY2lmeSBpbnZva2luZyBvbiB0aGUgbGVhZGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LlxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXVxuICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB0aHJvdHRsZWQgZnVuY3Rpb24uXG4gKiBAZXhhbXBsZVxuICpcbiAqIC8vIEF2b2lkIGV4Y2Vzc2l2ZWx5IHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB3aGlsZSBzY3JvbGxpbmcuXG4gKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7XG4gKlxuICogLy8gSW52b2tlIGByZW5ld1Rva2VuYCB3aGVuIHRoZSBjbGljayBldmVudCBpcyBmaXJlZCwgYnV0IG5vdCBtb3JlIHRoYW4gb25jZSBldmVyeSA1IG1pbnV0ZXMuXG4gKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7XG4gKiBqUXVlcnkoZWxlbWVudCkub24oJ2NsaWNrJywgdGhyb3R0bGVkKTtcbiAqXG4gKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLlxuICogalF1ZXJ5KHdpbmRvdykub24oJ3BvcHN0YXRlJywgdGhyb3R0bGVkLmNhbmNlbCk7XG4gKi9cbmZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlYWRpbmcgPSB0cnVlLFxuICAgICAgdHJhaWxpbmcgPSB0cnVlO1xuXG4gIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO1xuICB9XG4gIGlmIChpc09iamVjdChvcHRpb25zKSkge1xuICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZztcbiAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nO1xuICB9XG4gIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7XG4gICAgJ2xlYWRpbmcnOiBsZWFkaW5nLFxuICAgICdtYXhXYWl0Jzogd2FpdCxcbiAgICAndHJhaWxpbmcnOiB0cmFpbGluZ1xuICB9KTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGVcbiAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcylcbiAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYClcbiAqXG4gKiBAc3RhdGljXG4gKiBAbWVtYmVyT2YgX1xuICogQHNpbmNlIDAuMS4wXG4gKiBAY2F0ZWdvcnkgTGFuZ1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdCh7fSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdChbMSwgMiwgM10pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3QoXy5ub29wKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzT2JqZWN0KG51bGwpO1xuICogLy8gPT4gZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG4gIHJldHVybiAhIXZhbHVlICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3ltYm9sYCBwcmltaXRpdmUgb3Igb2JqZWN0LlxuICpcbiAqIEBzdGF0aWNcbiAqIEBtZW1iZXJPZiBfXG4gKiBAc2luY2UgNC4wLjBcbiAqIEBjYXRlZ29yeSBMYW5nXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTtcbiAqIC8vID0+IHRydWVcbiAqXG4gKiBfLmlzU3ltYm9sKCdhYmMnKTtcbiAqIC8vID0+IGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ3N5bWJvbCcgfHxcbiAgICAoaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKSA9PSBzeW1ib2xUYWcpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuXG4gKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuXG4gKiBAZXhhbXBsZVxuICpcbiAqIF8udG9OdW1iZXIoMy4yKTtcbiAqIC8vID0+IDMuMlxuICpcbiAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7XG4gKiAvLyA9PiA1ZS0zMjRcbiAqXG4gKiBfLnRvTnVtYmVyKEluZmluaXR5KTtcbiAqIC8vID0+IEluZmluaXR5XG4gKlxuICogXy50b051bWJlcignMy4yJyk7XG4gKiAvLyA9PiAzLjJcbiAqL1xuZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlO1xuICAgIHZhbHVlID0gaXNPYmplY3Qob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlO1xuICB9XG4gIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTtcbiAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtcbiAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpXG4gICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpXG4gICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gdGhyb3R0bGU7XG4iXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +!function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let o=void 0;function i(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=i,t.getSettings=function(){if(o)return o;if(o=i("data-settings"))return o;throw new Error("Could not load settings")}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const o=n(0),i="code-line";function r(e){return t=0,n=o.getSettings().lineCount-1,i=e,Math.min(n,Math.max(t,i));var t,n,i}const c=(()=>{let e;return()=>{if(!e){e=[{element:document.body,line:0}];for(const t of document.getElementsByClassName(i)){const n=+t.getAttribute("data-line");isNaN(n)||("CODE"===t.tagName&&t.parentElement&&"PRE"===t.parentElement.tagName?e.push({element:t.parentElement,line:n}):e.push({element:t,line:n}))}}return e}})();function s(e){const t=Math.floor(e),n=c();let o=n[0]||null;for(const e of n){if(e.line===t)return{previous:e,next:void 0};if(e.line>t)return{previous:o,next:e};o=e}return{previous:o}}function a(e){const t=c(),n=e-window.scrollY;let o=-1,i=t.length-1;for(;o+1=n?i=e:o=e}const r=t[i],s=u(r);if(i>=1&&s.top>n){return{previous:t[o],next:r}}return i>1&&in?{previous:r,next:t[i+1]}:{previous:r}}function u({element:e}){const t=e.getBoundingClientRect(),n=e.querySelector(`.${i}`);if(n){const e=n.getBoundingClientRect(),o=Math.max(1,e.top-t.top);return{top:t.top,height:o}}return t}t.getElementsForSourceLine=s,t.getLineElementsAtPageOffset=a,t.scrollToRevealSourceLine=function(e){if(!o.getSettings().scrollPreviewWithEditor)return;if(e<=0)return void window.scroll(window.scrollX,0);const{previous:t,next:n}=s(e);if(!t)return;let i=0;const r=u(t),c=r.top;if(n&&n.line!==t.line){i=c+(e-t.line)/(n.line-t.line)*(n.element.getBoundingClientRect().top-c)}else{const t=e-Math.floor(e);i=c+r.height*t}window.scroll(window.scrollX,Math.max(1,window.scrollY+i))},t.getEditorLineNumberForPageOffset=function(e){const{previous:t,next:n}=a(e);if(t){const o=u(t),i=e-window.scrollY-o.top;if(n){const e=i/(u(n).top-o.top);return r(t.line+e*(n.line-t.line))}{const e=i/o.height;return r(t.line+e)}}return null},t.getLineElementForFragment=function(e){return c().find(t=>t.element.id===e)}},function(e,t,n){"use strict";(function(e){Object.defineProperty(t,"__esModule",{value:!0});const o=n(7),i=n(8),r=n(9),c=n(2),s=n(0),a=n(10);let u=!0;const l=new o.ActiveLineMarker,f=s.getSettings(),d=acquireVsCodeApi(),m={...d.getState(),...s.getData("data-state")};d.setState(m);const p=r.createPosterForVsCode(d);window.cspAlerter.setPoster(p),window.styleLoadingMonitor.setPoster(p),window.onload=()=>{h()},i.onceDocumentLoaded(()=>{const t=m.scrollProgress;"number"!=typeof t||f.fragment?f.scrollPreviewWithEditor&&e(()=>{if(f.fragment){m.fragment=void 0,d.setState(m);const e=c.getLineElementForFragment(f.fragment);e&&(u=!0,c.scrollToRevealSourceLine(e.line))}else isNaN(f.line)||(u=!0,c.scrollToRevealSourceLine(f.line))}):e(()=>{u=!0,window.scrollTo(0,t*document.body.clientHeight)})});const g=(()=>{const e=a(e=>{u=!0,c.scrollToRevealSourceLine(e)},50);return t=>{isNaN(t)||(m.line=t,e(t))}})();let h=a(()=>{const e=[];let t=document.getElementsByTagName("img");if(t){let n;for(n=0;n{u=!0,y(),h()},!0),window.addEventListener("message",e=>{if(e.data.source===f.source)switch(e.data.type){case"onDidChangeTextEditorSelection":l.onDidChangeTextEditorSelection(e.data.line);break;case"updateView":g(e.data.line)}},!1),document.addEventListener("dblclick",e=>{if(!f.doubleClickToSwitchToEditor)return;for(let t=e.target;t;t=t.parentNode)if("A"===t.tagName)return;const t=e.pageY,n=c.getEditorLineNumberForPageOffset(t);"number"!=typeof n||isNaN(n)||p.postMessage("didClick",{line:Math.floor(n)})});const v=["http:","https:","mailto:","vscode:","vscode-insiders:"];function y(){m.scrollProgress=window.scrollY/document.body.clientHeight,d.setState(m)}document.addEventListener("click",e=>{if(!e)return;let t=e.target;for(;t;){if(t.tagName&&"A"===t.tagName&&t.href){if(t.getAttribute("href").startsWith("#"))return;if(v.some(e=>t.href.startsWith(e)))return;const n=t.getAttribute("data-href")||t.getAttribute("href");return/^[a-z\-]+:/i.test(n)?void 0:(p.postMessage("openLink",{href:n}),e.preventDefault(),void e.stopPropagation())}t=t.parentNode}},!0),window.addEventListener("scroll",a(()=>{if(y(),u)u=!1;else{const e=c.getEditorLineNumberForPageOffset(window.scrollY);"number"!=typeof e||isNaN(e)||p.postMessage("revealLine",{line:e})}},50))}).call(this,n(4).setImmediate)},function(e,t,n){(function(e){var o=Function.prototype.apply;function i(e,t){this._id=e,this._clearFn=t}t.setTimeout=function(){return new i(o.call(setTimeout,window,arguments),clearTimeout)},t.setInterval=function(){return new i(o.call(setInterval,window,arguments),clearInterval)},t.clearTimeout=t.clearInterval=function(e){e&&e.close()},i.prototype.unref=i.prototype.ref=function(){},i.prototype.close=function(){this._clearFn.call(window,this._id)},t.enroll=function(e,t){clearTimeout(e._idleTimeoutId),e._idleTimeout=t},t.unenroll=function(e){clearTimeout(e._idleTimeoutId),e._idleTimeout=-1},t._unrefActive=t.active=function(e){clearTimeout(e._idleTimeoutId);var t=e._idleTimeout;t>=0&&(e._idleTimeoutId=setTimeout((function(){e._onTimeout&&e._onTimeout()}),t))},n(5),t.setImmediate="undefined"!=typeof self&&self.setImmediate||void 0!==e&&e.setImmediate||this&&this.setImmediate,t.clearImmediate="undefined"!=typeof self&&self.clearImmediate||void 0!==e&&e.clearImmediate||this&&this.clearImmediate}).call(this,n(1))},function(e,t,n){(function(e,t){!function(e,n){"use strict";if(!e.setImmediate){var o,i,r,c,s,a=1,u={},l=!1,f=e.document,d=Object.getPrototypeOf&&Object.getPrototypeOf(e);d=d&&d.setTimeout?d:e,"[object process]"==={}.toString.call(e.process)?o=function(e){t.nextTick((function(){p(e)}))}:!function(){if(e.postMessage&&!e.importScripts){var t=!0,n=e.onmessage;return e.onmessage=function(){t=!1},e.postMessage("","*"),e.onmessage=n,t}}()?e.MessageChannel?((r=new MessageChannel).port1.onmessage=function(e){p(e.data)},o=function(e){r.port2.postMessage(e)}):f&&"onreadystatechange"in f.createElement("script")?(i=f.documentElement,o=function(e){var t=f.createElement("script");t.onreadystatechange=function(){p(e),t.onreadystatechange=null,i.removeChild(t),t=null},i.appendChild(t)}):o=function(e){setTimeout(p,0,e)}:(c="setImmediate$"+Math.random()+"$",s=function(t){t.source===e&&"string"==typeof t.data&&0===t.data.indexOf(c)&&p(+t.data.slice(c.length))},e.addEventListener?e.addEventListener("message",s,!1):e.attachEvent("onmessage",s),o=function(t){e.postMessage(c+t,"*")}),d.setImmediate=function(e){"function"!=typeof e&&(e=new Function(""+e));for(var t=new Array(arguments.length-1),n=0;n1)for(var n=1;nnew class{postMessage(t,n){e.postMessage({type:t,source:o.getSettings().source,body:n})}}},function(e,t,n){(function(t){var n="Expected a function",o=NaN,i="[object Symbol]",r=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,s=/^0b[01]+$/i,a=/^0o[0-7]+$/i,u=parseInt,l="object"==typeof t&&t&&t.Object===Object&&t,f="object"==typeof self&&self&&self.Object===Object&&self,d=l||f||Function("return this")(),m=Object.prototype.toString,p=Math.max,g=Math.min,h=function(){return d.Date.now()};function v(e,t,o){var i,r,c,s,a,u,l=0,f=!1,d=!1,m=!0;if("function"!=typeof e)throw new TypeError(n);function v(t){var n=i,o=r;return i=r=void 0,l=t,s=e.apply(o,n)}function b(e){var n=e-u;return void 0===u||n>=t||n<0||d&&e-l>=c}function T(){var e=h();if(b(e))return E(e);a=setTimeout(T,function(e){var n=t-(e-u);return d?g(n,c-(e-l)):n}(e))}function E(e){return a=void 0,m&&i?v(e):(i=r=void 0,s)}function _(){var e=h(),n=b(e);if(i=arguments,r=this,u=e,n){if(void 0===a)return function(e){return l=e,a=setTimeout(T,t),f?v(e):s}(u);if(d)return a=setTimeout(T,t),v(u)}return void 0===a&&(a=setTimeout(T,t)),s}return t=w(t)||0,y(o)&&(f=!!o.leading,c=(d="maxWait"in o)?p(w(o.maxWait)||0,t):c,m="trailing"in o?!!o.trailing:m),_.cancel=function(){void 0!==a&&clearTimeout(a),l=0,i=u=r=a=void 0},_.flush=function(){return void 0===a?s:E(h())},_}function y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function w(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&m.call(e)==i}(e))return o;if(y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(r,"");var n=s.test(e);return n||a.test(e)?u(e.slice(2),n?2:8):c.test(e)?o:+e}e.exports=function(e,t,o){var i=!0,r=!0;if("function"!=typeof e)throw new TypeError(n);return y(o)&&(i="leading"in o?!!o.leading:i,r="trailing"in o?!!o.trailing:r),v(e,t,{leading:i,maxWait:t,trailing:r})}}).call(this,n(1))}]); \ No newline at end of file diff --git a/extensions/markdown-language-features/media/markdown.css b/extensions/markdown-language-features/media/markdown.css index e4afd26c3f..64414ab281 100644 --- a/extensions/markdown-language-features/media/markdown.css +++ b/extensions/markdown-language-features/media/markdown.css @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ html, body { - font-family: var(--markdown-font-family, system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif); + font-family: var(--markdown-font-family, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", system-ui, "Ubuntu", "Droid Sans", sans-serif); font-size: var(--markdown-font-size, 14px); padding: 0 26px; line-height: var(--markdown-line-height, 22px); @@ -157,7 +157,7 @@ blockquote { } code { - font-family: var(--vscode-editor-font-family, Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"); + font-family: var(--vscode-editor-font-family, "SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace); font-size: 1em; line-height: 1.357em; } diff --git a/extensions/markdown-language-features/media/pre.js b/extensions/markdown-language-features/media/pre.js index c75da6b854..8268f1e2d5 100644 --- a/extensions/markdown-language-features/media/pre.js +++ b/extensions/markdown-language-features/media/pre.js @@ -1,2 +1 @@ -!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let s=void 0;function o(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=o,t.getSettings=function(){if(s)return s;if(s=o("data-settings"))return s;throw new Error("Could not load settings")}},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(12),o=n(14);window.cspAlerter=new s.CspAlerter,window.styleLoadingMonitor=new o.StyleLoadingMonitor},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(0),o=n(13);t.CspAlerter=class{constructor(){this.didShow=!1,this.didHaveCspWarning=!1,document.addEventListener("securitypolicyviolation",()=>{this.onCspWarning()}),window.addEventListener("message",e=>{e&&e.data&&"vscode-did-block-svg"===e.data.name&&this.onCspWarning()})}setPoster(e){this.messaging=e,this.didHaveCspWarning&&this.showCspWarning()}onCspWarning(){this.didHaveCspWarning=!0,this.showCspWarning()}showCspWarning(){const e=o.getStrings(),t=s.getSettings();if(this.didShow||t.disableSecurityWarnings||!this.messaging)return;this.didShow=!0;const n=document.createElement("a");n.innerText=e.cspAlertMessageText,n.setAttribute("id","code-csp-warning"),n.setAttribute("title",e.cspAlertMessageTitle),n.setAttribute("role","button"),n.setAttribute("aria-label",e.cspAlertMessageLabel),n.onclick=()=>{this.messaging.postMessage("showPreviewSecuritySelector",{source:t.source})},document.body.appendChild(n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getStrings=function(){const e=document.getElementById("vscode-markdown-preview-data");if(e){const t=e.getAttribute("data-strings");if(t)return JSON.parse(t)}throw new Error("Could not load strings")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.StyleLoadingMonitor=class{constructor(){this.unloadedStyles=[],this.finishedLoading=!1;const e=e=>{const t=e.target.dataset.source;this.unloadedStyles.push(t)};window.addEventListener("DOMContentLoaded",()=>{for(const t of document.getElementsByClassName("code-user-style"))t.dataset.source&&(t.onerror=e)}),window.addEventListener("load",()=>{this.unloadedStyles.length&&(this.finishedLoading=!0,this.poster&&this.poster.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles}))})}setPoster(e){this.poster=e,this.finishedLoading&&e.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles})}}}]); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvc2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vLy4vcHJldmlldy1zcmMvcHJlLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2NzcC50cyIsIndlYnBhY2s6Ly8vLi9wcmV2aWV3LXNyYy9zdHJpbmdzLnRzIiwid2VicGFjazovLy8uL3ByZXZpZXctc3JjL2xvYWRpbmcudHMiXSwibmFtZXMiOlsiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImV4cG9ydHMiLCJtb2R1bGUiLCJpIiwibCIsIm1vZHVsZXMiLCJjYWxsIiwibSIsImMiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJyIiwiU3ltYm9sIiwidG9TdHJpbmdUYWciLCJ2YWx1ZSIsInQiLCJtb2RlIiwiX19lc01vZHVsZSIsIm5zIiwiY3JlYXRlIiwia2V5IiwiYmluZCIsIm4iLCJvYmplY3QiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwicCIsInMiLCJjYWNoZWRTZXR0aW5ncyIsInVuZGVmaW5lZCIsImdldERhdGEiLCJlbGVtZW50IiwiZG9jdW1lbnQiLCJnZXRFbGVtZW50QnlJZCIsImRhdGEiLCJnZXRBdHRyaWJ1dGUiLCJKU09OIiwicGFyc2UiLCJFcnJvciIsImdldFNldHRpbmdzIiwiY3NwXzEiLCJsb2FkaW5nXzEiLCJ3aW5kb3ciLCJjc3BBbGVydGVyIiwiQ3NwQWxlcnRlciIsInN0eWxlTG9hZGluZ01vbml0b3IiLCJTdHlsZUxvYWRpbmdNb25pdG9yIiwic2V0dGluZ3NfMSIsInN0cmluZ3NfMSIsInRoaXMiLCJkaWRTaG93IiwiZGlkSGF2ZUNzcFdhcm5pbmciLCJhZGRFdmVudExpc3RlbmVyIiwib25Dc3BXYXJuaW5nIiwiZXZlbnQiLCJwb3N0ZXIiLCJtZXNzYWdpbmciLCJzaG93Q3NwV2FybmluZyIsInN0cmluZ3MiLCJnZXRTdHJpbmdzIiwic2V0dGluZ3MiLCJkaXNhYmxlU2VjdXJpdHlXYXJuaW5ncyIsIm5vdGlmaWNhdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJpbm5lclRleHQiLCJjc3BBbGVydE1lc3NhZ2VUZXh0Iiwic2V0QXR0cmlidXRlIiwiY3NwQWxlcnRNZXNzYWdlVGl0bGUiLCJjc3BBbGVydE1lc3NhZ2VMYWJlbCIsIm9uY2xpY2siLCJwb3N0TWVzc2FnZSIsInNvdXJjZSIsImJvZHkiLCJhcHBlbmRDaGlsZCIsInN0b3JlIiwidW5sb2FkZWRTdHlsZXMiLCJmaW5pc2hlZExvYWRpbmciLCJvblN0eWxlTG9hZEVycm9yIiwidGFyZ2V0IiwiZGF0YXNldCIsInB1c2giLCJsaW5rIiwiZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSIsIm9uZXJyb3IiLCJsZW5ndGgiXSwibWFwcGluZ3MiOiJhQUNFLElBQUlBLEVBQW1CLEdBR3ZCLFNBQVNDLEVBQW9CQyxHQUc1QixHQUFHRixFQUFpQkUsR0FDbkIsT0FBT0YsRUFBaUJFLEdBQVVDLFFBR25DLElBQUlDLEVBQVNKLEVBQWlCRSxHQUFZLENBQ3pDRyxFQUFHSCxFQUNISSxHQUFHLEVBQ0hILFFBQVMsSUFVVixPQU5BSSxFQUFRTCxHQUFVTSxLQUFLSixFQUFPRCxRQUFTQyxFQUFRQSxFQUFPRCxRQUFTRixHQUcvREcsRUFBT0UsR0FBSSxFQUdKRixFQUFPRCxRQUtmRixFQUFvQlEsRUFBSUYsRUFHeEJOLEVBQW9CUyxFQUFJVixFQUd4QkMsRUFBb0JVLEVBQUksU0FBU1IsRUFBU1MsRUFBTUMsR0FDM0NaLEVBQW9CYSxFQUFFWCxFQUFTUyxJQUNsQ0csT0FBT0MsZUFBZWIsRUFBU1MsRUFBTSxDQUFFSyxZQUFZLEVBQU1DLElBQUtMLEtBS2hFWixFQUFvQmtCLEVBQUksU0FBU2hCLEdBQ1gsb0JBQVhpQixRQUEwQkEsT0FBT0MsYUFDMUNOLE9BQU9DLGVBQWViLEVBQVNpQixPQUFPQyxZQUFhLENBQUVDLE1BQU8sV0FFN0RQLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxLQVF2RHJCLEVBQW9Cc0IsRUFBSSxTQUFTRCxFQUFPRSxHQUV2QyxHQURVLEVBQVBBLElBQVVGLEVBQVFyQixFQUFvQnFCLElBQy9CLEVBQVBFLEVBQVUsT0FBT0YsRUFDcEIsR0FBVyxFQUFQRSxHQUE4QixpQkFBVkYsR0FBc0JBLEdBQVNBLEVBQU1HLFdBQVksT0FBT0gsRUFDaEYsSUFBSUksRUFBS1gsT0FBT1ksT0FBTyxNQUd2QixHQUZBMUIsRUFBb0JrQixFQUFFTyxHQUN0QlgsT0FBT0MsZUFBZVUsRUFBSSxVQUFXLENBQUVULFlBQVksRUFBTUssTUFBT0EsSUFDdEQsRUFBUEUsR0FBNEIsaUJBQVRGLEVBQW1CLElBQUksSUFBSU0sS0FBT04sRUFBT3JCLEVBQW9CVSxFQUFFZSxFQUFJRSxFQUFLLFNBQVNBLEdBQU8sT0FBT04sRUFBTU0sSUFBUUMsS0FBSyxLQUFNRCxJQUM5SSxPQUFPRixHQUlSekIsRUFBb0I2QixFQUFJLFNBQVMxQixHQUNoQyxJQUFJUyxFQUFTVCxHQUFVQSxFQUFPcUIsV0FDN0IsV0FBd0IsT0FBT3JCLEVBQWdCLFNBQy9DLFdBQThCLE9BQU9BLEdBRXRDLE9BREFILEVBQW9CVSxFQUFFRSxFQUFRLElBQUtBLEdBQzVCQSxHQUlSWixFQUFvQmEsRUFBSSxTQUFTaUIsRUFBUUMsR0FBWSxPQUFPakIsT0FBT2tCLFVBQVVDLGVBQWUxQixLQUFLdUIsRUFBUUMsSUFHekcvQixFQUFvQmtDLEVBQUksR0FJakJsQyxFQUFvQkEsRUFBb0JtQyxFQUFJLEksK0JDN0VyRHJCLE9BQU9DLGVBQWViLEVBQVMsYUFBYyxDQUFFbUIsT0FBTyxJQUN0RCxJQUFJZSxPQUFpQkMsRUFDckIsU0FBU0MsRUFBUVgsR0FDYixNQUFNWSxFQUFVQyxTQUFTQyxlQUFlLGdDQUN4QyxHQUFJRixFQUFTLENBQ1QsTUFBTUcsRUFBT0gsRUFBUUksYUFBYWhCLEdBQ2xDLEdBQUllLEVBQ0EsT0FBT0UsS0FBS0MsTUFBTUgsR0FHMUIsTUFBTSxJQUFJSSxNQUFNLDJCQUEyQm5CLEtBRS9DekIsRUFBUW9DLFFBQVVBLEVBV2xCcEMsRUFBUTZDLFlBVlIsV0FDSSxHQUFJWCxFQUNBLE9BQU9BLEVBR1gsR0FEQUEsRUFBaUJFLEVBQVEsaUJBRXJCLE9BQU9GLEVBRVgsTUFBTSxJQUFJVSxNQUFNLDZCLHVDQ3JCcEJoQyxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFDdEQsTUFBTTJCLEVBQVEsRUFBUSxJQUNoQkMsRUFBWSxFQUFRLElBQzFCQyxPQUFPQyxXQUFhLElBQUlILEVBQU1JLFdBQzlCRixPQUFPRyxvQkFBc0IsSUFBSUosRUFBVUsscUIsNkJDSjNDeEMsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBQ3RELE1BQU1rQyxFQUFhLEVBQVEsR0FDckJDLEVBQVksRUFBUSxJQThDMUJ0RCxFQUFRa0QsV0ExQ1IsTUFDSSxjQUNJSyxLQUFLQyxTQUFVLEVBQ2ZELEtBQUtFLG1CQUFvQixFQUN6Qm5CLFNBQVNvQixpQkFBaUIsMEJBQTJCLEtBQ2pESCxLQUFLSSxpQkFFVFgsT0FBT1UsaUJBQWlCLFVBQVlFLElBQzVCQSxHQUFTQSxFQUFNcEIsTUFBNEIseUJBQXBCb0IsRUFBTXBCLEtBQUsvQixNQUNsQzhDLEtBQUtJLGlCQUlqQixVQUFVRSxHQUNOTixLQUFLTyxVQUFZRCxFQUNiTixLQUFLRSxtQkFDTEYsS0FBS1EsaUJBR2IsZUFDSVIsS0FBS0UsbUJBQW9CLEVBQ3pCRixLQUFLUSxpQkFFVCxpQkFDSSxNQUFNQyxFQUFVVixFQUFVVyxhQUNwQkMsRUFBV2IsRUFBV1IsY0FDNUIsR0FBSVUsS0FBS0MsU0FBV1UsRUFBU0MsMEJBQTRCWixLQUFLTyxVQUMxRCxPQUVKUCxLQUFLQyxTQUFVLEVBQ2YsTUFBTVksRUFBZTlCLFNBQVMrQixjQUFjLEtBQzVDRCxFQUFhRSxVQUFZTixFQUFRTyxvQkFDakNILEVBQWFJLGFBQWEsS0FBTSxvQkFDaENKLEVBQWFJLGFBQWEsUUFBU1IsRUFBUVMsc0JBQzNDTCxFQUFhSSxhQUFhLE9BQVEsVUFDbENKLEVBQWFJLGFBQWEsYUFBY1IsRUFBUVUsc0JBQ2hETixFQUFhTyxRQUFVLEtBQ25CcEIsS0FBS08sVUFBVWMsWUFBWSw4QkFBK0IsQ0FBRUMsT0FBUVgsRUFBU1csVUFFakZ2QyxTQUFTd0MsS0FBS0MsWUFBWVgsTSw2QkM3Q2xDeEQsT0FBT0MsZUFBZWIsRUFBUyxhQUFjLENBQUVtQixPQUFPLElBV3REbkIsRUFBUWlFLFdBVlIsV0FDSSxNQUFNZSxFQUFRMUMsU0FBU0MsZUFBZSxnQ0FDdEMsR0FBSXlDLEVBQU8sQ0FDUCxNQUFNeEMsRUFBT3dDLEVBQU12QyxhQUFhLGdCQUNoQyxHQUFJRCxFQUNBLE9BQU9FLEtBQUtDLE1BQU1ILEdBRzFCLE1BQU0sSUFBSUksTUFBTSw0Qiw2QkNicEJoQyxPQUFPQyxlQUFlYixFQUFTLGFBQWMsQ0FBRW1CLE9BQU8sSUFpQ3REbkIsRUFBUW9ELG9CQWhDUixNQUNJLGNBQ0lHLEtBQUswQixlQUFpQixHQUN0QjFCLEtBQUsyQixpQkFBa0IsRUFDdkIsTUFBTUMsRUFBb0J2QixJQUN0QixNQUFNaUIsRUFBU2pCLEVBQU13QixPQUFPQyxRQUFRUixPQUNwQ3RCLEtBQUswQixlQUFlSyxLQUFLVCxJQUU3QjdCLE9BQU9VLGlCQUFpQixtQkFBb0IsS0FDeEMsSUFBSyxNQUFNNkIsS0FBUWpELFNBQVNrRCx1QkFBdUIsbUJBQzNDRCxFQUFLRixRQUFRUixTQUNiVSxFQUFLRSxRQUFVTixLQUkzQm5DLE9BQU9VLGlCQUFpQixPQUFRLEtBQ3ZCSCxLQUFLMEIsZUFBZVMsU0FHekJuQyxLQUFLMkIsaUJBQWtCLEVBQ25CM0IsS0FBS00sUUFDTE4sS0FBS00sT0FBT2UsWUFBWSx3QkFBeUIsQ0FBRUssZUFBZ0IxQixLQUFLMEIsb0JBSXBGLFVBQVVwQixHQUNOTixLQUFLTSxPQUFTQSxFQUNWTixLQUFLMkIsaUJBQ0xyQixFQUFPZSxZQUFZLHdCQUF5QixDQUFFSyxlQUFnQjFCLEtBQUswQiIsImZpbGUiOiJwcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMTEpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmxldCBjYWNoZWRTZXR0aW5ncyA9IHVuZGVmaW5lZDtcbmZ1bmN0aW9uIGdldERhdGEoa2V5KSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2c2NvZGUtbWFya2Rvd24tcHJldmlldy1kYXRhJyk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBsb2FkIGRhdGEgZm9yICR7a2V5fWApO1xufVxuZXhwb3J0cy5nZXREYXRhID0gZ2V0RGF0YTtcbmZ1bmN0aW9uIGdldFNldHRpbmdzKCkge1xuICAgIGlmIChjYWNoZWRTZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG4gICAgfVxuICAgIGNhY2hlZFNldHRpbmdzID0gZ2V0RGF0YSgnZGF0YS1zZXR0aW5ncycpO1xuICAgIGlmIChjYWNoZWRTZXR0aW5ncykge1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0dGluZ3M7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc2V0dGluZ3MnKTtcbn1cbmV4cG9ydHMuZ2V0U2V0dGluZ3MgPSBnZXRTZXR0aW5ncztcbiIsIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5jb25zdCBjc3BfMSA9IHJlcXVpcmUoXCIuL2NzcFwiKTtcbmNvbnN0IGxvYWRpbmdfMSA9IHJlcXVpcmUoXCIuL2xvYWRpbmdcIik7XG53aW5kb3cuY3NwQWxlcnRlciA9IG5ldyBjc3BfMS5Dc3BBbGVydGVyKCk7XG53aW5kb3cuc3R5bGVMb2FkaW5nTW9uaXRvciA9IG5ldyBsb2FkaW5nXzEuU3R5bGVMb2FkaW5nTW9uaXRvcigpO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IHNldHRpbmdzXzEgPSByZXF1aXJlKFwiLi9zZXR0aW5nc1wiKTtcbmNvbnN0IHN0cmluZ3NfMSA9IHJlcXVpcmUoXCIuL3N0cmluZ3NcIik7XG4vKipcbiAqIFNob3dzIGFuIGFsZXJ0IHdoZW4gdGhlcmUgaXMgYSBjb250ZW50IHNlY3VyaXR5IHBvbGljeSB2aW9sYXRpb24uXG4gKi9cbmNsYXNzIENzcEFsZXJ0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmRpZFNob3cgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kaWRIYXZlQ3NwV2FybmluZyA9IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWN1cml0eXBvbGljeXZpb2xhdGlvbicsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Dc3BXYXJuaW5nKCk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmRhdGEgJiYgZXZlbnQuZGF0YS5uYW1lID09PSAndnNjb2RlLWRpZC1ibG9jay1zdmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNzcFdhcm5pbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFBvc3Rlcihwb3N0ZXIpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdpbmcgPSBwb3N0ZXI7XG4gICAgICAgIGlmICh0aGlzLmRpZEhhdmVDc3BXYXJuaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dDc3BXYXJuaW5nKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Dc3BXYXJuaW5nKCkge1xuICAgICAgICB0aGlzLmRpZEhhdmVDc3BXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93Q3NwV2FybmluZygpO1xuICAgIH1cbiAgICBzaG93Q3NwV2FybmluZygpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IHN0cmluZ3NfMS5nZXRTdHJpbmdzKCk7XG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gc2V0dGluZ3NfMS5nZXRTZXR0aW5ncygpO1xuICAgICAgICBpZiAodGhpcy5kaWRTaG93IHx8IHNldHRpbmdzLmRpc2FibGVTZWN1cml0eVdhcm5pbmdzIHx8ICF0aGlzLm1lc3NhZ2luZykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlkU2hvdyA9IHRydWU7XG4gICAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbm90aWZpY2F0aW9uLmlubmVyVGV4dCA9IHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGV4dDtcbiAgICAgICAgbm90aWZpY2F0aW9uLnNldEF0dHJpYnV0ZSgnaWQnLCAnY29kZS1jc3Atd2FybmluZycpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCd0aXRsZScsIHN0cmluZ3MuY3NwQWxlcnRNZXNzYWdlVGl0bGUpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdyb2xlJywgJ2J1dHRvbicpO1xuICAgICAgICBub3RpZmljYXRpb24uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgc3RyaW5ncy5jc3BBbGVydE1lc3NhZ2VMYWJlbCk7XG4gICAgICAgIG5vdGlmaWNhdGlvbi5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdpbmcucG9zdE1lc3NhZ2UoJ3Nob3dQcmV2aWV3U2VjdXJpdHlTZWxlY3RvcicsIHsgc291cmNlOiBzZXR0aW5ncy5zb3VyY2UgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm90aWZpY2F0aW9uKTtcbiAgICB9XG59XG5leHBvcnRzLkNzcEFsZXJ0ZXIgPSBDc3BBbGVydGVyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG4vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmZ1bmN0aW9uIGdldFN0cmluZ3MoKSB7XG4gICAgY29uc3Qgc3RvcmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndnNjb2RlLW1hcmtkb3duLXByZXZpZXctZGF0YScpO1xuICAgIGlmIChzdG9yZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gc3RvcmUuZ2V0QXR0cmlidXRlKCdkYXRhLXN0cmluZ3MnKTtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGxvYWQgc3RyaW5ncycpO1xufVxuZXhwb3J0cy5nZXRTdHJpbmdzID0gZ2V0U3RyaW5ncztcbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuY2xhc3MgU3R5bGVMb2FkaW5nTW9uaXRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMudW5sb2FkZWRTdHlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy5maW5pc2hlZExvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgb25TdHlsZUxvYWRFcnJvciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlID0gZXZlbnQudGFyZ2V0LmRhdGFzZXQuc291cmNlO1xuICAgICAgICAgICAgdGhpcy51bmxvYWRlZFN0eWxlcy5wdXNoKHNvdXJjZSk7XG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2NvZGUtdXNlci1zdHlsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxpbmsuZGF0YXNldC5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluay5vbmVycm9yID0gb25TdHlsZUxvYWRFcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy51bmxvYWRlZFN0eWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpbmlzaGVkTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3N0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvc3Rlci5wb3N0TWVzc2FnZSgncHJldmlld1N0eWxlTG9hZEVycm9yJywgeyB1bmxvYWRlZFN0eWxlczogdGhpcy51bmxvYWRlZFN0eWxlcyB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHNldFBvc3Rlcihwb3N0ZXIpIHtcbiAgICAgICAgdGhpcy5wb3N0ZXIgPSBwb3N0ZXI7XG4gICAgICAgIGlmICh0aGlzLmZpbmlzaGVkTG9hZGluZykge1xuICAgICAgICAgICAgcG9zdGVyLnBvc3RNZXNzYWdlKCdwcmV2aWV3U3R5bGVMb2FkRXJyb3InLCB7IHVubG9hZGVkU3R5bGVzOiB0aGlzLnVubG9hZGVkU3R5bGVzIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5TdHlsZUxvYWRpbmdNb25pdG9yID0gU3R5bGVMb2FkaW5nTW9uaXRvcjtcbiJdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file +!function(e){var t={};function n(s){if(t[s])return t[s].exports;var o=t[s]={i:s,l:!1,exports:{}};return e[s].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,s){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:s})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var s=Object.create(null);if(n.r(s),Object.defineProperty(s,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(s,o,function(t){return e[t]}.bind(null,o));return s},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=11)}([function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});let s=void 0;function o(e){const t=document.getElementById("vscode-markdown-preview-data");if(t){const n=t.getAttribute(e);if(n)return JSON.parse(n)}throw new Error(`Could not load data for ${e}`)}t.getData=o,t.getSettings=function(){if(s)return s;if(s=o("data-settings"))return s;throw new Error("Could not load settings")}},,,,,,,,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(12),o=n(14);window.cspAlerter=new s.CspAlerter,window.styleLoadingMonitor=new o.StyleLoadingMonitor},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});const s=n(0),o=n(13);t.CspAlerter=class{constructor(){this.didShow=!1,this.didHaveCspWarning=!1,document.addEventListener("securitypolicyviolation",()=>{this.onCspWarning()}),window.addEventListener("message",e=>{e&&e.data&&"vscode-did-block-svg"===e.data.name&&this.onCspWarning()})}setPoster(e){this.messaging=e,this.didHaveCspWarning&&this.showCspWarning()}onCspWarning(){this.didHaveCspWarning=!0,this.showCspWarning()}showCspWarning(){const e=o.getStrings(),t=s.getSettings();if(this.didShow||t.disableSecurityWarnings||!this.messaging)return;this.didShow=!0;const n=document.createElement("a");n.innerText=e.cspAlertMessageText,n.setAttribute("id","code-csp-warning"),n.setAttribute("title",e.cspAlertMessageTitle),n.setAttribute("role","button"),n.setAttribute("aria-label",e.cspAlertMessageLabel),n.onclick=()=>{this.messaging.postMessage("showPreviewSecuritySelector",{source:t.source})},document.body.appendChild(n)}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getStrings=function(){const e=document.getElementById("vscode-markdown-preview-data");if(e){const t=e.getAttribute("data-strings");if(t)return JSON.parse(t)}throw new Error("Could not load strings")}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});t.StyleLoadingMonitor=class{constructor(){this.unloadedStyles=[],this.finishedLoading=!1;const e=e=>{const t=e.target.dataset.source;this.unloadedStyles.push(t)};window.addEventListener("DOMContentLoaded",()=>{for(const t of document.getElementsByClassName("code-user-style"))t.dataset.source&&(t.onerror=e)}),window.addEventListener("load",()=>{this.unloadedStyles.length&&(this.finishedLoading=!0,this.poster&&this.poster.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles}))})}setPoster(e){this.poster=e,this.finishedLoading&&e.postMessage("previewStyleLoadError",{unloadedStyles:this.unloadedStyles})}}}]); \ No newline at end of file diff --git a/extensions/markdown-language-features/media/preview-right-dark.svg b/extensions/markdown-language-features/media/preview-right-dark.svg deleted file mode 100644 index 1d59877196..0000000000 --- a/extensions/markdown-language-features/media/preview-right-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/extensions/markdown-language-features/media/preview-right-light.svg b/extensions/markdown-language-features/media/preview-right-light.svg deleted file mode 100644 index 3f1152fc3c..0000000000 --- a/extensions/markdown-language-features/media/preview-right-light.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/extensions/markdown-language-features/media/view-source-dark.svg b/extensions/markdown-language-features/media/view-source-dark.svg deleted file mode 100644 index ed302ae139..0000000000 --- a/extensions/markdown-language-features/media/view-source-dark.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/extensions/markdown-language-features/media/view-source-light.svg b/extensions/markdown-language-features/media/view-source-light.svg deleted file mode 100644 index 392a840c5e..0000000000 --- a/extensions/markdown-language-features/media/view-source-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/extensions/markdown-language-features/package.json b/extensions/markdown-language-features/package.json index c23fb33eb8..c3b7e73b25 100644 --- a/extensions/markdown-language-features/package.json +++ b/extensions/markdown-language-features/package.json @@ -12,6 +12,7 @@ "vscode": "^1.20.0" }, "main": "./out/extension", + "browser": "./dist/extension.js", "categories": [ "Programming Languages" ], @@ -44,28 +45,19 @@ "command": "markdown.showPreviewToSide", "title": "%markdown.previewSide.title%", "category": "Markdown", - "icon": { - "light": "./media/preview-right-light.svg", - "dark": "./media/preview-right-dark.svg" - } + "icon": "$(open-preview)" }, { "command": "markdown.showLockedPreviewToSide", "title": "%markdown.showLockedPreviewToSide.title%", "category": "Markdown", - "icon": { - "light": "./media/preview-right-light.svg", - "dark": "./media/preview-right-dark.svg" - } + "icon": "$(open-preview)" }, { "command": "markdown.showSource", "title": "%markdown.showSource.title%", "category": "Markdown", - "icon": { - "light": "./media/view-source-light.svg", - "dark": "./media/view-source-dark.svg" - } + "icon": "$(go-to-file)" }, { "command": "markdown.showPreviewSecuritySelector", @@ -211,7 +203,7 @@ }, "markdown.preview.fontFamily": { "type": "string", - "default": "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', 'Ubuntu', 'Droid Sans', sans-serif", + "default": "-apple-system, BlinkMacSystemFont, 'Segoe WPC', 'Segoe UI', system-ui, 'Ubuntu', 'Droid Sans', sans-serif", "description": "%markdown.preview.fontFamily.desc%", "scope": "resource" }, @@ -328,7 +320,9 @@ "watch": "npm run build-preview && gulp watch-extension:markdown-language-features", "vscode:prepublish": "npm run build-ext && npm run build-preview", "build-ext": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:markdown-language-features ./tsconfig.json", - "build-preview": "webpack --mode production" + "build-preview": "webpack --mode production", + "compile-web": "npx webpack-cli --config extension-browser.webpack.config --mode none", + "watch-web": "npx webpack-cli --config extension-browser.webpack.config --mode none --watch --info-verbosity verbose" }, "dependencies": { "highlight.js": "9.15.10", diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index a711e7cc50..13adb641a6 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -227,10 +227,10 @@ class MarkdownPreview extends Disposable implements WebviewResourceProvider { } private get iconPath() { - const root = path.join(this._contributionProvider.extensionPath, 'media'); + const root = vscode.Uri.joinPath(this._contributionProvider.extensionUri, 'media'); return { - light: vscode.Uri.file(path.join(root, 'preview-light.svg')), - dark: vscode.Uri.file(path.join(root, 'preview-dark.svg')) + light: vscode.Uri.joinPath(root, 'preview-light.svg'), + dark: vscode.Uri.joinPath(root, 'preview-dark.svg'), }; } diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index db21c81e25..49e3695e58 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -111,7 +111,7 @@ export class MarkdownContentProvider { private extensionResourcePath(resourceProvider: WebviewResourceProvider, mediaFile: string): string { const webviewResource = resourceProvider.asWebviewUri( - vscode.Uri.file(this.context.asAbsolutePath(path.join('media', mediaFile)))); + vscode.Uri.joinPath(this.context.extensionUri, 'media', mediaFile)); return webviewResource.toString(); } @@ -132,7 +132,7 @@ export class MarkdownContentProvider { // Use a workspace relative path if there is a workspace const root = vscode.workspace.getWorkspaceFolder(resource); if (root) { - return resourceProvider.asWebviewUri(vscode.Uri.file(path.join(root.uri.fsPath, href))).toString(); + return resourceProvider.asWebviewUri(vscode.Uri.joinPath(root.uri, href)).toString(); } // Otherwise look relative to the markdown file diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 0e7899fafd..c88e476c8e 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -3,14 +3,14 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as crypto from 'crypto'; -import * as path from 'path'; import { MarkdownIt, Token } from 'markdown-it'; +import * as path from 'path'; import * as vscode from 'vscode'; import { MarkdownContributionProvider as MarkdownContributionProvider } from './markdownExtensions'; import { Slugifier } from './slugify'; import { SkinnyTextDocument } from './tableOfContentsProvider'; -import { MarkdownFileExtensions, Schemes, isOfScheme } from './util/links'; +import { hash } from './util/hash'; +import { isOfScheme, MarkdownFileExtensions, Schemes } from './util/links'; const UNICODE_NEWLINE_REGEX = /\u2028|\u2029/g; @@ -204,9 +204,7 @@ export class MarkdownEngine { const src = token.attrGet('src'); if (src) { - const hash = crypto.createHash('sha256'); - hash.update(src); - const imgHash = hash.digest('hex'); + const imgHash = hash(src); token.attrSet('id', `image-hash-${imgHash}`); } @@ -249,7 +247,7 @@ export class MarkdownEngine { if (uri.path[0] === '/') { const root = vscode.workspace.getWorkspaceFolder(this.currentDocument!); if (root) { - const fileUri = vscode.Uri.file(path.join(root.uri.fsPath, uri.fsPath)); + const fileUri = vscode.Uri.joinPath(root.uri, uri.fsPath); uri = fileUri.with({ scheme: uri.scheme, fragment: uri.fragment, diff --git a/extensions/markdown-language-features/src/markdownExtensions.ts b/extensions/markdown-language-features/src/markdownExtensions.ts index 8189e4ee81..073ca3e972 100644 --- a/extensions/markdown-language-features/src/markdownExtensions.ts +++ b/extensions/markdown-language-features/src/markdownExtensions.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import * as path from 'path'; -import { Disposable } from './util/dispose'; import * as arrays from './util/arrays'; +import { Disposable } from './util/dispose'; const resolveExtensionResource = (extension: vscode.Extension, resourcePath: string): vscode.Uri => { - return vscode.Uri.file(path.join(extension.extensionPath, resourcePath)); + return vscode.Uri.joinPath(extension.extensionUri, resourcePath); }; const resolveExtensionResources = (extension: vscode.Extension, resourcePaths: unknown): vscode.Uri[] => { @@ -114,7 +113,8 @@ export namespace MarkdownContributions { } export interface MarkdownContributionProvider { - readonly extensionPath: string; + readonly extensionUri: vscode.Uri; + readonly contributions: MarkdownContributions; readonly onContributionsChanged: vscode.Event; @@ -125,7 +125,7 @@ class VSCodeExtensionMarkdownContributionProvider extends Disposable implements private _contributions?: MarkdownContributions; public constructor( - public readonly extensionPath: string, + private readonly _extensionContext: vscode.ExtensionContext, ) { super(); @@ -139,6 +139,8 @@ class VSCodeExtensionMarkdownContributionProvider extends Disposable implements }, undefined, this._disposables); } + public get extensionUri() { return this._extensionContext.extensionUri; } + private readonly _onContributionsChanged = this._register(new vscode.EventEmitter()); public readonly onContributionsChanged = this._onContributionsChanged.event; @@ -157,5 +159,5 @@ class VSCodeExtensionMarkdownContributionProvider extends Disposable implements } export function getMarkdownExtensionContributions(context: vscode.ExtensionContext): MarkdownContributionProvider { - return new VSCodeExtensionMarkdownContributionProvider(context.extensionPath); -} \ No newline at end of file + return new VSCodeExtensionMarkdownContributionProvider(context); +} diff --git a/extensions/markdown-language-features/src/test/engine.ts b/extensions/markdown-language-features/src/test/engine.ts index bff44db40e..7e05cf41fb 100644 --- a/extensions/markdown-language-features/src/test/engine.ts +++ b/extensions/markdown-language-features/src/test/engine.ts @@ -10,7 +10,7 @@ import { githubSlugifier } from '../slugify'; import { Disposable } from '../util/dispose'; const emptyContributions = new class extends Disposable implements MarkdownContributionProvider { - readonly extensionPath = ''; + readonly extensionUri = vscode.Uri.file('/'); readonly contributions = MarkdownContributions.Empty; readonly onContributionsChanged = this._register(new vscode.EventEmitter()).event; }; diff --git a/extensions/markdown-language-features/src/util/hash.ts b/extensions/markdown-language-features/src/util/hash.ts new file mode 100644 index 0000000000..621d944b1f --- /dev/null +++ b/extensions/markdown-language-features/src/util/hash.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/** + * Return a hash value for an object. + */ +export function hash(obj: any, hashVal = 0): number { + switch (typeof obj) { + case 'object': + if (obj === null) { + return numberHash(349, hashVal); + } else if (Array.isArray(obj)) { + return arrayHash(obj, hashVal); + } + return objectHash(obj, hashVal); + case 'string': + return stringHash(obj, hashVal); + case 'boolean': + return booleanHash(obj, hashVal); + case 'number': + return numberHash(obj, hashVal); + case 'undefined': + return 937 * 31; + default: + return numberHash(obj, 617); + } +} + +function numberHash(val: number, initialHashVal: number): number { + return (((initialHashVal << 5) - initialHashVal) + val) | 0; // hashVal * 31 + ch, keep as int32 +} + +function booleanHash(b: boolean, initialHashVal: number): number { + return numberHash(b ? 433 : 863, initialHashVal); +} + +function stringHash(s: string, hashVal: number) { + hashVal = numberHash(149417, hashVal); + for (let i = 0, length = s.length; i < length; i++) { + hashVal = numberHash(s.charCodeAt(i), hashVal); + } + return hashVal; +} + +function arrayHash(arr: any[], initialHashVal: number): number { + initialHashVal = numberHash(104579, initialHashVal); + return arr.reduce((hashVal, item) => hash(item, hashVal), initialHashVal); +} + +function objectHash(obj: any, initialHashVal: number): number { + initialHashVal = numberHash(181387, initialHashVal); + return Object.keys(obj).sort().reduce((hashVal, key) => { + hashVal = stringHash(key, hashVal); + return hash(obj[key], hashVal); + }, initialHashVal); +} diff --git a/extensions/markdown-language-features/webpack.config.js b/extensions/markdown-language-features/webpack.config.js index 36f188ccb1..df6ce926c1 100644 --- a/extensions/markdown-language-features/webpack.config.js +++ b/extensions/markdown-language-features/webpack.config.js @@ -21,9 +21,8 @@ module.exports = { resolve: { extensions: ['.tsx', '.ts', '.js'] }, - devtool: 'inline-source-map', output: { filename: '[name].js', path: path.resolve(__dirname, 'media') } -}; \ No newline at end of file +}; diff --git a/extensions/merge-conflict/extension-browser.webpack.config.js b/extensions/merge-conflict/extension-browser.webpack.config.js new file mode 100644 index 0000000000..c7418f9dd4 --- /dev/null +++ b/extensions/merge-conflict/extension-browser.webpack.config.js @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + target: 'webworker', + context: __dirname, + entry: { + extension: './src/mergeConflictMain.ts' + }, + output: { + filename: 'mergeConflictMain.js' + }, + performance: { + hints: false + }, + resolve: { + alias: { + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') + } + } +}); +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/merge-conflict/extension.webpack.config.js b/extensions/merge-conflict/extension.webpack.config.js index 35b95ccffc..a1a1c8d5df 100644 --- a/extensions/merge-conflict/extension.webpack.config.js +++ b/extensions/merge-conflict/extension.webpack.config.js @@ -12,6 +12,9 @@ const withDefaults = require('../shared.webpack.config'); module.exports = withDefaults({ context: __dirname, entry: { - extension: './src/extension.ts' - } + extension: './src/mergeConflictMain.ts' + }, + output: { + filename: 'mergeConflictMain.js' + }, }); diff --git a/extensions/merge-conflict/package.json b/extensions/merge-conflict/package.json index 815a412492..f59738d300 100644 --- a/extensions/merge-conflict/package.json +++ b/extensions/merge-conflict/package.json @@ -16,7 +16,8 @@ "activationEvents": [ "*" ], - "main": "./out/extension", + "main": "./out/mergeConflictMain", + "browser": "./dist/mergeConflictMain", "scripts": { "compile": "gulp compile-extension:merge-conflict", "watch": "gulp watch-extension:merge-conflict" diff --git a/extensions/merge-conflict/src/commandHandler.ts b/extensions/merge-conflict/src/commandHandler.ts index 5f29c9b5c8..6dabb97218 100644 --- a/extensions/merge-conflict/src/commandHandler.ts +++ b/extensions/merge-conflict/src/commandHandler.ts @@ -5,7 +5,6 @@ import * as vscode from 'vscode'; import * as interfaces from './interfaces'; import ContentProvider from './contentProvider'; -import * as path from 'path'; import { loadMessageBundle } from 'vscode-nls'; const localize = loadMessageBundle(); @@ -86,7 +85,6 @@ export default class CommandHandler implements vscode.Disposable { } async compare(editor: vscode.TextEditor, conflict: interfaces.IDocumentMergeConflict | null) { - const fileName = path.basename(editor.document.uri.fsPath); // No conflict, command executed from command palette if (!conflict) { @@ -134,6 +132,8 @@ export default class CommandHandler implements vscode.Disposable { conflict.range.start.line - mergeConflictLineOffsets, conflict.range.start.character ); + const docPath = editor.document.uri.path; + const fileName = docPath.substring(docPath.lastIndexOf('/') + 1); // avoid NodeJS path to keep browser webpack small const title = localize('compareChangesTitle', '{0}: Current Changes ⟷ Incoming Changes', fileName); const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict'); const openToTheSide = mergeConflictConfig.get('diffViewPosition'); @@ -365,4 +365,4 @@ export default class CommandHandler implements vscode.Disposable { conflict: fallback() }; } -} \ No newline at end of file +} diff --git a/extensions/merge-conflict/src/extension.ts b/extensions/merge-conflict/src/mergeConflictMain.ts similarity index 100% rename from extensions/merge-conflict/src/extension.ts rename to extensions/merge-conflict/src/mergeConflictMain.ts diff --git a/extensions/microsoft-authentication/src/AADHelper.ts b/extensions/microsoft-authentication/src/AADHelper.ts index c3f50126db..4ad0cae03e 100644 --- a/extensions/microsoft-authentication/src/AADHelper.ts +++ b/extensions/microsoft-authentication/src/AADHelper.ts @@ -87,6 +87,10 @@ export class AzureActiveDirectoryService { try { const sessions = this.parseStoredData(storedData); const refreshes = sessions.map(async session => { + if (!session.refreshToken) { + return Promise.resolve(); + } + try { await this.refreshToken(session.refreshToken, session.scope, session.id); } catch (e) { @@ -148,7 +152,7 @@ export class AzureActiveDirectoryService { 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) { + if (!matchesExisting && session.refreshToken) { try { await this.refreshToken(session.refreshToken, session.scope, session.id); addedIds.push(session.id); @@ -242,6 +246,10 @@ export class AzureActiveDirectoryService { public async login(scope: string): Promise { Logger.info('Logging in...'); + if (!scope.includes('offline_access')) { + Logger.info('Warning: The \'offline_access\' scope was not included, so the generated token will not be able to be refreshed.'); + } + return new Promise(async (resolve, reject) => { if (vscode.env.uiKind === vscode.UIKind.Web) { resolve(this.loginWithoutLocalServer(scope)); diff --git a/extensions/notebook/src/test/common/stubs.ts b/extensions/notebook/src/test/common/stubs.ts index f541416276..97252c0f56 100644 --- a/extensions/notebook/src/test/common/stubs.ts +++ b/extensions/notebook/src/test/common/stubs.ts @@ -18,6 +18,7 @@ export class MockExtensionContext implements vscode.ExtensionContext { } storagePath: string; globalStoragePath: string; + extensionMode: vscode.ExtensionMode; constructor() { this.subscriptions = []; diff --git a/extensions/package.json b/extensions/package.json index 178ddba617..e54ff1794b 100644 --- a/extensions/package.json +++ b/extensions/package.json @@ -3,9 +3,12 @@ "version": "0.0.1", "description": "Dependencies shared by all extensions", "dependencies": { - "typescript": "3.9.4" + "typescript": "3.9.5" }, "scripts": { "postinstall": "node ./postinstall" + }, + "devDependencies": { + "rimraf": "^3.0.2" } } diff --git a/extensions/postinstall.js b/extensions/postinstall.js index ea57fc45a7..eea982968a 100644 --- a/extensions/postinstall.js +++ b/extensions/postinstall.js @@ -2,29 +2,58 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +// @ts-check 'use strict'; const fs = require('fs'); const path = require('path'); -const toDelete = new Set(['tsc.js', 'tsserverlibrary.js', 'typescriptServices.js']); +const rimraf = require('rimraf'); -const root = path.join(__dirname, 'node_modules', 'typescript', 'lib'); -for (let name of fs.readdirSync(root)) { - if (name === 'lib.d.ts' || name.match(/^lib\..*\.d\.ts$/) || name === 'protocol.d.ts') { - continue; - } - if (name === 'typescript.js' || name === 'typescript.d.ts') { - // used by html and extension editing - continue; - } +const root = path.join(__dirname, 'node_modules', 'typescript'); - if (toDelete.has(name) || name.match(/\.d\.ts$/)) { - try { - fs.unlinkSync(path.join(root, name)); - console.log(`removed '${path.join(root, name)}'`); - } catch (e) { - console.warn(e); +function processRoot() { + const toKeep = new Set([ + 'lib', + 'package.json', + ]); + for (const name of fs.readdirSync(root)) { + if (!toKeep.has(name)) { + const filePath = path.join(root, name); + console.log(`Removed ${filePath}`); + rimraf.sync(filePath); } } -} \ No newline at end of file +} + +function processLib() { + const toDelete = new Set([ + 'tsc.js', + 'tsserverlibrary.js', + 'typescriptServices.js', + ]); + + const libRoot = path.join(root, 'lib'); + + for (const name of fs.readdirSync(libRoot)) { + if (name === 'lib.d.ts' || name.match(/^lib\..*\.d\.ts$/) || name === 'protocol.d.ts') { + continue; + } + if (name === 'typescript.js' || name === 'typescript.d.ts') { + // used by html and extension editing + continue; + } + + if (toDelete.has(name) || name.match(/\.d\.ts$/)) { + try { + fs.unlinkSync(path.join(libRoot, name)); + console.log(`removed '${path.join(libRoot, name)}'`); + } catch (e) { + console.warn(e); + } + } + } +} + +processRoot(); +processLib(); diff --git a/extensions/python/extension-browser.webpack.config.js b/extensions/python/extension-browser.webpack.config.js new file mode 100644 index 0000000000..58ecb822fc --- /dev/null +++ b/extensions/python/extension-browser.webpack.config.js @@ -0,0 +1,33 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); +const path = require('path'); + +const clientConfig = withDefaults({ + target: 'webworker', + context: __dirname, + entry: { + extension: './src/pythonMain.ts' + }, + output: { + filename: 'pythonMain.js' + }, + performance: { + hints: false + }, + resolve: { + alias: { + 'vscode-nls': path.resolve(__dirname, '../../build/polyfills/vscode-nls.js') + } + } +}); +clientConfig.module.rules[0].use.shift(); // remove nls loader + +module.exports = clientConfig; diff --git a/extensions/python/package.json b/extensions/python/package.json index 1a7a65b2de..ab813f048d 100644 --- a/extensions/python/package.json +++ b/extensions/python/package.json @@ -8,6 +8,7 @@ "engines": { "vscode": "*" }, "activationEvents": ["onLanguage:python"], "main": "./out/pythonMain", + "browser": "./dist/pythonMain", "extensionKind": [ "ui", "workspace" ], "contributes": { "languages": [{ diff --git a/extensions/schema-compare/src/test/testContext.ts b/extensions/schema-compare/src/test/testContext.ts index 5936784e8d..f1979446b2 100644 --- a/extensions/schema-compare/src/test/testContext.ts +++ b/extensions/schema-compare/src/test/testContext.ts @@ -34,7 +34,8 @@ export function createContext(): TestContext { globalStoragePath: '', logPath: '', extensionUri: vscode.Uri.parse(''), - environmentVariableCollection: undefined as any + environmentVariableCollection: undefined as any, + extensionMode: undefined as any }, }; } diff --git a/extensions/sql-database-projects/src/test/testContext.ts b/extensions/sql-database-projects/src/test/testContext.ts index 5936784e8d..f1979446b2 100644 --- a/extensions/sql-database-projects/src/test/testContext.ts +++ b/extensions/sql-database-projects/src/test/testContext.ts @@ -34,7 +34,8 @@ export function createContext(): TestContext { globalStoragePath: '', logPath: '', extensionUri: vscode.Uri.parse(''), - environmentVariableCollection: undefined as any + environmentVariableCollection: undefined as any, + extensionMode: undefined as any }, }; } diff --git a/extensions/vscode-web-playground/.gitignore b/extensions/vscode-web-playground/.gitignore index 8e5962ee72..c19bd94aaa 100644 --- a/extensions/vscode-web-playground/.gitignore +++ b/extensions/vscode-web-playground/.gitignore @@ -1,2 +1,3 @@ +dist out -node_modules \ No newline at end of file +node_modules diff --git a/extensions/vscode-web-playground/.vscodeignore b/extensions/vscode-web-playground/.vscodeignore index eb6a48615c..32fe3f0369 100644 --- a/extensions/vscode-web-playground/.vscodeignore +++ b/extensions/vscode-web-playground/.vscodeignore @@ -1,6 +1,11 @@ .vscode/** +build/** +dist/** +out/** +src/** typings/** -**/*.ts -**/*.map .gitignore +extension-browser.webpack.config.js +extension.webpack.config.js tsconfig.json +yarn.lock diff --git a/extensions/vscode-web-playground/extension-browser.webpack.config.js b/extensions/vscode-web-playground/extension-browser.webpack.config.js new file mode 100644 index 0000000000..3fb4b69338 --- /dev/null +++ b/extensions/vscode-web-playground/extension-browser.webpack.config.js @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; +const path = require('path'); +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + target: 'webworker', + node: false, + entry: { + extension: './src/extension.ts', + } +}); diff --git a/extensions/vscode-web-playground/extension.webpack.config.js b/extensions/vscode-web-playground/extension.webpack.config.js new file mode 100644 index 0000000000..35b95ccffc --- /dev/null +++ b/extensions/vscode-web-playground/extension.webpack.config.js @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +//@ts-check + +'use strict'; + +const withDefaults = require('../shared.webpack.config'); + +module.exports = withDefaults({ + context: __dirname, + entry: { + extension: './src/extension.ts' + } +}); diff --git a/extensions/vscode-web-playground/package.json b/extensions/vscode-web-playground/package.json index 05fa8bdeb7..7d48eca66c 100644 --- a/extensions/vscode-web-playground/package.json +++ b/extensions/vscode-web-playground/package.json @@ -8,9 +8,11 @@ "private": true, "activationEvents": [ "onFileSystem:memfs", + "onFileSystem:github", "onDebug" ], - "browser": "./out/extension", + "browser": "./dist/extension", + "main": "./out/extension", "engines": { "vscode": "^1.25.0" }, @@ -78,15 +80,27 @@ } ] } + ], + "resourceLabelFormatters": [ + { + "scheme": "github", + "authority": "*", + "formatting": { + "label": "${authority}${path}", + "separator": "/", + "workspaceSuffix": "GitHub" + } + } ] }, "scripts": { "compile": "node ./node_modules/vscode/bin/compile -watch -p ./", - "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-api-tests ./tsconfig.json" + "compile-web": "npx webpack-cli --config extension.webpack.config --mode none", + "watch-web": "npx webpack-cli --config extension.webpack.config --mode none --watch --info-verbosity verbose", + "vscode:prepublish": "node ../../node_modules/gulp/bin/gulp.js --gulpfile ../../build/gulpfile.extensions.js compile-extension:vscode-web-playground ./tsconfig.json" }, "devDependencies": { "@types/mocha": "2.2.43", - "@types/node": "^12.11.7", "mocha-junit-reporter": "^1.17.0", "mocha-multi-reporters": "^1.1.7" } diff --git a/extensions/vscode-web-playground/src/exampleFiles.ts b/extensions/vscode-web-playground/src/exampleFiles.ts new file mode 100644 index 0000000000..f382391bfc --- /dev/null +++ b/extensions/vscode-web-playground/src/exampleFiles.ts @@ -0,0 +1,304 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const largeTSFile = `/// +/// + +module Mankala { +export var storeHouses = [6,13]; +export var svgNS = 'http://www.w3.org/2000/svg'; + +function createSVGRect(r:Rectangle) { + var rect = document.createElementNS(svgNS,'rect'); + rect.setAttribute('x', r.x.toString()); + rect.setAttribute('y', r.y.toString()); + rect.setAttribute('width', r.width.toString()); + rect.setAttribute('height', r.height.toString()); + return rect; +} + +function createSVGEllipse(r:Rectangle) { + var ell = document.createElementNS(svgNS,'ellipse'); + ell.setAttribute('rx',(r.width/2).toString()); + ell.setAttribute('ry',(r.height/2).toString()); + ell.setAttribute('cx',(r.x+r.width/2).toString()); + ell.setAttribute('cy',(r.y+r.height/2).toString()); + return ell; +} + +function createSVGEllipsePolar(angle:number,radius:number,tx:number,ty:number,cxo:number,cyo:number) { + var ell = document.createElementNS(svgNS,'ellipse'); + ell.setAttribute('rx',radius.toString()); + ell.setAttribute('ry',(radius/3).toString()); + ell.setAttribute('cx',cxo.toString()); + ell.setAttribute('cy',cyo.toString()); + var dangle = angle*(180/Math.PI); + ell.setAttribute('transform','rotate('+dangle+','+cxo+','+cyo+') translate('+tx+','+ty+')'); + return ell; +} + +function createSVGInscribedCircle(sq:Square) { + var circle = document.createElementNS(svgNS,'circle'); + circle.setAttribute('r',(sq.length/2).toString()); + circle.setAttribute('cx',(sq.x+(sq.length/2)).toString()); + circle.setAttribute('cy',(sq.y+(sq.length/2)).toString()); + return circle; +} + +export class Position { + + seedCounts:number[]; + startMove:number; + turn:number; + + constructor(seedCounts:number[],startMove:number,turn:number) { + this.seedCounts = seedCounts; + this.startMove = startMove; + this.turn = turn; + } + + score() { + var baseScore = this.seedCounts[storeHouses[1-this.turn]]-this.seedCounts[storeHouses[this.turn]]; + var otherSpaces = homeSpaces[this.turn]; + var sum = 0; + for (var k = 0,len = otherSpaces.length;k0) { + features.clear(); + var len = this.seedCounts.length; + for (var i = 0;i0) { + if (nextSpace==storeHouses[this.turn]) { + features.seedStoredCount++; + } + if ((nextSpace!=storeHouses[1-this.turn])) { + nextSeedCounts[nextSpace]++; + seedCount--; + } + if (seedCount==0) { + if (nextSpace==storeHouses[this.turn]) { + features.turnContinues = true; + } + else { + if ((nextSeedCounts[nextSpace]==1)&& + (nextSpace>=firstHomeSpace[this.turn])&& + (nextSpace<=lastHomeSpace[this.turn])) { + // capture + var capturedSpace = capturedSpaces[nextSpace]; + if (capturedSpace>=0) { + features.spaceCaptured = capturedSpace; + features.capturedCount = nextSeedCounts[capturedSpace]; + nextSeedCounts[capturedSpace] = 0; + nextSeedCounts[storeHouses[this.turn]] += features.capturedCount; + features.seedStoredCount += nextSeedCounts[capturedSpace]; + } + } + } + } + nextSpace = (nextSpace+1)%14; + } + return true; + } + else { + return false; + } + } +} + +export class SeedCoords { + tx:number; + ty:number; + angle:number; + + constructor(tx:number, ty:number, angle:number) { + this.tx = tx; + this.ty = ty; + this.angle = angle; + } +} + +export class DisplayPosition extends Position { + + config:SeedCoords[][]; + + constructor(seedCounts:number[],startMove:number,turn:number) { + super(seedCounts,startMove,turn); + + this.config = []; + + for (var i = 0;i(); + } + } + + + seedCircleRect(rect:Rectangle,seedCount:number,board:Element,seed:number) { + var coords = this.config[seed]; + var sq = rect.inner(0.95).square(); + var cxo = (sq.width/2)+sq.x; + var cyo = (sq.height/2)+sq.y; + var seedNumbers = [5,7,9,11]; + var ringIndex = 0; + var ringRem = seedNumbers[ringIndex]; + var angleDelta = (2*Math.PI)/ringRem; + var angle = angleDelta; + var seedLength = sq.width/(seedNumbers.length<<1); + var crMax = sq.width/2-(seedLength/2); + var pit = createSVGInscribedCircle(sq); + if (seed<7) { + pit.setAttribute('fill','brown'); + } + else { + pit.setAttribute('fill','saddlebrown'); + } + board.appendChild(pit); + var seedsSeen = 0; + while (seedCount > 0) { + if (ringRem == 0) { + ringIndex++; + ringRem = seedNumbers[ringIndex]; + angleDelta = (2*Math.PI)/ringRem; + angle = angleDelta; + } + var tx:number; + var ty:number; + var tangle = angle; + if (coords.length>seedsSeen) { + tx = coords[seedsSeen].tx; + ty = coords[seedsSeen].ty; + tangle = coords[seedsSeen].angle; + } + else { + tx = (Math.random()*crMax)-(crMax/3); + ty = (Math.random()*crMax)-(crMax/3); + coords[seedsSeen] = new SeedCoords(tx,ty,angle); + } + var ell = createSVGEllipsePolar(tangle,seedLength,tx,ty,cxo,cyo); + board.appendChild(ell); + angle += angleDelta; + ringRem--; + seedCount--; + seedsSeen++; + } + } + + toCircleSVG() { + var seedDivisions = 14; + var board = document.createElementNS(svgNS,'svg'); + var boardRect = new Rectangle(0,0,1800,800); + board.setAttribute('width','1800'); + board.setAttribute('height','800'); + var whole = createSVGRect(boardRect); + whole.setAttribute('fill','tan'); + board.appendChild(whole); + var labPlayLab = boardRect.proportionalSplitVert(20,760,20); + var playSurface = labPlayLab[1]; + var storeMainStore = playSurface.proportionalSplitHoriz(8,48,8); + var mainPair = storeMainStore[1].subDivideVert(2); + var playerRects = [mainPair[0].subDivideHoriz(6), mainPair[1].subDivideHoriz(6)]; + // reverse top layer because storehouse on left + for (var k = 0;k<3;k++) { + var temp = playerRects[0][k]; + playerRects[0][k] = playerRects[0][5-k]; + playerRects[0][5-k] = temp; + } + var storehouses = [storeMainStore[0],storeMainStore[2]]; + var playerSeeds = this.seedCounts.length>>1; + for (var i = 0;i<2;i++) { + var player = playerRects[i]; + var storehouse = storehouses[i]; + var r:Rectangle; + for (var j = 0;j(); + } + } + } + return board; + } +} +} +`; + +export const debuggableFile = `# VS Code Mock Debug + +This is a starter sample for developing VS Code debug adapters. + +**Mock Debug** simulates a debug adapter for Visual Studio Code. +It supports *step*, *continue*, *breakpoints*, *exceptions*, and +*variable access* but it is not connected to any real debugger. + +The sample is meant as an educational piece showing how to implement a debug +adapter for VS Code. It can be used as a starting point for developing a real adapter. + +More information about how to develop a new debug adapter can be found +[here](https://code.visualstudio.com/docs/extensions/example-debuggers). +Or discuss debug adapters on Gitter: +[![Gitter Chat](https://img.shields.io/badge/chat-online-brightgreen.svg)](https://gitter.im/Microsoft/vscode) + +## Using Mock Debug + +* Install the **Mock Debug** extension in VS Code. +* Create a new 'program' file 'readme.md' and enter several lines of arbitrary text. +* Switch to the debug viewlet and press the gear dropdown. +* Select the debug environment "Mock Debug". +* Press the green 'play' button to start debugging. + +You can now 'step through' the 'readme.md' file, set and hit breakpoints, and run into exceptions (if the word exception appears in a line). + +![Mock Debug](images/mock-debug.gif) + +## Build and Run + +[![build status](https://travis-ci.org/Microsoft/vscode-mock-debug.svg?branch=master)](https://travis-ci.org/Microsoft/vscode-mock-debug) +[![build status](https://ci.appveyor.com/api/projects/status/empmw5q1tk6h1fly/branch/master?svg=true)](https://ci.appveyor.com/project/weinand/vscode-mock-debug) + + +* Clone the project [https://github.com/Microsoft/vscode-mock-debug.git](https://github.com/Microsoft/vscode-mock-debug.git) +* Open the project folder in VS Code. +* Press 'F5' to build and launch Mock Debug in another VS Code window. In that window: +* Open a new workspace, create a new 'program' file 'readme.md' and enter several lines of arbitrary text. +* Switch to the debug viewlet and press the gear dropdown. +* Select the debug environment "Mock Debug". +* Press 'F5' to start debugging.`; + +export function getImageFile(): Uint8Array { + const data = atob(`/9j/4AAQSkZJRgABAQAASABIAAD/2wCEAA4ODg4ODhcODhchFxcXIS0hISEhLTktLS0tLTlFOTk5OTk5RUVFRUVFRUVSUlJSUlJgYGBgYGxsbGxsbGxsbGwBERISGxkbLxkZL3FMP0xxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcf/AABEIAFYAZAMBIgACEQEDEQH/xAB1AAACAwEBAQAAAAAAAAAAAAAABAMFBgIBBxAAAgIBAwMCBQQCAwAAAAAAAQIAAxEEBSESMUFRcRMiIzJhFIGRoQbBQlKxAQEBAQEAAAAAAAAAAAAAAAABAgADEQEBAQADAQEAAAAAAAAAAAAAARESITECQf/aAAwDAQACEQMRAD8A2LEZkLc/bKxbdYEHWoyfEze56zXpqRTTYUyPHiVrY2TVZyMzhFZMg8iYE6jcVXAusY98KMnj2lhRu+4aLoGuTNTYPV5APnyDNyPFp6EY3EsO3kxnVVLZVg8z2tw9YsXkGQpcbGIbxHQzep0vw8Jgc8n28CJJRY30lBwzf1iaa2ku/HmMV01VW/k/6hh0abTDTafpPcTytmckEewjeosAqJEj0yDo6yO/rFLzoGME5nIAXtGSM9uwnjLn8zFECw7QneITMWouR7gj9/Ep94061bjXa32WDGfzOGuCXKy9/wDc0FlFe5aX4OpHJHBHcSfT4w246bWJar6MsCwKnp9DOF0r6XRiu5snvg9hNK217vQeih0tXwzcED895R7voNfWoN9gOT2QH/2T3mHrda3Y+p9ppZuSV/qR0j6r+5ju2oun2ypOwCAASGikISzdySf5lxLsAdRPpIqw91xC/wDHvGbAAh88RnSVCjT9b8E/MYsguerTqWuYKo8k4ESTcttsPSmoQ+zCZPWPbvWqsvLE0IxCL4wPP7xEW7TXeKsvaGABOMdLef2ky7ejevX0tBWy5Qhh6jmS9IIxPm6XazbW69K56M/aeRibnSaqyytWtGCfE0+tazDhrHpCdixT5EJSWD1BPkcjsYxpN21FWEcdu0dG3hl8rIX0YqUgDqkSrq/0+6oyfOOZT7hqxqLMKMk8ARfS0fqGatAR04yCY+u3OpLt38e0rQl0tzsFrc8rxj0lqqDHMzujIXUMGPI4mjS1MTCvG8gRLddYE2811n5nHTJ9RaAsztzZ1AZhlX9fBi0VWgWzbSqahfpWfa/iSnatMuqOpVgVPIHGMzc6erS3aQVOoZSMFTK19i2pTwGA9Axx/E58b+K2M8lP6/Urp6BkA5Y+OPE112nrIFeOw8RMajQ7dWU0iAH8TyrVG0mw8EypMFuk7K9TS5RGJHiEYsuUtmEWO1KO2RGDRSVJzj1MiQhOQIx8QEYK5hGpUUJVc1lTgcDjEe1FPxqGQHBZSMiQqa8/Z38xgOoHB/aIfJNVZrdFqirsVbsfzLXT7+UQLYmcDHBlh/k+g+KP1dOCV+4efcTNbdtGq3CxQiMKyeX7CGqxqtDuK7lYK2BXnAz3JMuNZoPpDAyV5zHNt2bRbcA1S/Pjljyf7jerWxx0V4wQeZgynxrUXoUnIif629GJY595cptr1N9XJYjOfEi1G3LYMLgH1m04qxelrAtnj/qZYIvUPpMcHwYtTT8FzVaMN6+sslqVF6gcQ1sRivPccwjS314+bGYRBnqzws6FhUfL7CQ8gdI7+TDIHHgcSVGBYRznMXfUL2J5ngPUOYCpfM2tiq1tnUpVRnMe0DGtAKyQIw+mU4GJCKmrPy+I6V0lxYYIzxOCtdjZyVIMRqtPsYx8RT37+sdRhsFlHzcyC0J0kmcfqFX5cxC7VAk4OPUQtM+UVtYf7vH8iKP8SnKg5U9xHQwsGV7jxF9QnWACMEcgwlUjT4ZUE+YRRLGRehwciEpLRMAAT6SALlIQkF4kl7HEIQLwuQfac9RPeEJi5H3TruvvmEJo1QOcgGQuvVg+sITM8rDKeDHVItXkQhKgqM6esnJEIQlJf//Z`); + return Uint8Array.from([...data].map(x => x.charCodeAt(0))); +} diff --git a/extensions/vscode-web-playground/src/extension.ts b/extensions/vscode-web-playground/src/extension.ts index cc976d82c3..da80a0847c 100644 --- a/extensions/vscode-web-playground/src/extension.ts +++ b/extensions/vscode-web-playground/src/extension.ts @@ -13,373 +13,32 @@ // import * as vscode from 'vscode'; +import { MemFS } from './memfs'; declare const window: unknown; -const textEncoder = new TextEncoder(); -const SCHEME = 'memfs'; - export function activate(context: vscode.ExtensionContext) { if (typeof window !== 'undefined') { // do not run under node.js const memFs = enableFs(context); - enableProblems(context); - enableSearch(context, memFs); - enableTasks(); - enableDebug(context, memFs); - vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(`memfs:/sample-folder/large.ts`)); + if (vscode.workspace.workspaceFolders?.some(f => f.uri.scheme === MemFS.scheme)) { + memFs.seed(); + enableProblems(context); + enableTasks(); + enableDebug(context, memFs); + + vscode.commands.executeCommand('vscode.open', vscode.Uri.parse(`memfs:/sample-folder/large.ts`)); + } } } function enableFs(context: vscode.ExtensionContext): MemFS { const memFs = new MemFS(); - context.subscriptions.push(vscode.workspace.registerFileSystemProvider(SCHEME, memFs, { isCaseSensitive: true })); - - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/`)); - - // most common files types - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/large.ts`), textEncoder.encode(getLargeTSFile()), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.txt`), textEncoder.encode('foo'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.html`), textEncoder.encode('

Hello

'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.js`), textEncoder.encode('console.log("JavaScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.json`), textEncoder.encode('{ "json": true }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.ts`), textEncoder.encode('console.log("TypeScript")'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.css`), textEncoder.encode('* { color: green; }'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.md`), textEncoder.encode(getDebuggableFile()), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.xml`), textEncoder.encode(''), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.py`), textEncoder.encode('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.php`), textEncoder.encode('&1\'); ?>'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/file.yaml`), textEncoder.encode('- just: write something'), { create: true, overwrite: true }); - - // some more files & folders - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/folder/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/large/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/xyz/`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/xyz/abc`)); - memFs.createDirectory(vscode.Uri.parse(`memfs:/sample-folder/xyz/def`)); - - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/folder/empty.txt`), new Uint8Array(0), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/folder/empty.foo`), new Uint8Array(0), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/folder/file.ts`), textEncoder.encode('let a:number = true; console.log(a);'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/large/rnd.foo`), randomData(50000), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/xyz/UPPER.txt`), textEncoder.encode('UPPER'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/xyz/upper.txt`), textEncoder.encode('upper'), { create: true, overwrite: true }); - memFs.writeFile(vscode.Uri.parse(`memfs:/sample-folder/xyz/def/foo.md`), textEncoder.encode('*MemFS*'), { create: true, overwrite: true }); - - function getLargeTSFile(): string { - return `/// -/// - -module Mankala { - export var storeHouses = [6,13]; - export var svgNS = 'http://www.w3.org/2000/svg'; - - function createSVGRect(r:Rectangle) { - var rect = document.createElementNS(svgNS,'rect'); - rect.setAttribute('x', r.x.toString()); - rect.setAttribute('y', r.y.toString()); - rect.setAttribute('width', r.width.toString()); - rect.setAttribute('height', r.height.toString()); - return rect; - } - - function createSVGEllipse(r:Rectangle) { - var ell = document.createElementNS(svgNS,'ellipse'); - ell.setAttribute('rx',(r.width/2).toString()); - ell.setAttribute('ry',(r.height/2).toString()); - ell.setAttribute('cx',(r.x+r.width/2).toString()); - ell.setAttribute('cy',(r.y+r.height/2).toString()); - return ell; - } - - function createSVGEllipsePolar(angle:number,radius:number,tx:number,ty:number,cxo:number,cyo:number) { - var ell = document.createElementNS(svgNS,'ellipse'); - ell.setAttribute('rx',radius.toString()); - ell.setAttribute('ry',(radius/3).toString()); - ell.setAttribute('cx',cxo.toString()); - ell.setAttribute('cy',cyo.toString()); - var dangle = angle*(180/Math.PI); - ell.setAttribute('transform','rotate('+dangle+','+cxo+','+cyo+') translate('+tx+','+ty+')'); - return ell; - } - - function createSVGInscribedCircle(sq:Square) { - var circle = document.createElementNS(svgNS,'circle'); - circle.setAttribute('r',(sq.length/2).toString()); - circle.setAttribute('cx',(sq.x+(sq.length/2)).toString()); - circle.setAttribute('cy',(sq.y+(sq.length/2)).toString()); - return circle; - } - - export class Position { - - seedCounts:number[]; - startMove:number; - turn:number; - - constructor(seedCounts:number[],startMove:number,turn:number) { - this.seedCounts = seedCounts; - this.startMove = startMove; - this.turn = turn; - } - - score() { - var baseScore = this.seedCounts[storeHouses[1-this.turn]]-this.seedCounts[storeHouses[this.turn]]; - var otherSpaces = homeSpaces[this.turn]; - var sum = 0; - for (var k = 0,len = otherSpaces.length;k0) { - features.clear(); - var len = this.seedCounts.length; - for (var i = 0;i0) { - if (nextSpace==storeHouses[this.turn]) { - features.seedStoredCount++; - } - if ((nextSpace!=storeHouses[1-this.turn])) { - nextSeedCounts[nextSpace]++; - seedCount--; - } - if (seedCount==0) { - if (nextSpace==storeHouses[this.turn]) { - features.turnContinues = true; - } - else { - if ((nextSeedCounts[nextSpace]==1)&& - (nextSpace>=firstHomeSpace[this.turn])&& - (nextSpace<=lastHomeSpace[this.turn])) { - // capture - var capturedSpace = capturedSpaces[nextSpace]; - if (capturedSpace>=0) { - features.spaceCaptured = capturedSpace; - features.capturedCount = nextSeedCounts[capturedSpace]; - nextSeedCounts[capturedSpace] = 0; - nextSeedCounts[storeHouses[this.turn]] += features.capturedCount; - features.seedStoredCount += nextSeedCounts[capturedSpace]; - } - } - } - } - nextSpace = (nextSpace+1)%14; - } - return true; - } - else { - return false; - } - } - } - - export class SeedCoords { - tx:number; - ty:number; - angle:number; - - constructor(tx:number, ty:number, angle:number) { - this.tx = tx; - this.ty = ty; - this.angle = angle; - } - } - - export class DisplayPosition extends Position { - - config:SeedCoords[][]; - - constructor(seedCounts:number[],startMove:number,turn:number) { - super(seedCounts,startMove,turn); - - this.config = []; - - for (var i = 0;i(); - } - } - - - seedCircleRect(rect:Rectangle,seedCount:number,board:Element,seed:number) { - var coords = this.config[seed]; - var sq = rect.inner(0.95).square(); - var cxo = (sq.width/2)+sq.x; - var cyo = (sq.height/2)+sq.y; - var seedNumbers = [5,7,9,11]; - var ringIndex = 0; - var ringRem = seedNumbers[ringIndex]; - var angleDelta = (2*Math.PI)/ringRem; - var angle = angleDelta; - var seedLength = sq.width/(seedNumbers.length<<1); - var crMax = sq.width/2-(seedLength/2); - var pit = createSVGInscribedCircle(sq); - if (seed<7) { - pit.setAttribute('fill','brown'); - } - else { - pit.setAttribute('fill','saddlebrown'); - } - board.appendChild(pit); - var seedsSeen = 0; - while (seedCount > 0) { - if (ringRem == 0) { - ringIndex++; - ringRem = seedNumbers[ringIndex]; - angleDelta = (2*Math.PI)/ringRem; - angle = angleDelta; - } - var tx:number; - var ty:number; - var tangle = angle; - if (coords.length>seedsSeen) { - tx = coords[seedsSeen].tx; - ty = coords[seedsSeen].ty; - tangle = coords[seedsSeen].angle; - } - else { - tx = (Math.random()*crMax)-(crMax/3); - ty = (Math.random()*crMax)-(crMax/3); - coords[seedsSeen] = new SeedCoords(tx,ty,angle); - } - var ell = createSVGEllipsePolar(tangle,seedLength,tx,ty,cxo,cyo); - board.appendChild(ell); - angle += angleDelta; - ringRem--; - seedCount--; - seedsSeen++; - } - } - - toCircleSVG() { - var seedDivisions = 14; - var board = document.createElementNS(svgNS,'svg'); - var boardRect = new Rectangle(0,0,1800,800); - board.setAttribute('width','1800'); - board.setAttribute('height','800'); - var whole = createSVGRect(boardRect); - whole.setAttribute('fill','tan'); - board.appendChild(whole); - var labPlayLab = boardRect.proportionalSplitVert(20,760,20); - var playSurface = labPlayLab[1]; - var storeMainStore = playSurface.proportionalSplitHoriz(8,48,8); - var mainPair = storeMainStore[1].subDivideVert(2); - var playerRects = [mainPair[0].subDivideHoriz(6), mainPair[1].subDivideHoriz(6)]; - // reverse top layer because storehouse on left - for (var k = 0;k<3;k++) { - var temp = playerRects[0][k]; - playerRects[0][k] = playerRects[0][5-k]; - playerRects[0][5-k] = temp; - } - var storehouses = [storeMainStore[0],storeMainStore[2]]; - var playerSeeds = this.seedCounts.length>>1; - for (var i = 0;i<2;i++) { - var player = playerRects[i]; - var storehouse = storehouses[i]; - var r:Rectangle; - for (var j = 0;j(); - } - } - } - return board; - } - } -} -`; - } - - function getDebuggableFile(): string { - return `# VS Code Mock Debug - -This is a starter sample for developing VS Code debug adapters. - -**Mock Debug** simulates a debug adapter for Visual Studio Code. -It supports *step*, *continue*, *breakpoints*, *exceptions*, and -*variable access* but it is not connected to any real debugger. - -The sample is meant as an educational piece showing how to implement a debug -adapter for VS Code. It can be used as a starting point for developing a real adapter. - -More information about how to develop a new debug adapter can be found -[here](https://code.visualstudio.com/docs/extensions/example-debuggers). -Or discuss debug adapters on Gitter: -[![Gitter Chat](https://img.shields.io/badge/chat-online-brightgreen.svg)](https://gitter.im/Microsoft/vscode) - -## Using Mock Debug - -* Install the **Mock Debug** extension in VS Code. -* Create a new 'program' file 'readme.md' and enter several lines of arbitrary text. -* Switch to the debug viewlet and press the gear dropdown. -* Select the debug environment "Mock Debug". -* Press the green 'play' button to start debugging. - -You can now 'step through' the 'readme.md' file, set and hit breakpoints, and run into exceptions (if the word exception appears in a line). - -![Mock Debug](images/mock-debug.gif) - -## Build and Run - -[![build status](https://travis-ci.org/Microsoft/vscode-mock-debug.svg?branch=master)](https://travis-ci.org/Microsoft/vscode-mock-debug) -[![build status](https://ci.appveyor.com/api/projects/status/empmw5q1tk6h1fly/branch/master?svg=true)](https://ci.appveyor.com/project/weinand/vscode-mock-debug) - - -* Clone the project [https://github.com/Microsoft/vscode-mock-debug.git](https://github.com/Microsoft/vscode-mock-debug.git) -* Open the project folder in VS Code. -* Press 'F5' to build and launch Mock Debug in another VS Code window. In that window: - * Open a new workspace, create a new 'program' file 'readme.md' and enter several lines of arbitrary text. - * Switch to the debug viewlet and press the gear dropdown. - * Select the debug environment "Mock Debug". - * Press 'F5' to start debugging.`; - } + context.subscriptions.push(memFs); return memFs; } -function randomData(lineCnt: number, lineLen = 155): Uint8Array { - let lines: string[] = []; - for (let i = 0; i < lineCnt; i++) { - let line = ''; - while (line.length < lineLen) { - line += Math.random().toString(2 + (i % 34)).substr(2); - } - lines.push(line.substr(0, lineLen)); - } - return textEncoder.encode(lines.join('\n')); -} - function enableProblems(context: vscode.ExtensionContext): void { const collection = vscode.languages.createDiagnosticCollection('test'); if (vscode.window.activeTextEditor) { @@ -415,11 +74,6 @@ function updateDiagnostics(document: vscode.TextDocument, collection: vscode.Dia } } -function enableSearch(context: vscode.ExtensionContext, memFs: MemFS): void { - context.subscriptions.push(vscode.workspace.registerFileSearchProvider(SCHEME, memFs)); - context.subscriptions.push(vscode.workspace.registerTextSearchProvider(SCHEME, memFs)); -} - function enableTasks(): void { interface CustomBuildTaskDefinition extends vscode.TaskDefinition { @@ -554,347 +208,6 @@ function enableTasks(): void { vscode.tasks.registerTaskProvider(CustomBuildTaskProvider.CustomBuildScriptType, new CustomBuildTaskProvider(vscode.workspace.rootPath!)); } -export class File implements vscode.FileStat { - - type: vscode.FileType; - ctime: number; - mtime: number; - size: number; - - name: string; - data?: Uint8Array; - - constructor(public uri: vscode.Uri, name: string) { - this.type = vscode.FileType.File; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - } -} - -export class Directory implements vscode.FileStat { - - type: vscode.FileType; - ctime: number; - mtime: number; - size: number; - - name: string; - entries: Map; - - constructor(public uri: vscode.Uri, name: string) { - this.type = vscode.FileType.Directory; - this.ctime = Date.now(); - this.mtime = Date.now(); - this.size = 0; - this.name = name; - this.entries = new Map(); - } -} - -export type Entry = File | Directory; - -export class MemFS implements vscode.FileSystemProvider, vscode.FileSearchProvider, vscode.TextSearchProvider { - - root = new Directory(vscode.Uri.parse('memfs:/'), ''); - - // --- manage file metadata - - stat(uri: vscode.Uri): vscode.FileStat { - return this._lookup(uri, false); - } - - readDirectory(uri: vscode.Uri): [string, vscode.FileType][] { - const entry = this._lookupAsDirectory(uri, false); - let result: [string, vscode.FileType][] = []; - for (const [name, child] of entry.entries) { - result.push([name, child.type]); - } - return result; - } - - // --- manage file contents - - readFile(uri: vscode.Uri): Uint8Array { - const data = this._lookupAsFile(uri, false).data; - if (data) { - return data; - } - throw vscode.FileSystemError.FileNotFound(); - } - - writeFile(uri: vscode.Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { - let basename = this._basename(uri.path); - let parent = this._lookupParentDirectory(uri); - let entry = parent.entries.get(basename); - if (entry instanceof Directory) { - throw vscode.FileSystemError.FileIsADirectory(uri); - } - if (!entry && !options.create) { - throw vscode.FileSystemError.FileNotFound(uri); - } - if (entry && options.create && !options.overwrite) { - throw vscode.FileSystemError.FileExists(uri); - } - if (!entry) { - entry = new File(uri, basename); - parent.entries.set(basename, entry); - this._fireSoon({ type: vscode.FileChangeType.Created, uri }); - } - entry.mtime = Date.now(); - entry.size = content.byteLength; - entry.data = content; - - this._fireSoon({ type: vscode.FileChangeType.Changed, uri }); - } - - // --- manage files/folders - - rename(oldUri: vscode.Uri, newUri: vscode.Uri, options: { overwrite: boolean }): void { - if (!options.overwrite && this._lookup(newUri, true)) { - throw vscode.FileSystemError.FileExists(newUri); - } - - let entry = this._lookup(oldUri, false); - let oldParent = this._lookupParentDirectory(oldUri); - - let newParent = this._lookupParentDirectory(newUri); - let newName = this._basename(newUri.path); - - oldParent.entries.delete(entry.name); - entry.name = newName; - newParent.entries.set(newName, entry); - - this._fireSoon( - { type: vscode.FileChangeType.Deleted, uri: oldUri }, - { type: vscode.FileChangeType.Created, uri: newUri } - ); - } - - delete(uri: vscode.Uri): void { - let dirname = uri.with({ path: this._dirname(uri.path) }); - let basename = this._basename(uri.path); - let parent = this._lookupAsDirectory(dirname, false); - if (!parent.entries.has(basename)) { - throw vscode.FileSystemError.FileNotFound(uri); - } - parent.entries.delete(basename); - parent.mtime = Date.now(); - parent.size -= 1; - this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { uri, type: vscode.FileChangeType.Deleted }); - } - - createDirectory(uri: vscode.Uri): void { - let basename = this._basename(uri.path); - let dirname = uri.with({ path: this._dirname(uri.path) }); - let parent = this._lookupAsDirectory(dirname, false); - - let entry = new Directory(uri, basename); - parent.entries.set(entry.name, entry); - parent.mtime = Date.now(); - parent.size += 1; - this._fireSoon({ type: vscode.FileChangeType.Changed, uri: dirname }, { type: vscode.FileChangeType.Created, uri }); - } - - // --- lookup - - private _lookup(uri: vscode.Uri, silent: false): Entry; - private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined; - private _lookup(uri: vscode.Uri, silent: boolean): Entry | undefined { - let parts = uri.path.split('/'); - let entry: Entry = this.root; - for (const part of parts) { - if (!part) { - continue; - } - let child: Entry | undefined; - if (entry instanceof Directory) { - child = entry.entries.get(part); - } - if (!child) { - if (!silent) { - throw vscode.FileSystemError.FileNotFound(uri); - } else { - return undefined; - } - } - entry = child; - } - return entry; - } - - private _lookupAsDirectory(uri: vscode.Uri, silent: boolean): Directory { - let entry = this._lookup(uri, silent); - if (entry instanceof Directory) { - return entry; - } - throw vscode.FileSystemError.FileNotADirectory(uri); - } - - private _lookupAsFile(uri: vscode.Uri, silent: boolean): File { - let entry = this._lookup(uri, silent); - if (entry instanceof File) { - return entry; - } - throw vscode.FileSystemError.FileIsADirectory(uri); - } - - private _lookupParentDirectory(uri: vscode.Uri): Directory { - const dirname = uri.with({ path: this._dirname(uri.path) }); - return this._lookupAsDirectory(dirname, false); - } - - // --- manage file events - - private _emitter = new vscode.EventEmitter(); - private _bufferedEvents: vscode.FileChangeEvent[] = []; - private _fireSoonHandle?: NodeJS.Timer; - - readonly onDidChangeFile: vscode.Event = this._emitter.event; - - watch(_resource: vscode.Uri): vscode.Disposable { - // ignore, fires for all changes... - return new vscode.Disposable(() => { }); - } - - private _fireSoon(...events: vscode.FileChangeEvent[]): void { - this._bufferedEvents.push(...events); - - if (this._fireSoonHandle) { - clearTimeout(this._fireSoonHandle); - } - - this._fireSoonHandle = setTimeout(() => { - this._emitter.fire(this._bufferedEvents); - this._bufferedEvents.length = 0; - }, 5); - } - - // --- path utils - - private _basename(path: string): string { - path = this._rtrim(path, '/'); - if (!path) { - return ''; - } - - return path.substr(path.lastIndexOf('/') + 1); - } - - private _dirname(path: string): string { - path = this._rtrim(path, '/'); - if (!path) { - return '/'; - } - - return path.substr(0, path.lastIndexOf('/')); - } - - private _rtrim(haystack: string, needle: string): string { - if (!haystack || !needle) { - return haystack; - } - - const needleLen = needle.length, - haystackLen = haystack.length; - - if (needleLen === 0 || haystackLen === 0) { - return haystack; - } - - let offset = haystackLen, - idx = -1; - - while (true) { - idx = haystack.lastIndexOf(needle, offset - 1); - if (idx === -1 || idx + needleLen !== offset) { - break; - } - if (idx === 0) { - return ''; - } - offset = idx; - } - - return haystack.substring(0, offset); - } - - private _getFiles(): Set { - const files = new Set(); - - this._doGetFiles(this.root, files); - - return files; - } - - private _doGetFiles(dir: Directory, files: Set): void { - dir.entries.forEach(entry => { - if (entry instanceof File) { - files.add(entry); - } else { - this._doGetFiles(entry, files); - } - }); - } - - private _convertSimple2RegExpPattern(pattern: string): string { - return pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*'); - } - - // --- search provider - - provideFileSearchResults(query: vscode.FileSearchQuery, _options: vscode.FileSearchOptions, _token: vscode.CancellationToken): vscode.ProviderResult { - return this._findFiles(query.pattern); - } - - private _findFiles(query: string | undefined): vscode.Uri[] { - const files = this._getFiles(); - const result: vscode.Uri[] = []; - - const pattern = query ? new RegExp(this._convertSimple2RegExpPattern(query)) : null; - - for (const file of files) { - if (!pattern || pattern.exec(file.name)) { - result.push(file.uri); - } - } - - return result; - } - - private _textDecoder = new TextDecoder(); - - provideTextSearchResults(query: vscode.TextSearchQuery, options: vscode.TextSearchOptions, progress: vscode.Progress, _token: vscode.CancellationToken) { - const result: vscode.TextSearchComplete = { limitHit: false }; - - const files = this._findFiles(options.includes[0]); - if (files) { - for (const file of files) { - const content = this._textDecoder.decode(this.readFile(file)); - - const lines = content.split('\n'); - for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - const index = line.indexOf(query.pattern); - if (index !== -1) { - progress.report({ - uri: file, - ranges: new vscode.Range(new vscode.Position(i, index), new vscode.Position(i, index + query.pattern.length)), - preview: { - text: line, - matches: new vscode.Range(new vscode.Position(0, index), new vscode.Position(0, index + query.pattern.length)) - } - }); - } - } - } - } - - return result; - } -} - //--------------------------------------------------------------------------- // DEBUG //--------------------------------------------------------------------------- diff --git a/extensions/vscode-web-playground/src/memfs.ts b/extensions/vscode-web-playground/src/memfs.ts new file mode 100644 index 0000000000..f3a407443d --- /dev/null +++ b/extensions/vscode-web-playground/src/memfs.ts @@ -0,0 +1,436 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { + CancellationToken, + Disposable, + Event, + EventEmitter, + FileChangeEvent, + FileChangeType, + FileSearchOptions, + FileSearchProvider, + FileSearchQuery, + FileStat, + FileSystemError, + FileSystemProvider, + FileType, + Position, + Progress, + ProviderResult, + Range, + TextSearchComplete, + TextSearchOptions, + TextSearchQuery, + TextSearchProvider, + TextSearchResult, + Uri, + workspace, +} from 'vscode'; +import { largeTSFile, getImageFile, debuggableFile } from './exampleFiles'; + +export class File implements FileStat { + + type: FileType; + ctime: number; + mtime: number; + size: number; + + name: string; + data?: Uint8Array; + + constructor(public uri: Uri, name: string) { + this.type = FileType.File; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + } +} + +export class Directory implements FileStat { + + type: FileType; + ctime: number; + mtime: number; + size: number; + + name: string; + entries: Map; + + constructor(public uri: Uri, name: string) { + this.type = FileType.Directory; + this.ctime = Date.now(); + this.mtime = Date.now(); + this.size = 0; + this.name = name; + this.entries = new Map(); + } +} + +export type Entry = File | Directory; + +const textEncoder = new TextEncoder(); + +export class MemFS implements FileSystemProvider, FileSearchProvider, TextSearchProvider, Disposable { + static scheme = 'memfs'; + + private readonly disposable: Disposable; + + constructor() { + this.disposable = Disposable.from( + workspace.registerFileSystemProvider(MemFS.scheme, this, { isCaseSensitive: true }), + workspace.registerFileSearchProvider(MemFS.scheme, this), + workspace.registerTextSearchProvider(MemFS.scheme, this) + ); + } + + dispose() { + this.disposable?.dispose(); + } + + seed() { + this.createDirectory(Uri.parse(`memfs:/sample-folder/`)); + + // most common files types + this.writeFile(Uri.parse(`memfs:/sample-folder/large.ts`), textEncoder.encode(largeTSFile), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.txt`), textEncoder.encode('foo'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.html`), textEncoder.encode('

Hello

'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.js`), textEncoder.encode('console.log("JavaScript")'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.json`), textEncoder.encode('{ "json": true }'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.ts`), textEncoder.encode('console.log("TypeScript")'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.css`), textEncoder.encode('* { color: green; }'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.md`), textEncoder.encode(debuggableFile), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.xml`), textEncoder.encode(''), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.py`), textEncoder.encode('import base64, sys; base64.decode(open(sys.argv[1], "rb"), open(sys.argv[2], "wb"))'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.php`), textEncoder.encode('&1\'); ?>'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.yaml`), textEncoder.encode('- just: write something'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/file.jpg`), getImageFile(), { create: true, overwrite: true }); + + // some more files & folders + this.createDirectory(Uri.parse(`memfs:/sample-folder/folder/`)); + this.createDirectory(Uri.parse(`memfs:/sample-folder/large/`)); + this.createDirectory(Uri.parse(`memfs:/sample-folder/xyz/`)); + this.createDirectory(Uri.parse(`memfs:/sample-folder/xyz/abc`)); + this.createDirectory(Uri.parse(`memfs:/sample-folder/xyz/def`)); + + this.writeFile(Uri.parse(`memfs:/sample-folder/folder/empty.txt`), new Uint8Array(0), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/folder/empty.foo`), new Uint8Array(0), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/folder/file.ts`), textEncoder.encode('let a:number = true; console.log(a);'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/large/rnd.foo`), randomData(50000), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/xyz/UPPER.txt`), textEncoder.encode('UPPER'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/xyz/upper.txt`), textEncoder.encode('upper'), { create: true, overwrite: true }); + this.writeFile(Uri.parse(`memfs:/sample-folder/xyz/def/foo.md`), textEncoder.encode('*MemFS*'), { create: true, overwrite: true }); + } + + root = new Directory(Uri.parse('memfs:/'), ''); + + // --- manage file metadata + + stat(uri: Uri): FileStat { + return this._lookup(uri, false); + } + + readDirectory(uri: Uri): [string, FileType][] { + const entry = this._lookupAsDirectory(uri, false); + let result: [string, FileType][] = []; + for (const [name, child] of entry.entries) { + result.push([name, child.type]); + } + return result; + } + + // --- manage file contents + + readFile(uri: Uri): Uint8Array { + const data = this._lookupAsFile(uri, false).data; + if (data) { + return data; + } + throw FileSystemError.FileNotFound(); + } + + writeFile(uri: Uri, content: Uint8Array, options: { create: boolean, overwrite: boolean }): void { + let basename = this._basename(uri.path); + let parent = this._lookupParentDirectory(uri); + let entry = parent.entries.get(basename); + if (entry instanceof Directory) { + throw FileSystemError.FileIsADirectory(uri); + } + if (!entry && !options.create) { + throw FileSystemError.FileNotFound(uri); + } + if (entry && options.create && !options.overwrite) { + throw FileSystemError.FileExists(uri); + } + if (!entry) { + entry = new File(uri, basename); + parent.entries.set(basename, entry); + this._fireSoon({ type: FileChangeType.Created, uri }); + } + entry.mtime = Date.now(); + entry.size = content.byteLength; + entry.data = content; + + this._fireSoon({ type: FileChangeType.Changed, uri }); + } + + // --- manage files/folders + + rename(oldUri: Uri, newUri: Uri, options: { overwrite: boolean }): void { + if (!options.overwrite && this._lookup(newUri, true)) { + throw FileSystemError.FileExists(newUri); + } + + let entry = this._lookup(oldUri, false); + let oldParent = this._lookupParentDirectory(oldUri); + + let newParent = this._lookupParentDirectory(newUri); + let newName = this._basename(newUri.path); + + oldParent.entries.delete(entry.name); + entry.name = newName; + newParent.entries.set(newName, entry); + + this._fireSoon( + { type: FileChangeType.Deleted, uri: oldUri }, + { type: FileChangeType.Created, uri: newUri } + ); + } + + delete(uri: Uri): void { + let dirname = uri.with({ path: this._dirname(uri.path) }); + let basename = this._basename(uri.path); + let parent = this._lookupAsDirectory(dirname, false); + if (!parent.entries.has(basename)) { + throw FileSystemError.FileNotFound(uri); + } + parent.entries.delete(basename); + parent.mtime = Date.now(); + parent.size -= 1; + this._fireSoon({ type: FileChangeType.Changed, uri: dirname }, { uri, type: FileChangeType.Deleted }); + } + + createDirectory(uri: Uri): void { + let basename = this._basename(uri.path); + let dirname = uri.with({ path: this._dirname(uri.path) }); + let parent = this._lookupAsDirectory(dirname, false); + + let entry = new Directory(uri, basename); + parent.entries.set(entry.name, entry); + parent.mtime = Date.now(); + parent.size += 1; + this._fireSoon({ type: FileChangeType.Changed, uri: dirname }, { type: FileChangeType.Created, uri }); + } + + // --- lookup + + private _lookup(uri: Uri, silent: false): Entry; + private _lookup(uri: Uri, silent: boolean): Entry | undefined; + private _lookup(uri: Uri, silent: boolean): Entry | undefined { + let parts = uri.path.split('/'); + let entry: Entry = this.root; + for (const part of parts) { + if (!part) { + continue; + } + let child: Entry | undefined; + if (entry instanceof Directory) { + child = entry.entries.get(part); + } + if (!child) { + if (!silent) { + throw FileSystemError.FileNotFound(uri); + } else { + return undefined; + } + } + entry = child; + } + return entry; + } + + private _lookupAsDirectory(uri: Uri, silent: boolean): Directory { + let entry = this._lookup(uri, silent); + if (entry instanceof Directory) { + return entry; + } + throw FileSystemError.FileNotADirectory(uri); + } + + private _lookupAsFile(uri: Uri, silent: boolean): File { + let entry = this._lookup(uri, silent); + if (entry instanceof File) { + return entry; + } + throw FileSystemError.FileIsADirectory(uri); + } + + private _lookupParentDirectory(uri: Uri): Directory { + const dirname = uri.with({ path: this._dirname(uri.path) }); + return this._lookupAsDirectory(dirname, false); + } + + // --- manage file events + + private _emitter = new EventEmitter(); + private _bufferedEvents: FileChangeEvent[] = []; + private _fireSoonHandle?: any; + + readonly onDidChangeFile: Event = this._emitter.event; + + watch(_resource: Uri): Disposable { + // ignore, fires for all changes... + return new Disposable(() => { }); + } + + private _fireSoon(...events: FileChangeEvent[]): void { + this._bufferedEvents.push(...events); + + if (this._fireSoonHandle) { + clearTimeout(this._fireSoonHandle); + } + + this._fireSoonHandle = setTimeout(() => { + this._emitter.fire(this._bufferedEvents); + this._bufferedEvents.length = 0; + }, 5); + } + + // --- path utils + + private _basename(path: string): string { + path = this._rtrim(path, '/'); + if (!path) { + return ''; + } + + return path.substr(path.lastIndexOf('/') + 1); + } + + private _dirname(path: string): string { + path = this._rtrim(path, '/'); + if (!path) { + return '/'; + } + + return path.substr(0, path.lastIndexOf('/')); + } + + private _rtrim(haystack: string, needle: string): string { + if (!haystack || !needle) { + return haystack; + } + + const needleLen = needle.length, + haystackLen = haystack.length; + + if (needleLen === 0 || haystackLen === 0) { + return haystack; + } + + let offset = haystackLen, + idx = -1; + + while (true) { + idx = haystack.lastIndexOf(needle, offset - 1); + if (idx === -1 || idx + needleLen !== offset) { + break; + } + if (idx === 0) { + return ''; + } + offset = idx; + } + + return haystack.substring(0, offset); + } + + private _getFiles(): Set { + const files = new Set(); + + this._doGetFiles(this.root, files); + + return files; + } + + private _doGetFiles(dir: Directory, files: Set): void { + dir.entries.forEach(entry => { + if (entry instanceof File) { + files.add(entry); + } else { + this._doGetFiles(entry, files); + } + }); + } + + private _convertSimple2RegExpPattern(pattern: string): string { + return pattern.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, '\\$&').replace(/[\*]/g, '.*'); + } + + // --- search provider + + provideFileSearchResults(query: FileSearchQuery, _options: FileSearchOptions, _token: CancellationToken): ProviderResult { + return this._findFiles(query.pattern); + } + + private _findFiles(query: string | undefined): Uri[] { + const files = this._getFiles(); + const result: Uri[] = []; + + const pattern = query ? new RegExp(this._convertSimple2RegExpPattern(query)) : null; + + for (const file of files) { + if (!pattern || pattern.exec(file.name)) { + result.push(file.uri); + } + } + + return result; + } + + private _textDecoder = new TextDecoder(); + + provideTextSearchResults(query: TextSearchQuery, options: TextSearchOptions, progress: Progress, _token: CancellationToken) { + const result: TextSearchComplete = { limitHit: false }; + + const files = this._findFiles(options.includes[0]); + if (files) { + for (const file of files) { + const content = this._textDecoder.decode(this.readFile(file)); + + const lines = content.split('\n'); + for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + const index = line.indexOf(query.pattern); + if (index !== -1) { + progress.report({ + uri: file, + ranges: new Range(new Position(i, index), new Position(i, index + query.pattern.length)), + preview: { + text: line, + matches: new Range(new Position(0, index), new Position(0, index + query.pattern.length)) + } + }); + } + } + } + } + + return result; + } +} + +function randomData(lineCnt: number, lineLen = 155): Uint8Array { + let lines: string[] = []; + for (let i = 0; i < lineCnt; i++) { + let line = ''; + while (line.length < lineLen) { + line += Math.random().toString(2 + (i % 34)).substr(2); + } + lines.push(line.substr(0, lineLen)); + } + return textEncoder.encode(lines.join('\n')); +} diff --git a/extensions/vscode-web-playground/tsconfig.json b/extensions/vscode-web-playground/tsconfig.json index 296ddb38fc..633da7fad7 100644 --- a/extensions/vscode-web-playground/tsconfig.json +++ b/extensions/vscode-web-playground/tsconfig.json @@ -1,9 +1,14 @@ { "extends": "../shared.tsconfig.json", "compilerOptions": { - "outDir": "./out" + "outDir": "./out", + "lib": [ + "dom", + "dom.iterable", + "es2018" + ] }, "include": [ "src/**/*" ] -} \ No newline at end of file +} diff --git a/extensions/vscode-web-playground/yarn.lock b/extensions/vscode-web-playground/yarn.lock index e595aafe8c..b29fc8fc61 100644 --- a/extensions/vscode-web-playground/yarn.lock +++ b/extensions/vscode-web-playground/yarn.lock @@ -7,11 +7,6 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.43.tgz#03c54589c43ad048cbcbfd63999b55d0424eec27" integrity sha512-xNlAmH+lRJdUMXClMTI9Y0pRqIojdxfm7DHsIxoB2iTzu3fnPmSMEN8SsSx0cdwV36d02PWCWaDUoZPDSln+xw== -"@types/node@^12.11.7": - version "12.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" - integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== - ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -35,11 +30,11 @@ debug@^2.2.0: ms "2.0.0" debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: - ms "2.0.0" + ms "^2.1.1" is-buffer@~1.1.1: version "1.1.6" @@ -47,9 +42,9 @@ is-buffer@~1.1.1: integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== lodash@^4.16.4: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== md5@^2.1.0: version "2.2.1" @@ -60,22 +55,22 @@ md5@^2.1.0: crypt "~0.0.1" is-buffer "~1.1.1" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== mkdirp@~0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" mocha-junit-reporter@^1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.17.0.tgz#2e5149ed40fc5d2e3ca71e42db5ab1fec9c6d85c" - integrity sha1-LlFJ7UD8XS48px5C21qx/snG2Fw= + version "1.23.3" + resolved "https://registry.yarnpkg.com/mocha-junit-reporter/-/mocha-junit-reporter-1.23.3.tgz#941e219dd759ed732f8641e165918aa8b167c981" + integrity sha512-ed8LqbRj1RxZfjt/oC9t12sfrWsjZ3gNnbhV1nuj9R/Jb5/P3Xb4duv2eCfCDMYH+fEu0mqca7m4wsiVjsxsvA== dependencies: debug "^2.2.0" md5 "^2.1.0" @@ -96,6 +91,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" diff --git a/extensions/yarn.lock b/extensions/yarn.lock index 31924f9e86..e0f5c7c4dd 100644 --- a/extensions/yarn.lock +++ b/extensions/yarn.lock @@ -2,7 +2,86 @@ # yarn lockfile v1 -typescript@3.9.4: - version "3.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.4.tgz#5aa0a54904b51b96dfd67870ce2db70251802f10" - integrity sha512-9OL+r0KVHqsYVH7K18IBR9hhC82YwLNlpSZfQDupGcfg8goB9p/s/9Okcy+ztnTeHR2U68xq21/igW9xpoGTgA== +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +glob@^7.1.3: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "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= + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +typescript@3.9.5: + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= diff --git a/package.json b/package.json index 24d357b7df..70c62b41f2 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "valid-layers-check": "node build/lib/layersChecker.js", "strict-function-types-watch": "tsc --watch -p src/tsconfig.json --noEmit --strictFunctionTypes", "update-distro": "node build/npm/update-distro.js", - "web": "node scripts/code-web.js", + "web": "node resources/serverless/code-web.js", "eslint": "eslint -c .eslintrc.json --rulesdir ./build/lib/eslint --ext .ts --ext .js ./src/vs ./extensions", "sqllint": "eslint --no-eslintrc -c .eslintrc.sql.ts.json --rulesdir ./build/lib/eslint --ext .ts ./src/sql" }, @@ -56,7 +56,7 @@ "html-query-plan": "git://github.com/anthonydresser/html-query-plan.git#2.6", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", - "iconv-lite": "0.5.0", + "iconv-lite": "0.6.0", "jquery": "3.5.0", "jschardet": "2.1.1", "keytar": "^5.5.0", @@ -114,8 +114,8 @@ "@types/winreg": "^1.2.30", "@types/yauzl": "^2.9.1", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^2.21.0", - "@typescript-eslint/parser": "^2.21.0", + "@typescript-eslint/eslint-plugin": "3.2.0", + "@typescript-eslint/parser": "^3.3.0", "ansi-colors": "^3.2.3", "asar": "^0.14.0", "chromium-pickle-js": "^0.2.0", @@ -125,7 +125,7 @@ "css-loader": "^3.2.0", "debounce": "^1.0.0", "deemon": "^1.4.0", - "electron": "7.3.0", + "electron": "7.3.1", "eslint": "6.8.0", "eslint-plugin-jsdoc": "^19.1.0", "event-stream": "3.3.4", @@ -188,7 +188,7 @@ "vinyl": "^2.0.0", "vinyl-fs": "^3.0.0", "vsce": "1.48.0", - "vscode-debugprotocol": "^1.40.0", + "vscode-debugprotocol": "1.41.0", "vscode-nls-dev": "^3.3.1", "webpack": "^4.16.5", "webpack-cli": "^3.3.8", diff --git a/remote/package.json b/remote/package.json index 23ecbfdc19..bca65dd5a8 100644 --- a/remote/package.json +++ b/remote/package.json @@ -20,7 +20,7 @@ "html-query-plan": "git://github.com/anthonydresser/html-query-plan.git#2.6", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", - "iconv-lite": "0.5.0", + "iconv-lite": "0.6.0", "jquery": "3.5.0", "jschardet": "2.1.1", "minimist": "^1.2.5", diff --git a/remote/yarn.lock b/remote/yarn.lock index 477a8fc362..d2b5e39fe1 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -356,10 +356,10 @@ https-proxy-agent@^2.2.3: agent-base "^4.3.0" debug "^3.1.0" -iconv-lite@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" - integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== +iconv-lite@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.0.tgz#66a93b80df0bd05d2a43a7426296b7f91073f125" + integrity sha512-43ZpGYZ9QtuutX5l6WC1DSO8ane9N+Ct5qPLF2OV7vM9abM69gnAbVkh66ibaZd3aOGkoP1ZmringlKhLBkw2Q== dependencies: safer-buffer ">= 2.1.2 < 3" diff --git a/resources/linux/bin/code.sh b/resources/linux/bin/code.sh index 91e4d79d27..d72ec7260d 100755 --- a/resources/linux/bin/code.sh +++ b/resources/linux/bin/code.sh @@ -27,13 +27,13 @@ if [ "$(id -u)" = "0" ]; then fi fi -if [ ! -L $0 ]; then +if [ ! -L "$0" ]; then # if path is not a symlink, find relatively - VSCODE_PATH="$(dirname $0)/.." + VSCODE_PATH="$(dirname "$0")/.." else if command -v readlink >/dev/null; then # if readlink exists, follow the symlink and find relatively - VSCODE_PATH="$(dirname $(readlink -f $0))/.." + VSCODE_PATH="$(dirname $(readlink -f "$0"))/.." else # else use the standard install location VSCODE_PATH="/usr/share/@@NAME@@" diff --git a/resources/linux/debian/control.template b/resources/linux/debian/control.template index 7e03df4170..5c6e405c38 100644 --- a/resources/linux/debian/control.template +++ b/resources/linux/debian/control.template @@ -1,7 +1,7 @@ Package: @@NAME@@ Version: @@VERSION@@ Section: devel -Depends: libnotify4, libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libxss1 +Depends: libnss3 (>= 2:3.26), gnupg, apt, libxkbfile1, libsecret-1-0, libgtk-3-0 (>= 3.10.0), libxss1 Priority: optional Architecture: @@ARCHITECTURE@@ Maintainer: Microsoft Corporation diff --git a/resources/serverless/callback.html b/resources/serverless/callback.html new file mode 100644 index 0000000000..81f217e980 --- /dev/null +++ b/resources/serverless/callback.html @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + Visual Studio Code + + + + + + + + Visual Studio Code + +
+
+ You can close this page now. +
+
+ + + diff --git a/scripts/code-web.js b/resources/serverless/code-web.js old mode 100755 new mode 100644 similarity index 69% rename from scripts/code-web.js rename to resources/serverless/code-web.js index e78d39835b..d4314c5c3f --- a/scripts/code-web.js +++ b/resources/serverless/code-web.js @@ -6,17 +6,19 @@ *--------------------------------------------------------------------------------------------*/ // @ts-check +/** @typedef {import('../../src/vs/workbench/workbench.web.api').IWorkbenchConstructionOptions} WebConfiguration **/ const http = require('http'); const url = require('url'); const fs = require('fs'); const path = require('path'); const util = require('util'); +const glob = require('glob'); const opn = require('opn'); const minimist = require('minimist'); const webpack = require('webpack'); -const APP_ROOT = path.dirname(__dirname); +const APP_ROOT = path.join(__dirname, '..', '..'); const EXTENSIONS_ROOT = path.join(APP_ROOT, 'extensions'); const WEB_MAIN = path.join(APP_ROOT, 'src', 'vs', 'code', 'browser', 'workbench', 'workbench-dev.html'); @@ -78,8 +80,13 @@ async function initialize() { if (packageJSON.browser) { packageJSON.main = packageJSON.browser; - const webpackConfigPath = path.join(EXTENSIONS_ROOT, extensionFolder, 'extension-browser.webpack.config.js'); - if ((await exists(webpackConfigPath))) { + + const webpackConfigLocations = await util.promisify(glob)( + path.join(EXTENSIONS_ROOT, extensionFolder, '**', 'extension-browser.webpack.config.js'), + { ignore: ['**/node_modules'] } + ); + + for (const webpackConfigPath of webpackConfigLocations) { const configOrFnOrArray = require(webpackConfigPath); function addConfig(configOrFn) { if (typeof configOrFn === 'function') { @@ -88,11 +95,7 @@ async function initialize() { webpackConfigs.push(configOrFn); } } - if (Array.isArray(configOrFnOrArray)) { - configOrFnOrArray.forEach(addConfig); - } else { - addConfig(configOrFnOrArray); - } + addConfig(configOrFnOrArray); } } @@ -119,7 +122,8 @@ async function initialize() { packageJSON.extensionKind = ['web']; // enable for Web staticExtensions.push({ packageJSON, - extensionLocation: { scheme: SCHEME, authority: AUTHORITY, path: `/static-extension/${extensionFolder}` } + extensionLocation: { scheme: SCHEME, authority: AUTHORITY, path: `/static-extension/${extensionFolder}` }, + isBuiltin: true }); } catch (e) { console.log(e); @@ -154,6 +158,8 @@ async function initialize() { const staticExtensionsPromise = initialize(); +const mapCallbackUriToRequestId = new Map(); + const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); const pathname = parsedUrl.pathname; @@ -185,6 +191,12 @@ const server = http.createServer((req, res) => { 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); } return serveError(req, res, 404, 'Not found.'); @@ -251,14 +263,20 @@ async function handleRoot(req, res) { } const staticExtensions = await staticExtensionsPromise; - const webConfiguration = escapeAttribute(JSON.stringify({ - staticExtensions, folderUri: ghPath - ? { scheme: 'github', authority: 'github.com', path: ghPath } - : { scheme: 'memfs', path: `/sample-folder` } + /** @type {WebConfiguration} */ + const webConfig = { + staticExtensions: staticExtensions, + }; + + const webConfigJSON = escapeAttribute(JSON.stringify({ + ...webConfig, + folderUri: ghPath + ? { scheme: 'github', authority: 'HEAD', path: ghPath } + : { scheme: 'memfs', path: `/sample-folder` }, })); const data = (await util.promisify(fs.readFile)(WEB_MAIN)).toString() - .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => webConfiguration) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied + .replace('{{WORKBENCH_WEB_CONFIGURATION}}', () => webConfigJSON) // use a replace function to avoid that regexp replace patterns ($&, $0, ...) are applied .replace('{{WEBVIEW_ENDPOINT}}', '') .replace('{{REMOTE_USER_DATA_URI}}', ''); @@ -266,6 +284,100 @@ async function handleRoot(req, res) { 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', 'serverless', '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 */ diff --git a/resources/win32/bin/code.sh b/resources/win32/bin/code.sh index 74ca1e3d83..c751647f2e 100644 --- a/resources/win32/bin/code.sh +++ b/resources/win32/bin/code.sh @@ -1,7 +1,11 @@ #!/usr/bin/env sh # # Copyright (c) Microsoft Corporation. All rights reserved. -# Licensed under the Source EULA. See License.txt in the project root for license information. +# Licensed under the MIT License. See License.txt in the project root for license information. +if [ "$VSCODE_WSL_DEBUG_INFO" = true ]; then + set -x +fi + COMMIT="@@COMMIT@@" APP_NAME="@@APPNAME@@" QUALITY="@@QUALITY@@" @@ -11,7 +15,7 @@ VSCODE_PATH="$(dirname "$(dirname "$(realpath "$0")")")" ELECTRON="$VSCODE_PATH/$NAME.exe" if grep -qi Microsoft /proc/version; then # in a wsl shell - WSL_BUILD=$(uname -r | sed -E 's/^[0-9.]+-([0-9]+)-Microsoft|([0-9]+).([0-9]+).([0-9]+)-microsoft-standard|.*/\1\2\3\4/') + WSL_BUILD=$(uname -r | sed -E 's/^[0-9.]+-([0-9]+)-Microsoft.*|([0-9]+).([0-9]+).([0-9]+)-microsoft-standard.*|.*/\1\2\3\4/') if [ -z "$WSL_BUILD" ]; then WSL_BUILD=0 fi diff --git a/scripts/code-cli.bat b/scripts/code-cli.bat index 1e7f37712c..a07ccc96bf 100644 --- a/scripts/code-cli.bat +++ b/scripts/code-cli.bat @@ -30,7 +30,6 @@ if not exist out yarn compile set ELECTRON_RUN_AS_NODE=1 set NODE_ENV=development set VSCODE_DEV=1 -REM set ELECTRON_DEFAULT_ERROR_MODE=1 TODO@ben to investigate if this helps with builds reporting stacks if renderer crashes set ELECTRON_ENABLE_LOGGING=1 set ELECTRON_ENABLE_STACK_DUMPING=1 diff --git a/scripts/code.bat b/scripts/code.bat index d23724ef14..c4c1cc7c05 100644 --- a/scripts/code.bat +++ b/scripts/code.bat @@ -29,7 +29,6 @@ if not exist out yarn compile set NODE_ENV=development set VSCODE_DEV=1 set VSCODE_CLI=1 -REM set ELECTRON_DEFAULT_ERROR_MODE=1 TODO@ben to investigate if this helps with builds reporting stacks if renderer crashes set ELECTRON_ENABLE_LOGGING=1 set ELECTRON_ENABLE_STACK_DUMPING=1 set VSCODE_LOGS= diff --git a/scripts/test-integration.bat b/scripts/test-integration.bat index 11623c2e60..1b72c0cd54 100755 --- a/scripts/test-integration.bat +++ b/scripts/test-integration.bat @@ -37,28 +37,31 @@ if "%INTEGRATION_TEST_ELECTRON_PATH%"=="" ( :: Tests in the extension host -REM 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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% -REM if %errorlevel% neq 0 exit /b %errorlevel% +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-notebook-tests\test --enable-proposed-api=vscode.vscode-notebook-tests --extensionDevelopmentPath=%~dp0\..\extensions\vscode-notebook-tests --extensionTestsPath=%~dp0\..\extensions\vscode-notebook-tests\out --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +if %errorlevel% neq 0 exit /b %errorlevel% -REM 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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% -REM if %errorlevel% neq 0 exit /b %errorlevel% +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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +if %errorlevel% neq 0 exit /b %errorlevel% -REM call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\vscode-colorize-tests\test --extensionDevelopmentPath=%~dp0\..\extensions\vscode-colorize-tests --extensionTestsPath=%~dp0\..\extensions\vscode-colorize-tests\out --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% -REM 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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +if %errorlevel% neq 0 exit /b %errorlevel% -REM call "%INTEGRATION_TEST_ELECTRON_PATH%" $%~dp0\..\extensions\markdown-language-features\out\test\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\markdown-language-features --extensionTestsPath=%~dp0\..\extensions\markdown-language-features\out\test --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . -REM 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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +if %errorlevel% neq 0 exit /b %errorlevel% -REM call "%INTEGRATION_TEST_ELECTRON_PATH%" $%~dp0\..\extensions\emmet\out\test\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . -REM if %errorlevel% neq 0 exit /b %errorlevel% +call "%INTEGRATION_TEST_ELECTRON_PATH%" $%~dp0\..\extensions\markdown-language-features\out\test\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\markdown-language-features --extensionTestsPath=%~dp0\..\extensions\markdown-language-features\out\test --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . +if %errorlevel% neq 0 exit /b %errorlevel% -call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\azurecore\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\azurecore --extensionTestsPath=%~dp0\..\extensions\azurecore\out\test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +call "%INTEGRATION_TEST_ELECTRON_PATH%" $%~dp0\..\extensions\emmet\out\test\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\emmet --extensionTestsPath=%~dp0\..\extensions\emmet\out\test --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% . +if %errorlevel% neq 0 exit /b %errorlevel% + +call "%INTEGRATION_TEST_ELECTRON_PATH%" %~dp0\..\extensions\azurecore\test-fixtures --extensionDevelopmentPath=%~dp0\..\extensions\azurecore --extensionTestsPath=%~dp0\..\extensions\azurecore\out\test --no-cached-data --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% 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 --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% +call "%INTEGRATION_TEST_ELECTRON_PATH%" %GITWORKSPACE% --extensionDevelopmentPath=%~dp0\..\extensions\git --extensionTestsPath=%~dp0\..\extensions\git\out\test --enable-proposed-api=vscode.git --disable-telemetry --crash-reporter-directory=%VSCODECRASHDIR% --no-cached-data --disable-updates --disable-extensions --user-data-dir=%VSCODEUSERDATADIR% if %errorlevel% neq 0 exit /b %errorlevel% :: Tests in commonJS (HTML, CSS, JSON language server tests...) diff --git a/scripts/test-integration.sh b/scripts/test-integration.sh index 390135260d..eb5c7489ec 100755 --- a/scripts/test-integration.sh +++ b/scripts/test-integration.sh @@ -41,17 +41,18 @@ fi ./scripts/test.sh --runGlob **/*.integrationTest.js "$@" # Tests in the extension host -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-notebook-tests/test --enable-proposed-api=vscode.vscode-notebook-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-notebook-tests --extensionTestsPath=$ROOT/extensions/vscode-notebook-tests/out/ --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $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 --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $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 --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/markdown-language-features/out/test/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -# "$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/emmet/out/test/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.git --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR -"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/azurecore/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/azurecore --extensionTestsPath=$ROOT/extensions/azurecore/out/test --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-notebook-tests/test --enable-proposed-api=vscode.vscode-notebook-tests --extensionDevelopmentPath=$ROOT/extensions/vscode-notebook-tests --extensionTestsPath=$ROOT/extensions/vscode-notebook-tests/out/ --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $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 --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $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 --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/vscode-colorize-tests/test --extensionDevelopmentPath=$ROOT/extensions/vscode-colorize-tests --extensionTestsPath=$ROOT/extensions/vscode-colorize-tests/out --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/markdown-language-features/out/test/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/markdown-language-features --extensionTestsPath=$ROOT/extensions/markdown-language-features/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/emmet/out/test/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/emmet --extensionTestsPath=$ROOT/extensions/emmet/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHDIR --no-cached-data --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $(mktemp -d 2>/dev/null) --enable-proposed-api=vscode.git --extensionDevelopmentPath=$ROOT/extensions/git --extensionTestsPath=$ROOT/extensions/git/out/test --disable-telemetry --crash-reporter-directory=$VSCODECRASHD + +"$INTEGRATION_TEST_ELECTRON_PATH" $LINUX_NO_SANDBOX $ROOT/extensions/azurecore/test-fixtures --extensionDevelopmentPath=$ROOT/extensions/azurecore --extensionTestsPath=$ROOT/extensions/azurecore/out/test --no-cached-data --disable-telemetry --disable-crash-reporter --disable-updates --disable-extensions --user-data-dir=$VSCODEUSERDATADIR # Tests in commonJS # cd $ROOT/extensions/css-language-features/server && $ROOT/scripts/node-electron.sh test/index.js # cd $ROOT/extensions/html-language-features/server && $ROOT/scripts/node-electron.sh test/index.js -rm -r $VSCODEUSERDATADIR +rm -rf $VSCODEUSERDATADIR diff --git a/src/bootstrap-fork.js b/src/bootstrap-fork.js index c92f1c79ce..7f04d50283 100644 --- a/src/bootstrap-fork.js +++ b/src/bootstrap-fork.js @@ -109,6 +109,9 @@ function pipeLoggingToParent() { return res; } + /** + * @param {{ type: string; severity: string; arguments: string; }} arg + */ function safeSend(arg) { try { process.send(arg); @@ -117,6 +120,9 @@ function pipeLoggingToParent() { } } + /** + * @param {unknown} obj + */ function isObject(obj) { return typeof obj === 'object' && obj !== null diff --git a/src/bootstrap-window.js b/src/bootstrap-window.js index 4c0f153f69..95317267a4 100644 --- a/src/bootstrap-window.js +++ b/src/bootstrap-window.js @@ -18,7 +18,6 @@ exports.assign = function assign(destination, source) { }; /** - * * @param {string[]} modulePaths * @param {(result, configuration: object) => any} resultCallback * @param {{ forceEnableDeveloperKeybindings?: boolean, disallowReloadKeybinding?: boolean, removeDeveloperKeybindingsAfterLoad?: boolean, canModifyDOM?: (config: object) => void, beforeLoaderConfig?: (config: object, loaderConfig: object) => void, beforeRequire?: () => void }=} options @@ -218,6 +217,10 @@ function registerDeveloperKeybindings(disallowReloadKeybinding) { }; } +/** + * @param {string | Error} error + * @param {boolean} enableDeveloperTools + */ function onUnexpectedError(error, enableDeveloperTools) { const ipc = require('electron').ipcRenderer; @@ -228,7 +231,7 @@ function onUnexpectedError(error, enableDeveloperTools) { console.error('[uncaught exception]: ' + error); - if (error && error.stack) { + if (error && typeof error !== 'string' && error.stack) { console.error(error.stack); } } diff --git a/src/bootstrap.js b/src/bootstrap.js index 11f110d08f..e3312a749d 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -13,7 +13,6 @@ Error.stackTraceLimit = 100; // Workaround for Electron not installing a handler to ignore SIGPIPE // (https://github.com/electron/electron/issues/13254) -// @ts-ignore process.on('SIGPIPE', () => { console.error(new Error('Unexpected SIGPIPE')); }); @@ -27,7 +26,6 @@ exports.injectNodeModuleLookupPath = function (injectPath) { throw new Error('Missing injectPath'); } - // @ts-ignore const Module = require('module'); const path = require('path'); @@ -51,12 +49,12 @@ exports.injectNodeModuleLookupPath = function (injectPath) { return paths; }; }; + //#endregion //#region Remove global paths from the node lookup paths -exports.removeGlobalNodeModuleLookupPaths = function() { - // @ts-ignore +exports.removeGlobalNodeModuleLookupPaths = function () { const Module = require('module'); // @ts-ignore const globalPaths = Module.globalPaths; @@ -74,15 +72,15 @@ exports.removeGlobalNodeModuleLookupPaths = function() { return paths.slice(0, paths.length - commonSuffixLength); }; }; + //#endregion //#region Add support for using node_modules.asar + /** * @param {string=} nodeModulesPath */ exports.enableASARSupport = function (nodeModulesPath) { - - // @ts-ignore const Module = require('module'); const path = require('path'); @@ -111,9 +109,11 @@ exports.enableASARSupport = function (nodeModulesPath) { return paths; }; }; + //#endregion //#region URI helpers + /** * @param {string} _path * @returns {string} @@ -136,9 +136,11 @@ exports.uriFromPath = function (_path) { return uri.replace(/#/g, '%23'); }; + //#endregion //#region FS helpers + /** * @param {string} file * @returns {Promise} @@ -185,9 +187,11 @@ exports.mkdirp = function mkdirp(dir) { return new Promise((c, e) => fs.mkdir(dir, { recursive: true }, err => (err && err.code !== 'EEXIST') ? e(err) : c(dir))); }; + //#endregion //#region NLS helpers + /** * @returns {{locale?: string, availableLanguages: {[lang: string]: string;}, pseudo?: boolean }} */ @@ -235,14 +239,15 @@ exports.setupNLS = function () { return nlsConfig; }; + //#endregion //#region Portable helpers + /** * @returns {{ portableDataPath: string, isPortable: boolean }} */ exports.configurePortable = function () { - // @ts-ignore const product = require('../product.json'); const path = require('path'); const fs = require('fs'); @@ -270,6 +275,7 @@ exports.configurePortable = function () { return path.join(getApplicationPath(), 'data'); } + // @ts-ignore const portableDataName = product.portable || `${product.applicationName}-portable-data`; return path.join(path.dirname(getApplicationPath()), portableDataName); } @@ -299,16 +305,17 @@ exports.configurePortable = function () { isPortable }; }; + //#endregion //#region ApplicationInsights -/** - * Prevents appinsights from monkey patching modules. - * This should be called before importing the applicationinsights module - */ + +// Prevents appinsights from monkey patching modules. +// This should be called before importing the applicationinsights module exports.avoidMonkeyPatchFromAppInsights = function () { // @ts-ignore process.env['APPLICATION_INSIGHTS_NO_DIAGNOSTIC_CHANNEL'] = true; // Skip monkey patching of 3rd party modules by appinsights global['diagnosticsSource'] = {}; // Prevents diagnostic channel (which patches "require") from initializing entirely }; + //#endregion diff --git a/src/main.js b/src/main.js index d0cc84e82b..327fd1458f 100644 --- a/src/main.js +++ b/src/main.js @@ -16,9 +16,8 @@ const fs = require('fs'); const os = require('os'); const bootstrap = require('./bootstrap'); const paths = require('./paths'); -// @ts-ignore +/** @type {any} */ const product = require('../product.json'); -// @ts-ignore const { app, protocol } = require('electron'); // Enable portable support @@ -49,6 +48,11 @@ let crashReporterDirectory = args['crash-reporter-directory']; if (crashReporterDirectory) { crashReporterDirectory = path.normalize(crashReporterDirectory); + if (!path.isAbsolute(crashReporterDirectory)) { + console.error(`The path '${crashReporterDirectory}' specified for --crash-reporter-directory must be absolute.`); + app.exit(1); + } + if (!fs.existsSync(crashReporterDirectory)) { try { fs.mkdirSync(crashReporterDirectory); @@ -65,9 +69,11 @@ if (crashReporterDirectory) { // Start crash reporter const { crashReporter } = require('electron'); + const productName = (product.crashReporter && product.crashReporter.productName) || product.nameShort; + const companyName = (product.crashReporter && product.crashReporter.companyName) || 'Microsoft'; crashReporter.start({ - companyName: 'Microsoft', - productName: product.nameShort, + companyName: companyName, + productName: process.env['VSCODE_DEV'] ? `${productName} Dev` : productName, submitURL: '', uploadToServer: false }); @@ -87,6 +93,13 @@ setCurrentWorkingDirectory(); // Register custom schemes with privileges protocol.registerSchemesAsPrivileged([ { + scheme: 'vscode-resource', + privileges: { + secure: true, + supportFetchAPI: true, + corsEnabled: true, + } + }, { scheme: 'vscode-webview-resource', privileges: { secure: true, @@ -129,7 +142,6 @@ if (locale) { // Load our code once ready app.once('ready', function () { if (args['trace']) { - // @ts-ignore const contentTracing = require('electron').contentTracing; const traceOptions = { @@ -196,30 +208,45 @@ function configureCommandlineSwitchesSync(cliArgs) { SUPPORTED_ELECTRON_SWITCHES.push('force-renderer-accessibility'); } + const SUPPORTED_MAIN_PROCESS_SWITCHES = [ + + // Persistently enable proposed api via argv.json: https://github.com/microsoft/vscode/issues/99775 + 'enable-proposed-api' + ]; + // Read argv config const argvConfig = readArgvConfigSync(); - // Append each flag to Electron Object.keys(argvConfig).forEach(argvKey => { - if (SUPPORTED_ELECTRON_SWITCHES.indexOf(argvKey) === -1) { - return; // unsupported argv key - } - const argvValue = argvConfig[argvKey]; - // Color profile - if (argvKey === 'force-color-profile') { - if (argvValue) { - app.commandLine.appendSwitch(argvKey, argvValue); + // Append Electron flags to Electron + if (SUPPORTED_ELECTRON_SWITCHES.indexOf(argvKey) !== -1) { + // Color profile + if (argvKey === 'force-color-profile') { + if (argvValue) { + app.commandLine.appendSwitch(argvKey, argvValue); + } + } + + // Others + else if (argvValue === true || argvValue === 'true') { + if (argvKey === 'disable-hardware-acceleration') { + app.disableHardwareAcceleration(); // needs to be called explicitly + } else { + app.commandLine.appendSwitch(argvKey); + } } } - // Others - else if (argvValue === true || argvValue === 'true') { - if (argvKey === 'disable-hardware-acceleration') { - app.disableHardwareAcceleration(); // needs to be called explicitly - } else { - app.commandLine.appendSwitch(argvKey); + // Append main process flags to process.argv + else if (SUPPORTED_MAIN_PROCESS_SWITCHES.indexOf(argvKey) !== -1) { + if (argvKey === 'enable-proposed-api') { + if (Array.isArray(argvValue)) { + argvValue.forEach(id => id && typeof id === 'string' && process.argv.push('--enable-proposed-api', id)); + } else { + console.error(`Unexpected value for \`enable-proposed-api\` in argv.json. Expected array of extension ids.`); + } } } }); @@ -476,6 +503,7 @@ function getNodeCachedDir() { } //#region NLS Support + /** * Resolve the NLS configuration * @@ -571,4 +599,5 @@ function getLegacyUserDefinedLocaleSync(localeConfigPath) { // ignore } } + //#endregion diff --git a/src/paths.js b/src/paths.js index 7453a528c6..9b8cbda34a 100644 --- a/src/paths.js +++ b/src/paths.js @@ -6,7 +6,6 @@ //@ts-check 'use strict'; -// @ts-expect-error // const pkg = require('../package.json'); const path = require('path'); const os = require('os'); diff --git a/src/sql/platform/clipboard/browser/clipboardService.ts b/src/sql/platform/clipboard/browser/clipboardService.ts index a90b15136f..fb0ed6e418 100644 --- a/src/sql/platform/clipboard/browser/clipboardService.ts +++ b/src/sql/platform/clipboard/browser/clipboardService.ts @@ -70,11 +70,6 @@ export class BrowserClipboardService implements IClipboardService { return this._vsClipboardService.hasResources(); } - readTextSync(): string | undefined { - // eslint-disable-next-line no-sync - return this._vsClipboardService.readTextSync(); - } - readFindTextSync(): string { // eslint-disable-next-line no-sync return this._vsClipboardService.readFindTextSync(); diff --git a/src/sql/workbench/browser/modelComponents/diffeditor.component.ts b/src/sql/workbench/browser/modelComponents/diffeditor.component.ts index a4f710e4f7..859485faa1 100644 --- a/src/sql/workbench/browser/modelComponents/diffeditor.component.ts +++ b/src/sql/workbench/browser/modelComponents/diffeditor.component.ts @@ -89,8 +89,8 @@ export default class DiffEditorComponent extends ComponentBase implements ICompo } }); - let editorinput1 = this._instantiationService.createInstance(ResourceEditorInput, 'source', undefined, uri1, undefined); - let editorinput2 = this._instantiationService.createInstance(ResourceEditorInput, 'target', undefined, uri2, undefined); + let editorinput1 = this._instantiationService.createInstance(ResourceEditorInput, uri1, 'source', undefined, undefined); + let editorinput2 = this._instantiationService.createInstance(ResourceEditorInput, uri2, 'target', undefined, undefined); this._editorInput = new DiffEditorInput('DiffEditor', undefined, editorinput1, editorinput2, true); this._editor.setInput(this._editorInput, undefined, cancellationTokenSource.token); diff --git a/src/sql/workbench/browser/parts/views/treeView.ts b/src/sql/workbench/browser/parts/views/treeView.ts index a6c1aceaa5..93b46aab7d 100644 --- a/src/sql/workbench/browser/parts/views/treeView.ts +++ b/src/sql/workbench/browser/parts/views/treeView.ts @@ -26,7 +26,7 @@ import { URI } from 'vs/base/common/uri'; import { dirname, basename } from 'vs/base/common/resources'; import { LIGHT, FileThemeIcon, FolderThemeIcon, registerThemingParticipant, ThemeIcon, IThemeService } from 'vs/platform/theme/common/themeService'; import { FileKind } from 'vs/platform/files/common/files'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { localize } from 'vs/nls'; import { timeout } from 'vs/base/common/async'; @@ -487,9 +487,7 @@ export class TreeView extends Disposable implements ITreeView { })); this.tree.setInput(this.root).then(() => this.updateContentAreas()); - const treeNavigator = new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false }); - this._register(treeNavigator); - this._register(treeNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (!e.browserEvent) { return; } diff --git a/src/sql/workbench/contrib/commandLine/test/electron-browser/commandLine.test.ts b/src/sql/workbench/contrib/commandLine/test/electron-browser/commandLine.test.ts index 169a654079..3e025918ca 100644 --- a/src/sql/workbench/contrib/commandLine/test/electron-browser/commandLine.test.ts +++ b/src/sql/workbench/contrib/commandLine/test/electron-browser/commandLine.test.ts @@ -393,7 +393,7 @@ suite('commandLineService tests', () => { querymodelService.setup(c => c.onRunQueryComplete).returns(() => Event.None); let uri = URI.file(args._[0]); const workbenchinstantiationService = workbenchInstantiationService(); - const editorInput = workbenchinstantiationService.createInstance(FileEditorInput, uri, undefined, undefined); + const editorInput = workbenchinstantiationService.createInstance(FileEditorInput, uri, undefined, undefined, undefined); const queryInput = new FileQueryEditorInput(undefined, editorInput, undefined, connectionManagementService.object, querymodelService.object, configurationService.object); queryInput.state.connected = true; const editorService: TypeMoq.Mock = TypeMoq.Mock.ofType(TestEditorService, TypeMoq.MockBehavior.Strict); diff --git a/src/sql/workbench/contrib/dashboard/browser/contents/webviewContent.component.ts b/src/sql/workbench/contrib/dashboard/browser/contents/webviewContent.component.ts index 25978b4b7d..5de6e98ce3 100644 --- a/src/sql/workbench/contrib/dashboard/browser/contents/webviewContent.component.ts +++ b/src/sql/workbench/contrib/dashboard/browser/contents/webviewContent.component.ts @@ -85,7 +85,7 @@ export class WebviewContent extends AngularDisposable implements OnInit, IDashbo public sendMessage(message: string): void { if (this._webview) { - this._webview.sendMessage(message); + this._webview.postMessage(message); } } diff --git a/src/sql/workbench/contrib/dashboard/browser/widgets/webview/webviewWidget.component.ts b/src/sql/workbench/contrib/dashboard/browser/widgets/webview/webviewWidget.component.ts index 164f089e93..574cdb621b 100644 --- a/src/sql/workbench/contrib/dashboard/browser/widgets/webview/webviewWidget.component.ts +++ b/src/sql/workbench/contrib/dashboard/browser/widgets/webview/webviewWidget.component.ts @@ -86,7 +86,7 @@ export class WebviewWidget extends DashboardWidget implements IDashboardWidget, public sendMessage(message: string): void { if (this._webview) { - this._webview.sendMessage(message); + this._webview.postMessage(message); } } diff --git a/src/sql/workbench/contrib/editorReplacement/test/browser/editorReplacerContribution.test.ts b/src/sql/workbench/contrib/editorReplacement/test/browser/editorReplacerContribution.test.ts index b74d58f4b2..9d3c5997c7 100644 --- a/src/sql/workbench/contrib/editorReplacement/test/browser/editorReplacerContribution.test.ts +++ b/src/sql/workbench/contrib/editorReplacement/test/browser/editorReplacerContribution.test.ts @@ -71,7 +71,7 @@ suite('Editor Replacer Contribution', () => { const editorService = new MockEditorService(instantiationService); instantiationService.stub(IEditorService, editorService); const contrib = instantiationService.createInstance(EditorReplacementContribution); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); const response = editorService.fireOpenEditor(input, undefined, undefined as IEditorGroup, OpenEditorContext.NEW_EDITOR); assert(response?.override); const newinput = (await response.override) as EditorInput; // our test service returns this so we are fine to cast this @@ -86,7 +86,7 @@ suite('Editor Replacer Contribution', () => { const editorService = new MockEditorService(instantiationService); instantiationService.stub(IEditorService, editorService); const contrib = instantiationService.createInstance(EditorReplacementContribution); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.other'), undefined, 'sql'); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.other'), undefined, 'sql', undefined); const response = editorService.fireOpenEditor(input, undefined, undefined as IEditorGroup, OpenEditorContext.NEW_EDITOR); assert(response?.override); const newinput = (await response.override) as EditorInput; // our test service returns this so we are fine to cast this @@ -101,7 +101,7 @@ suite('Editor Replacer Contribution', () => { const editorService = new MockEditorService(instantiationService); instantiationService.stub(IEditorService, editorService); const contrib = instantiationService.createInstance(EditorReplacementContribution); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.notebook'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.notebook'), undefined, undefined, undefined); const response = editorService.fireOpenEditor(input, undefined, undefined as IEditorGroup, OpenEditorContext.NEW_EDITOR); assert(response?.override); const newinput = (await response.override) as EditorInput; // our test service returns this so we are fine to cast this @@ -116,7 +116,7 @@ suite('Editor Replacer Contribution', () => { const editorService = new MockEditorService(instantiationService); instantiationService.stub(IEditorService, editorService); const contrib = instantiationService.createInstance(EditorReplacementContribution); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.iynb'), undefined, 'notebook'); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.iynb'), undefined, 'notebook', undefined); const response = editorService.fireOpenEditor(input, undefined, undefined as IEditorGroup, OpenEditorContext.NEW_EDITOR); assert(response?.override); const newinput = (await response.override) as EditorInput; // our test service returns this so we are fine to cast this @@ -191,10 +191,10 @@ class MockEditorService extends TestEditorService { }); } - fireOpenEditor(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext, id?: string) { + fireOpenEditor(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext) { for (const handler of this.overridenOpens) { let response: IOpenEditorOverride | undefined; - if (response = handler.open(editor, options, group, context, id)) { + if (response = handler.open(editor, options, group, context)) { return response; } } diff --git a/src/sql/workbench/contrib/modelView/browser/webview.component.ts b/src/sql/workbench/contrib/modelView/browser/webview.component.ts index 309d7eb289..e12bb3c737 100644 --- a/src/sql/workbench/contrib/modelView/browser/webview.component.ts +++ b/src/sql/workbench/contrib/modelView/browser/webview.component.ts @@ -114,7 +114,7 @@ export default class WebViewComponent extends ComponentBase implements IComponen private sendMessage(): void { if (this._webview && this.message) { - this._webview.sendMessage(this.message); + this._webview.postMessage(this.message); } } diff --git a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts index 272193d711..0d8ec3f736 100644 --- a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts +++ b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts @@ -28,7 +28,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { TestEnvironmentService, TestLifecycleService, TestTextFileService, workbenchInstantiationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { TestEnvironmentService, TestLifecycleService, TestTextFileService, workbenchInstantiationService, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { Range } from 'vs/editor/common/core/range'; import { nb } from 'azdata'; import { Emitter } from 'vs/base/common/event'; @@ -884,7 +884,7 @@ suite('Notebook Editor Model', function (): void { async function createTextEditorModel(self: Mocha.ITestCallbackContext): Promise { let textFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(self, defaultUri.toString()), 'utf8', undefined); - (accessor.textFileService.files).add(textFileEditorModel.resource, textFileEditorModel); + (accessor.textFileService.files).add(textFileEditorModel.resource, textFileEditorModel); await textFileEditorModel.load(); return new NotebookEditorModel(defaultUri, textFileEditorModel, mockNotebookService.object, testResourcePropertiesService); } diff --git a/src/sql/workbench/contrib/query/common/fileQueryEditorInput.ts b/src/sql/workbench/contrib/query/common/fileQueryEditorInput.ts index bc2fef89f7..6acf02cd38 100644 --- a/src/sql/workbench/contrib/query/common/fileQueryEditorInput.ts +++ b/src/sql/workbench/contrib/query/common/fileQueryEditorInput.ts @@ -15,9 +15,7 @@ import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel' import { ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { URI } from 'vs/base/common/uri'; -type PublicPart = { [K in keyof T]: T[K] }; - -export class FileQueryEditorInput extends QueryEditorInput implements PublicPart { +export class FileQueryEditorInput extends QueryEditorInput { public static readonly ID = 'workbench.editorInput.fileQueryInput'; @@ -84,7 +82,7 @@ export class FileQueryEditorInput extends QueryEditorInput implements PublicPart return this.text.isResolved(); } - public move(group: GroupIdentifier, target: URI): IMoveResult { - return this.text.move(group, target); + public rename(group: GroupIdentifier, target: URI): IMoveResult { + return this.text.rename(group, target); } } diff --git a/src/sql/workbench/contrib/query/test/browser/queryInputFactory.test.ts b/src/sql/workbench/contrib/query/test/browser/queryInputFactory.test.ts index a6f8bb9d21..f8e18aed2f 100644 --- a/src/sql/workbench/contrib/query/test/browser/queryInputFactory.test.ts +++ b/src/sql/workbench/contrib/query/test/browser/queryInputFactory.test.ts @@ -36,7 +36,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); queryEditorLanguageAssociation.convertInput(input); assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active OE connection exists'); }); @@ -49,7 +49,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); const response = queryEditorLanguageAssociation.convertInput(input); assert(isThenable(response)); await response; @@ -64,7 +64,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); queryEditorLanguageAssociation.convertInput(input); assert(connectionManagementService.numberConnects === 1, 'Convert input should have called connect when active editor connection exists'); }); @@ -77,7 +77,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); const response = queryEditorLanguageAssociation.convertInput(input); assert(isThenable(response)); await response; @@ -115,7 +115,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); queryEditorLanguageAssociation.syncConvertinput(input); assert(connectionManagementService.numberConnects === 0, 'Convert input should not have been called connect when no global connections exist'); }); @@ -127,7 +127,7 @@ suite('Query Input Factory', () => { instantiationService.stub(IConnectionManagementService, connectionManagementService); instantiationService.stub(IEditorService, editorService); const queryEditorLanguageAssociation = instantiationService.createInstance(QueryEditorLanguageAssociation); - const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.sql'), undefined, undefined, undefined); const response = queryEditorLanguageAssociation.convertInput(input); assert(isThenable(response)); await response; diff --git a/src/sql/workbench/contrib/webview/browser/webViewDialog.ts b/src/sql/workbench/contrib/webview/browser/webViewDialog.ts index 6054293f88..0b6e3b0077 100644 --- a/src/sql/workbench/contrib/webview/browser/webViewDialog.ts +++ b/src/sql/workbench/contrib/webview/browser/webViewDialog.ts @@ -145,7 +145,7 @@ export class WebViewDialog extends Modal { } public sendMessage(message: any): void { - this._webview.sendMessage(message); + this._webview.postMessage(message); } public open() { diff --git a/src/sql/workbench/test/browser/parts/editor/editorStatusModeSelect.test.ts b/src/sql/workbench/test/browser/parts/editor/editorStatusModeSelect.test.ts index a29040bd62..519aa4ba40 100644 --- a/src/sql/workbench/test/browser/parts/editor/editorStatusModeSelect.test.ts +++ b/src/sql/workbench/test/browser/parts/editor/editorStatusModeSelect.test.ts @@ -61,7 +61,7 @@ suite('set mode', () => { const replaceEditorStub = sinon.stub(editorService, 'replaceEditors', () => Promise.resolve()); const stub = sinon.stub(); const modeSupport = { setMode: stub }; - const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext'); + const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext', undefined); await instantiationService.invokeFunction(setMode, modeSupport, activeEditor, 'json'); assert(stub.calledOnce); assert(stub.calledWithExactly('json')); @@ -75,7 +75,7 @@ suite('set mode', () => { const stub = sinon.stub(); const modeSupport = { setMode: stub }; const uri = URI.file('/test/file.sql'); - const textInput = instantiationService.createInstance(FileEditorInput, uri, undefined, 'sql'); + const textInput = instantiationService.createInstance(FileEditorInput, uri, undefined, 'sql', undefined); const activeEditor = instantiationService.createInstance(FileQueryEditorInput, '', textInput, instantiationService.createInstance(QueryResultsInput, uri.toString())); await instantiationService.invokeFunction(setMode, modeSupport, activeEditor, 'notebooks'); assert(stub.calledOnce); @@ -89,7 +89,7 @@ suite('set mode', () => { const stub = sinon.stub(); const modeSupport = { setMode: stub }; const uri = URI.file('/test/file.sql'); - const textInput = instantiationService.createInstance(FileEditorInput, uri, undefined, 'sql'); + const textInput = instantiationService.createInstance(FileEditorInput, uri, undefined, 'sql', undefined); const activeEditor = instantiationService.createInstance(FileQueryEditorInput, '', textInput, instantiationService.createInstance(QueryResultsInput, uri.toString())); await instantiationService.invokeFunction(setMode, modeSupport, activeEditor, 'plaintext'); assert(stub.calledOnce); @@ -102,7 +102,7 @@ suite('set mode', () => { instantiationService.stub(IEditorService, editorService); const stub = sinon.stub(); const modeSupport = { setMode: stub }; - const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext'); + const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext', undefined); await instantiationService.invokeFunction(setMode, modeSupport, activeEditor, 'sql'); assert(stub.calledOnce); assert(stub.calledWithExactly('sql')); @@ -117,7 +117,7 @@ suite('set mode', () => { (instantiationService as TestInstantiationService).stub(INotificationService, 'error', errorStub); const stub = sinon.stub(); const modeSupport = { setMode: stub }; - const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext'); + const activeEditor = instantiationService.createInstance(FileEditorInput, URI.file('/test/file.txt'), undefined, 'plaintext', undefined); sinon.stub(activeEditor, 'isDirty', () => true); await instantiationService.invokeFunction(setMode, modeSupport, activeEditor, 'sql'); assert(stub.notCalled); @@ -136,16 +136,18 @@ class MockEditorService extends TestEditorService { group: {} }; - activeTextEditorControl: ICodeEditor = { - getModel: () => { - return { - getLanguageIdentifier: () => { - return { language: this.mode }; - } - }; - }, - getEditorType: () => EditorType.ICodeEditor - }; + get activeTextEditorControl(): ICodeEditor { + return { + getModel: () => { + return { + getLanguageIdentifier: () => { + return { language: this.mode }; + } + }; + }, + getEditorType: () => EditorType.ICodeEditor + } as any; + } openEditor(_editor: any, _options?: any, _group?: any): Promise { return Promise.resolve(_editor); diff --git a/src/vs/base/browser/markdownRenderer.ts b/src/vs/base/browser/markdownRenderer.ts index 1de9ee0cbf..c3909d78ac 100644 --- a/src/vs/base/browser/markdownRenderer.ts +++ b/src/vs/base/browser/markdownRenderer.ts @@ -88,9 +88,13 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende if (href) { ({ href, dimensions } = parseHrefAndDimensions(href)); href = _href(href, true); - if (options.baseUrl) { - href = resolvePath(options.baseUrl, href).toString(); - } + 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(); + } + } catch (err) { } + attributes.push(`src="${href}"`); } if (text) { @@ -225,9 +229,12 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende ); function filter(token: { tag: string, attrs: { readonly [key: string]: string } }): boolean { - if (token.tag === 'span' && markdown.isTrusted) { - if (token.attrs['style'] && Object.keys(token.attrs).length === 1) { + if (token.tag === 'span' && markdown.isTrusted && (Object.keys(token.attrs).length === 1)) { + if (token.attrs['style']) { return !!token.attrs['style'].match(/^(color\:#[0-9a-fA-F]+;)?(background-color\:#[0-9a-fA-F]+;)?$/); + } else if (token.attrs['class']) { + // The class should match codicon rendering in src\vs\base\common\codicons.ts + return !!token.attrs['class'].match(/^codicon codicon-[a-z\-]+( codicon-animation-[a-z\-]+)?$/); } return false; } @@ -239,7 +246,8 @@ export function renderMarkdown(markdown: IMarkdownString, options: MarkdownRende // allowedTags should included everything that markdown renders to. // Since we have our own sanitize function for marked, it's possible we missed some tag so let insane make sure. // HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/ - allowedTags: ['ul', 'li', 'p', 'code', 'blockquote', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'em', 'pre', 'table', 'tr', 'td', 'div', 'del', 'a', 'strong', 'br', 'img', 'span'], + // HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension- + allowedTags: ['ul', 'li', 'p', 'code', 'blockquote', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'em', 'pre', 'table', 'thead', 'tbody', 'tr', 'th', 'td', 'div', 'del', 'a', 'strong', 'br', 'img', 'span'], allowedAttributes: { 'a': ['href', 'name', 'target', 'data-href'], 'img': ['src', 'title', 'alt', 'width', 'height'], diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index ee4cda4222..98cca67642 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -479,27 +479,27 @@ export class ActionBar extends Disposable implements IActionRunner { DOM.addClass(this.domNode, 'animated'); } - let previousKeys: KeyCode[]; - let nextKeys: KeyCode[]; + let previousKey: KeyCode; + let nextKey: KeyCode; switch (this.options.orientation) { case ActionsOrientation.HORIZONTAL: - previousKeys = [KeyCode.LeftArrow, KeyCode.UpArrow]; - nextKeys = [KeyCode.RightArrow, KeyCode.DownArrow]; + previousKey = KeyCode.LeftArrow; + nextKey = KeyCode.RightArrow; break; case ActionsOrientation.HORIZONTAL_REVERSE: - previousKeys = [KeyCode.RightArrow, KeyCode.DownArrow]; - nextKeys = [KeyCode.LeftArrow, KeyCode.UpArrow]; + previousKey = KeyCode.RightArrow; + nextKey = KeyCode.LeftArrow; this.domNode.className += ' reverse'; break; case ActionsOrientation.VERTICAL: - previousKeys = [KeyCode.LeftArrow, KeyCode.UpArrow]; - nextKeys = [KeyCode.RightArrow, KeyCode.DownArrow]; + previousKey = KeyCode.UpArrow; + nextKey = KeyCode.DownArrow; this.domNode.className += ' vertical'; break; case ActionsOrientation.VERTICAL_REVERSE: - previousKeys = [KeyCode.RightArrow, KeyCode.DownArrow]; - nextKeys = [KeyCode.LeftArrow, KeyCode.UpArrow]; + previousKey = KeyCode.DownArrow; + nextKey = KeyCode.UpArrow; this.domNode.className += ' vertical reverse'; break; } @@ -508,9 +508,9 @@ export class ActionBar extends Disposable implements IActionRunner { const event = new StandardKeyboardEvent(e); let eventHandled = true; - if (previousKeys && (event.equals(previousKeys[0]) || event.equals(previousKeys[1]))) { + if (event.equals(previousKey)) { this.focusPrevious(); - } else if (nextKeys && (event.equals(nextKeys[0]) || event.equals(nextKeys[1]))) { + } else if (event.equals(nextKey)) { this.focusNext(); } else if (event.equals(KeyCode.Escape)) { this._onDidCancel.fire(); @@ -696,7 +696,8 @@ export class ActionBar extends Disposable implements IActionRunner { } clear(): void { - this.viewItems = dispose(this.viewItems); + dispose(this.viewItems); + this.viewItems = []; DOM.clearNode(this.actionsList); } diff --git a/src/vs/base/browser/ui/aria/aria.ts b/src/vs/base/browser/ui/aria/aria.ts index fa96f4fc4a..bdd6f67343 100644 --- a/src/vs/base/browser/ui/aria/aria.ts +++ b/src/vs/base/browser/ui/aria/aria.ts @@ -11,50 +11,78 @@ import * as dom from 'vs/base/browser/dom'; const MAX_MESSAGE_LENGTH = 20000; let ariaContainer: HTMLElement; let alertContainer: HTMLElement; +let alertContainer2: HTMLElement; let statusContainer: HTMLElement; +let statusContainer2: HTMLElement; export function setARIAContainer(parent: HTMLElement) { ariaContainer = document.createElement('div'); ariaContainer.className = 'monaco-aria-container'; - alertContainer = document.createElement('div'); - alertContainer.className = 'monaco-alert'; - alertContainer.setAttribute('role', 'alert'); - alertContainer.setAttribute('aria-atomic', 'true'); - ariaContainer.appendChild(alertContainer); + const createAlertContainer = () => { + const element = document.createElement('div'); + element.className = 'monaco-alert'; + element.setAttribute('role', 'alert'); + element.setAttribute('aria-atomic', 'true'); + ariaContainer.appendChild(element); + return element; + }; + alertContainer = createAlertContainer(); + alertContainer2 = createAlertContainer(); - statusContainer = document.createElement('div'); - statusContainer.className = 'monaco-status'; - statusContainer.setAttribute('role', 'complementary'); - statusContainer.setAttribute('aria-live', 'polite'); - statusContainer.setAttribute('aria-atomic', 'true'); - ariaContainer.appendChild(statusContainer); + const createStatusContainer = () => { + const element = document.createElement('div'); + element.className = 'monaco-status'; + element.setAttribute('role', 'complementary'); + element.setAttribute('aria-live', 'polite'); + element.setAttribute('aria-atomic', 'true'); + ariaContainer.appendChild(element); + return element; + }; + statusContainer = createStatusContainer(); + statusContainer2 = createStatusContainer(); parent.appendChild(ariaContainer); } - /** * Given the provided message, will make sure that it is read as alert to screen readers. */ export function alert(msg: string): void { - insertMessage(alertContainer, msg); + if (!ariaContainer) { + return; + } + + // Use alternate containers such that duplicated messages get read out by screen readers #99466 + if (alertContainer.textContent !== msg) { + dom.clearNode(alertContainer2); + insertMessage(alertContainer, msg); + } else { + dom.clearNode(alertContainer); + insertMessage(alertContainer2, msg); + } } /** * Given the provided message, will make sure that it is read as status to screen readers. */ export function status(msg: string): void { - if (isMacintosh) { - alert(msg); // VoiceOver does not seem to support status role - } else { - insertMessage(statusContainer, msg); - } -} - -function insertMessage(target: HTMLElement, msg: string): void { if (!ariaContainer) { return; } + if (isMacintosh) { + alert(msg); // VoiceOver does not seem to support status role + } else { + if (statusContainer.textContent !== msg) { + dom.clearNode(statusContainer2); + insertMessage(statusContainer, msg); + } else { + dom.clearNode(statusContainer); + insertMessage(statusContainer2, msg); + } + } +} + +function insertMessage(target: HTMLElement, msg: string): void { dom.clearNode(target); if (msg.length > MAX_MESSAGE_LENGTH) { msg = msg.substr(0, MAX_MESSAGE_LENGTH); diff --git a/src/vs/base/browser/ui/button/button.ts b/src/vs/base/browser/ui/button/button.ts index 86434491ef..73839e5639 100644 --- a/src/vs/base/browser/ui/button/button.ts +++ b/src/vs/base/browser/ui/button/button.ts @@ -18,12 +18,16 @@ import { escape } from 'vs/base/common/strings'; export interface IButtonOptions extends IButtonStyles { readonly title?: boolean | string; readonly supportCodicons?: boolean; + readonly secondary?: boolean; } export interface IButtonStyles { buttonBackground?: Color; buttonHoverBackground?: Color; buttonForeground?: Color; + buttonSecondaryBackground?: Color; + buttonSecondaryHoverBackground?: Color; + buttonSecondaryForeground?: Color; buttonBorder?: Color; } @@ -41,6 +45,9 @@ export class Button extends Disposable { private buttonBackground: Color | undefined; private buttonHoverBackground: Color | undefined; private buttonForeground: Color | undefined; + private buttonSecondaryBackground: Color | undefined; + private buttonSecondaryHoverBackground: Color | undefined; + private buttonSecondaryForeground: Color | undefined; private buttonBorder: Color | undefined; private _onDidClick = this._register(new Emitter()); @@ -54,9 +61,14 @@ export class Button extends Disposable { this.options = options || Object.create(null); mixin(this.options, defaultOptions, false); + this.buttonForeground = this.options.buttonForeground; this.buttonBackground = this.options.buttonBackground; this.buttonHoverBackground = this.options.buttonHoverBackground; - this.buttonForeground = this.options.buttonForeground; + + this.buttonSecondaryForeground = this.options.buttonSecondaryForeground; + this.buttonSecondaryBackground = this.options.buttonSecondaryBackground; + this.buttonSecondaryHoverBackground = this.options.buttonSecondaryHoverBackground; + this.buttonBorder = this.options.buttonBorder; this._element = document.createElement('a'); @@ -114,7 +126,12 @@ export class Button extends Disposable { } private setHoverBackground(): void { - const hoverBackground = this.buttonHoverBackground ? this.buttonHoverBackground.toString() : null; + let hoverBackground; + if (this.options.secondary) { + hoverBackground = this.buttonSecondaryHoverBackground ? this.buttonSecondaryHoverBackground.toString() : null; + } else { + hoverBackground = this.buttonHoverBackground ? this.buttonHoverBackground.toString() : null; + } if (hoverBackground) { this._element.style.backgroundColor = hoverBackground; } @@ -124,6 +141,9 @@ export class Button extends Disposable { this.buttonForeground = styles.buttonForeground; this.buttonBackground = styles.buttonBackground; this.buttonHoverBackground = styles.buttonHoverBackground; + this.buttonSecondaryForeground = styles.buttonSecondaryForeground; + this.buttonSecondaryBackground = styles.buttonSecondaryBackground; + this.buttonSecondaryHoverBackground = styles.buttonSecondaryHoverBackground; this.buttonBorder = styles.buttonBorder; this.applyStyles(); @@ -132,8 +152,15 @@ export class Button extends Disposable { // {{SQL CARBON EDIT}} -- removed 'private' access modifier @todo anthonydresser 4/12/19 things needs investigation whether we need this applyStyles(): void { if (this._element) { - const background = this.buttonBackground ? this.buttonBackground.toString() : ''; - const foreground = this.buttonForeground ? this.buttonForeground.toString() : ''; + let background, foreground; + if (this.options.secondary) { + foreground = this.buttonSecondaryForeground ? this.buttonSecondaryForeground.toString() : ''; + background = this.buttonSecondaryBackground ? this.buttonSecondaryBackground.toString() : ''; + } else { + foreground = this.buttonForeground ? this.buttonForeground.toString() : ''; + background = this.buttonBackground ? this.buttonBackground.toString() : ''; + } + const border = this.buttonBorder ? this.buttonBorder.toString() : ''; this._element.style.color = foreground; diff --git a/src/vs/base/browser/ui/checkbox/checkbox.ts b/src/vs/base/browser/ui/checkbox/checkbox.ts index 61ad570210..0cd3192493 100644 --- a/src/vs/base/browser/ui/checkbox/checkbox.ts +++ b/src/vs/base/browser/ui/checkbox/checkbox.ts @@ -23,6 +23,7 @@ export interface ICheckboxOpts extends ICheckboxStyles { export interface ICheckboxStyles { inputActiveOptionBorder?: Color; + inputActiveOptionForeground?: Color; inputActiveOptionBackground?: Color; } @@ -34,6 +35,7 @@ export interface ISimpleCheckboxStyles { const defaultOpts = { inputActiveOptionBorder: Color.fromHex('#007ACC00'), + inputActiveOptionForeground: Color.fromHex('#FFFFFF'), inputActiveOptionBackground: Color.fromHex('#0E639C50') }; @@ -170,6 +172,9 @@ export class Checkbox extends Widget { if (styles.inputActiveOptionBorder) { this._opts.inputActiveOptionBorder = styles.inputActiveOptionBorder; } + if (styles.inputActiveOptionForeground) { + this._opts.inputActiveOptionForeground = styles.inputActiveOptionForeground; + } if (styles.inputActiveOptionBackground) { this._opts.inputActiveOptionBackground = styles.inputActiveOptionBackground; } @@ -179,6 +184,7 @@ export class Checkbox extends Widget { protected applyStyles(): void { if (this.domNode) { this.domNode.style.borderColor = this._checked && this._opts.inputActiveOptionBorder ? this._opts.inputActiveOptionBorder.toString() : 'transparent'; + this.domNode.style.color = this._checked && this._opts.inputActiveOptionForeground ? this._opts.inputActiveOptionForeground.toString() : 'inherit'; this.domNode.style.backgroundColor = this._checked && this._opts.inputActiveOptionBackground ? this._opts.inputActiveOptionBackground.toString() : 'transparent'; } } diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf index ba25be2a8e971cbb5ff43cbc736a3ba8571c604f..691a9c3798ab212fc9c17e3dd0479ac2efb31f42 100644 GIT binary patch delta 758 zcmV006s)Xk}q!87ZKIkyI=M*8BtBk%S`=3;+NE z3UF_8bU$TS-~a&H7?HRz91BqrNnZ~<^#BV4=l}o!0NW0&-T(jq0NW0&-m?S&4;p{8 zB*-NaB|0U5CF&+DCSE42ClV(}C!i<%C{QS#DAFk^DeNjDDwHb%D@H4*E9@*5EQBne zEWj;rEsQO+E$l8>FA6VaFPtyPFYYiHFibGOFxoK+F;FpHU2heHq18;H%d3MH^zTA{5VE9hB%@)(m3`xdO5y2QaZjnC_9!s3Oq_Y zay-&J^gRMS);>}`dOrd`RzJ`{K0ug2^g$>=WI@P6GD4a{)I$D4AVXk7u0z;F5JXNy zxJ3L#LPgX@L`K3#4o8$n)<_sgghbCp8xXS-dR%i9S98 zGd@23%>g<3yu1S3yAwbC5G&VZ{2NxwHCm|mK5eFeB5f>355hFJhGXZyjhAdFKD@Q6SM=Kv6 zCpR}IyHPCxKBqqcBrLoVKK;!;J_0lPKD+{Ufh>nDPys4ORY)p7HcmHDEc!nayDa_9 zK0X1}HU0%)0rdL2v+rdL9s%o<{DVC;yaKO39wGk7M*hz~KLI%Y$O4EcA_5yG4hs^K oER!EeM>G`-Eg>WsAsiSM3n@1>5Do(sD3fl48v+}Wvx|gfW=|Xdpa1{> delta 762 zcmV006s;Xk}q!81*s^kyI=M*R%wfk%S`=5C8xI z3UF_8bU$TS-~a&H9Fe#%90^yUrC$#`^#BV4=l}o!0NV6+qW}N^0NV6+qq7774;p{A zB+4ZeB|Ig9CF~|HCSWG6Cln`2C!#0*C{ie(DAXw|DefvHDwZn*D@ZGc_HUKtiHqJK?H%vFQH^_fC{y0cDh&ZG;)HwJ#d^x~6R64*rDm$1w3_MIc zbUf5N_B{kW*gjM~d_M#~SU=K0KtP&6_CYE^Wr6*CzDCl&fWJ_0j761*(_ zi2*tKyaTE~{SrPt0y8YT6a3Qx?)v@=0yDe20JAStI1zuU1F8TQ04e}200038CpRM^ z1{4-M0Tm-6E&)CQI{_y*7Y7$N5g`#HH6t}AGamvG2O%c`6*B?&hAdFKCpR}IA0I16 zD*-A;E4xuGhQB!l0rdJiEwdBU2O#~<9|3o@0{4b2Q8!LDKPpI7M=MY*htW9&{$ByM z`VcM#+ZhS{?H?Zk&%6Ktv+HFH9s#bC_=7z)eFCsP9wGk7M*hz}J^?xY#{!EeBLW*H s4h#{KER!EfM>G`;Eg>WrA{-YM3n(}=5Do+tDU)i18v+`WvxkIbW;;9pmjD0& diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index 0a33b9a273..07475d31bf 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -73,6 +73,7 @@ export class Dialog extends Disposable { this.modal = this.container.appendChild($(`.monaco-dialog-modal-block${options.type === 'pending' ? '.dimmed' : ''}`)); this.shadowElement = this.modal.appendChild($('.dialog-shadow')); this.element = this.shadowElement.appendChild($('.monaco-dialog-box')); + this.element.setAttribute('role', 'dialog'); hide(this.element); // If no button is provided, default to OK @@ -109,6 +110,28 @@ export class Dialog extends Disposable { this.toolbarContainer = toolbarRowElement.appendChild($('.dialog-toolbar')); } + private getAriaLabel(): string { + let typeLabel = nls.localize('dialogInfoMessage', 'Info'); + switch (this.options.type) { + case 'error': + nls.localize('dialogErrorMessage', 'Error'); + break; + case 'warning': + nls.localize('dialogWarningMessage', 'Warning'); + break; + case 'pending': + nls.localize('dialogPendingMessage', 'In Progress'); + break; + case 'none': + case 'info': + case 'question': + default: + break; + } + + return `${typeLabel}: ${this.message} ${this.options.detail || ''}`; + } + updateMessage(message: string): void { if (this.messageDetailElement) { this.messageDetailElement.innerText = message; @@ -242,7 +265,7 @@ export class Dialog extends Disposable { this.applyStyles(); - this.element.setAttribute('aria-label', this.message); + this.element.setAttribute('aria-label', this.getAriaLabel()); show(this.element); // Focus first element diff --git a/src/vs/base/browser/ui/dropdown/dropdown.ts b/src/vs/base/browser/ui/dropdown/dropdown.ts index 8421f003f3..933f406be1 100644 --- a/src/vs/base/browser/ui/dropdown/dropdown.ts +++ b/src/vs/base/browser/ui/dropdown/dropdown.ts @@ -214,6 +214,7 @@ export interface IDropdownMenuOptions extends IBaseDropdownOptions { actions?: ReadonlyArray; actionProvider?: IActionProvider; menuClassName?: string; + menuAsChild?: boolean; // scope down for #99448 } export class DropdownMenu extends BaseDropdown { @@ -222,6 +223,7 @@ export class DropdownMenu extends BaseDropdown { private _actions: ReadonlyArray = []; private actionProvider?: IActionProvider; private menuClassName: string; + private menuAsChild?: boolean; constructor(container: HTMLElement, options: IDropdownMenuOptions) { super(container, options); @@ -230,6 +232,7 @@ export class DropdownMenu extends BaseDropdown { this.actions = options.actions || []; this.actionProvider = options.actionProvider; this.menuClassName = options.menuClassName || ''; + this.menuAsChild = !!options.menuAsChild; } set menuOptions(options: IMenuOptions | undefined) { @@ -267,7 +270,7 @@ export class DropdownMenu extends BaseDropdown { onHide: () => this.onHide(), actionRunner: this.menuOptions ? this.menuOptions.actionRunner : undefined, anchorAlignment: this.menuOptions ? this.menuOptions.anchorAlignment : AnchorAlignment.LEFT, - anchorAsContainer: true + anchorAsContainer: this.menuAsChild }); } @@ -289,10 +292,11 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { private keybindings?: (action: IAction) => ResolvedKeybinding | undefined; private clazz: string | undefined; private anchorAlignmentProvider: (() => AnchorAlignment) | undefined; + private menuAsChild?: boolean; - constructor(action: IAction, menuActions: ReadonlyArray, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment); - constructor(action: IAction, actionProvider: IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment); - constructor(action: IAction, menuActionsOrProvider: ReadonlyArray | IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment) { + constructor(action: IAction, menuActions: ReadonlyArray, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean); + constructor(action: IAction, actionProvider: IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean); + constructor(action: IAction, menuActionsOrProvider: ReadonlyArray | IActionProvider, contextMenuProvider: IContextMenuProvider, actionViewItemProvider: IActionViewItemProvider | undefined, actionRunner: IActionRunner, keybindings: ((action: IAction) => ResolvedKeybinding | undefined) | undefined, clazz: string | undefined, anchorAlignmentProvider?: () => AnchorAlignment, menuAsChild?: boolean) { super(null, action); this.menuActionsOrProvider = menuActionsOrProvider; @@ -302,6 +306,7 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { this.keybindings = keybindings; this.clazz = clazz; this.anchorAlignmentProvider = anchorAlignmentProvider; + this.menuAsChild = menuAsChild; } render(container: HTMLElement): void { @@ -322,7 +327,8 @@ export class DropdownMenuActionViewItem extends BaseActionViewItem { const options: IDropdownMenuOptions = { contextMenuProvider: this.contextMenuProvider, - labelRenderer: labelRenderer + labelRenderer: labelRenderer, + menuAsChild: this.menuAsChild }; // Render the DropdownMenu around a simple action to toggle it diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 6cf8e814a6..a5e7d3adbd 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -35,6 +35,7 @@ export interface IFindInputOptions extends IFindInputStyles { export interface IFindInputStyles extends IInputBoxStyles { inputActiveOptionBorder?: Color; + inputActiveOptionForeground?: Color; inputActiveOptionBackground?: Color; } @@ -51,6 +52,7 @@ export class FindInput extends Widget { private fixFocusOnOptionClickEnabled = true; private inputActiveOptionBorder?: Color; + private inputActiveOptionForeground?: Color; private inputActiveOptionBackground?: Color; private inputBackground?: Color; private inputForeground?: Color; @@ -101,6 +103,7 @@ export class FindInput extends Widget { this.label = options.label || NLS_DEFAULT_LABEL; this.inputActiveOptionBorder = options.inputActiveOptionBorder; + this.inputActiveOptionForeground = options.inputActiveOptionForeground; this.inputActiveOptionBackground = options.inputActiveOptionBackground; this.inputBackground = options.inputBackground; this.inputForeground = options.inputForeground; @@ -155,6 +158,7 @@ export class FindInput extends Widget { appendTitle: appendRegexLabel, isChecked: false, inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground })); this._register(this.regex.onChange(viaKeyboard => { @@ -172,6 +176,7 @@ export class FindInput extends Widget { appendTitle: appendWholeWordsLabel, isChecked: false, inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground })); this._register(this.wholeWords.onChange(viaKeyboard => { @@ -186,6 +191,7 @@ export class FindInput extends Widget { appendTitle: appendCaseSensitiveLabel, isChecked: false, inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground })); this._register(this.caseSensitive.onChange(viaKeyboard => { @@ -301,6 +307,7 @@ export class FindInput extends Widget { public style(styles: IFindInputStyles): void { this.inputActiveOptionBorder = styles.inputActiveOptionBorder; + this.inputActiveOptionForeground = styles.inputActiveOptionForeground; this.inputActiveOptionBackground = styles.inputActiveOptionBackground; this.inputBackground = styles.inputBackground; this.inputForeground = styles.inputForeground; @@ -323,6 +330,7 @@ export class FindInput extends Widget { if (this.domNode) { const checkBoxStyles: ICheckboxStyles = { inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground, }; this.regex.style(checkBoxStyles); diff --git a/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts b/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts index 0f34a7f0a5..6438139494 100644 --- a/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts +++ b/src/vs/base/browser/ui/findinput/findInputCheckboxes.ts @@ -12,6 +12,7 @@ export interface IFindInputCheckboxOpts { readonly appendTitle: string; readonly isChecked: boolean; readonly inputActiveOptionBorder?: Color; + readonly inputActiveOptionForeground?: Color; readonly inputActiveOptionBackground?: Color; } @@ -26,6 +27,7 @@ export class CaseSensitiveCheckbox extends Checkbox { title: NLS_CASE_SENSITIVE_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, inputActiveOptionBackground: opts.inputActiveOptionBackground }); } @@ -38,6 +40,7 @@ export class WholeWordsCheckbox extends Checkbox { title: NLS_WHOLE_WORD_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, inputActiveOptionBackground: opts.inputActiveOptionBackground }); } @@ -50,6 +53,7 @@ export class RegexCheckbox extends Checkbox { title: NLS_REGEX_CHECKBOX_LABEL + opts.appendTitle, isChecked: opts.isChecked, inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, inputActiveOptionBackground: opts.inputActiveOptionBackground }); } diff --git a/src/vs/base/browser/ui/findinput/replaceInput.ts b/src/vs/base/browser/ui/findinput/replaceInput.ts index bfbbe3b02a..321ebeefd2 100644 --- a/src/vs/base/browser/ui/findinput/replaceInput.ts +++ b/src/vs/base/browser/ui/findinput/replaceInput.ts @@ -33,6 +33,7 @@ export interface IReplaceInputOptions extends IReplaceInputStyles { export interface IReplaceInputStyles extends IInputBoxStyles { inputActiveOptionBorder?: Color; + inputActiveOptionForeground?: Color; inputActiveOptionBackground?: Color; } @@ -47,6 +48,7 @@ export class PreserveCaseCheckbox extends Checkbox { title: NLS_PRESERVE_CASE_LABEL + opts.appendTitle, isChecked: opts.isChecked, inputActiveOptionBorder: opts.inputActiveOptionBorder, + inputActiveOptionForeground: opts.inputActiveOptionForeground, inputActiveOptionBackground: opts.inputActiveOptionBackground }); } @@ -63,6 +65,7 @@ export class ReplaceInput extends Widget { private fixFocusOnOptionClickEnabled = true; private inputActiveOptionBorder?: Color; + private inputActiveOptionForeground?: Color; private inputActiveOptionBackground?: Color; private inputBackground?: Color; private inputForeground?: Color; @@ -109,6 +112,7 @@ export class ReplaceInput extends Widget { this.label = options.label || NLS_DEFAULT_LABEL; this.inputActiveOptionBorder = options.inputActiveOptionBorder; + this.inputActiveOptionForeground = options.inputActiveOptionForeground; this.inputActiveOptionBackground = options.inputActiveOptionBackground; this.inputBackground = options.inputBackground; this.inputForeground = options.inputForeground; @@ -160,6 +164,7 @@ export class ReplaceInput extends Widget { appendTitle: '', isChecked: false, inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground, })); this._register(this.preserveCase.onChange(viaKeyboard => { @@ -271,6 +276,7 @@ export class ReplaceInput extends Widget { public style(styles: IReplaceInputStyles): void { this.inputActiveOptionBorder = styles.inputActiveOptionBorder; + this.inputActiveOptionForeground = styles.inputActiveOptionForeground; this.inputActiveOptionBackground = styles.inputActiveOptionBackground; this.inputBackground = styles.inputBackground; this.inputForeground = styles.inputForeground; @@ -293,6 +299,7 @@ export class ReplaceInput extends Widget { if (this.domNode) { const checkBoxStyles: ICheckboxStyles = { inputActiveOptionBorder: this.inputActiveOptionBorder, + inputActiveOptionForeground: this.inputActiveOptionForeground, inputActiveOptionBackground: this.inputActiveOptionBackground, }; this.preserveCase.style(checkBoxStyles); diff --git a/src/vs/base/browser/ui/hover/hover.css b/src/vs/base/browser/ui/hover/hover.css index 353df14170..9f9198d984 100644 --- a/src/vs/base/browser/ui/hover/hover.css +++ b/src/vs/base/browser/ui/hover/hover.css @@ -35,6 +35,7 @@ } .monaco-hover p, +.monaco-hover .code, .monaco-hover ul { margin: 8px 0; } @@ -45,18 +46,20 @@ .monaco-hover hr { margin-top: 4px; - margin-bottom: -6px; + margin-bottom: -4px; margin-left: -10px; margin-right: -10px; height: 1px; } .monaco-hover p:first-child, +.monaco-hover .code:first-child, .monaco-hover ul:first-child { margin-top: 0; } .monaco-hover p:last-child, +.monaco-hover .code:last-child, .monaco-hover ul:last-child { margin-bottom: 0; } diff --git a/src/vs/base/browser/ui/iconLabel/iconlabel.css b/src/vs/base/browser/ui/iconLabel/iconlabel.css index 3ba7eb28d0..75a3d058e0 100644 --- a/src/vs/base/browser/ui/iconLabel/iconlabel.css +++ b/src/vs/base/browser/ui/iconLabel/iconlabel.css @@ -55,6 +55,10 @@ white-space: pre; /* enable to show labels that include multiple whitespaces */ } +.vs .monaco-icon-label > .monaco-icon-label-container > .monaco-icon-description-container > .label-description { + opacity: .95; +} + .monaco-icon-label.italic > .monaco-icon-label-container > .monaco-icon-name-container > .label-name, .monaco-icon-label.italic > .monaco-icon-description-container > .label-description { font-style: italic; diff --git a/src/vs/base/browser/ui/list/listPaging.ts b/src/vs/base/browser/ui/list/listPaging.ts index 8c730ca86f..79f4c412f3 100644 --- a/src/vs/base/browser/ui/list/listPaging.ts +++ b/src/vs/base/browser/ui/list/listPaging.ts @@ -6,12 +6,13 @@ import 'vs/css!./list'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import { range } from 'vs/base/common/arrays'; -import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent } from './list'; -import { List, IListStyles, IListOptions, IListAccessibilityProvider } from './listWidget'; +import { IListVirtualDelegate, IListRenderer, IListEvent, IListContextMenuEvent, IListMouseEvent } from './list'; +import { List, IListStyles, IListOptions, IListAccessibilityProvider, IListOptionsUpdate } from './listWidget'; import { IPagedModel } from 'vs/base/common/paging'; import { Event } from 'vs/base/common/event'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; +import { IThemable } from 'vs/base/common/styler'; export interface IPagedRenderer extends IListRenderer { renderPlaceholder(index: number, templateData: TTemplateData): void; @@ -119,7 +120,7 @@ function fromPagedListOptions(modelProvider: () => IPagedModel, options: I }; } -export class PagedList implements IDisposable { +export class PagedList implements IThemable, IDisposable { private list: List; private _model!: IPagedModel; @@ -136,6 +137,10 @@ export class PagedList implements IDisposable { this.list = new List(user, container, virtualDelegate, pagedRenderers, fromPagedListOptions(modelProvider, options)); } + updateOptions(options: IListOptionsUpdate) { + this.list.updateOptions(options); + } + getHTMLElement(): HTMLElement { return this.list.getHTMLElement(); } @@ -164,22 +169,30 @@ export class PagedList implements IDisposable { return this.list.onDidDispose; } + get onMouseClick(): Event> { + return Event.map(this.list.onMouseClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onMouseDblClick(): Event> { + return Event.map(this.list.onMouseDblClick, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onTap(): Event> { + return Event.map(this.list.onTap, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + + get onPointer(): Event> { + return Event.map(this.list.onPointer, ({ element, index, browserEvent }) => ({ element: element === undefined ? undefined : this._model.get(element), index, browserEvent })); + } + get onDidChangeFocus(): Event> { return Event.map(this.list.onDidChangeFocus, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); } - get onDidOpen(): Event> { - return Event.map(this.list.onDidOpen, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); - } - get onDidChangeSelection(): Event> { return Event.map(this.list.onDidChangeSelection, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); } - get onPin(): Event> { - return Event.map(this.list.onDidPin, ({ elements, indexes, browserEvent }) => ({ elements: elements.map(e => this._model.get(e)), indexes, browserEvent })); - } - get onContextMenu(): Event> { return Event.map(this.list.onContextMenu, ({ element, index, anchor, browserEvent }) => (typeof element === 'undefined' ? { element, index, anchor, browserEvent } : { element: this._model.get(element), index, anchor, browserEvent })); } @@ -213,10 +226,6 @@ export class PagedList implements IDisposable { this.list.scrollLeft = scrollLeft; } - open(indexes: number[], browserEvent?: UIEvent): void { - this.list.open(indexes, browserEvent); - } - setFocus(indexes: number[]): void { this.list.setFocus(indexes); } diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index f3e9a95aa3..80c8d9849e 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -51,6 +51,7 @@ export interface IListViewAccessibilityProvider { export interface IListViewOptionsUpdate { readonly additionalScrollHeight?: number; readonly smoothScrolling?: boolean; + readonly horizontalScrolling?: boolean; } export interface IListViewOptions extends IListViewOptionsUpdate { @@ -61,7 +62,6 @@ export interface IListViewOptions extends IListViewOptionsUpdate { readonly setRowHeight?: boolean; readonly supportDynamicHeights?: boolean; readonly mouseSupport?: boolean; - readonly horizontalScrolling?: boolean; readonly accessibilityProvider?: IListViewAccessibilityProvider; readonly transformOptimization?: boolean; } @@ -86,7 +86,14 @@ const DefaultOptions = { export class ElementsDragAndDropData implements IDragAndDropData { readonly elements: T[]; - context: TContext | undefined; + + private _context: TContext | undefined; + public get context(): TContext | undefined { + return this._context; + } + public set context(value: TContext | undefined) { + this._context = value; + } constructor(elements: T[]) { this.elements = elements; @@ -220,7 +227,6 @@ export class ListView implements ISpliceable, IDisposable { private setRowLineHeight: boolean; private setRowHeight: boolean; private supportDynamicHeights: boolean; - private horizontalScrolling: boolean; private additionalScrollHeight: number; private accessibilityProvider: ListViewAccessibilityProvider; private scrollWidth: number | undefined; @@ -242,6 +248,35 @@ export class ListView implements ISpliceable, IDisposable { get onWillScroll(): Event { return this.scrollableElement.onWillScroll; } get containerDomNode(): HTMLElement { return this.rowsContainer; } + private _horizontalScrolling: boolean = false; + private get horizontalScrolling(): boolean { return this._horizontalScrolling; } + private set horizontalScrolling(value: boolean) { + if (value === this._horizontalScrolling) { + return; + } + + if (value && this.supportDynamicHeights) { + throw new Error('Horizontal scrolling and dynamic heights not supported simultaneously'); + } + + this._horizontalScrolling = value; + DOM.toggleClass(this.domNode, 'horizontal-scrolling', this._horizontalScrolling); + + if (this._horizontalScrolling) { + for (const item of this.items) { + this.measureItemWidth(item); + } + + this.updateScrollWidth(); + this.scrollableElement.setScrollDimensions({ width: DOM.getContentWidth(this.domNode) }); + this.rowsContainer.style.width = `${Math.max(this.scrollWidth || 0, this.renderWidth)}px`; + } else { + this.scrollableElementWidthDelayer.cancel(); + this.scrollableElement.setScrollDimensions({ width: this.renderWidth, scrollWidth: this.renderWidth }); + this.rowsContainer.style.width = ''; + } + } + constructor( container: HTMLElement, private virtualDelegate: IListVirtualDelegate, @@ -273,8 +308,8 @@ export class ListView implements ISpliceable, IDisposable { DOM.toggleClass(this.domNode, 'mouse-support', typeof options.mouseSupport === 'boolean' ? options.mouseSupport : true); - this.horizontalScrolling = getOrDefault(options, o => o.horizontalScrolling, DefaultOptions.horizontalScrolling); - DOM.toggleClass(this.domNode, 'horizontal-scrolling', this.horizontalScrolling); + this._horizontalScrolling = getOrDefault(options, o => o.horizontalScrolling, DefaultOptions.horizontalScrolling); + DOM.toggleClass(this.domNode, 'horizontal-scrolling', this._horizontalScrolling); this.additionalScrollHeight = typeof options.additionalScrollHeight === 'undefined' ? 0 : options.additionalScrollHeight; @@ -293,7 +328,7 @@ export class ListView implements ISpliceable, IDisposable { this.scrollable = new Scrollable(getOrDefault(options, o => o.smoothScrolling, false) ? 125 : 0, cb => DOM.scheduleAtNextAnimationFrame(cb)); this.scrollableElement = this.disposables.add(new SmoothScrollableElement(this.rowsContainer, { alwaysConsumeMouseWheel: true, - horizontal: this.horizontalScrolling ? ScrollbarVisibility.Auto : ScrollbarVisibility.Hidden, + horizontal: ScrollbarVisibility.Auto, vertical: getOrDefault(options, o => o.verticalScrollMode, DefaultOptions.verticalScrollMode), useShadows: getOrDefault(options, o => o.useShadows, DefaultOptions.useShadows), }, this.scrollable)); @@ -322,7 +357,7 @@ export class ListView implements ISpliceable, IDisposable { this.layout(); } - updateOptions(options: IListViewOptions) { + updateOptions(options: IListViewOptionsUpdate) { if (options.additionalScrollHeight !== undefined) { this.additionalScrollHeight = options.additionalScrollHeight; } @@ -330,6 +365,10 @@ export class ListView implements ISpliceable, IDisposable { if (options.smoothScrolling !== undefined) { this.scrollable.setSmoothScrollDuration(options.smoothScrolling ? 125 : 0); } + + if (options.horizontalScrolling !== undefined) { + this.horizontalScrolling = options.horizontalScrolling; + } } triggerScrollFromMouseWheelEvent(browserEvent: IMouseWheelEvent) { @@ -478,6 +517,7 @@ export class ListView implements ISpliceable, IDisposable { private eventuallyUpdateScrollWidth(): void { if (!this.horizontalScrolling) { + this.scrollableElementWidthDelayer.cancel(); return; } @@ -489,10 +529,6 @@ export class ListView implements ISpliceable, IDisposable { return; } - if (this.items.length === 0) { - this.scrollableElement.setScrollDimensions({ scrollWidth: 0 }); - } - let scrollWidth = 0; for (const item of this.items) { @@ -502,7 +538,7 @@ export class ListView implements ISpliceable, IDisposable { } this.scrollWidth = scrollWidth; - this.scrollableElement.setScrollDimensions({ scrollWidth: scrollWidth + 10 }); + this.scrollableElement.setScrollDimensions({ scrollWidth: scrollWidth === 0 ? 0 : (scrollWidth + 10) }); } updateWidth(index: number): void { diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 7547418095..d9bed479d9 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -26,6 +26,7 @@ import { clamp } from 'vs/base/common/numbers'; import { matchesPrefix } from 'vs/base/common/filters'; import { IDragAndDropData } from 'vs/base/browser/dnd'; import { alert } from 'vs/base/browser/ui/aria/aria'; +import { IThemable } from 'vs/base/common/styler'; interface ITraitChangeEvent { indexes: number[]; @@ -231,7 +232,6 @@ function isInputElement(e: HTMLElement): boolean { class KeyboardController implements IDisposable { private readonly disposables = new DisposableStore(); - private openController: IOpenController; constructor( private list: List, @@ -240,8 +240,6 @@ class KeyboardController implements IDisposable { ) { const multipleSelectionSupport = options.multipleSelectionSupport !== false; - this.openController = options.openController || DefaultOpenController; - const onKeyDown = Event.chain(domEvent(view.domNode, 'keydown')) .filter(e => !isInputElement(e.target as HTMLElement)) .map(e => new StandardKeyboardEvent(e)); @@ -262,10 +260,6 @@ class KeyboardController implements IDisposable { e.preventDefault(); e.stopPropagation(); this.list.setSelection(this.list.getFocus(), e.browserEvent); - - if (this.openController.shouldOpen(e.browserEvent)) { - this.list.open(this.list.getFocus(), e.browserEvent); - } } private onUpArrow(e: StandardKeyboardEvent): void { @@ -527,24 +521,16 @@ const DefaultMultipleSelectionController = { isSelectionRangeChangeEvent }; -const DefaultOpenController: IOpenController = { - shouldOpen: (event: UIEvent) => { - if (event instanceof MouseEvent) { - return !isMouseRightClick(event); - } - - return true; - } -}; - export class MouseController implements IDisposable { private multipleSelectionSupport: boolean; readonly multipleSelectionController: IMultipleSelectionController | undefined; - private openController: IOpenController; private mouseSupport: boolean; private readonly disposables = new DisposableStore(); + private _onPointer = new Emitter>(); + readonly onPointer: Event> = this._onPointer.event; + constructor(protected list: List) { this.multipleSelectionSupport = !(list.options.multipleSelectionSupport === false); @@ -552,7 +538,6 @@ export class MouseController implements IDisposable { this.multipleSelectionController = list.options.multipleSelectionController || DefaultMultipleSelectionController; } - this.openController = list.options.openController || DefaultOpenController; this.mouseSupport = typeof list.options.mouseSupport === 'undefined' || !!list.options.mouseSupport; if (this.mouseSupport) { @@ -563,9 +548,7 @@ export class MouseController implements IDisposable { this.disposables.add(Gesture.addTarget(list.getHTMLElement())); } - list.onMouseClick(this.onPointer, this, this.disposables); - list.onMouseMiddleClick(this.onPointer, this, this.disposables); - list.onTap(this.onPointer, this, this.disposables); + Event.any(list.onMouseClick, list.onMouseMiddleClick, list.onTap)(this.onViewPointer, this, this.disposables); } protected isSelectionSingleChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { @@ -599,7 +582,7 @@ export class MouseController implements IDisposable { this.list.setFocus(focus, e.browserEvent); } - protected onPointer(e: IListMouseEvent): void { + protected onViewPointer(e: IListMouseEvent): void { if (!this.mouseSupport) { return; } @@ -632,11 +615,9 @@ export class MouseController implements IDisposable { if (!isMouseRightClick(e.browserEvent)) { this.list.setSelection([focus], e.browserEvent); - - if (this.openController.shouldOpen(e.browserEvent)) { - this.list.open([focus], e.browserEvent); - } } + + this._onPointer.fire(e); } protected onDoubleClick(e: IListMouseEvent): void { @@ -650,7 +631,6 @@ export class MouseController implements IDisposable { const focus = this.list.getFocus(); this.list.setSelection(focus, e.browserEvent); - this.list.pin(focus); } private changeSelection(e: IListMouseEvent | IListTouchEvent, reference: number | undefined): void { @@ -694,10 +674,6 @@ export interface IMultipleSelectionController { isSelectionRangeChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean; } -export interface IOpenController { - shouldOpen(event: UIEvent): boolean; -} - export interface IStyleController { style(styles: IListStyles): void; } @@ -841,7 +817,6 @@ export interface IListOptions { readonly keyboardSupport?: boolean; readonly multipleSelectionSupport?: boolean; readonly multipleSelectionController?: IMultipleSelectionController; - readonly openController?: IOpenController; readonly styleController?: (suffix: string) => IStyleController; readonly accessibilityProvider?: IListAccessibilityProvider; @@ -1112,7 +1087,7 @@ export interface IListOptionsUpdate extends IListViewOptionsUpdate { readonly automaticKeyboardNavigation?: boolean; } -export class List implements ISpliceable, IDisposable { +export class List implements ISpliceable, IThemable, IDisposable { private focus: Trait; private selection: Trait; @@ -1122,6 +1097,7 @@ export class List implements ISpliceable, IDisposable { private styleController: IStyleController; private typeLabelController?: TypeLabelController; private accessibilityProvider?: IListAccessibilityProvider; + private mouseController: MouseController; private _ariaLabel: string = ''; protected readonly disposables = new DisposableStore(); @@ -1134,17 +1110,12 @@ export class List implements ISpliceable, IDisposable { return Event.map(this.eventBufferer.wrapEvent(this.selection.onChange), e => this.toListEvent(e)); } - private readonly _onDidOpen = new Emitter>(); - readonly onDidOpen: Event> = this._onDidOpen.event; - - private readonly _onDidPin = new Emitter>(); - readonly onDidPin: Event> = this._onDidPin.event; - get domId(): string { return this.view.domId; } get onDidScroll(): Event { return this.view.onDidScroll; } get onMouseClick(): Event> { return this.view.onMouseClick; } get onMouseDblClick(): Event> { return this.view.onMouseDblClick; } get onMouseMiddleClick(): Event> { return this.view.onMouseMiddleClick; } + get onPointer(): Event> { return this.mouseController.onPointer; } get onMouseUp(): Event> { return this.view.onMouseUp; } get onMouseDown(): Event> { return this.view.onMouseDown; } get onMouseOver(): Event> { return this.view.onMouseOver; } @@ -1263,7 +1234,8 @@ export class List implements ISpliceable, IDisposable { this.disposables.add(this.typeLabelController); } - this.disposables.add(this.createMouseController(_options)); + this.mouseController = this.createMouseController(_options); + this.disposables.add(this.mouseController); this.onDidChangeFocus(this._onFocusChange, this, this.disposables); this.onDidChangeSelection(this._onSelectionChange, this, this.disposables); @@ -1625,26 +1597,6 @@ export class List implements ISpliceable, IDisposable { return this.view.domNode; } - open(indexes: number[], browserEvent?: UIEvent): void { - for (const index of indexes) { - if (index < 0 || index >= this.length) { - throw new ListError(this.user, `Invalid index ${index}`); - } - } - - this._onDidOpen.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent }); - } - - pin(indexes: number[], browserEvent?: UIEvent): void { - for (const index of indexes) { - if (index < 0 || index >= this.length) { - throw new ListError(this.user, `Invalid index ${index}`); - } - } - - this._onDidPin.fire({ indexes, elements: indexes.map(i => this.view.element(i)), browserEvent }); - } - style(styles: IListStyles): void { this.styleController.style(styles); } @@ -1687,8 +1639,6 @@ export class List implements ISpliceable, IDisposable { this._onDidDispose.fire(); this.disposables.dispose(); - this._onDidOpen.dispose(); - this._onDidPin.dispose(); this._onDidDispose.dispose(); } } diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index f803cb6f63..9eb049888c 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -446,6 +446,16 @@ export class MenuBar extends Disposable { return this.container.clientHeight; } + toggleFocus(): void { + if (!this.isFocused && this.options.visibility !== 'hidden') { + this.mnemonicsInUse = true; + this.focusedMenu = { index: this.numMenusShown > 0 ? 0 : MenuBar.OVERFLOW_INDEX }; + this.focusState = MenubarState.FOCUSED; + } else if (!this.isOpen) { + this.setUnfocusedState(); + } + } + private updateOverflowAction(): void { if (!this.menuCache || !this.menuCache.length) { return; diff --git a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts index da2d9c7db6..88caef66f0 100644 --- a/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +++ b/src/vs/base/browser/ui/scrollbar/scrollableElement.ts @@ -343,7 +343,13 @@ export abstract class AbstractScrollableElement extends Widget { const classifier = MouseWheelClassifier.INSTANCE; if (SCROLL_WHEEL_SMOOTH_SCROLL_ENABLED) { - classifier.accept(Date.now(), e.deltaX, e.deltaY); + if (platform.isWindows) { + // On Windows, the incoming delta events are multiplied with the device pixel ratio, + // so to get a better classification, simply undo that. + classifier.accept(Date.now(), e.deltaX / window.devicePixelRatio, e.deltaY / window.devicePixelRatio); + } else { + classifier.accept(Date.now(), e.deltaX, e.deltaY); + } } // console.log(`${Date.now()}, ${e.deltaY}, ${e.deltaX}`); diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.css b/src/vs/base/browser/ui/selectBox/selectBoxCustom.css index 40f7dce9ba..55fcf4025c 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.css +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.css @@ -30,7 +30,7 @@ .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown code { line-height: 15px; /** For some reason, this is needed, otherwise will take up 20px height */ - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; + font-family: var(--monaco-monospace-font); } diff --git a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts index 7ff01fb105..4aeab6db37 100644 --- a/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts +++ b/src/vs/base/browser/ui/selectBox/selectBoxCustom.ts @@ -475,6 +475,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi // Track initial selection the case user escape, blur this._currentSelection = this.selected; this._isVisible = true; + this.selectElement.setAttribute('aria-expanded', 'true'); } private hideSelectDropDown(focusSelect: boolean) { @@ -483,6 +484,7 @@ export class SelectBoxList extends Disposable implements ISelectBoxDelegate, ILi } this._isVisible = false; + this.selectElement.setAttribute('aria-expanded', 'false'); if (focusSelect) { this.selectElement.focus(); diff --git a/src/vs/base/browser/ui/splitview/paneview.css b/src/vs/base/browser/ui/splitview/paneview.css index add5d05934..5efaccd718 100644 --- a/src/vs/base/browser/ui/splitview/paneview.css +++ b/src/vs/base/browser/ui/splitview/paneview.css @@ -29,6 +29,7 @@ display: flex; cursor: pointer; align-items: center; + box-sizing: border-box; } .monaco-pane-view .pane.horizontal:not(.expanded) > .pane-header { diff --git a/src/vs/base/browser/ui/toolbar/toolbar.ts b/src/vs/base/browser/ui/toolbar/toolbar.ts index 0bb6b36e1d..edbe2f8c7e 100644 --- a/src/vs/base/browser/ui/toolbar/toolbar.ts +++ b/src/vs/base/browser/ui/toolbar/toolbar.ts @@ -69,7 +69,8 @@ export class ToolBar extends Disposable { this.actionRunner, this.options.getKeyBinding, toolBarMoreIcon.classNames, - this.options.anchorAlignmentProvider + this.options.anchorAlignmentProvider, + true ); this.toggleMenuActionViewItem.value.setActionContext(this.actionBar.context); diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index f6283d69bd..db3f01b75e 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { IListOptions, List, IListStyles, MouseController, DefaultKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/listWidget'; -import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list'; +import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider, IKeyboardNavigationDelegate } from 'vs/base/browser/ui/list/list'; import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass, hasParentWithClass, createStyleSheet, clearNode, addClasses, removeClasses } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; @@ -22,7 +22,6 @@ import { getVisibleState, isFilterResult } from 'vs/base/browser/ui/tree/indexTr import { localize } from 'vs/nls'; import { disposableTimeout } from 'vs/base/common/async'; import { isMacintosh } from 'vs/base/common/platform'; -import { values } from 'vs/base/common/map'; import { clamp } from 'vs/base/common/numbers'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { SetMap } from 'vs/base/common/collections'; @@ -922,13 +921,6 @@ function isInputElement(e: HTMLElement): boolean { return e.tagName === 'INPUT' || e.tagName === 'TEXTAREA'; } -function asTreeEvent(event: IListEvent>): ITreeEvent { - return { - elements: event.elements.map(node => node.element), - browserEvent: event.browserEvent - }; -} - function asTreeMouseEvent(event: IListMouseEvent>): ITreeMouseEvent { let target: TreeMouseEventTarget = TreeMouseEventTarget.Unknown; @@ -961,8 +953,8 @@ export interface IAbstractTreeOptionsUpdate extends ITreeRendererOptions { readonly automaticKeyboardNavigation?: boolean; readonly simpleKeyboardNavigation?: boolean; readonly filterOnType?: boolean; - readonly openOnSingleClick?: boolean; readonly smoothScrolling?: boolean; + readonly horizontalScrolling?: boolean; } export interface IAbstractTreeOptions extends IAbstractTreeOptionsUpdate, IListOptions { @@ -1042,7 +1034,7 @@ class Trait { const set = this.createNodeSet(); const visit = (node: ITreeNode) => set.delete(node); deletedNodes.forEach(node => dfs(node, visit)); - this.set(values(set)); + this.set([...set.values()]); return; } @@ -1091,7 +1083,7 @@ class TreeNodeListMouseController extends MouseController< super(list); } - protected onPointer(e: IListMouseEvent>): void { + protected onViewPointer(e: IListMouseEvent>): void { if (isInputElement(e.browserEvent.target as HTMLElement)) { return; } @@ -1099,19 +1091,14 @@ class TreeNodeListMouseController extends MouseController< const node = e.element; if (!node) { - return super.onPointer(e); + return super.onViewPointer(e); } if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) { - return super.onPointer(e); + return super.onViewPointer(e); } const onTwistie = hasClass(e.browserEvent.target as HTMLElement, 'monaco-tl-twistie'); - - if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2 && !onTwistie) { - return super.onPointer(e); - } - let expandOnlyOnTwistieClick = false; if (typeof this.tree.expandOnlyOnTwistieClick === 'function') { @@ -1121,7 +1108,7 @@ class TreeNodeListMouseController extends MouseController< } if (expandOnlyOnTwistieClick && !onTwistie) { - return super.onPointer(e); + return super.onViewPointer(e); } if (node.collapsible) { @@ -1135,7 +1122,7 @@ class TreeNodeListMouseController extends MouseController< } } - super.onPointer(e); + super.onViewPointer(e); } protected onDoubleClick(e: IListMouseEvent>): void { @@ -1238,12 +1225,12 @@ export abstract class AbstractTree implements IDisposable get onDidChangeFocus(): Event> { return this.eventBufferer.wrapEvent(this.focus.onDidChange); } get onDidChangeSelection(): Event> { return this.eventBufferer.wrapEvent(this.selection.onDidChange); } - get onDidOpen(): Event> { return Event.map(this.view.onDidOpen, asTreeEvent); } - get onDidPin(): Event> { return Event.map(this.view.onDidPin, asTreeEvent); } get onMouseClick(): Event> { return Event.map(this.view.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.view.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.view.onContextMenu, asTreeContextMenuEvent); } + get onTap(): Event> { return Event.map(this.view.onTap, asTreeMouseEvent); } + get onPointer(): Event> { return Event.map(this.view.onPointer, asTreeMouseEvent); } get onKeyDown(): Event { return this.view.onKeyDown; } get onKeyUp(): Event { return this.view.onKeyUp; } @@ -1261,7 +1248,6 @@ export abstract class AbstractTree implements IDisposable get filterOnType(): boolean { return !!this._options.filterOnType; } get onDidChangeTypeFilterPattern(): Event { return this.typeFilterController ? this.typeFilterController.onDidChangePattern : Event.None; } - get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; } get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; } private readonly _onDidUpdateOptions = new Emitter>(); @@ -1328,7 +1314,7 @@ export abstract class AbstractTree implements IDisposable set.add(node); } - return values(set); + return [...set.values()]; }).event; if (_options.keyboardSupport !== false) { @@ -1362,7 +1348,8 @@ export abstract class AbstractTree implements IDisposable this.view.updateOptions({ enableKeyboardNavigation: this._options.simpleKeyboardNavigation, automaticKeyboardNavigation: this._options.automaticKeyboardNavigation, - smoothScrolling: this._options.smoothScrolling + smoothScrolling: this._options.smoothScrolling, + horizontalScrolling: this._options.horizontalScrolling }); if (this.typeFilterController) { @@ -1601,11 +1588,6 @@ export abstract class AbstractTree implements IDisposable return this.focus.get(); } - open(elements: TRef[], browserEvent?: UIEvent): void { - const indexes = elements.map(e => this.model.getListIndex(e)).filter(i => i >= 0); - this.view.open(indexes, browserEvent); - } - reveal(location: TRef, relativeTop?: number): void { this.model.expandTo(location); diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index a9a7328548..1c1512bac4 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -16,7 +16,6 @@ import { IDragAndDropData } from 'vs/base/browser/dnd'; import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors'; import { removeClasses, addClasses } from 'vs/base/browser/dom'; -import { values } from 'vs/base/common/map'; import { ScrollEvent } from 'vs/base/common/scrollable'; import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { IThemable } from 'vs/base/common/styler'; @@ -331,12 +330,13 @@ export class AsyncDataTree implements IDisposable get onDidChangeFocus(): Event> { return Event.map(this.tree.onDidChangeFocus, asTreeEvent); } get onDidChangeSelection(): Event> { return Event.map(this.tree.onDidChangeSelection, asTreeEvent); } - get onDidOpen(): Event> { return Event.map(this.tree.onDidOpen, asTreeEvent); } get onKeyDown(): Event { return this.tree.onKeyDown; } get onMouseClick(): Event> { return Event.map(this.tree.onMouseClick, asTreeMouseEvent); } get onMouseDblClick(): Event> { return Event.map(this.tree.onMouseDblClick, asTreeMouseEvent); } get onContextMenu(): Event> { return Event.map(this.tree.onContextMenu, asTreeContextMenuEvent); } + get onTap(): Event> { return Event.map(this.tree.onTap, asTreeMouseEvent); } + get onPointer(): Event> { return Event.map(this.tree.onPointer, asTreeMouseEvent); } get onDidFocus(): Event { return this.tree.onDidFocus; } get onDidBlur(): Event { return this.tree.onDidBlur; } @@ -345,7 +345,6 @@ export class AsyncDataTree implements IDisposable get onDidUpdateOptions(): Event { return this.tree.onDidUpdateOptions; } get filterOnType(): boolean { return this.tree.filterOnType; } - get openOnSingleClick(): boolean { return this.tree.openOnSingleClick; } get expandOnlyOnTwistieClick(): boolean | ((e: T) => boolean) { if (typeof this.tree.expandOnlyOnTwistieClick === 'boolean') { return this.tree.expandOnlyOnTwistieClick; @@ -408,6 +407,10 @@ export class AsyncDataTree implements IDisposable this.tree.updateOptions(options); } + get options(): IAsyncDataTreeOptions { + return this.tree.options as unknown as IAsyncDataTreeOptions; // {{SQL CARBON EDIT}} strict-null-check + } + // Widget getHTMLElement(): HTMLElement { @@ -668,11 +671,6 @@ export class AsyncDataTree implements IDisposable return nodes.map(n => n!.element as T); } - open(elements: T[], browserEvent?: UIEvent): void { - const nodes = elements.map(e => this.getDataNode(e)); - this.tree.open(nodes, browserEvent); - } - reveal(element: T, relativeTop?: number): void { this.tree.reveal(this.getDataNode(element), relativeTop); } @@ -904,7 +902,7 @@ export class AsyncDataTree implements IDisposable return childAsyncDataTreeNode; }); - for (const node of values(nodesToForget)) { + for (const node of nodesToForget.values()) { dfs(node, node => this.nodes.delete(node.element as T)); } diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 0495c024fa..9a7e2d4762 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -489,12 +489,21 @@ export function index(array: ReadonlyArray, indexer: (t: T) => string, export function insert(array: T[], element: T): () => void { array.push(element); - return () => { - const index = array.indexOf(element); - if (index > -1) { - array.splice(index, 1); - } - }; + return () => remove(array, element); +} + +/** + * Removes an element from an array if it can be found. + */ +export function remove(array: T[], element: T): T | undefined { + const index = array.indexOf(element); + if (index > -1) { + array.splice(index, 1); + + return element; + } + + return undefined; } /** diff --git a/src/vs/base/common/buffer.ts b/src/vs/base/common/buffer.ts index 05df43204e..b648dc2618 100644 --- a/src/vs/base/common/buffer.ts +++ b/src/vs/base/common/buffer.ts @@ -194,6 +194,8 @@ export interface VSBufferReadableStream extends streams.ReadableStream export interface VSBufferWriteableStream extends streams.WriteableStream { } +export interface VSBufferReadableBufferedStream extends streams.ReadableBufferedStream { } + export function readableToBuffer(readable: VSBufferReadable): VSBuffer { return streams.consumeReadable(readable, chunks => VSBuffer.concat(chunks)); } @@ -206,6 +208,21 @@ export function streamToBuffer(stream: streams.ReadableStream): Promis return streams.consumeStream(stream, chunks => VSBuffer.concat(chunks)); } +export async function bufferedStreamToBuffer(bufferedStream: streams.ReadableBufferedStream): Promise { + if (bufferedStream.ended) { + return VSBuffer.concat(bufferedStream.buffer); + } + + return VSBuffer.concat([ + + // Include already read chunks... + ...bufferedStream.buffer, + + // ...and all additional chunks + await streamToBuffer(bufferedStream.stream) + ]); +} + export function bufferToStream(buffer: VSBuffer): streams.ReadableStream { return streams.toStream(buffer, chunks => VSBuffer.concat(chunks)); } @@ -214,6 +231,6 @@ export function streamToBufferReadableStream(stream: streams.ReadableStreamEvent return streams.transform(stream, { data: data => typeof data === 'string' ? VSBuffer.fromString(data) : VSBuffer.wrap(data) }, chunks => VSBuffer.concat(chunks)); } -export function newWriteableBufferStream(): streams.WriteableStream { - return streams.newWriteableStream(chunks => VSBuffer.concat(chunks)); +export function newWriteableBufferStream(options?: streams.WriteableStreamOptions): streams.WriteableStream { + return streams.newWriteableStream(chunks => VSBuffer.concat(chunks), options); } diff --git a/src/vs/base/common/codicons.ts b/src/vs/base/common/codicons.ts index 5b8d56a031..3fddda9389 100644 --- a/src/vs/base/common/codicons.ts +++ b/src/vs/base/common/codicons.ts @@ -495,6 +495,7 @@ export function markdownUnescapeCodicons(text: string): string { const renderCodiconsRegex = /(\\)?\$\((([a-z0-9\-]+?)(?:~([a-z0-9\-]*?))?)\)/gi; export function renderCodicons(text: string): string { return text.replace(renderCodiconsRegex, (_, escaped, codicon, name, animation) => { + // If the class for codicons is changed, it should also be updated in src\vs\base\browser\markdownRenderer.ts return escaped ? `$(${codicon})` : ``; diff --git a/src/vs/base/common/collections.ts b/src/vs/base/common/collections.ts index b88075b997..9fd606b102 100644 --- a/src/vs/base/common/collections.ts +++ b/src/vs/base/common/collections.ts @@ -32,25 +32,6 @@ export function values(from: IStringDictionary | INumberDictionary): T[ return result; } -export function size(from: IStringDictionary | INumberDictionary): number { - let count = 0; - for (let key in from) { - if (hasOwnProperty.call(from, key)) { - count += 1; - } - } - return count; -} - -export function first(from: IStringDictionary | INumberDictionary): T | undefined { - for (const key in from) { - if (hasOwnProperty.call(from, key)) { - return (from as any)[key]; - } - } - return undefined; -} - /** * Iterates over each entry in the provided dictionary. The iterator allows * to remove elements and will stop when the callback returns {{false}}. diff --git a/src/vs/base/common/event.ts b/src/vs/base/common/event.ts index 1fb56b5efe..5c584f83e2 100644 --- a/src/vs/base/common/event.ts +++ b/src/vs/base/common/event.ts @@ -440,14 +440,14 @@ class LeakageMonitor { this._warnCountdown = threshold * 0.5; // find most frequent listener and print warning - let topStack: string; + let topStack: string | undefined; let topCount: number = 0; - this._stacks.forEach((count, stack) => { + for (const [stack, count] of this._stacks) { if (!topStack || topCount < count) { topStack = stack; topCount = count; } - }); + } console.warn(`[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`); console.warn(topStack!); diff --git a/src/vs/base/common/extpath.ts b/src/vs/base/common/extpath.ts index 0543114117..7eefd052fb 100644 --- a/src/vs/base/common/extpath.ts +++ b/src/vs/base/common/extpath.ts @@ -285,7 +285,7 @@ export function isRootOrDriveLetter(path: string): boolean { return pathNormalized === posix.sep; } -export function indexOfPath(path: string, candidate: string, ignoreCase: boolean): number { +export function indexOfPath(path: string, candidate: string, ignoreCase?: boolean): number { if (candidate.length > path.length) { return -1; } diff --git a/src/vs/base/common/keybindingLabels.ts b/src/vs/base/common/keybindingLabels.ts index 977f079715..665ae16bec 100644 --- a/src/vs/base/common/keybindingLabels.ts +++ b/src/vs/base/common/keybindingLabels.ts @@ -182,7 +182,9 @@ function _simpleAsString(modifiers: Modifiers, key: string, labels: ModifierLabe } // the actual key - result.push(key); + if (key !== '') { + result.push(key); + } return result.join(labels.separator); } diff --git a/src/vs/base/common/lifecycle.ts b/src/vs/base/common/lifecycle.ts index 2d47df6c1b..53115bc5ec 100644 --- a/src/vs/base/common/lifecycle.ts +++ b/src/vs/base/common/lifecycle.ts @@ -66,7 +66,7 @@ export function dispose(arg: T | IterableIterator | un d.dispose(); } } - return arg; + return Array.isArray(arg) ? [] : arg; } else if (arg) { markTracked(arg); arg.dispose(); @@ -219,11 +219,11 @@ export abstract class ReferenceCollection { private readonly references: Map = new Map(); - acquire(key: string): IReference { + acquire(key: string, ...args: any[]): IReference { let reference = this.references.get(key); if (!reference) { - reference = { counter: 0, object: this.createReferencedObject(key) }; + reference = { counter: 0, object: this.createReferencedObject(key, ...args) }; this.references.set(key, reference); } @@ -240,7 +240,7 @@ export abstract class ReferenceCollection { return { object, dispose }; } - protected abstract createReferencedObject(key: string): T; + protected abstract createReferencedObject(key: string, ...args: any[]): T; protected abstract destroyReferencedObject(key: string, object: T): void; } diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index f862ecaa76..328cfffe57 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -481,14 +481,40 @@ export class TernarySearchTree { } } +interface ResourceMapKeyFn { + (resource: URI): string; +} + export class ResourceMap implements Map { + private static readonly defaultToKey = (resource: URI) => resource.toString(); + readonly [Symbol.toStringTag] = 'ResourceMap'; - protected readonly map: Map; + private readonly map: Map; + private readonly toKey: ResourceMapKeyFn; - constructor(other?: ResourceMap) { - this.map = other ? new Map(other.map) : new Map(); + /** + * + * @param toKey Custom uri identity function, e.g use an existing `IExtUri#getComparison`-util + */ + constructor(toKey?: ResourceMapKeyFn); + + /** + * + * @param other Another resource which this maps is created from + * @param toKey Custom uri identity function, e.g use an existing `IExtUri#getComparison`-util + */ + constructor(other?: ResourceMap, toKey?: ResourceMapKeyFn); + + constructor(mapOrKeyFn?: ResourceMap | ResourceMapKeyFn, toKey?: ResourceMapKeyFn) { + if (mapOrKeyFn instanceof ResourceMap) { + this.map = new Map(mapOrKeyFn.map); + this.toKey = toKey ?? ResourceMap.defaultToKey; + } else { + this.map = new Map(); + this.toKey = mapOrKeyFn ?? ResourceMap.defaultToKey; + } } set(resource: URI, value: T): this { @@ -546,10 +572,6 @@ export class ResourceMap implements Map { yield [URI.parse(item[0]), item[1]]; } } - - private toKey(resource: URI): string { - return resource.toString(); - } } interface Item { diff --git a/src/vs/base/common/network.ts b/src/vs/base/common/network.ts index 23dfb36986..5fd64ee90b 100644 --- a/src/vs/base/common/network.ts +++ b/src/vs/base/common/network.ts @@ -56,11 +56,18 @@ export namespace Schemas { export const vscodeCustomEditor = 'vscode-custom-editor'; + export const vscodeNotebook = 'vscode-notebook'; + export const vscodeSettings = 'vscode-settings'; export const webviewPanel = 'webview-panel'; export const vscodeWebviewResource = 'vscode-webview-resource'; + + /** + * Scheme used for extension pages + */ + export const extension = 'extension'; } class RemoteAuthoritiesImpl { diff --git a/src/vs/base/common/performance.d.ts b/src/vs/base/common/performance.d.ts index 2ae345b034..b48941728b 100644 --- a/src/vs/base/common/performance.d.ts +++ b/src/vs/base/common/performance.d.ts @@ -5,7 +5,7 @@ export interface PerformanceEntry { readonly name: string; - readonly timestamp: number; + readonly startTime: number; } export function mark(name: string): void; @@ -15,8 +15,6 @@ export function mark(name: string): void; */ export function getEntries(): PerformanceEntry[]; -export function getEntry(name: string): PerformanceEntry; - export function getDuration(from: string, to: string): number; type ExportData = any[]; diff --git a/src/vs/base/common/performance.js b/src/vs/base/common/performance.js index a6079b5036..c3891415b0 100644 --- a/src/vs/base/common/performance.js +++ b/src/vs/base/common/performance.js @@ -28,24 +28,12 @@ function _factory(sharedObj) { for (let i = 0; i < entries.length; i += _dataLen) { result.push({ name: entries[i], - timestamp: entries[i + 1], + startTime: entries[i + 1], }); } return result; } - function getEntry(name) { - const entries = sharedObj._performanceEntries; - for (let i = 0; i < entries.length; i += _dataLen) { - if (entries[i] === name) { - return { - name: entries[i], - timestamp: entries[i + 1], - }; - } - } - } - function getDuration(from, to) { const entries = sharedObj._performanceEntries; let target = to; @@ -73,7 +61,6 @@ function _factory(sharedObj) { const exports = { mark: mark, getEntries: getEntries, - getEntry: getEntry, getDuration: getDuration, importEntries: importEntries, exportEntries: exportEntries diff --git a/src/vs/base/common/resourceTree.ts b/src/vs/base/common/resourceTree.ts index d22e3a5545..edf75ec9a2 100644 --- a/src/vs/base/common/resourceTree.ts +++ b/src/vs/base/common/resourceTree.ts @@ -7,7 +7,7 @@ import { memoize } from 'vs/base/common/decorators'; import * as paths from 'vs/base/common/path'; import { relativePath, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { PathIterator, values } from 'vs/base/common/map'; +import { PathIterator } from 'vs/base/common/map'; export interface IResourceNode { readonly uri: URI; @@ -30,7 +30,7 @@ class Node implements IResourceNode { } get children(): Iterable> { - return [...values(this._children)]; + return this._children.values(); } @memoize diff --git a/src/vs/base/common/resources.ts b/src/vs/base/common/resources.ts index e1f944c21a..90a07f2e10 100644 --- a/src/vs/base/common/resources.ts +++ b/src/vs/base/common/resources.ts @@ -6,9 +6,9 @@ import * as extpath from 'vs/base/common/extpath'; import * as paths from 'vs/base/common/path'; import { URI, uriToFsPath } from 'vs/base/common/uri'; -import { equalsIgnoreCase, compare as strCompare, compareIgnoreCase } from 'vs/base/common/strings'; +import { equalsIgnoreCase, compare as strCompare } from 'vs/base/common/strings'; import { Schemas } from 'vs/base/common/network'; -import { isLinux, isWindows } from 'vs/base/common/platform'; +import { isWindows, isLinux } from 'vs/base/common/platform'; import { CharCode } from 'vs/base/common/charCode'; import { ParsedExpression, IExpression, parse } from 'vs/base/common/glob'; import { TernarySearchTree } from 'vs/base/common/map'; @@ -138,32 +138,10 @@ export class ExtUri implements IExtUri { constructor(private _ignorePathCasing: (uri: URI) => boolean) { } compare(uri1: URI, uri2: URI, ignoreFragment: boolean = false): number { - // scheme - let ret = strCompare(uri1.scheme, uri2.scheme); - if (ret === 0) { - // authority - ret = compareIgnoreCase(uri1.authority, uri2.authority); - if (ret === 0) { - // path - ret = this._ignorePathCasing(uri1) ? compareIgnoreCase(uri1.path, uri2.path) : strCompare(uri1.path, uri2.path); - // query - if (ret === 0) { - ret = strCompare(uri1.query, uri2.query); - // fragment - if (ret === 0 && !ignoreFragment) { - ret = strCompare(uri1.fragment, uri2.fragment); - } - } - } + if (uri1 === uri2) { + return 0; } - return ret; - } - - getComparisonKey(uri: URI, ignoreFragment: boolean = false): string { - return uri.with({ - path: this._ignorePathCasing(uri) ? uri.path.toLowerCase() : undefined, - fragment: ignoreFragment ? null : undefined - }).toString(); + return strCompare(this.getComparisonKey(uri1, ignoreFragment), this.getComparisonKey(uri2, ignoreFragment)); } isEqual(uri1: URI | undefined, uri2: URI | undefined, ignoreFragment: boolean = false): boolean { @@ -173,11 +151,14 @@ export class ExtUri implements IExtUri { if (!uri1 || !uri2) { return false; } - if (uri1.scheme !== uri2.scheme || !isEqualAuthority(uri1.authority, uri2.authority)) { - return false; - } - const p1 = uri1.path, p2 = uri2.path; - return (p1 === p2 || this._ignorePathCasing(uri1) && equalsIgnoreCase(p1, p2)) && uri1.query === uri2.query && (ignoreFragment || uri1.fragment === uri2.fragment); + return this.getComparisonKey(uri1, ignoreFragment) === this.getComparisonKey(uri2, ignoreFragment); + } + + getComparisonKey(uri: URI, ignoreFragment: boolean = false): string { + return uri.with({ + path: this._ignorePathCasing(uri) ? uri.path.toLowerCase() : undefined, + fragment: ignoreFragment ? null : undefined + }).toString(); } isEqualOrParent(base: URI, parentCandidate: URI, ignoreFragment: boolean = false): boolean { @@ -332,6 +313,7 @@ export class ExtUri implements IExtUri { } } + /** * Unbiased utility that takes uris "as they are". This means it can be interchanged with * uri#toString() usages. The following is true @@ -342,36 +324,52 @@ export class ExtUri implements IExtUri { export const extUri = new ExtUri(() => false); /** - * BIASED utility that always ignores the casing of uris path. ONLY use these util if you + * BIASED utility that _mostly_ ignored the case of urs paths. ONLY use this util if you * understand what you are doing. * - * Note that `IUriIdentityService#extUri` is a better replacement for this because that utility - * knows when path casing matters and when not. + * This utility is INCOMPATIBLE with `uri.toString()`-usages and both CANNOT be used interchanged. + * + * When dealing with uris from files or documents, `extUri` (the unbiased friend)is sufficient + * because those uris come from a "trustworthy source". When creating unknown uris it's always + * better to use `IUriIdentityService` which exposes an `IExtUri`-instance which knows when path + * casing matters. + */ +export const extUriBiasedIgnorePathCase = new ExtUri(uri => { + // A file scheme resource is in the same platform as code, so ignore case for non linux platforms + // Resource can be from another platform. Lowering the case as an hack. Should come from File system provider + return uri.scheme === Schemas.file ? !isLinux : true; +}); + + +/** + * BIASED utility that always ignores the casing of uris paths. ONLY use this util if you + * understand what you are doing. + * + * This utility is INCOMPATIBLE with `uri.toString()`-usages and both CANNOT be used interchanged. + * + * When dealing with uris from files or documents, `extUri` (the unbiased friend)is sufficient + * because those uris come from a "trustworthy source". When creating unknown uris it's always + * better to use `IUriIdentityService` which exposes an `IExtUri`-instance which knows when path + * casing matters. */ export const extUriIgnorePathCase = new ExtUri(_ => true); -const exturiBiasedIgnorePathCase = new ExtUri(uri => { - // A file scheme resource is in the same platform as code, so ignore case for non linux platforms - // Resource can be from another platform. Lowering the case as an hack. Should come from File system provider - return uri && uri.scheme === Schemas.file ? !isLinux : true; -}); - -export const isEqual = exturiBiasedIgnorePathCase.isEqual.bind(exturiBiasedIgnorePathCase); -export const isEqualOrParent = exturiBiasedIgnorePathCase.isEqualOrParent.bind(exturiBiasedIgnorePathCase); -export const getComparisonKey = exturiBiasedIgnorePathCase.getComparisonKey.bind(exturiBiasedIgnorePathCase); -export const basenameOrAuthority = exturiBiasedIgnorePathCase.basenameOrAuthority.bind(exturiBiasedIgnorePathCase); -export const basename = exturiBiasedIgnorePathCase.basename.bind(exturiBiasedIgnorePathCase); -export const extname = exturiBiasedIgnorePathCase.extname.bind(exturiBiasedIgnorePathCase); -export const dirname = exturiBiasedIgnorePathCase.dirname.bind(exturiBiasedIgnorePathCase); +export const isEqual = extUri.isEqual.bind(extUri); +export const isEqualOrParent = extUri.isEqualOrParent.bind(extUri); +export const getComparisonKey = extUri.getComparisonKey.bind(extUri); +export const basenameOrAuthority = extUri.basenameOrAuthority.bind(extUri); +export const basename = extUri.basename.bind(extUri); +export const extname = extUri.extname.bind(extUri); +export const dirname = extUri.dirname.bind(extUri); export const joinPath = extUri.joinPath.bind(extUri); -export const normalizePath = exturiBiasedIgnorePathCase.normalizePath.bind(exturiBiasedIgnorePathCase); -export const relativePath = exturiBiasedIgnorePathCase.relativePath.bind(exturiBiasedIgnorePathCase); -export const resolvePath = exturiBiasedIgnorePathCase.resolvePath.bind(exturiBiasedIgnorePathCase); -export const isAbsolutePath = exturiBiasedIgnorePathCase.isAbsolutePath.bind(exturiBiasedIgnorePathCase); -export const isEqualAuthority = exturiBiasedIgnorePathCase.isEqualAuthority.bind(exturiBiasedIgnorePathCase); -export const hasTrailingPathSeparator = exturiBiasedIgnorePathCase.hasTrailingPathSeparator.bind(exturiBiasedIgnorePathCase); -export const removeTrailingPathSeparator = exturiBiasedIgnorePathCase.removeTrailingPathSeparator.bind(exturiBiasedIgnorePathCase); -export const addTrailingPathSeparator = exturiBiasedIgnorePathCase.addTrailingPathSeparator.bind(exturiBiasedIgnorePathCase); +export const normalizePath = extUri.normalizePath.bind(extUri); +export const relativePath = extUri.relativePath.bind(extUri); +export const resolvePath = extUri.resolvePath.bind(extUri); +export const isAbsolutePath = extUri.isAbsolutePath.bind(extUri); +export const isEqualAuthority = extUri.isEqualAuthority.bind(extUri); +export const hasTrailingPathSeparator = extUri.hasTrailingPathSeparator.bind(extUri); +export const removeTrailingPathSeparator = extUri.removeTrailingPathSeparator.bind(extUri); +export const addTrailingPathSeparator = extUri.addTrailingPathSeparator.bind(extUri); //#endregion diff --git a/src/vs/base/common/severity.ts b/src/vs/base/common/severity.ts index 2961a6ba68..541d57e283 100644 --- a/src/vs/base/common/severity.ts +++ b/src/vs/base/common/severity.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as nls from 'vs/nls'; import * as strings from 'vs/base/common/strings'; enum Severity { @@ -20,11 +19,6 @@ namespace Severity { const _warn = 'warn'; const _info = 'info'; - const _displayStrings: { [value: number]: string; } = Object.create(null); - _displayStrings[Severity.Error] = nls.localize('sev.error', "Error"); - _displayStrings[Severity.Warning] = nls.localize('sev.warning', "Warning"); - _displayStrings[Severity.Info] = nls.localize('sev.info', "Info"); - /** * Parses 'error', 'warning', 'warn', 'info' in call casings * and falls back to ignore. diff --git a/src/vs/base/common/stream.ts b/src/vs/base/common/stream.ts index 961dd7e6c0..331abf973a 100644 --- a/src/vs/base/common/stream.ts +++ b/src/vs/base/common/stream.ts @@ -3,6 +3,8 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; + /** * The payload that flows in readable stream events. */ @@ -49,6 +51,11 @@ export interface ReadableStream extends ReadableStreamEvents { * Destroys the stream and stops emitting any event. */ destroy(): void; + + /** + * Allows to remove a listener that was previously added. + */ + removeListener(event: string, callback: Function): void; } /** @@ -74,8 +81,14 @@ export interface WriteableStream extends ReadableStream { * Writing data to the stream will trigger the on('data') * event listener if the stream is flowing and buffer the * data otherwise until the stream is flowing. + * + * If a `highWaterMark` is configured and writing to the + * stream reaches this mark, a promise will be returned + * that should be awaited on before writing more data. + * Otherwise there is a risk of buffering a large number + * of data chunks without consumer. */ - write(data: T): void; + write(data: T): void | Promise; /** * Signals an error to the consumer of the stream via the @@ -95,12 +108,43 @@ export interface WriteableStream extends ReadableStream { end(result?: T | Error): void; } +/** + * A stream that has a buffer already read. Returns the original stream + * that was read as well as the chunks that got read. + * + * The `ended` flag indicates if the stream has been fully consumed. + */ +export interface ReadableBufferedStream { + + /** + * The original stream that is being read. + */ + stream: ReadableStream; + + /** + * An array of chunks already read from this stream. + */ + buffer: T[]; + + /** + * Signals if the stream has ended or not. If not, consumers + * should continue to read from the stream until consumed. + */ + ended: boolean; +} + export function isReadableStream(obj: unknown): obj is ReadableStream { const candidate = obj as ReadableStream; return candidate && [candidate.on, candidate.pause, candidate.resume, candidate.destroy].every(fn => typeof fn === 'function'); } +export function isReadableBufferedStream(obj: unknown): obj is ReadableBufferedStream { + const candidate = obj as ReadableBufferedStream; + + return candidate && isReadableStream(candidate.stream) && Array.isArray(candidate.buffer) && typeof candidate.ended === 'boolean'; +} + export interface IReducer { (data: T[]): T; } @@ -118,8 +162,18 @@ export interface ITransformer { error?: IErrorTransformer; } -export function newWriteableStream(reducer: IReducer): WriteableStream { - return new WriteableStreamImpl(reducer); +export function newWriteableStream(reducer: IReducer, options?: WriteableStreamOptions): WriteableStream { + return new WriteableStreamImpl(reducer, options); +} + +export interface WriteableStreamOptions { + + /** + * The number of objects to buffer before WriteableStream#write() + * signals back that the buffer is full. Can be used to reduce + * the memory pressure when the stream is not flowing. + */ + highWaterMark?: number; } class WriteableStreamImpl implements WriteableStream { @@ -141,7 +195,9 @@ class WriteableStreamImpl implements WriteableStream { end: [] as { (): void }[] }; - constructor(private reducer: IReducer) { } + private readonly pendingWritePromises: Function[] = []; + + constructor(private reducer: IReducer, private options?: WriteableStreamOptions) { } pause(): void { if (this.state.destroyed) { @@ -166,7 +222,7 @@ class WriteableStreamImpl implements WriteableStream { } } - write(data: T): void { + write(data: T): void | Promise { if (this.state.destroyed) { return; } @@ -179,6 +235,11 @@ class WriteableStreamImpl implements WriteableStream { // not yet flowing: buffer data until flowing else { this.buffer.data.push(data); + + // highWaterMark: if configured, signal back when buffer reached limits + if (typeof this.options?.highWaterMark === 'number' && this.buffer.data.length > this.options.highWaterMark) { + return new Promise(resolve => this.pendingWritePromises.push(resolve)); + } } } @@ -267,6 +328,35 @@ class WriteableStreamImpl implements WriteableStream { } } + removeListener(event: string, callback: Function): void { + if (this.state.destroyed) { + return; + } + + let listeners: unknown[] | undefined = undefined; + + switch (event) { + case 'data': + listeners = this.listeners.data; + break; + + case 'end': + listeners = this.listeners.end; + break; + + case 'error': + listeners = this.listeners.error; + break; + } + + if (listeners) { + const index = listeners.indexOf(callback); + if (index >= 0) { + listeners.splice(index, 1); + } + } + } + private flowData(): void { if (this.buffer.data.length > 0) { const fullDataBuffer = this.reducer(this.buffer.data); @@ -274,6 +364,11 @@ class WriteableStreamImpl implements WriteableStream { this.listeners.data.forEach(listener => listener(fullDataBuffer)); this.buffer.data.length = 0; + + // When the buffer is empty, resolve all pending writers + const pendingWritePromises = [...this.pendingWritePromises]; + this.pendingWritePromises.length = 0; + pendingWritePromises.forEach(pendingWritePromise => pendingWritePromise()); } } @@ -308,6 +403,8 @@ class WriteableStreamImpl implements WriteableStream { this.listeners.data.length = 0; this.listeners.error.length = 0; this.listeners.end.length = 0; + + this.pendingWritePromises.length = 0; } } } @@ -331,7 +428,7 @@ export function consumeReadable(readable: Readable, reducer: IReducer): * reached, will return a readable instead to ensure all data can still * be read. */ -export function consumeReadableWithLimit(readable: Readable, reducer: IReducer, maxChunks: number): T | Readable { +export function peekReadable(readable: Readable, reducer: IReducer, maxChunks: number): T | Readable { const chunks: T[] = []; let chunk: T | null | undefined = undefined; @@ -388,58 +485,50 @@ export function consumeStream(stream: ReadableStream, reducer: IReducer } /** - * Helper to read a T stream up to a maximum of chunks. If the limit is - * reached, will return a stream instead to ensure all data can still - * be read. + * Helper to peek up to `maxChunks` into a stream. The return type signals if + * the stream has ended or not. If not, caller needs to add a `data` listener + * to continue reading. */ -export function consumeStreamWithLimit(stream: ReadableStream, reducer: IReducer, maxChunks: number): Promise> { +export function peekStream(stream: ReadableStream, maxChunks: number): Promise> { return new Promise((resolve, reject) => { - const chunks: T[] = []; + const streamListeners = new DisposableStore(); - let wrapperStream: WriteableStream | undefined = undefined; + // Data Listener + const buffer: T[] = []; + const dataListener = (chunk: T) => { - stream.on('data', data => { + // Add to buffer + buffer.push(chunk); - // If we reach maxChunks, we start to return a stream - // and make sure that any data we have already read - // is in it as well - if (!wrapperStream && chunks.length === maxChunks) { - wrapperStream = newWriteableStream(reducer); - while (chunks.length) { - wrapperStream.write(chunks.shift()!); - } + // We reached maxChunks and thus need to return + if (buffer.length > maxChunks) { - wrapperStream.write(data); + // Dispose any listeners and ensure to pause the + // stream so that it can be consumed again by caller + streamListeners.dispose(); + stream.pause(); - return resolve(wrapperStream); + return resolve({ stream, buffer, ended: false }); } + }; - if (wrapperStream) { - wrapperStream.write(data); - } else { - chunks.push(data); - } - }); + streamListeners.add(toDisposable(() => stream.removeListener('data', dataListener))); + stream.on('data', dataListener); - stream.on('error', error => { - if (wrapperStream) { - wrapperStream.error(error); - } else { - return reject(error); - } - }); + // Error Listener + const errorListener = (error: Error) => { + return reject(error); + }; - stream.on('end', () => { - if (wrapperStream) { - while (chunks.length) { - wrapperStream.write(chunks.shift()!); - } + streamListeners.add(toDisposable(() => stream.removeListener('error', errorListener))); + stream.on('error', errorListener); - wrapperStream.end(); - } else { - return resolve(reducer(chunks)); - } - }); + const endListener = () => { + return resolve({ stream, buffer, ended: true }); + }; + + streamListeners.add(toDisposable(() => stream.removeListener('end', endListener))); + stream.on('end', endListener); }); } diff --git a/src/vs/base/common/strings.ts b/src/vs/base/common/strings.ts index 2bc6957841..4bbabf61ac 100644 --- a/src/vs/base/common/strings.ts +++ b/src/vs/base/common/strings.ts @@ -728,9 +728,9 @@ export function isBasicASCII(str: string): boolean { return IS_BASIC_ASCII.test(str); } -export const UNUSUAL_LINE_TERMINATORS = /[\u2028\u2029\u0085]/; // LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS), NEXT LINE (NEL) +export const UNUSUAL_LINE_TERMINATORS = /[\u2028\u2029]/; // LINE SEPARATOR (LS) or PARAGRAPH SEPARATOR (PS) /** - * Returns true if `str` contains unusual line terminators, like LS, PS or NEL + * Returns true if `str` contains unusual line terminators, like LS or PS */ export function containsUnusualLineTerminators(str: string): boolean { return UNUSUAL_LINE_TERMINATORS.test(str); diff --git a/src/vs/base/common/types.ts b/src/vs/base/common/types.ts index 78e61a6e86..9d6681764e 100644 --- a/src/vs/base/common/types.ts +++ b/src/vs/base/common/types.ts @@ -64,6 +64,13 @@ export function isUndefined(obj: any): obj is undefined { return (typeof obj === 'undefined'); } +/** + * @returns whether the provided parameter is defined. + */ +export function isDefined(arg: T | null | undefined): arg is T { + return !isUndefinedOrNull(arg); +} + /** * @returns whether the provided parameter is undefined or null. */ diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index d4bdc3b4d7..447e47d9ac 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -413,7 +413,7 @@ interface UriState extends UriComponents { const _pathSepMarker = isWindows ? 1 : undefined; -// eslint-disable-next-line @typescript-eslint/class-name-casing +// eslint-disable-next-line @typescript-eslint/naming-convention class _URI extends URI { _formatted: string | null = null; diff --git a/src/vs/base/node/encoding.ts b/src/vs/base/node/encoding.ts index 2f0073711a..311e3bc33c 100644 --- a/src/vs/base/node/encoding.ts +++ b/src/vs/base/node/encoding.ts @@ -3,9 +3,9 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as iconv from 'iconv-lite'; -import { Readable, Writable } from 'stream'; -import { VSBuffer } from 'vs/base/common/buffer'; +import { DecoderStream } from 'iconv-lite'; +import { Readable, ReadableStream, newWriteableStream } from 'vs/base/common/stream'; +import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; export const UTF8 = 'utf8'; export const UTF8_with_bom = 'utf8bom'; @@ -31,125 +31,156 @@ export interface IDecodeStreamOptions { guessEncoding: boolean; minBytesRequiredForDetection?: number; - overwriteEncoding(detectedEncoding: string | null): string; + overwriteEncoding(detectedEncoding: string | null): Promise; } export interface IDecodeStreamResult { - stream: NodeJS.ReadableStream; + stream: ReadableStream; detected: IDetectedEncodingResult; } -export function toDecodeStream(readable: Readable, options: IDecodeStreamOptions): Promise { - if (!options.minBytesRequiredForDetection) { - options.minBytesRequiredForDetection = options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES; - } +export function toDecodeStream(source: VSBufferReadableStream, options: IDecodeStreamOptions): Promise { + const minBytesRequiredForDetection = options.minBytesRequiredForDetection ?? options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES; return new Promise((resolve, reject) => { - const writer = new class extends Writable { - private decodeStream: NodeJS.ReadWriteStream | undefined; - private decodeStreamPromise: Promise | undefined; + const target = newWriteableStream(strings => strings.join('')); - private bufferedChunks: Buffer[] = []; - private bytesBuffered = 0; + const bufferedChunks: VSBuffer[] = []; + let bytesBuffered = 0; - _write(chunk: Buffer, encoding: string, callback: (error: Error | null | undefined) => void): void { - if (!Buffer.isBuffer(chunk)) { - return callback(new Error('toDecodeStream(): data must be a buffer')); - } + let decoder: DecoderStream | undefined = undefined; - // if the decode stream is ready, we just write directly - if (this.decodeStream) { - this.decodeStream.write(chunk, callback); - - return; - } - - // otherwise we need to buffer the data until the stream is ready - this.bufferedChunks.push(chunk); - this.bytesBuffered += chunk.byteLength; - - // waiting for the decoder to be ready - if (this.decodeStreamPromise) { - this.decodeStreamPromise.then(() => callback(null), error => callback(error)); - } - - // buffered enough data for encoding detection, create stream and forward data - else if (typeof options.minBytesRequiredForDetection === 'number' && this.bytesBuffered >= options.minBytesRequiredForDetection) { - this._startDecodeStream(callback); - } - - // only buffering until enough data for encoding detection is there - else { - callback(null); - } - } - - _startDecodeStream(callback: (error: Error | null | undefined) => void): void { + const createDecoder = async () => { + try { // detect encoding from buffer - this.decodeStreamPromise = Promise.resolve(detectEncodingFromBuffer({ - buffer: Buffer.concat(this.bufferedChunks), - bytesRead: this.bytesBuffered - }, options.guessEncoding)).then(detected => { + const detected = await detectEncodingFromBuffer({ + buffer: VSBuffer.concat(bufferedChunks), + bytesRead: bytesBuffered + }, options.guessEncoding); - // ensure to respect overwrite of encoding - detected.encoding = options.overwriteEncoding(detected.encoding); + // ensure to respect overwrite of encoding + detected.encoding = await options.overwriteEncoding(detected.encoding); - // decode and write buffer - this.decodeStream = decodeStream(detected.encoding); - this.decodeStream.write(Buffer.concat(this.bufferedChunks), callback); - this.bufferedChunks.length = 0; + // decode and write buffered content + const iconv = await import('iconv-lite'); + decoder = iconv.getDecoder(toNodeEncoding(detected.encoding)); + const decoded = decoder.write(Buffer.from(VSBuffer.concat(bufferedChunks).buffer)); + target.write(decoded); - // signal to the outside our detected encoding - // and final decoder stream - resolve({ detected, stream: this.decodeStream }); - }, error => { - this.emit('error', error); + bufferedChunks.length = 0; + bytesBuffered = 0; - callback(error); + // signal to the outside our detected encoding and final decoder stream + resolve({ + stream: target, + detected }); - } - - _final(callback: () => void) { - - // normal finish - if (this.decodeStream) { - this.decodeStream.end(callback); - } - - // we were still waiting for data to do the encoding - // detection. thus, wrap up starting the stream even - // without all the data to get things going - else { - this._startDecodeStream(() => { - if (this.decodeStream) { - this.decodeStream.end(callback); - } - }); - } + } catch (error) { + reject(error); } }; - // errors - readable.on('error', reject); + // Stream error: forward to target + source.on('error', error => target.error(error)); - // pipe through - readable.pipe(writer); + // Stream data + source.on('data', async chunk => { + + // if the decoder is ready, we just write directly + if (decoder) { + target.write(decoder.write(Buffer.from(chunk.buffer))); + } + + // otherwise we need to buffer the data until the stream is ready + else { + bufferedChunks.push(chunk); + bytesBuffered += chunk.byteLength; + + // buffered enough data for encoding detection, create stream + if (bytesBuffered >= minBytesRequiredForDetection) { + + // pause stream here until the decoder is ready + source.pause(); + + await createDecoder(); + + // resume stream now that decoder is ready but + // outside of this stack to reduce recursion + setTimeout(() => source.resume()); + } + } + }); + + // Stream end + source.on('end', async () => { + + // we were still waiting for data to do the encoding + // detection. thus, wrap up starting the stream even + // without all the data to get things going + if (!decoder) { + await createDecoder(); + } + + // end the target with the remainders of the decoder + target.end(decoder?.end()); + }); }); } -export function encodingExists(encoding: string): boolean { +export async function toEncodeReadable(readable: Readable, encoding: string, options?: { addBOM?: boolean }): Promise { + const iconv = await import('iconv-lite'); + const encoder = iconv.getEncoder(toNodeEncoding(encoding), options); + + let bytesRead = 0; + let done = false; + + return { + read() { + if (done) { + return null; + } + + const chunk = readable.read(); + if (typeof chunk !== 'string') { + done = true; + + // If we are instructed to add a BOM but we detect that no + // bytes have been read, we must ensure to return the BOM + // ourselves so that we comply with the contract. + if (bytesRead === 0 && options?.addBOM) { + switch (encoding) { + case UTF8: + case UTF8_with_bom: + return VSBuffer.wrap(Uint8Array.from(UTF8_BOM)); + case UTF16be: + return VSBuffer.wrap(Uint8Array.from(UTF16be_BOM)); + case UTF16le: + return VSBuffer.wrap(Uint8Array.from(UTF16le_BOM)); + } + } + + const leftovers = encoder.end(); + if (leftovers && leftovers.length > 0) { + return VSBuffer.wrap(leftovers); + } + + return null; + } + + bytesRead += chunk.length; + + return VSBuffer.wrap(encoder.write(chunk)); + } + }; +} + +export async function encodingExists(encoding: string): Promise { + const iconv = await import('iconv-lite'); + return iconv.encodingExists(toNodeEncoding(encoding)); } -function decodeStream(encoding: string | null): NodeJS.ReadWriteStream { - return iconv.decodeStream(toNodeEncoding(encoding)); -} - -export function encodeStream(encoding: string, options?: { addBOM?: boolean }): NodeJS.ReadWriteStream { - return iconv.encodeStream(toNodeEncoding(encoding), options); -} - export function toNodeEncoding(enc: string | null): string { if (enc === UTF8_with_bom || enc === null) { return UTF8; // iconv does not distinguish UTF 8 with or without BOM, so we need to help it @@ -158,7 +189,7 @@ export function toNodeEncoding(enc: string | null): string { return enc; } -export function detectEncodingByBOMFromBuffer(buffer: Buffer | VSBuffer | null, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | null { +export function detectEncodingByBOMFromBuffer(buffer: VSBuffer | null, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | null { if (!buffer || bytesRead < UTF16be_BOM.length) { return null; } @@ -200,10 +231,10 @@ const IGNORE_ENCODINGS = ['ascii', 'utf-16', 'utf-32']; /** * Guesses the encoding from buffer. */ -async function guessEncodingByBuffer(buffer: Buffer): Promise { +async function guessEncodingByBuffer(buffer: VSBuffer): Promise { const jschardet = await import('jschardet'); - const guessed = jschardet.detect(buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES)); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53 + const guessed = jschardet.detect(Buffer.from(buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES).buffer)); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53 if (!guessed || !guessed.encoding) { return null; } @@ -271,7 +302,7 @@ export interface IDetectedEncodingResult { } export interface IReadResult { - buffer: Buffer | null; + buffer: VSBuffer | null; bytesRead: number; } @@ -298,7 +329,7 @@ export function detectEncodingFromBuffer({ buffer, bytesRead }: IReadResult, aut // that is using 4 bytes to encode a character). for (let i = 0; i < bytesRead && i < ZERO_BYTE_DETECTION_BUFFER_MAX_LEN; i++) { const isEndian = (i % 2 === 1); // assume 2-byte sequences typical for UTF-16 - const isZeroByte = (buffer.readInt8(i) === 0); + const isZeroByte = (buffer.readUInt8(i) === 0); if (isZeroByte) { containsZeroByte = true; diff --git a/src/vs/base/node/stream.ts b/src/vs/base/node/stream.ts deleted file mode 100644 index fc99a9b5c4..0000000000 --- a/src/vs/base/node/stream.ts +++ /dev/null @@ -1,112 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { VSBufferReadableStream, VSBufferReadable, VSBuffer } from 'vs/base/common/buffer'; -import { Readable } from 'stream'; -import { isUndefinedOrNull } from 'vs/base/common/types'; -import { UTF8, UTF8_with_bom, UTF8_BOM, UTF16be, UTF16le_BOM, UTF16be_BOM, UTF16le, UTF_ENCODING } from 'vs/base/node/encoding'; - -export function streamToNodeReadable(stream: VSBufferReadableStream): Readable { - return new class extends Readable { - private listening = false; - - _read(size?: number): void { - if (!this.listening) { - this.listening = true; - - // Data - stream.on('data', data => { - try { - if (!this.push(data.buffer)) { - stream.pause(); // pause the stream if we should not push anymore - } - } catch (error) { - this.emit(error); - } - }); - - // End - stream.on('end', () => { - try { - this.push(null); // signal EOS - } catch (error) { - this.emit(error); - } - }); - - // Error - stream.on('error', error => this.emit('error', error)); - } - - // ensure the stream is flowing - stream.resume(); - } - - _destroy(error: Error | null, callback: (error: Error | null) => void): void { - stream.destroy(); - - callback(null); - } - }; -} - -export function nodeReadableToString(stream: NodeJS.ReadableStream): Promise { - return new Promise((resolve, reject) => { - let result = ''; - - stream.on('data', chunk => result += chunk); - stream.on('error', reject); - stream.on('end', () => resolve(result)); - }); -} - -export function nodeStreamToVSBufferReadable(stream: NodeJS.ReadWriteStream, addBOM?: { encoding: UTF_ENCODING }): VSBufferReadable { - let bytesRead = 0; - let done = false; - - return { - read(): VSBuffer | null { - if (done) { - return null; - } - - const res = stream.read(); - if (isUndefinedOrNull(res)) { - done = true; - - // If we are instructed to add a BOM but we detect that no - // bytes have been read, we must ensure to return the BOM - // ourselves so that we comply with the contract. - if (bytesRead === 0 && addBOM) { - switch (addBOM.encoding) { - case UTF8: - case UTF8_with_bom: - return VSBuffer.wrap(Buffer.from(UTF8_BOM)); - case UTF16be: - return VSBuffer.wrap(Buffer.from(UTF16be_BOM)); - case UTF16le: - return VSBuffer.wrap(Buffer.from(UTF16le_BOM)); - } - } - - return null; - } - - // Handle String - if (typeof res === 'string') { - bytesRead += res.length; - - return VSBuffer.fromString(res); - } - - // Handle Buffer - else { - bytesRead += res.byteLength; - - return VSBuffer.wrap(res); - } - } - }; -} diff --git a/src/vs/base/parts/quickinput/browser/quickInput.ts b/src/vs/base/parts/quickinput/browser/quickInput.ts index 88a1d9ffc4..68f495088e 100644 --- a/src/vs/base/parts/quickinput/browser/quickInput.ts +++ b/src/vs/base/parts/quickinput/browser/quickInput.ts @@ -719,13 +719,13 @@ class QuickPick extends QuickInput implements IQuickPi break; case KeyCode.Home: - if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { + if ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) { this.ui.list.focus(QuickInputListFocus.First); dom.EventHelper.stop(event, true); } break; case KeyCode.End: - if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { + if ((event.ctrlKey || event.metaKey) && !event.shiftKey && !event.altKey) { this.ui.list.focus(QuickInputListFocus.Last); dom.EventHelper.stop(event, true); } diff --git a/src/vs/base/parts/quickinput/browser/quickInputList.ts b/src/vs/base/parts/quickinput/browser/quickInputList.ts index f48bc1d7b0..45a70a5ffc 100644 --- a/src/vs/base/parts/quickinput/browser/quickInputList.ts +++ b/src/vs/base/parts/quickinput/browser/quickInputList.ts @@ -283,7 +283,6 @@ export class QuickInputList { const accessibilityProvider = new QuickInputAccessibilityProvider(); this.list = options.createList('QuickInput', this.container, delegate, [new ListElementRenderer()], { identityProvider: { getId: element => element.saneLabel }, - openController: { shouldOpen: () => false }, // Workaround #58124 setRowLineHeight: false, multipleSelectionSupport: false, horizontalScrolling: false, diff --git a/src/vs/base/test/common/arrays.test.ts b/src/vs/base/test/common/arrays.test.ts index 82d93a8637..15b3b9cbd2 100644 --- a/src/vs/base/test/common/arrays.test.ts +++ b/src/vs/base/test/common/arrays.test.ts @@ -342,5 +342,14 @@ suite('Arrays', () => { arrays.coalesceInPlace(sparse); assert.equal(sparse.length, 5); }); + + test('insert, remove', function () { + const array: string[] = []; + const remove = arrays.insert(array, 'foo'); + assert.equal(array[0], 'foo'); + + remove(); + assert.equal(array.length, 0); + }); }); diff --git a/src/vs/base/test/common/lifecycle.test.ts b/src/vs/base/test/common/lifecycle.test.ts index 9f11e0ce21..b29c7056de 100644 --- a/src/vs/base/test/common/lifecycle.test.ts +++ b/src/vs/base/test/common/lifecycle.test.ts @@ -48,6 +48,21 @@ suite('Lifecycle', () => { assert(disposable.isDisposed); assert(disposable2.isDisposed); }); + + test('Action bar has broken accessibility #100273', function () { + let array = [{ dispose() { } }, { dispose() { } }]; + let array2 = dispose(array); + + assert.equal(array.length, 2); + assert.equal(array2.length, 0); + assert.ok(array !== array2); + + let set = new Set([{ dispose() { } }, { dispose() { } }]); + let setValues = set.values(); + let setValues2 = dispose(setValues); + assert.ok(setValues === setValues2); + + }); }); suite('Reference Collection', () => { diff --git a/src/vs/base/test/common/map.test.ts b/src/vs/base/test/common/map.test.ts index 6c3ba81fa5..f4d7a8684d 100644 --- a/src/vs/base/test/common/map.test.ts +++ b/src/vs/base/test/common/map.test.ts @@ -6,6 +6,7 @@ import { ResourceMap, TernarySearchTree, PathIterator, StringIterator, LinkedMap, Touch, LRUCache, UriIterator } from 'vs/base/common/map'; import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; +import { extUriIgnorePathCase } from 'vs/base/common/resources'; suite('Map', () => { @@ -811,32 +812,32 @@ suite('Map', () => { assert.equal(map.get(uncFile), 'true'); }); - // test('ResourceMap - files (ignorecase)', function () { - // const map = new ResourceMap(true); + test('ResourceMap - files (ignorecase)', function () { + const map = new ResourceMap(uri => extUriIgnorePathCase.getComparisonKey(uri)); - // const fileA = URI.parse('file://some/filea'); - // const fileB = URI.parse('some://some/other/fileb'); - // const fileAUpper = URI.parse('file://SOME/FILEA'); + const fileA = URI.parse('file://some/filea'); + const fileB = URI.parse('some://some/other/fileb'); + const fileAUpper = URI.parse('file://SOME/FILEA'); - // map.set(fileA, 'true'); - // assert.equal(map.get(fileA), 'true'); + map.set(fileA, 'true'); + assert.equal(map.get(fileA), 'true'); - // assert.equal(map.get(fileAUpper), 'true'); + assert.equal(map.get(fileAUpper), 'true'); - // assert.ok(!map.get(fileB)); + assert.ok(!map.get(fileB)); - // map.set(fileAUpper, 'false'); - // assert.equal(map.get(fileAUpper), 'false'); + map.set(fileAUpper, 'false'); + assert.equal(map.get(fileAUpper), 'false'); - // assert.equal(map.get(fileA), 'false'); + assert.equal(map.get(fileA), 'false'); - // const windowsFile = URI.file('c:\\test with %25\\c#code'); - // const uncFile = URI.file('\\\\shäres\\path\\c#\\plugin.json'); + const windowsFile = URI.file('c:\\test with %25\\c#code'); + const uncFile = URI.file('\\\\shäres\\path\\c#\\plugin.json'); - // map.set(windowsFile, 'true'); - // map.set(uncFile, 'true'); + map.set(windowsFile, 'true'); + map.set(uncFile, 'true'); - // assert.equal(map.get(windowsFile), 'true'); - // assert.equal(map.get(uncFile), 'true'); - // }); + assert.equal(map.get(windowsFile), 'true'); + assert.equal(map.get(uncFile), 'true'); + }); }); diff --git a/src/vs/base/test/common/stream.test.ts b/src/vs/base/test/common/stream.test.ts index b08b8a6801..bc1752b69e 100644 --- a/src/vs/base/test/common/stream.test.ts +++ b/src/vs/base/test/common/stream.test.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { isReadableStream, newWriteableStream, Readable, consumeReadable, consumeReadableWithLimit, consumeStream, ReadableStream, toStream, toReadable, transform, consumeStreamWithLimit } from 'vs/base/common/stream'; +import { isReadableStream, newWriteableStream, Readable, consumeReadable, peekReadable, consumeStream, ReadableStream, toStream, toReadable, transform, peekStream, isReadableBufferedStream } from 'vs/base/common/stream'; +import { timeout } from 'vs/base/common/async'; suite('Stream', () => { @@ -13,7 +14,16 @@ suite('Stream', () => { assert.ok(isReadableStream(newWriteableStream(d => d))); }); - test('WriteableStream', () => { + test('isReadableBufferedStream', async () => { + assert.ok(!isReadableBufferedStream(Object.create(null))); + + const stream = newWriteableStream(d => d); + stream.end(); + const bufferedStream = await peekStream(stream, 1); + assert.ok(isReadableBufferedStream(bufferedStream)); + }); + + test('WriteableStream - basics', () => { const stream = newWriteableStream(strings => strings.join()); let error = false; @@ -66,17 +76,92 @@ suite('Stream', () => { assert.equal(chunks.length, 4); }); + test('WriteableStream - removeListener', () => { + const stream = newWriteableStream(strings => strings.join()); + + let error = false; + const errorListener = (e: Error) => { + error = true; + }; + stream.on('error', errorListener); + + let data = false; + const dataListener = () => { + data = true; + }; + stream.on('data', dataListener); + + stream.write('Hello'); + assert.equal(data, true); + + data = false; + stream.removeListener('data', dataListener); + + stream.write('World'); + assert.equal(data, false); + + stream.error(new Error()); + assert.equal(error, true); + + error = false; + stream.removeListener('error', errorListener); + + stream.error(new Error()); + assert.equal(error, false); + }); + + test('WriteableStream - highWaterMark', async () => { + const stream = newWriteableStream(strings => strings.join(), { highWaterMark: 3 }); + + let res = stream.write('1'); + assert.ok(!res); + + res = stream.write('2'); + assert.ok(!res); + + res = stream.write('3'); + assert.ok(!res); + + let promise1 = stream.write('4'); + assert.ok(promise1 instanceof Promise); + + let promise2 = stream.write('5'); + assert.ok(promise2 instanceof Promise); + + let drained1 = false; + (async () => { + await promise1; + drained1 = true; + })(); + + let drained2 = false; + (async () => { + await promise2; + drained2 = true; + })(); + + let data: string | undefined = undefined; + stream.on('data', chunk => { + data = chunk; + }); + assert.ok(data); + + await timeout(0); + assert.equal(drained1, true); + assert.equal(drained2, true); + }); + test('consumeReadable', () => { const readable = arrayToReadable(['1', '2', '3', '4', '5']); const consumed = consumeReadable(readable, strings => strings.join()); assert.equal(consumed, '1,2,3,4,5'); }); - test('consumeReadableWithLimit', () => { + test('peekReadable', () => { for (let i = 0; i < 5; i++) { const readable = arrayToReadable(['1', '2', '3', '4', '5']); - const consumedOrReadable = consumeReadableWithLimit(readable, strings => strings.join(), i); + const consumedOrReadable = peekReadable(readable, strings => strings.join(), i); if (typeof consumedOrReadable === 'string') { assert.fail('Unexpected result'); } else { @@ -86,14 +171,75 @@ suite('Stream', () => { } let readable = arrayToReadable(['1', '2', '3', '4', '5']); - let consumedOrReadable = consumeReadableWithLimit(readable, strings => strings.join(), 5); + let consumedOrReadable = peekReadable(readable, strings => strings.join(), 5); assert.equal(consumedOrReadable, '1,2,3,4,5'); readable = arrayToReadable(['1', '2', '3', '4', '5']); - consumedOrReadable = consumeReadableWithLimit(readable, strings => strings.join(), 6); + consumedOrReadable = peekReadable(readable, strings => strings.join(), 6); assert.equal(consumedOrReadable, '1,2,3,4,5'); }); + test('peekReadable - error handling', async () => { + + // 0 Chunks + let stream = newWriteableStream(data => data); + + let error: Error | undefined = undefined; + let promise = (async () => { + try { + await peekStream(stream, 1); + } catch (err) { + error = err; + } + })(); + + stream.error(new Error()); + await promise; + + assert.ok(error); + + // 1 Chunk + stream = newWriteableStream(data => data); + + error = undefined; + promise = (async () => { + try { + await peekStream(stream, 1); + } catch (err) { + error = err; + } + })(); + + stream.write('foo'); + stream.error(new Error()); + await promise; + + assert.ok(error); + + // 2 Chunks + stream = newWriteableStream(data => data); + + error = undefined; + promise = (async () => { + try { + await peekStream(stream, 1); + } catch (err) { + error = err; + } + })(); + + stream.write('foo'); + stream.write('bar'); + stream.error(new Error()); + await promise; + + assert.ok(!error); + + stream.on('error', err => error = err); + stream.on('data', chunk => { }); + assert.ok(error); + }); + function arrayToReadable(array: T[]): Readable { return { read: () => array.shift() || null @@ -122,26 +268,39 @@ suite('Stream', () => { assert.equal(consumed, '1,2,3,4,5'); }); - test('consumeStreamWithLimit', async () => { + test('peekStream', async () => { for (let i = 0; i < 5; i++) { - const readable = readableToStream(arrayToReadable(['1', '2', '3', '4', '5'])); + const stream = readableToStream(arrayToReadable(['1', '2', '3', '4', '5'])); - const consumedOrStream = await consumeStreamWithLimit(readable, strings => strings.join(), i); - if (typeof consumedOrStream === 'string') { - assert.fail('Unexpected result'); + const result = await peekStream(stream, i); + assert.equal(stream, result.stream); + if (result.ended) { + assert.fail('Unexpected result, stream should not have ended yet'); } else { - const consumed = await consumeStream(consumedOrStream, strings => strings.join()); - assert.equal(consumed, '1,2,3,4,5'); + assert.equal(result.buffer.length, i + 1, `maxChunks: ${i}`); + + const additionalResult: string[] = []; + await consumeStream(stream, strings => { + additionalResult.push(...strings); + + return strings.join(); + }); + + assert.equal([...result.buffer, ...additionalResult].join(), '1,2,3,4,5'); } } let stream = readableToStream(arrayToReadable(['1', '2', '3', '4', '5'])); - let consumedOrStream = await consumeStreamWithLimit(stream, strings => strings.join(), 5); - assert.equal(consumedOrStream, '1,2,3,4,5'); + let result = await peekStream(stream, 5); + assert.equal(stream, result.stream); + assert.equal(result.buffer.join(), '1,2,3,4,5'); + assert.equal(result.ended, true); stream = readableToStream(arrayToReadable(['1', '2', '3', '4', '5'])); - consumedOrStream = await consumeStreamWithLimit(stream, strings => strings.join(), 6); - assert.equal(consumedOrStream, '1,2,3,4,5'); + result = await peekStream(stream, 6); + assert.equal(stream, result.stream); + assert.equal(result.buffer.join(), '1,2,3,4,5'); + assert.equal(result.ended, true); }); test('toStream', async () => { diff --git a/src/vs/base/test/node/buffer.test.ts b/src/vs/base/test/node/buffer.test.ts index f7d465406e..68a2c29255 100644 --- a/src/vs/base/test/node/buffer.test.ts +++ b/src/vs/base/test/node/buffer.test.ts @@ -4,8 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { VSBuffer, bufferToReadable, readableToBuffer, bufferToStream, streamToBuffer, newWriteableBufferStream } from 'vs/base/common/buffer'; +import { VSBuffer, bufferToReadable, readableToBuffer, bufferToStream, streamToBuffer, newWriteableBufferStream, bufferedStreamToBuffer } from 'vs/base/common/buffer'; import { timeout } from 'vs/base/common/async'; +import { peekStream } from 'vs/base/common/stream'; suite('Buffer', () => { @@ -29,6 +30,13 @@ suite('Buffer', () => { assert.equal((await streamToBuffer(stream)).toString(), content); }); + test('bufferedStreamToBuffer', async () => { + const content = 'Hello World'; + const stream = await peekStream(bufferToStream(VSBuffer.fromString(content)), 1); + + assert.equal((await bufferedStreamToBuffer(stream)).toString(), content); + }); + test('bufferWriteableStream - basics (no error)', async () => { const stream = newWriteableBufferStream(); diff --git a/src/vs/base/test/node/encoding/encoding.test.ts b/src/vs/base/test/node/encoding/encoding.test.ts index 44e78401b3..fccb9e8bfd 100644 --- a/src/vs/base/test/node/encoding/encoding.test.ts +++ b/src/vs/base/test/node/encoding/encoding.test.ts @@ -7,9 +7,10 @@ import * as assert from 'assert'; import * as fs from 'fs'; import * as encoding from 'vs/base/node/encoding'; import * as terminalEncoding from 'vs/base/node/terminalEncoding'; -import { Readable } from 'stream'; +import * as streams from 'vs/base/common/stream'; import * as iconv from 'iconv-lite'; import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { newWriteableBufferStream, VSBuffer, VSBufferReadableStream, streamToBufferReadableStream } from 'vs/base/common/buffer'; export async function detectEncodingByBOM(file: string): Promise { try { @@ -22,7 +23,7 @@ export async function detectEncodingByBOM(file: string): Promise { process.env['VSCODE_CLI_ENCODING'] = 'utf16le'; const enc = await terminalEncoding.resolveTerminalEncoding(); - assert.ok(encoding.encodingExists(enc)); + assert.ok(await encoding.encodingExists(enc)); assert.equal(enc, 'utf16le'); }); @@ -231,32 +232,33 @@ suite('Encoding', () => { }); } - async function readAllAsString(stream: NodeJS.ReadableStream) { - return new Promise((resolve, reject) => { - let all = ''; - stream.on('data', chunk => { - all += chunk; - assert.equal(typeof chunk, 'string'); + function newTestReadableStream(buffers: Buffer[]): VSBufferReadableStream { + const stream = newWriteableBufferStream(); + buffers + .map(VSBuffer.wrap) + .forEach(buffer => { + setTimeout(() => { + stream.write(buffer); + }); }); - stream.on('end', () => { - resolve(all); - }); - stream.on('error', reject); + setTimeout(() => { + stream.end(); }); + return stream; + } + + async function readAllAsString(stream: streams.ReadableStream) { + return streams.consumeStream(stream, strings => strings.join('')); } test('toDecodeStream - some stream', async function () { + const source = newTestReadableStream([ + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + ]); - let source = new Readable({ - read(size) { - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(null); - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -266,17 +268,13 @@ suite('Encoding', () => { }); test('toDecodeStream - some stream, expect too much data', async function () { + const source = newTestReadableStream([ + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + Buffer.from([65, 66, 67]), + ]); - let source = new Readable({ - read(size) { - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(Buffer.from([65, 66, 67])); - this.push(null); - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -286,14 +284,10 @@ suite('Encoding', () => { }); test('toDecodeStream - some stream, no data', async function () { + const source = newWriteableBufferStream(); + source.end(); - let source = new Readable({ - read(size) { - this.push(null); // empty - } - }); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 512, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.ok(detected); assert.ok(stream); @@ -304,29 +298,105 @@ suite('Encoding', () => { test('toDecodeStream - encoding, utf16be', async function () { + const path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); + const source = streamToBufferReadableStream(fs.createReadStream(path)); - let path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); - let source = fs.createReadStream(path); - - let { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); + const { detected, stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 64, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); assert.equal(detected.encoding, 'utf16be'); assert.equal(detected.seemsBinary, false); - let expected = await readAndDecodeFromDisk(path, detected.encoding); - let actual = await readAllAsString(stream); + const expected = await readAndDecodeFromDisk(path, detected.encoding); + const actual = await readAllAsString(stream); assert.equal(actual, expected); }); test('toDecodeStream - empty file', async function () { + const path = getPathFromAmdModule(require, './fixtures/empty.txt'); + const source = streamToBufferReadableStream(fs.createReadStream(path)); + const { detected, stream } = await encoding.toDecodeStream(source, { guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); - let path = getPathFromAmdModule(require, './fixtures/empty.txt'); - let source = fs.createReadStream(path); - let { detected, stream } = await encoding.toDecodeStream(source, { guessEncoding: false, overwriteEncoding: detected => detected || encoding.UTF8 }); - - let expected = await readAndDecodeFromDisk(path, detected.encoding); - let actual = await readAllAsString(stream); + const expected = await readAndDecodeFromDisk(path, detected.encoding); + const actual = await readAllAsString(stream); assert.equal(actual, expected); }); + + test('toDecodeStream - decodes buffer entirely', async function () { + const emojis = Buffer.from('🖥️💻💾'); + const incompleteEmojis = emojis.slice(0, emojis.length - 1); + + const buffers: Buffer[] = []; + for (let i = 0; i < incompleteEmojis.length; i++) { + buffers.push(incompleteEmojis.slice(i, i + 1)); + } + + const source = newTestReadableStream(buffers); + const { stream } = await encoding.toDecodeStream(source, { minBytesRequiredForDetection: 4, guessEncoding: false, overwriteEncoding: async detected => detected || encoding.UTF8 }); + + const expected = incompleteEmojis.toString(encoding.UTF8); + const actual = await readAllAsString(stream); + + assert.equal(actual, expected); + }); + + test('toEncodeReadable - encoding, utf16be', async function () { + const path = getPathFromAmdModule(require, './fixtures/some_utf16be.css'); + const source = await readAndDecodeFromDisk(path, encoding.UTF16be); + + const expected = VSBuffer.wrap( + iconv.encode(source, encoding.toNodeEncoding(encoding.UTF16be)) + ).toString(); + + const actual = streams.consumeReadable( + await encoding.toEncodeReadable(streams.toReadable(source), encoding.UTF16be), + VSBuffer.concat + ).toString(); + + assert.equal(actual, expected); + }); + + test('toEncodeReadable - empty readable to utf8', async function () { + const source: streams.Readable = { + read() { + return null; + } + }; + + const actual = streams.consumeReadable( + await encoding.toEncodeReadable(source, encoding.UTF8), + VSBuffer.concat + ).toString(); + + assert.equal(actual, ''); + }); + + [{ + utfEncoding: encoding.UTF8, + relatedBom: encoding.UTF8_BOM + }, { + utfEncoding: encoding.UTF8_with_bom, + relatedBom: encoding.UTF8_BOM + }, { + utfEncoding: encoding.UTF16be, + relatedBom: encoding.UTF16be_BOM, + }, { + utfEncoding: encoding.UTF16le, + relatedBom: encoding.UTF16le_BOM + }].forEach(({ utfEncoding, relatedBom }) => { + test(`toEncodeReadable - empty readable to ${utfEncoding} with BOM`, async function () { + const source: streams.Readable = { + read() { + return null; + } + }; + + const encodedReadable = encoding.toEncodeReadable(source, utfEncoding, { addBOM: true }); + + const expected = VSBuffer.wrap(Buffer.from(relatedBom)).toString(); + const actual = streams.consumeReadable(await encodedReadable, VSBuffer.concat).toString(); + + assert.equal(actual, expected); + }); + }); }); diff --git a/src/vs/base/test/node/path.test.ts b/src/vs/base/test/node/path.test.ts index bf8065d3cc..0b2a975578 100644 --- a/src/vs/base/test/node/path.test.ts +++ b/src/vs/base/test/node/path.test.ts @@ -164,8 +164,7 @@ suite('Paths (Node Implementation)', () => { os = 'posix'; } const message = - `path.${os}.join(${test[0].map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + `path.${os}.join(${test[0].map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected && actualAlt !== expected) { failures.push(`\n${message}`); } @@ -319,8 +318,7 @@ suite('Paths (Node Implementation)', () => { os = 'posix'; } const actual = extname(input); - const message = `path.${os}.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.${os}.extname(${JSON.stringify(input)})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } @@ -328,8 +326,7 @@ suite('Paths (Node Implementation)', () => { { const input = `C:${test[0].replace(slashRE, '\\')}`; const actual = path.win32.extname(input); - const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.win32.extname(${JSON.stringify(input)})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } @@ -416,8 +413,7 @@ suite('Paths (Node Implementation)', () => { const expected = test[1]; const message = - `path.${os}.resolve(${test[0].map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + `path.${os}.resolve(${test[0].map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected && actualAlt !== expected) { failures.push(`\n${message}`); } @@ -585,9 +581,7 @@ suite('Paths (Node Implementation)', () => { const actual = relative(test[0], test[1]); const expected = test[2]; const os = relative === path.win32.relative ? 'win32' : 'posix'; - const message = `path.${os}.relative(${ - test.slice(0, 2).map(JSON.stringify).join(',')})\n expect=${ - JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; + const message = `path.${os}.relative(${test.slice(0, 2).map(JSON.stringify).join(',')})\n expect=${JSON.stringify(expected)}\n actual=${JSON.stringify(actual)}`; if (actual !== expected) { failures.push(`\n${message}`); } diff --git a/src/vs/code/browser/workbench/callback.html b/src/vs/code/browser/workbench/callback.html index da6c907b66..9aec539bb5 100644 --- a/src/vs/code/browser/workbench/callback.html +++ b/src/vs/code/browser/workbench/callback.html @@ -35,7 +35,7 @@ display: flex; flex-direction: column; color: white; - font-family: "Segoe UI", "Helvetica Neue", "Helvetica", Arial, sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", system-ui, "Ubuntu", "Droid Sans", sans-serif; background-color: #373277; } diff --git a/src/vs/code/electron-browser/issue/issueReporterMain.ts b/src/vs/code/electron-browser/issue/issueReporterMain.ts index ab2b4c2cf7..c86fe478c8 100644 --- a/src/vs/code/electron-browser/issue/issueReporterMain.ts +++ b/src/vs/code/electron-browser/issue/issueReporterMain.ts @@ -8,7 +8,7 @@ import { ElectronService, IElectronService } from 'vs/platform/electron/electron import { ipcRenderer, webFrame } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import * as os from 'os'; import * as browser from 'vs/base/browser/browser'; -import { $, windowOpenNoOpener } from 'vs/base/browser/dom'; +import { $, windowOpenNoOpener, addClass } from 'vs/base/browser/dom'; import { Button } from 'vs/base/browser/ui/button/button'; import 'vs/base/browser/ui/codicons/codiconStyles'; // make sure codicon css is loaded import { CodiconLabel } from 'vs/base/browser/ui/codicons/codiconLabel'; @@ -55,6 +55,9 @@ export interface IssueReporterConfiguration extends INativeWindowConfiguration { } export function startup(configuration: IssueReporterConfiguration) { + const platformClass = platform.isWindows ? 'windows' : platform.isLinux ? 'linux' : 'mac'; + addClass(document.body, platformClass); // used by our fonts + document.body.innerHTML = BaseHtml(); const issueReporter = new IssueReporter(configuration); issueReporter.render(); diff --git a/src/vs/code/electron-browser/issue/media/issueReporter.css b/src/vs/code/electron-browser/issue/media/issueReporter.css index 78c3b1d2ca..8362221f41 100644 --- a/src/vs/code/electron-browser/issue/media/issueReporter.css +++ b/src/vs/code/electron-browser/issue/media/issueReporter.css @@ -95,26 +95,30 @@ textarea, input, select { } html { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; color: #CCCCCC; height: 100%; } -html:lang(zh-Hans) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; -} +/* Font Families (with CJK support) */ -html:lang(zh-Hant) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Microsoft Jhenghei", "PingFang TC", "Source Han Sans TC", "Source Han Sans", "Source Han Sans TW", sans-serif; -} +.mac { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } +.mac:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } +.mac:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } +.mac:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } +.mac:lang(ko) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } -html:lang(ja) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Yu Gothic UI", "Meiryo UI", "Hiragino Kaku Gothic Pro", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", "Sazanami Gothic", "IPA Gothic", sans-serif; -} +.windows { font-family: "Segoe WPC", "Segoe UI", sans-serif; } +.windows:lang(zh-Hans) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } +.windows:lang(zh-Hant) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } +.windows:lang(ja) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } +.windows:lang(ko) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } -html:lang(ko) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Malgun Gothic", "Nanum Gothic", "Dotom", "Apple SD Gothic Neo", "AppleGothic", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; -} +/* Linux: add `system-ui` as first font and not `Ubuntu` to allow other distribution pick their standard OS font */ +.linux { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } +.linux:lang(zh-Hans) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } +.linux:lang(zh-Hant) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } +.linux:lang(ja) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } +.linux:lang(ko) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } body { margin: 0; diff --git a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css index 575fcbf64d..2859c35b17 100644 --- a/src/vs/code/electron-browser/processExplorer/media/processExplorer.css +++ b/src/vs/code/electron-browser/processExplorer/media/processExplorer.css @@ -4,25 +4,29 @@ *--------------------------------------------------------------------------------------------*/ html { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; font-size: 13px; } -html:lang(zh-Hans) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Microsoft YaHei", "PingFang SC", "Hiragino Sans GB", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; -} +/* Font Families (with CJK support) */ -html:lang(zh-Hant) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Microsoft Jhenghei", "PingFang TC", "Source Han Sans TC", "Source Han Sans", "Source Han Sans TW", sans-serif; -} +.mac { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } +.mac:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } +.mac:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } +.mac:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } +.mac:lang(ko) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } -html:lang(ja) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Yu Gothic UI", "Meiryo UI", "Hiragino Kaku Gothic Pro", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", "Sazanami Gothic", "IPA Gothic", sans-serif; -} +.windows { font-family: "Segoe WPC", "Segoe UI", sans-serif; } +.windows:lang(zh-Hans) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } +.windows:lang(zh-Hant) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } +.windows:lang(ja) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } +.windows:lang(ko) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } -html:lang(ko) { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Noto Sans", "Malgun Gothic", "Nanum Gothic", "Dotom", "Apple SD Gothic Neo", "AppleGothic", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; -} +/* Linux: add `system-ui` as first font and not `Ubuntu` to allow other distribution pick their standard OS font */ +.linux { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } +.linux:lang(zh-Hans) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } +.linux:lang(zh-Hant) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } +.linux:lang(ja) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } +.linux:lang(ko) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } body { margin: 0; diff --git a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts index 95198acde6..6a4eb290e6 100644 --- a/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts +++ b/src/vs/code/electron-browser/processExplorer/processExplorerMain.ts @@ -16,7 +16,7 @@ import * as platform from 'vs/base/common/platform'; import { IContextMenuItem } from 'vs/base/parts/contextmenu/common/contextmenu'; import { popup } from 'vs/base/parts/contextmenu/electron-sandbox/contextmenu'; import { ProcessItem } from 'vs/base/common/processes'; -import { addDisposableListener } from 'vs/base/browser/dom'; +import { addDisposableListener, addClass } from 'vs/base/browser/dom'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { isRemoteDiagnosticError, IRemoteDiagnosticError } from 'vs/platform/diagnostics/common/diagnostics'; @@ -389,6 +389,9 @@ function createCloseListener(): void { } export function startup(data: ProcessExplorerData): void { + const platformClass = platform.isWindows ? 'windows' : platform.isLinux ? 'linux' : 'mac'; + addClass(document.body, platformClass); // used by our fonts + applyStyles(data.styles); applyZoom(data.zoomLevel); createCloseListener(); diff --git a/src/vs/code/electron-browser/proxy/auth.html b/src/vs/code/electron-browser/proxy/auth.html index f0fc7231e3..e5cc351b14 100644 --- a/src/vs/code/electron-browser/proxy/auth.html +++ b/src/vs/code/electron-browser/proxy/auth.html @@ -18,7 +18,7 @@ } body { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", system-ui, "Ubuntu", "Droid Sans", sans-serif; font-size: 10pt; background-color: #F3F3F3; } @@ -58,7 +58,7 @@ } input { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif !important; + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", system-ui, "Ubuntu", "Droid Sans", sans-serif !important; } diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index f56310f1d0..cda53693a9 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -49,10 +49,10 @@ import { IFileService } from 'vs/platform/files/common/files'; import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemProvider'; import { Schemas } from 'vs/base/common/network'; import { IProductService } from 'vs/platform/product/common/productService'; -import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncStoreService, registerConfiguration, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; -import { UserDataSyncChannel, UserDataSyncUtilServiceClient, UserDataAutoSyncChannel, StorageKeysSyncRegistryChannelClient, UserDataSyncMachinesServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; +import { UserDataSyncChannel, UserDataSyncUtilServiceClient, UserDataAutoSyncChannel, StorageKeysSyncRegistryChannelClient, UserDataSyncMachinesServiceChannel, UserDataSyncAccountServiceChannel } from 'vs/platform/userDataSync/common/userDataSyncIpc'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { LoggerService } from 'vs/platform/log/node/loggerService'; import { UserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSyncLog'; @@ -63,9 +63,8 @@ import { NativeStorageService } from 'vs/platform/storage/node/storageService'; import { GlobalStorageDatabaseChannelClient } from 'vs/platform/storage/node/storageIpc'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; -import { IAuthenticationTokenService, AuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; -import { AuthenticationTokenServiceChannel } from 'vs/platform/authentication/electron-browser/authenticationIpc'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; +import { IUserDataSyncAccountService, UserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { ExtensionTipsService } from 'vs/platform/extensionManagement/node/extensionTipsService'; @@ -95,7 +94,7 @@ class MainProcessService implements IMainProcessService { private mainRouter: StaticRouter ) { } - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; getChannel(channelName: string): IChannel { return this.server.getChannel(channelName, this.mainRouter); @@ -199,14 +198,14 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat services.set(IExtensionTipsService, new SyncDescriptor(ExtensionTipsService)); services.set(ICredentialsService, new SyncDescriptor(KeytarCredentialsService)); - services.set(IAuthenticationTokenService, new SyncDescriptor(AuthenticationTokenService)); + services.set(IUserDataSyncAccountService, new SyncDescriptor(UserDataSyncAccountService)); services.set(IUserDataSyncLogService, new SyncDescriptor(UserDataSyncLogService)); services.set(IUserDataSyncUtilService, new UserDataSyncUtilServiceClient(server.getChannel('userDataSyncUtil', client => client.ctx !== 'main'))); services.set(IGlobalExtensionEnablementService, new SyncDescriptor(GlobalExtensionEnablementService)); services.set(IUserDataSyncStoreService, new SyncDescriptor(UserDataSyncStoreService)); services.set(IUserDataSyncMachinesService, new SyncDescriptor(UserDataSyncMachinesService)); services.set(IUserDataSyncBackupStoreService, new SyncDescriptor(UserDataSyncBackupStoreService)); - services.set(IUserDataSyncEnablementService, new SyncDescriptor(UserDataSyncEnablementService)); + services.set(IUserDataSyncResourceEnablementService, new SyncDescriptor(UserDataSyncResourceEnablementService)); services.set(IUserDataSyncService, new SyncDescriptor(UserDataSyncService)); registerConfiguration(); @@ -234,9 +233,9 @@ async function main(server: Server, initData: ISharedProcessInitData, configurat const userDataSyncMachineChannel = new UserDataSyncMachinesServiceChannel(userDataSyncMachinesService); server.registerChannel('userDataSyncMachines', userDataSyncMachineChannel); - const authTokenService = accessor.get(IAuthenticationTokenService); - const authTokenChannel = new AuthenticationTokenServiceChannel(authTokenService); - server.registerChannel('authToken', authTokenChannel); + const authTokenService = accessor.get(IUserDataSyncAccountService); + const authTokenChannel = new UserDataSyncAccountServiceChannel(authTokenService); + server.registerChannel('userDataSyncAccount', authTokenChannel); const userDataSyncService = accessor.get(IUserDataSyncService); const userDataSyncChannel = new UserDataSyncChannel(userDataSyncService, logService); diff --git a/src/vs/code/electron-browser/workbench/workbench.js b/src/vs/code/electron-browser/workbench/workbench.js index 6d7dbafdfc..383cbac088 100644 --- a/src/vs/code/electron-browser/workbench/workbench.js +++ b/src/vs/code/electron-browser/workbench/workbench.js @@ -6,7 +6,29 @@ //@ts-check 'use strict'; -const perf = require('../../../base/common/performance'); +const perf = (function () { + let sharedObj; + if (typeof global === 'object') { + // nodejs + sharedObj = global; + } else if (typeof self === 'object') { + // browser + sharedObj = self; + } else { + sharedObj = {}; + } + // @ts-ignore + sharedObj._performanceEntries = sharedObj._performanceEntries || []; + return { + /** + * @param {string} name + */ + mark(name) { + sharedObj._performanceEntries.push(name, Date.now()); + } + }; +})(); + perf.mark('renderer/started'); const bootstrapWindow = require('../../../../bootstrap-window'); @@ -150,7 +172,7 @@ function showPartsSplash(configuration) { * @returns {Promise} */ function getLazyEnv() { - // @ts-ignore + const ipc = require('electron').ipcRenderer; return new Promise(function (resolve) { diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 4d6174d30c..0c3f3e691d 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, powerMonitor, IpcMainEvent, BrowserWindow, dialog, session } from 'electron'; +import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, IpcMainEvent, BrowserWindow, dialog, session } from 'electron'; import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/platform'; import { WindowsMainService } from 'vs/platform/windows/electron-main/windowsMainService'; import { IWindowOpenable } from 'vs/platform/windows/common/windows'; @@ -26,7 +26,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IURLService } from 'vs/platform/url/common/url'; import { URLHandlerChannelClient, URLHandlerRouter } from 'vs/platform/url/common/urlIpc'; -import { ITelemetryService, machineIdKey, trueMachineIdKey } from 'vs/platform/telemetry/common/telemetry'; +import { ITelemetryService, machineIdKey } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService, combinedAppender, LogAppender } from 'vs/platform/telemetry/common/telemetryUtils'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { TelemetryService, ITelemetryServiceConfig } from 'vs/platform/telemetry/common/telemetryService'; @@ -261,13 +261,6 @@ export class CodeApplication extends Disposable { } }); - ipc.on('vscode:exit', (event: Event, code: number) => { - this.logService.trace('IPC#vscode:exit', code); - - this.dispose(); - this.lifecycleMainService.kill(code); - }); - ipc.on('vscode:fetchShellEnv', async (event: IpcMainEvent) => { const webContents = event.sender; @@ -294,13 +287,6 @@ export class CodeApplication extends Disposable { (async () => { await this.lifecycleMainService.when(LifecycleMainPhase.AfterWindowOpen); - // After waking up from sleep (after window opened) - powerMonitor.on('resume', () => { - if (this.windowsMainService) { - this.windowsMainService.sendToAll('vscode:osResume', undefined); - } - }); - // Keyboard layout changes (after window opened) const nativeKeymap = await import('native-keymap'); nativeKeymap.onDidChangeKeyboardLayout(() => { @@ -365,8 +351,8 @@ export class CodeApplication extends Disposable { // Resolve unique machine ID this.logService.trace('Resolving machine identifier...'); - const { machineId, trueMachineId } = await this.resolveMachineId(); - this.logService.trace(`Resolved machine identifier: ${machineId} (trueMachineId: ${trueMachineId})`); + const machineId = await this.resolveMachineId(); + this.logService.trace(`Resolved machine identifier: ${machineId}`); // Spawn shared process after the first window has opened and 3s have passed const sharedProcess = this.instantiationService.createInstance(SharedProcess, machineId, this.userEnv); @@ -387,7 +373,7 @@ export class CodeApplication extends Disposable { }); // Services - const appInstantiationService = await this.createServices(machineId, trueMachineId, sharedProcess, sharedProcessReady); + const appInstantiationService = await this.createServices(machineId, sharedProcess, sharedProcessReady); // Create driver if (this.environmentService.driverHandle) { @@ -412,32 +398,21 @@ export class CodeApplication extends Disposable { } } - private async resolveMachineId(): Promise<{ machineId: string, trueMachineId?: string }> { + private async resolveMachineId(): Promise { // We cache the machineId for faster lookups on startup - // and resolve it only once initially if not cached + // and resolve it only once initially if not cached or we need to replace the macOS iBridge device let machineId = this.stateService.getItem(machineIdKey); - if (!machineId) { + if (!machineId || (isMacintosh && machineId === '6c9d2bc8f91b89624add29c0abeae7fb42bf539fa1cdb2e3e57cd668fa9bcead')) { machineId = await getMachineId(); this.stateService.setItem(machineIdKey, machineId); } - // Check if machineId is hashed iBridge Device - let trueMachineId: string | undefined; - if (isMacintosh && machineId === '6c9d2bc8f91b89624add29c0abeae7fb42bf539fa1cdb2e3e57cd668fa9bcead') { - trueMachineId = this.stateService.getItem(trueMachineIdKey); - if (!trueMachineId) { - trueMachineId = await getMachineId(); - - this.stateService.setItem(trueMachineIdKey, trueMachineId); - } - } - - return { machineId, trueMachineId }; + return machineId; } - private async createServices(machineId: string, trueMachineId: string | undefined, sharedProcess: SharedProcess, sharedProcessReady: Promise>): Promise { + private async createServices(machineId: string, sharedProcess: SharedProcess, sharedProcessReady: Promise>): Promise { const services = new ServiceCollection(); switch (process.platform) { @@ -489,7 +464,7 @@ export class CodeApplication extends Disposable { const appender = combinedAppender(new TelemetryAppenderClient(channel), new LogAppender(this.logService)); const commonProperties = resolveCommonProperties(product.commit, product.version, machineId, product.msftInternalDomains, this.environmentService.installSourcePath); const piiPaths = this.environmentService.extensionsPath ? [this.environmentService.appRoot, this.environmentService.extensionsPath] : [this.environmentService.appRoot]; - const config: ITelemetryServiceConfig = { appender, commonProperties, piiPaths, trueMachineId, sendErrorTelemetry: true }; + const config: ITelemetryServiceConfig = { appender, commonProperties, piiPaths, sendErrorTelemetry: true }; services.set(ITelemetryService, new SyncDescriptor(TelemetryService, [config])); } else { diff --git a/src/vs/code/electron-main/auth.ts b/src/vs/code/electron-main/auth.ts index 625e135390..a5f6df24ed 100644 --- a/src/vs/code/electron-main/auth.ts +++ b/src/vs/code/electron-main/auth.ts @@ -23,7 +23,7 @@ type Credentials = { export class ProxyAuthHandler extends Disposable { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private retryCount = 0; @@ -60,7 +60,8 @@ export class ProxyAuthHandler extends Disposable { webPreferences: { nodeIntegration: true, webviewTag: true, - enableWebSQL: false + enableWebSQL: false, + nativeWindowOpen: true } }; diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index b7baef7e21..415107bb19 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -47,6 +47,9 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { Schemas } from 'vs/base/common/network'; import { IFileService } from 'vs/platform/files/common/files'; import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { TunnelService } from 'vs/platform/remote/node/tunnelService'; +import { IProductService } from 'vs/platform/product/common/productService'; class ExpectedError extends Error { readonly isExpected = true; @@ -162,6 +165,8 @@ class CodeMain { services.set(IThemeMainService, new SyncDescriptor(ThemeMainService)); services.set(ISignService, new SyncDescriptor(SignService)); services.set(IStorageKeysSyncRegistryService, new SyncDescriptor(StorageKeysSyncRegistryService)); + services.set(IProductService, { _serviceBrand: undefined, ...product }); + services.set(ITunnelService, new SyncDescriptor(TunnelService)); return [new InstantiationService(services, true), instanceEnvironment, environmentService]; } diff --git a/src/vs/code/electron-main/sharedProcess.ts b/src/vs/code/electron-main/sharedProcess.ts index bb4d02390e..6122a5f400 100644 --- a/src/vs/code/electron-main/sharedProcess.ts +++ b/src/vs/code/electron-main/sharedProcess.ts @@ -47,6 +47,7 @@ export class SharedProcess implements ISharedProcess { nodeIntegration: true, webgl: false, enableWebSQL: false, + nativeWindowOpen: true, disableBlinkFeatures: 'Auxclick' // do NOT change, allows us to identify this window as shared-process in the process explorer } }); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index bf01c63f4a..4602cd8fff 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -8,7 +8,7 @@ import * as objects from 'vs/base/common/objects'; import * as nls from 'vs/nls'; import { Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; -import { screen, BrowserWindow, systemPreferences, app, TouchBar, nativeImage, Rectangle, Display, TouchBarSegmentedControl, NativeImage, BrowserWindowConstructorOptions, SegmentedControlSegment, nativeTheme } from 'electron'; +import { screen, BrowserWindow, systemPreferences, app, TouchBar, nativeImage, Rectangle, Display, TouchBarSegmentedControl, NativeImage, BrowserWindowConstructorOptions, SegmentedControlSegment, nativeTheme, Event } from 'electron'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { ILogService } from 'vs/platform/log/common/log'; @@ -91,15 +91,18 @@ export class CodeWindow extends Disposable implements ICodeWindow { private static readonly MAX_URL_LENGTH = 2 * 1024 * 1024; // https://cs.chromium.org/chromium/src/url/url_constants.cc?l=32 + private readonly _onLoad = this._register(new Emitter()); + readonly onLoad = this._onLoad.event; + + private readonly _onReady = this._register(new Emitter()); + readonly onReady = this._onReady.event; + private readonly _onClose = this._register(new Emitter()); readonly onClose = this._onClose.event; private readonly _onDestroy = this._register(new Emitter()); readonly onDestroy = this._onDestroy.event; - private readonly _onLoad = this._register(new Emitter()); - readonly onLoad = this._onLoad.event; - private hiddenTitleBarStyle: boolean | undefined; private showTimeoutHandle: NodeJS.Timeout | undefined; private _lastFocusTime: number; @@ -167,7 +170,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { nodeIntegration: true, nodeIntegrationInWorker: RUN_TEXTMATE_IN_WORKER, webviewTag: true, - enableWebSQL: false + enableWebSQL: false, + nativeWindowOpen: true } }; @@ -346,6 +350,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { while (this.whenReadyCallbacks.length) { this.whenReadyCallbacks.pop()!(this); } + + // Events + this._onReady.fire(); } ready(): Promise { @@ -431,24 +438,34 @@ export class CodeWindow extends Disposable implements ICodeWindow { this._lastFocusTime = Date.now(); }); - // Simple fullscreen doesn't resize automatically when the resolution changes so as a workaround - // we need to detect when display metrics change or displays are added/removed and toggle the - // fullscreen manually. if (isMacintosh) { - const simpleFullScreenScheduler = this._register(new RunOnceScheduler(() => { + const displayChangedScheduler = this._register(new RunOnceScheduler(() => { if (!this._win) { return; // disposed } + // Notify renderers about displays changed + this.sendWhenReady('vscode:displayChanged'); + + // Simple fullscreen doesn't resize automatically when the resolution changes so as a workaround + // we need to detect when display metrics change or displays are added/removed and toggle the + // fullscreen manually. if (!this.useNativeFullScreen() && this.isFullScreen) { this.setFullScreen(false); this.setFullScreen(true); } - - this.sendWhenReady('vscode:displayChanged'); }, 100)); - const displayChangedListener = () => simpleFullScreenScheduler.schedule(); + const displayChangedListener = (event: Event, display: Display, changedMetrics?: string[]) => { + if (Array.isArray(changedMetrics) && changedMetrics.length === 1 && changedMetrics[0] === 'workArea') { + // Electron will emit 'display-metrics-changed' events even when actually + // going fullscreen, because the dock hides. However, we do not want to + // react on this event as there is no change in display bounds. + return; + } + + displayChangedScheduler.schedule(); + }; screen.on('display-metrics-changed', displayChangedListener); this._register(toDisposable(() => screen.removeListener('display-metrics-changed', displayChangedListener))); diff --git a/src/vs/code/node/cliProcessMain.ts b/src/vs/code/node/cliProcessMain.ts index bbb56c517d..8e5d367e70 100644 --- a/src/vs/code/node/cliProcessMain.ts +++ b/src/vs/code/node/cliProcessMain.ts @@ -86,7 +86,7 @@ export class Main { } else if (argv['list-extensions']) { await this.listExtensions(!!argv['show-versions'], argv['category']); } else if (argv['install-extension']) { - await this.installExtensions(argv['install-extension'], !!argv['force'], !!argv['donot-sync']); + await this.installExtensions(argv['install-extension'], !!argv['force'], !!argv['do-not-sync']); } else if (argv['uninstall-extension']) { await this.uninstallExtension(argv['uninstall-extension']); } else if (argv['locate-extension']) { @@ -126,7 +126,7 @@ export class Main { extensions.forEach(e => console.log(getId(e.manifest, showVersions))); } - private async installExtensions(extensions: string[], force: boolean, donotSync: boolean): Promise { + private async installExtensions(extensions: string[], force: boolean, doNotSync: boolean): Promise { const failed: string[] = []; const installedExtensionsManifests: IExtensionManifest[] = []; if (extensions.length) { @@ -135,7 +135,7 @@ export class Main { for (const extension of extensions) { try { - const manifest = await this.installExtension(extension, force, donotSync); + const manifest = await this.installExtension(extension, force, doNotSync); if (manifest) { installedExtensionsManifests.push(manifest); } @@ -150,7 +150,7 @@ export class Main { return failed.length ? Promise.reject(localize('installation failed', "Failed Installing Extensions: {0}", failed.join(', '))) : Promise.resolve(); } - private async installExtension(extension: string, force: boolean, donotSync: boolean): Promise { + private async installExtension(extension: string, force: boolean, doNotSync: boolean): Promise { if (/\.vsix$/i.test(extension)) { extension = path.isAbsolute(extension) ? extension : path.join(process.cwd(), extension); @@ -158,7 +158,7 @@ export class Main { const valid = await this.validate(manifest, force); if (valid) { - return this.extensionManagementService.install(URI.file(extension), donotSync).then(id => { + return this.extensionManagementService.install(URI.file(extension), doNotSync).then(id => { console.log(localize('successVsixInstall', "Extension '{0}' was successfully installed.", getBaseLabel(extension))); return manifest; }, error => { @@ -205,7 +205,7 @@ export class Main { } console.log(localize('updateMessage', "Updating the extension '{0}' to the version {1}", id, extension.version)); } - await this.installFromGallery(id, extension, donotSync); + await this.installFromGallery(id, extension, doNotSync); return manifest; })); } @@ -227,11 +227,11 @@ export class Main { return true; } - private async installFromGallery(id: string, extension: IGalleryExtension, donotSync: boolean): Promise { + private async installFromGallery(id: string, extension: IGalleryExtension, doNotSync: boolean): Promise { console.log(localize('installing', "Installing extension '{0}' v{1}...", id, extension.version)); try { - await this.extensionManagementService.installFromGallery(extension, donotSync); + await this.extensionManagementService.installFromGallery(extension, doNotSync); console.log(localize('successInstall', "Extension '{0}' v{1} was successfully installed.", id, extension.version)); } catch (error) { if (isPromiseCanceledError(error)) { diff --git a/src/vs/editor/browser/controller/coreCommands.ts b/src/vs/editor/browser/controller/coreCommands.ts index e5e31e6817..b662767c19 100644 --- a/src/vs/editor/browser/controller/coreCommands.ts +++ b/src/vs/editor/browser/controller/coreCommands.ts @@ -958,7 +958,7 @@ export namespace CoreNavigationCommands { viewModel.setCursorStates( args.source, CursorChangeReason.Explicit, - CursorMoveCommands.moveToEndOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode) + CursorMoveCommands.moveToEndOfLine(viewModel, viewModel.getCursorStates(), this._inSelectionMode, args.sticky || false) ); viewModel.revealPrimaryCursor(args.source, true); } @@ -969,10 +969,27 @@ export namespace CoreNavigationCommands { id: 'cursorEnd', precondition: undefined, kbOpts: { + args: { sticky: false }, weight: CORE_WEIGHT, kbExpr: EditorContextKeys.textInputFocus, primary: KeyCode.End, mac: { primary: KeyCode.End, secondary: [KeyMod.CtrlCmd | KeyCode.RightArrow] } + }, + description: { + description: `Go to End`, + args: [{ + name: 'args', + schema: { + type: 'object', + properties: { + 'sticky': { + description: nls.localize('stickydesc', "Stick to the end even when going to longer lines"), + type: 'boolean', + default: false + } + } + } + }] } })); @@ -981,10 +998,27 @@ export namespace CoreNavigationCommands { id: 'cursorEndSelect', precondition: undefined, kbOpts: { + args: { sticky: false }, weight: CORE_WEIGHT, kbExpr: EditorContextKeys.textInputFocus, primary: KeyMod.Shift | KeyCode.End, mac: { primary: KeyMod.Shift | KeyCode.End, secondary: [KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.RightArrow] } + }, + description: { + description: `Select to End`, + args: [{ + name: 'args', + schema: { + type: 'object', + properties: { + 'sticky': { + description: nls.localize('stickydesc', "Stick to the end even when going to longer lines"), + type: 'boolean', + default: false + } + } + } + }] } })); diff --git a/src/vs/editor/browser/controller/textAreaInput.ts b/src/vs/editor/browser/controller/textAreaInput.ts index 29549e0180..aded2667fb 100644 --- a/src/vs/editor/browser/controller/textAreaInput.ts +++ b/src/vs/editor/browser/controller/textAreaInput.ts @@ -380,7 +380,7 @@ export class TextAreaInput extends Disposable { } private _installSelectionChangeListener(): IDisposable { - // See https://github.com/Microsoft/vscode/issues/27216 + // See https://github.com/Microsoft/vscode/issues/27216 and https://github.com/microsoft/vscode/issues/98256 // When using a Braille display, it is possible for users to reposition the // system caret. This is reflected in Chrome as a `selectionchange` event. // @@ -406,8 +406,8 @@ export class TextAreaInput extends Disposable { if (this._isDoingComposition) { return; } - if (!browser.isChrome || !platform.isWindows) { - // Support only for Chrome on Windows until testing happens on other browsers + OS configurations + if (!browser.isChrome) { + // Support only for Chrome until testing happens on other browsers return; } diff --git a/src/vs/editor/browser/core/keybindingCancellation.ts b/src/vs/editor/browser/core/keybindingCancellation.ts index a3123fd563..c20c6dcde4 100644 --- a/src/vs/editor/browser/core/keybindingCancellation.ts +++ b/src/vs/editor/browser/core/keybindingCancellation.ts @@ -17,7 +17,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; const IEditorCancellationTokens = createDecorator('IEditorCancelService'); interface IEditorCancellationTokens { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; add(editor: ICodeEditor, cts: CancellationTokenSource): () => void; cancel(editor: ICodeEditor): void; } @@ -26,7 +26,7 @@ const ctxCancellableOperation = new RawContextKey('cancellableOperation', false) registerSingleton(IEditorCancellationTokens, class implements IEditorCancellationTokens { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _tokens = new WeakMap, tokens: LinkedList }>(); diff --git a/src/vs/editor/browser/editorExtensions.ts b/src/vs/editor/browser/editorExtensions.ts index 8ea1a02fce..021d977f8f 100644 --- a/src/vs/editor/browser/editorExtensions.ts +++ b/src/vs/editor/browser/editorExtensions.ts @@ -43,6 +43,10 @@ export interface IDiffEditorContributionDescription { export interface ICommandKeybindingsOptions extends IKeybindings { kbExpr?: ContextKeyExpression | null; weight: number; + /** + * the default keybinding arguments + */ + args?: any; } export interface ICommandMenuOptions { menuId: MenuId; @@ -96,6 +100,7 @@ export abstract class Command { id: this.id, handler: (accessor, args) => this.runCommand(accessor, args), weight: this._kbOpts.weight, + args: this._kbOpts.args, when: kbWhen, primary: this._kbOpts.primary, secondary: this._kbOpts.secondary, diff --git a/src/vs/editor/browser/services/abstractCodeEditorService.ts b/src/vs/editor/browser/services/abstractCodeEditorService.ts index 248ea82728..9798b8db64 100644 --- a/src/vs/editor/browser/services/abstractCodeEditorService.ts +++ b/src/vs/editor/browser/services/abstractCodeEditorService.ts @@ -10,10 +10,11 @@ import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; +import { URI } from 'vs/base/common/uri'; export abstract class AbstractCodeEditorService extends Disposable implements ICodeEditorService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onCodeEditorAdd: Emitter = this._register(new Emitter()); public readonly onCodeEditorAdd: Event = this._onCodeEditorAdd.event; @@ -94,6 +95,29 @@ export abstract class AbstractCodeEditorService extends Disposable implements IC abstract resolveDecorationOptions(decorationTypeKey: string | undefined, writable: boolean): IModelDecorationOptions; private readonly _transientWatchers: { [uri: string]: ModelTransientSettingWatcher; } = {}; + private readonly _modelProperties = new Map>(); + + public setModelProperty(resource: URI, key: string, value: any): void { + const key1 = resource.toString(); + let dest: Map; + if (this._modelProperties.has(key1)) { + dest = this._modelProperties.get(key1)!; + } else { + dest = new Map(); + this._modelProperties.set(key1, dest); + } + + dest.set(key, value); + } + + public getModelProperty(resource: URI, key: string): any { + const key1 = resource.toString(); + if (this._modelProperties.has(key1)) { + const innerMap = this._modelProperties.get(key1)!; + return innerMap.get(key); + } + return undefined; + } public setTransientModelProperty(model: ITextModel, key: string, value: any): void { const uri = model.uri.toString(); diff --git a/src/vs/editor/browser/services/bulkEditService.ts b/src/vs/editor/browser/services/bulkEditService.ts index c44e52cb6a..1c4b57699f 100644 --- a/src/vs/editor/browser/services/bulkEditService.ts +++ b/src/vs/editor/browser/services/bulkEditService.ts @@ -26,7 +26,7 @@ export interface IBulkEditResult { export type IBulkEditPreviewHandler = (edit: WorkspaceEdit, options?: IBulkEditOptions) => Promise; export interface IBulkEditService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; hasPreviewHandler(): boolean; diff --git a/src/vs/editor/browser/services/codeEditorService.ts b/src/vs/editor/browser/services/codeEditorService.ts index cb94babd29..84e16b4f92 100644 --- a/src/vs/editor/browser/services/codeEditorService.ts +++ b/src/vs/editor/browser/services/codeEditorService.ts @@ -9,11 +9,12 @@ import { IDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { IModelDecorationOptions, ITextModel } from 'vs/editor/common/model'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { URI } from 'vs/base/common/uri'; export const ICodeEditorService = createDecorator('codeEditorService'); export interface ICodeEditorService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onCodeEditorAdd: Event; readonly onCodeEditorRemove: Event; @@ -41,6 +42,9 @@ export interface ICodeEditorService { removeDecorationType(key: string): void; resolveDecorationOptions(typeKey: string, writable: boolean): IModelDecorationOptions; + setModelProperty(resource: URI, key: string, value: any): void; + getModelProperty(resource: URI, key: string): any; + setTransientModelProperty(model: ITextModel, key: string, value: any): void; getTransientModelProperty(model: ITextModel, key: string): any; getTransientModelProperties(model: ITextModel): [string, any][] | undefined; diff --git a/src/vs/editor/browser/services/openerService.ts b/src/vs/editor/browser/services/openerService.ts index 6431ca6f16..09e75bbcc6 100644 --- a/src/vs/editor/browser/services/openerService.ts +++ b/src/vs/editor/browser/services/openerService.ts @@ -85,7 +85,7 @@ class EditorOpener implements IOpener { export class OpenerService implements IOpenerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _openers = new LinkedList(); private readonly _validators = new LinkedList(); diff --git a/src/vs/editor/browser/widget/diffReview.ts b/src/vs/editor/browser/widget/diffReview.ts index 0f5df6e756..48e22a7038 100644 --- a/src/vs/editor/browser/widget/diffReview.ts +++ b/src/vs/editor/browser/widget/diffReview.ts @@ -752,7 +752,7 @@ export class DiffReview extends Disposable { switch (type) { case DiffEntryType.Equal: if (originalLine === modifiedLine) { - ariaLabel = nls.localize('unchangedLine', "{0} unchanged line {1}", lineContent, originalLine); + ariaLabel = nls.localize({ key: 'unchangedLine', comment: ['The placholders are contents of the line and should not be translated.'] }, "{0} unchanged line {1}", lineContent, originalLine); } else { ariaLabel = nls.localize('equalLine', "{0} original line {1} modified line {2}", lineContent, originalLine, modifiedLine); } diff --git a/src/vs/editor/common/config/editorOptions.ts b/src/vs/editor/common/config/editorOptions.ts index 62589c406c..d80c745c48 100644 --- a/src/vs/editor/common/config/editorOptions.ts +++ b/src/vs/editor/common/config/editorOptions.ts @@ -94,10 +94,10 @@ export interface IEditorOptions { */ renderFinalNewline?: boolean; /** - * Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS), NEXT LINE (NEL). - * Defaults to true. + * Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS). + * Defaults to 'prompt'. */ - removeUnusualLineTerminators?: boolean; + unusualLineTerminators?: 'off' | 'prompt' | 'auto'; /** * Should the corresponding line be selected when clicking on the line number? * Defaults to true. @@ -3560,7 +3560,6 @@ export const enum EditorOption { quickSuggestions, quickSuggestionsDelay, readOnly, - removeUnusualLineTerminators, renameOnType, renderControlCharacters, renderIndentGuides, @@ -3590,6 +3589,7 @@ export const enum EditorOption { suggestOnTriggerCharacters, suggestSelection, tabCompletion, + unusualLineTerminators, useTabStops, wordSeparators, wordWrap, @@ -3979,10 +3979,6 @@ export const EditorOptions = { readOnly: register(new EditorBooleanOption( EditorOption.readOnly, 'readOnly', false, )), - removeUnusualLineTerminators: register(new EditorBooleanOption( - EditorOption.removeUnusualLineTerminators, 'removeUnusualLineTerminators', true, - { description: nls.localize('removeUnusualLineTerminators', "Remove unusual line terminators that might cause problems.") } - )), renameOnType: register(new EditorBooleanOption( EditorOption.renameOnType, 'renameOnType', false, { description: nls.localize('renameOnType', "Controls whether the editor auto renames on type.") } @@ -4152,6 +4148,19 @@ export const EditorOptions = { description: nls.localize('tabCompletion', "Enables tab completions.") } )), + unusualLineTerminators: register(new EditorStringEnumOption( + EditorOption.unusualLineTerminators, 'unusualLineTerminators', + 'prompt' as 'off' | 'prompt' | 'auto', + ['off', 'prompt', 'auto'] as const, + { + enumDescriptions: [ + nls.localize('unusualLineTerminators.off', "Unusual line terminators are ignored."), + nls.localize('unusualLineTerminators.prompt', "Unusual line terminators prompt to be removed."), + nls.localize('unusualLineTerminators.auto', "Unusual line terminators are automatically removed."), + ], + description: nls.localize('unusualLineTerminators', "Remove unusual line terminators that might cause problems.") + } + )), useTabStops: register(new EditorBooleanOption( EditorOption.useTabStops, 'useTabStops', true, { description: nls.localize('useTabStops', "Inserting and deleting whitespace follows tab stops.") } diff --git a/src/vs/editor/common/controller/cursorMoveCommands.ts b/src/vs/editor/common/controller/cursorMoveCommands.ts index 84feaa9955..acdb253188 100644 --- a/src/vs/editor/common/controller/cursorMoveCommands.ts +++ b/src/vs/editor/common/controller/cursorMoveCommands.ts @@ -80,17 +80,17 @@ export class CursorMoveCommands { ); } - public static moveToEndOfLine(viewModel: IViewModel, cursors: CursorState[], inSelectionMode: boolean): PartialCursorState[] { + public static moveToEndOfLine(viewModel: IViewModel, cursors: CursorState[], inSelectionMode: boolean, sticky: boolean): PartialCursorState[] { let result: PartialCursorState[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - result[i] = this._moveToLineEnd(viewModel, cursor, inSelectionMode); + result[i] = this._moveToLineEnd(viewModel, cursor, inSelectionMode, sticky); } return result; } - private static _moveToLineEnd(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean): PartialCursorState { + private static _moveToLineEnd(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean, sticky: boolean): PartialCursorState { const viewStatePosition = cursor.viewState.position; const viewModelMaxColumn = viewModel.getLineMaxColumn(viewStatePosition.lineNumber); const isEndOfViewLine = viewStatePosition.column === viewModelMaxColumn; @@ -100,21 +100,21 @@ export class CursorMoveCommands { const isEndLineOfWrappedLine = viewModelMaxColumn - viewStatePosition.column === modelMaxColumn - modelStatePosition.column; if (isEndOfViewLine || isEndLineOfWrappedLine) { - return this._moveToLineEndByModel(viewModel, cursor, inSelectionMode); + return this._moveToLineEndByModel(viewModel, cursor, inSelectionMode, sticky); } else { - return this._moveToLineEndByView(viewModel, cursor, inSelectionMode); + return this._moveToLineEndByView(viewModel, cursor, inSelectionMode, sticky); } } - private static _moveToLineEndByView(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean): PartialCursorState { + private static _moveToLineEndByView(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean, sticky: boolean): PartialCursorState { return CursorState.fromViewState( - MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode) + MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, sticky) ); } - private static _moveToLineEndByModel(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean): PartialCursorState { + private static _moveToLineEndByModel(viewModel: IViewModel, cursor: CursorState, inSelectionMode: boolean, sticky: boolean): PartialCursorState { return CursorState.fromModelState( - MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode) + MoveOperations.moveToEndOfLine(viewModel.cursorConfig, viewModel.model, cursor.modelState, inSelectionMode, sticky) ); } @@ -404,13 +404,14 @@ export class CursorMoveCommands { } private static _moveLeft(viewModel: IViewModel, cursors: CursorState[], inSelectionMode: boolean, noOfColumns: number): PartialCursorState[] { + const hasMultipleCursors = (cursors.length > 1); let result: PartialCursorState[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; - + const skipWrappingPointStop = hasMultipleCursors || !cursor.viewState.hasSelection(); let newViewState = MoveOperations.moveLeft(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns); - if (!cursor.viewState.hasSelection() && noOfColumns === 1 && newViewState.position.lineNumber !== cursor.viewState.position.lineNumber) { + if (skipWrappingPointStop && noOfColumns === 1 && newViewState.position.lineNumber !== cursor.viewState.position.lineNumber) { // moved over to the previous view line const newViewModelPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(newViewState.position); if (newViewModelPosition.lineNumber === cursor.modelState.position.lineNumber) { @@ -436,12 +437,14 @@ export class CursorMoveCommands { } private static _moveRight(viewModel: IViewModel, cursors: CursorState[], inSelectionMode: boolean, noOfColumns: number): PartialCursorState[] { + const hasMultipleCursors = (cursors.length > 1); let result: PartialCursorState[] = []; for (let i = 0, len = cursors.length; i < len; i++) { const cursor = cursors[i]; + const skipWrappingPointStop = hasMultipleCursors || !cursor.viewState.hasSelection(); let newViewState = MoveOperations.moveRight(viewModel.cursorConfig, viewModel, cursor.viewState, inSelectionMode, noOfColumns); - if (!cursor.viewState.hasSelection() && noOfColumns === 1 && newViewState.position.lineNumber !== cursor.viewState.position.lineNumber) { + if (skipWrappingPointStop && noOfColumns === 1 && newViewState.position.lineNumber !== cursor.viewState.position.lineNumber) { // moved over to the next view line const newViewModelPosition = viewModel.coordinatesConverter.convertViewPositionToModelPosition(newViewState.position); if (newViewModelPosition.lineNumber === cursor.modelState.position.lineNumber) { diff --git a/src/vs/editor/common/controller/cursorMoveOperations.ts b/src/vs/editor/common/controller/cursorMoveOperations.ts index e0a32d2077..923d6d065b 100644 --- a/src/vs/editor/common/controller/cursorMoveOperations.ts +++ b/src/vs/editor/common/controller/cursorMoveOperations.ts @@ -222,10 +222,10 @@ export class MoveOperations { return cursor.move(inSelectionMode, lineNumber, column, 0); } - public static moveToEndOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { + public static moveToEndOfLine(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean, sticky: boolean): SingleCursorState { let lineNumber = cursor.position.lineNumber; let maxColumn = model.getLineMaxColumn(lineNumber); - return cursor.move(inSelectionMode, lineNumber, maxColumn, Constants.MAX_SAFE_SMALL_INTEGER - maxColumn); + return cursor.move(inSelectionMode, lineNumber, maxColumn, sticky ? Constants.MAX_SAFE_SMALL_INTEGER - maxColumn : 0); } public static moveToBeginningOfBuffer(config: CursorConfiguration, model: ICursorSimpleModel, cursor: SingleCursorState, inSelectionMode: boolean): SingleCursorState { diff --git a/src/vs/editor/common/editorContextKeys.ts b/src/vs/editor/common/editorContextKeys.ts index 2f79a80c71..c11f8afbc9 100644 --- a/src/vs/editor/common/editorContextKeys.ts +++ b/src/vs/editor/common/editorContextKeys.ts @@ -36,6 +36,8 @@ export namespace EditorContextKeys { export const canUndo = new RawContextKey('canUndo', false); export const canRedo = new RawContextKey('canRedo', false); + export const hoverVisible = new RawContextKey('editorHoverVisible', false); + /** * A context key that is set when an editor is part of a larger editor, like notebooks or * (future) a diff editor diff --git a/src/vs/editor/common/model.ts b/src/vs/editor/common/model.ts index 228dbdae4a..5049003d2b 100644 --- a/src/vs/editor/common/model.ts +++ b/src/vs/editor/common/model.ts @@ -552,7 +552,7 @@ export interface ITextModel { mightContainRTL(): boolean; /** - * If true, the text model might contain LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS), NEXT LINE (NEL). + * If true, the text model might contain LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS). * If false, the text model definitely does not contain these. * @internal */ diff --git a/src/vs/editor/common/model/editStack.ts b/src/vs/editor/common/model/editStack.ts index 2a145c649d..731d14a949 100644 --- a/src/vs/editor/common/model/editStack.ts +++ b/src/vs/editor/common/model/editStack.ts @@ -168,6 +168,16 @@ export class SingleModelEditStackElement implements IResourceUndoRedoElement { this._data = SingleModelEditStackData.create(model, beforeCursorState); } + public toString(): string { + const data = (this._data instanceof SingleModelEditStackData ? this._data : SingleModelEditStackData.deserialize(this._data)); + return data.changes.map(change => change.toString()).join(', '); + } + + public matchesResource(resource: URI): boolean { + const uri = (URI.isUri(this.model) ? this.model : this.model.uri); + return (uri.toString() === resource.toString()); + } + public setModel(model: ITextModel | URI): void { this.model = model; } @@ -270,6 +280,11 @@ export class MultiModelEditStackElement implements IWorkspaceUndoRedoElement { return result; } + public matchesResource(resource: URI): boolean { + const key = uriGetComparisonKey(resource); + return (this._editStackElementsMap.has(key)); + } + public setModel(model: ITextModel | URI): void { const key = uriGetComparisonKey(URI.isUri(model) ? model : model.uri); if (this._editStackElementsMap.has(key)) { @@ -338,7 +353,7 @@ function getModelEOL(model: ITextModel): EndOfLineSequence { } } -function isKnownStackElement(element: IResourceUndoRedoElement | IWorkspaceUndoRedoElement | null): element is EditStackElement { +export function isEditStackElement(element: IResourceUndoRedoElement | IWorkspaceUndoRedoElement | null): element is EditStackElement { if (!element) { return false; } @@ -357,7 +372,7 @@ export class EditStack { public pushStackElement(): void { const lastElement = this._undoRedoService.getLastElement(this._model.uri); - if (isKnownStackElement(lastElement)) { + if (isEditStackElement(lastElement)) { lastElement.close(); } } @@ -368,7 +383,7 @@ export class EditStack { private _getOrCreateEditStackElement(beforeCursorState: Selection[] | null): EditStackElement { const lastElement = this._undoRedoService.getLastElement(this._model.uri); - if (isKnownStackElement(lastElement) && lastElement.canAppend(this._model)) { + if (isEditStackElement(lastElement) && lastElement.canAppend(this._model)) { return lastElement; } const newElement = new SingleModelEditStackElement(this._model, beforeCursorState); diff --git a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts index 4de657dcf5..0da9ca0752 100644 --- a/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts +++ b/src/vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer.ts @@ -510,6 +510,32 @@ export class PieceTreeTextBuffer implements ITextBuffer, IDisposable { public getPieceTree(): PieceTreeBase { return this._pieceTree; } + + public static _getInverseEditRange(range: Range, text: string) { + let startLineNumber = range.startLineNumber; + let startColumn = range.startColumn; + const [eolCount, firstLineLength, lastLineLength] = countEOL(text); + let resultRange: Range; + + if (text.length > 0) { + // the operation inserts something + const lineCount = eolCount + 1; + + if (lineCount === 1) { + // single line insert + resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn + firstLineLength); + } else { + // multi line insert + resultRange = new Range(startLineNumber, startColumn, startLineNumber + lineCount - 1, lastLineLength + 1); + } + } else { + // There is nothing to insert + resultRange = new Range(startLineNumber, startColumn, startLineNumber, startColumn); + } + + return resultRange; + } + /** * Assumes `operations` are validated and sorted ascending */ diff --git a/src/vs/editor/common/model/textChange.ts b/src/vs/editor/common/model/textChange.ts index d3e241f0dd..e358345fb6 100644 --- a/src/vs/editor/common/model/textChange.ts +++ b/src/vs/editor/common/model/textChange.ts @@ -31,6 +31,16 @@ export class TextChange { public readonly newText: string ) { } + public toString(): string { + if (this.oldText.length === 0) { + return `(insert@${this.oldPosition} "${this.newText}")`; + } + if (this.newText.length === 0) { + return `(delete@${this.oldPosition} "${this.oldText}")`; + } + return `(replace@${this.oldPosition} "${this.oldText}" with "${this.newText}")`; + } + private static _writeStringSize(str: string): number { return ( 4 + 2 * str.length diff --git a/src/vs/editor/common/model/textModel.ts b/src/vs/editor/common/model/textModel.ts index 63c2aef309..b4a36c6b3c 100644 --- a/src/vs/editor/common/model/textModel.ts +++ b/src/vs/editor/common/model/textModel.ts @@ -706,9 +706,8 @@ export class TextModel extends Disposable implements model.ITextModel { public removeUnusualLineTerminators(selections: Selection[] | null = null): void { const matches = this.findMatches(strings.UNUSUAL_LINE_TERMINATORS.source, false, true, false, null, false, Constants.MAX_SAFE_SMALL_INTEGER); - const eol = this.getEOL(); this._buffer.resetMightContainUnusualLineTerminators(); - this.pushEditOperations(selections, matches.map(m => ({ range: m.range, text: eol })), () => null); + this.pushEditOperations(selections, matches.map(m => ({ range: m.range, text: null })), () => null); } public mightContainNonBasicASCII(): boolean { diff --git a/src/vs/editor/common/services/editorWorkerService.ts b/src/vs/editor/common/services/editorWorkerService.ts index fe6b8710f6..1ec8ca8649 100644 --- a/src/vs/editor/common/services/editorWorkerService.ts +++ b/src/vs/editor/common/services/editorWorkerService.ts @@ -19,7 +19,7 @@ export interface IDiffComputationResult { } export interface IEditorWorkerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; canComputeDiff(original: URI, modified: URI): boolean; computeDiff(original: URI, modified: URI, ignoreTrimWhitespace: boolean, maxComputationTime: number): Promise; diff --git a/src/vs/editor/common/services/editorWorkerServiceImpl.ts b/src/vs/editor/common/services/editorWorkerServiceImpl.ts index a50f51209b..fb3ca82281 100644 --- a/src/vs/editor/common/services/editorWorkerServiceImpl.ts +++ b/src/vs/editor/common/services/editorWorkerServiceImpl.ts @@ -46,7 +46,7 @@ function canSyncModel(modelService: IModelService, resource: URI): boolean { export class EditorWorkerServiceImpl extends Disposable implements IEditorWorkerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _modelService: IModelService; private readonly _workerManager: WorkerManager; diff --git a/src/vs/editor/common/services/markerDecorationsServiceImpl.ts b/src/vs/editor/common/services/markerDecorationsServiceImpl.ts index d097d7b816..adee9ac131 100644 --- a/src/vs/editor/common/services/markerDecorationsServiceImpl.ts +++ b/src/vs/editor/common/services/markerDecorationsServiceImpl.ts @@ -70,7 +70,7 @@ class MarkerDecorations extends Disposable { export class MarkerDecorationsService extends Disposable implements IMarkerDecorationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeMarker = this._register(new Emitter()); readonly onDidChangeMarker: Event = this._onDidChangeMarker.event; diff --git a/src/vs/editor/common/services/markersDecorationService.ts b/src/vs/editor/common/services/markersDecorationService.ts index 0be1f271e5..866e4dccd8 100644 --- a/src/vs/editor/common/services/markersDecorationService.ts +++ b/src/vs/editor/common/services/markersDecorationService.ts @@ -12,7 +12,7 @@ import { Range } from 'vs/editor/common/core/range'; export const IMarkerDecorationsService = createDecorator('markerDecorationsService'); export interface IMarkerDecorationsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidChangeMarker: Event; diff --git a/src/vs/editor/common/services/modeService.ts b/src/vs/editor/common/services/modeService.ts index b4f9bef415..2ae63c6116 100644 --- a/src/vs/editor/common/services/modeService.ts +++ b/src/vs/editor/common/services/modeService.ts @@ -28,7 +28,7 @@ export interface ILanguageSelection extends IDisposable { } export interface IModeService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidCreateMode: Event; onLanguagesMaybeChanged: Event; diff --git a/src/vs/editor/common/services/modelService.ts b/src/vs/editor/common/services/modelService.ts index fed177b8b6..19fd7f0823 100644 --- a/src/vs/editor/common/services/modelService.ts +++ b/src/vs/editor/common/services/modelService.ts @@ -16,7 +16,7 @@ export const IModelService = createDecorator('modelService'); export type DocumentTokensProvider = DocumentSemanticTokensProvider | DocumentRangeSemanticTokensProvider; export interface IModelService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createModel(value: string | ITextBufferFactory, languageSelection: ILanguageSelection | null, resource?: URI, isForSimpleWidget?: boolean): ITextModel; diff --git a/src/vs/editor/common/services/modelServiceImpl.ts b/src/vs/editor/common/services/modelServiceImpl.ts index 7ca2239276..7c770b12cc 100644 --- a/src/vs/editor/common/services/modelServiceImpl.ts +++ b/src/vs/editor/common/services/modelServiceImpl.ts @@ -26,7 +26,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ILogService } from 'vs/platform/log/common/log'; import { IUndoRedoService, IUndoRedoElement, IPastFutureElements } from 'vs/platform/undoRedo/common/undoRedo'; import { StringSHA1 } from 'vs/base/common/hash'; -import { SingleModelEditStackElement, MultiModelEditStackElement, EditStackElement } from 'vs/editor/common/model/editStack'; +import { SingleModelEditStackElement, MultiModelEditStackElement, EditStackElement, isEditStackElement } from 'vs/editor/common/model/editStack'; import { Schemas } from 'vs/base/common/network'; import { SemanticTokensProviderStyling, toMultilineTokens2 } from 'vs/editor/common/services/semanticTokensProviderStyling'; @@ -139,6 +139,7 @@ class DisposedModelInfo { constructor( public readonly uri: URI, public readonly time: number, + public readonly sharesUndoRedoStack: boolean, public readonly heapSize: number, public readonly sha1: string, public readonly versionId: number, @@ -352,7 +353,11 @@ export class ModelServiceImpl extends Disposable implements IModelService { if (this._disposedModelsHeapSize > maxModelsHeapSize) { // we must remove some old undo stack elements to free up some memory const disposedModels: DisposedModelInfo[] = []; - this._disposedModels.forEach(entry => disposedModels.push(entry)); + this._disposedModels.forEach(entry => { + if (!entry.sharesUndoRedoStack) { + disposedModels.push(entry); + } + }); disposedModels.sort((a, b) => a.time - b.time); while (disposedModels.length > 0 && this._disposedModelsHeapSize > maxModelsHeapSize) { const disposedModel = disposedModels.shift()!; @@ -369,16 +374,23 @@ export class ModelServiceImpl extends Disposable implements IModelService { if (resource && this._disposedModels.has(MODEL_ID(resource))) { const disposedModelData = this._removeDisposedModel(resource)!; const elements = this._undoRedoService.getElements(resource); - if (computeModelSha1(model) === disposedModelData.sha1 && isEditStackPastFutureElements(elements)) { + const sha1IsEqual = (computeModelSha1(model) === disposedModelData.sha1); + if (sha1IsEqual || disposedModelData.sharesUndoRedoStack) { for (const element of elements.past) { - element.setModel(model); + if (isEditStackElement(element) && element.matchesResource(resource)) { + element.setModel(model); + } } for (const element of elements.future) { - element.setModel(model); + if (isEditStackElement(element) && element.matchesResource(resource)) { + element.setModel(model); + } + } + this._undoRedoService.setElementsValidFlag(resource, true, (element) => (isEditStackElement(element) && element.matchesResource(resource))); + if (sha1IsEqual) { + model._overwriteVersionId(disposedModelData.versionId); + model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId); } - this._undoRedoService.setElementsIsValid(resource, true); - model._overwriteVersionId(disposedModelData.versionId); - model._overwriteAlternativeVersionId(disposedModelData.alternativeVersionId); } else { this._undoRedoService.removeElements(resource); } @@ -504,31 +516,39 @@ export class ModelServiceImpl extends Disposable implements IModelService { return; } const model = modelData.model; + const sharesUndoRedoStack = (this._undoRedoService.getUriComparisonKey(model.uri) !== model.uri.toString()); let maintainUndoRedoStack = false; let heapSize = 0; - if (this._shouldRestoreUndoStack() && (resource.scheme === Schemas.file || resource.scheme === Schemas.vscodeRemote || resource.scheme === Schemas.userData)) { + if (sharesUndoRedoStack || (this._shouldRestoreUndoStack() && (resource.scheme === Schemas.file || resource.scheme === Schemas.vscodeRemote || resource.scheme === Schemas.userData))) { const elements = this._undoRedoService.getElements(resource); - if ((elements.past.length > 0 || elements.future.length > 0) && isEditStackPastFutureElements(elements)) { - maintainUndoRedoStack = true; + if (elements.past.length > 0 || elements.future.length > 0) { for (const element of elements.past) { - heapSize += element.heapSize(resource); - element.setModel(resource); // remove reference from text buffer instance + if (isEditStackElement(element) && element.matchesResource(resource)) { + maintainUndoRedoStack = true; + heapSize += element.heapSize(resource); + element.setModel(resource); // remove reference from text buffer instance + } } for (const element of elements.future) { - heapSize += element.heapSize(resource); - element.setModel(resource); // remove reference from text buffer instance + if (isEditStackElement(element) && element.matchesResource(resource)) { + maintainUndoRedoStack = true; + heapSize += element.heapSize(resource); + element.setModel(resource); // remove reference from text buffer instance + } } } } if (!maintainUndoRedoStack) { - this._undoRedoService.removeElements(resource); + if (!sharesUndoRedoStack) { + this._undoRedoService.removeElements(resource); + } modelData.model.dispose(); return; } const maxMemory = ModelServiceImpl.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK; - if (heapSize > maxMemory) { + if (!sharesUndoRedoStack && heapSize > maxMemory) { // the undo stack for this file would never fit in the configured memory, so don't bother with it. this._undoRedoService.removeElements(resource); modelData.model.dispose(); @@ -538,8 +558,8 @@ export class ModelServiceImpl extends Disposable implements IModelService { this._ensureDisposedModelsHeapSize(maxMemory - heapSize); // We only invalidate the elements, but they remain in the undo-redo service. - this._undoRedoService.setElementsIsValid(resource, false); - this._insertDisposedModel(new DisposedModelInfo(resource, Date.now(), heapSize, computeModelSha1(model), model.getVersionId(), model.getAlternativeVersionId())); + this._undoRedoService.setElementsValidFlag(resource, false, (element) => (isEditStackElement(element) && element.matchesResource(resource))); + this._insertDisposedModel(new DisposedModelInfo(resource, Date.now(), sharesUndoRedoStack, heapSize, computeModelSha1(model), model.getVersionId(), model.getAlternativeVersionId())); modelData.model.dispose(); } diff --git a/src/vs/editor/common/services/resolverService.ts b/src/vs/editor/common/services/resolverService.ts index 70e59939aa..e225df40a3 100644 --- a/src/vs/editor/common/services/resolverService.ts +++ b/src/vs/editor/common/services/resolverService.ts @@ -12,7 +12,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const ITextModelService = createDecorator('textModelService'); export interface ITextModelService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Provided a resource URI, it will return a model reference diff --git a/src/vs/editor/common/services/textResourceConfigurationService.ts b/src/vs/editor/common/services/textResourceConfigurationService.ts index 4c45dbd8ca..2ce27493a8 100644 --- a/src/vs/editor/common/services/textResourceConfigurationService.ts +++ b/src/vs/editor/common/services/textResourceConfigurationService.ts @@ -31,7 +31,7 @@ export interface ITextResourceConfigurationChangeEvent { export interface ITextResourceConfigurationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Event that fires when the configuration changes. @@ -70,7 +70,7 @@ export const ITextResourcePropertiesService = createDecorator this._onDidChangeConfiguration.fire(this.toResourceConfigurationChangeEvent(e)))); } - getValue(resource: URI, section?: string): T; - getValue(resource: URI, at?: IPosition, section?: string): T; - getValue(resource: URI, arg2?: any, arg3?: any): T { + getValue(resource: URI | undefined, section?: string): T; + getValue(resource: URI | undefined, at?: IPosition, section?: string): T; + getValue(resource: URI | undefined, arg2?: any, arg3?: any): T { if (typeof arg3 === 'string') { return this._getValue(resource, Position.isIPosition(arg2) ? arg2 : null, arg3); } @@ -98,7 +98,7 @@ export class TextResourceConfigurationService extends Disposable implements ITex return ConfigurationTarget.USER_LOCAL; } - private _getValue(resource: URI, position: IPosition | null, section: string | undefined): T { + private _getValue(resource: URI | undefined, position: IPosition | null, section: string | undefined): T { const language = resource ? this.getLanguage(resource, position) : undefined; if (typeof section === 'undefined') { return this.configurationService.getValue({ resource, overrideIdentifier: language }); diff --git a/src/vs/editor/common/standalone/standaloneEnums.ts b/src/vs/editor/common/standalone/standaloneEnums.ts index f4a876f38c..6f85ea17a6 100644 --- a/src/vs/editor/common/standalone/standaloneEnums.ts +++ b/src/vs/editor/common/standalone/standaloneEnums.ts @@ -240,36 +240,36 @@ export enum EditorOption { quickSuggestions = 70, quickSuggestionsDelay = 71, readOnly = 72, - removeUnusualLineTerminators = 73, - renameOnType = 74, - renderControlCharacters = 75, - renderIndentGuides = 76, - renderFinalNewline = 77, - renderLineHighlight = 78, - renderLineHighlightOnlyWhenFocus = 79, - renderValidationDecorations = 80, - renderWhitespace = 81, - revealHorizontalRightPadding = 82, - roundedSelection = 83, - rulers = 84, - scrollbar = 85, - scrollBeyondLastColumn = 86, - scrollBeyondLastLine = 87, - scrollPredominantAxis = 88, - selectionClipboard = 89, - selectionHighlight = 90, - selectOnLineNumbers = 91, - showFoldingControls = 92, - showUnused = 93, - snippetSuggestions = 94, - smoothScrolling = 95, - stopRenderingLineAfter = 96, - suggest = 97, - suggestFontSize = 98, - suggestLineHeight = 99, - suggestOnTriggerCharacters = 100, - suggestSelection = 101, - tabCompletion = 102, + renameOnType = 73, + renderControlCharacters = 74, + renderIndentGuides = 75, + renderFinalNewline = 76, + renderLineHighlight = 77, + renderLineHighlightOnlyWhenFocus = 78, + renderValidationDecorations = 79, + renderWhitespace = 80, + revealHorizontalRightPadding = 81, + roundedSelection = 82, + rulers = 83, + scrollbar = 84, + scrollBeyondLastColumn = 85, + scrollBeyondLastLine = 86, + scrollPredominantAxis = 87, + selectionClipboard = 88, + selectionHighlight = 89, + selectOnLineNumbers = 90, + showFoldingControls = 91, + showUnused = 92, + snippetSuggestions = 93, + smoothScrolling = 94, + stopRenderingLineAfter = 95, + suggest = 96, + suggestFontSize = 97, + suggestLineHeight = 98, + suggestOnTriggerCharacters = 99, + suggestSelection = 100, + tabCompletion = 101, + unusualLineTerminators = 102, useTabStops = 103, wordSeparators = 104, wordWrap = 105, diff --git a/src/vs/editor/contrib/codelens/codeLensCache.ts b/src/vs/editor/contrib/codelens/codeLensCache.ts index af4c0b2afc..797fd44626 100644 --- a/src/vs/editor/contrib/codelens/codeLensCache.ts +++ b/src/vs/editor/contrib/codelens/codeLensCache.ts @@ -17,7 +17,7 @@ import { once } from 'vs/base/common/functional'; export const ICodeLensCache = createDecorator('ICodeLensCache'); export interface ICodeLensCache { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; put(model: ITextModel, data: CodeLensModel): void; get(model: ITextModel): CodeLensModel | undefined; delete(model: ITextModel): void; @@ -38,7 +38,7 @@ class CacheItem { export class CodeLensCache implements ICodeLensCache { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _fakeProvider = new class implements CodeLensProvider { provideCodeLenses(): CodeLensList { @@ -96,7 +96,7 @@ export class CodeLensCache implements ICodeLensCache { private _serialize(): string { const data: Record = Object.create(null); - this._cache.forEach((value, key) => { + for (const [key, value] of this._cache) { const lines = new Set(); for (const d of value.data.lenses) { lines.add(d.symbol.range.startLineNumber); @@ -105,7 +105,7 @@ export class CodeLensCache implements ICodeLensCache { lineCount: value.lineCount, lines: [...lines.values()] }; - }); + } return JSON.stringify(data); } diff --git a/src/vs/editor/contrib/find/findModel.ts b/src/vs/editor/contrib/find/findModel.ts index 9917d4f7a0..5b8ab59a10 100644 --- a/src/vs/editor/contrib/find/findModel.ts +++ b/src/vs/editor/contrib/find/findModel.ts @@ -23,6 +23,7 @@ import { ReplacePattern, parseReplaceString } from 'vs/editor/contrib/find/repla import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; +import { findFirstInSorted } from 'vs/base/common/arrays'; export const CONTEXT_FIND_WIDGET_VISIBLE = new RawContextKey('findWidgetVisible', false); export const CONTEXT_FIND_WIDGET_NOT_VISIBLE = CONTEXT_FIND_WIDGET_VISIBLE.toNegated(); @@ -189,8 +190,17 @@ export class FindModelBoundToEditorModel { let findMatches = this._findMatches(findScope, false, MATCHES_LIMIT); this._decorations.set(findMatches, findScope); + const editorSelection = this._editor.getSelection(); + let currentMatchesPosition = this._decorations.getCurrentMatchesPosition(editorSelection); + if (currentMatchesPosition === 0 && findMatches.length > 0) { + // current selection is not on top of a match + // try to find its nearest result from the top of the document + const matchAfterSelection = findFirstInSorted(findMatches.map(match => match.range), range => Range.compareRangesUsingStarts(range, editorSelection) >= 0); + currentMatchesPosition = matchAfterSelection > 0 ? matchAfterSelection - 1 + 1 /** match position is one based */ : currentMatchesPosition; + } + this._state.changeMatchInfo( - this._decorations.getCurrentMatchesPosition(this._editor.getSelection()), + currentMatchesPosition, this._decorations.getCount(), undefined ); diff --git a/src/vs/editor/contrib/find/findOptionsWidget.ts b/src/vs/editor/contrib/find/findOptionsWidget.ts index ee42cffae4..b334b6aa28 100644 --- a/src/vs/editor/contrib/find/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/findOptionsWidget.ts @@ -11,7 +11,7 @@ import { ICodeEditor, IOverlayWidget, IOverlayWidgetPosition, OverlayWidgetPosit import { FIND_IDS } from 'vs/editor/contrib/find/findModel'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { contrastBorder, editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, widgetShadow, editorWidgetForeground, inputActiveOptionForeground } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; export class FindOptionsWidget extends Widget implements IOverlayWidget { @@ -47,12 +47,14 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { this._domNode.setAttribute('aria-hidden', 'true'); const inputActiveOptionBorderColor = themeService.getColorTheme().getColor(inputActiveOptionBorder); + const inputActiveOptionForegroundColor = themeService.getColorTheme().getColor(inputActiveOptionForeground); const inputActiveOptionBackgroundColor = themeService.getColorTheme().getColor(inputActiveOptionBackground); this.caseSensitive = this._register(new CaseSensitiveCheckbox({ appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand), isChecked: this._state.matchCase, inputActiveOptionBorder: inputActiveOptionBorderColor, + inputActiveOptionForeground: inputActiveOptionForegroundColor, inputActiveOptionBackground: inputActiveOptionBackgroundColor })); this._domNode.appendChild(this.caseSensitive.domNode); @@ -66,6 +68,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleWholeWordCommand), isChecked: this._state.wholeWord, inputActiveOptionBorder: inputActiveOptionBorderColor, + inputActiveOptionForeground: inputActiveOptionForegroundColor, inputActiveOptionBackground: inputActiveOptionBackgroundColor })); this._domNode.appendChild(this.wholeWords.domNode); @@ -79,6 +82,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleRegexCommand), isChecked: this._state.isRegex, inputActiveOptionBorder: inputActiveOptionBorderColor, + inputActiveOptionForeground: inputActiveOptionForegroundColor, inputActiveOptionBackground: inputActiveOptionBackgroundColor })); this._domNode.appendChild(this.regex.domNode); @@ -185,6 +189,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { private _applyTheme(theme: IColorTheme) { let inputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), + inputActiveOptionForeground: theme.getColor(inputActiveOptionForeground), inputActiveOptionBackground: theme.getColor(inputActiveOptionBackground) }; this.caseSensitive.style(inputStyles); diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index 5e46b7f9c0..15bc618b10 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -30,7 +30,7 @@ import { CONTEXT_FIND_INPUT_FOCUSED, CONTEXT_REPLACE_INPUT_FOCUSED, FIND_IDS, MA import { FindReplaceState, FindReplaceStateChangedEvent } from 'vs/editor/contrib/find/findState'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputActiveOptionBackground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground, focusBorder } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorFindMatch, editorFindMatchBorder, editorFindMatchHighlight, editorFindMatchHighlightBorder, editorFindRangeHighlight, editorFindRangeHighlightBorder, editorWidgetBackground, editorWidgetBorder, editorWidgetResizeBorder, errorForeground, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground, focusBorder } from 'vs/platform/theme/common/colorRegistry'; import { IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedReplaceInput } from 'vs/platform/browser/contextScopedHistoryWidget'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; @@ -662,6 +662,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IVerticalSashL let inputStyles: IFindInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), inputActiveOptionBackground: theme.getColor(inputActiveOptionBackground), + inputActiveOptionForeground: theme.getColor(inputActiveOptionForeground), inputBackground: theme.getColor(inputBackground), inputForeground: theme.getColor(inputForeground), inputBorder: theme.getColor(inputBorder), diff --git a/src/vs/editor/contrib/find/replacePattern.ts b/src/vs/editor/contrib/find/replacePattern.ts index 7c5cb455fd..8ff3d8df84 100644 --- a/src/vs/editor/contrib/find/replacePattern.ts +++ b/src/vs/editor/contrib/find/replacePattern.ts @@ -20,7 +20,7 @@ class StaticValueReplacePattern { } /** - * Assigned when the replace pattern has replacemend patterns. + * Assigned when the replace pattern has replacement patterns. */ class DynamicPiecesReplacePattern { public readonly kind = ReplacePatternKind.DynamicPieces; @@ -68,7 +68,38 @@ export class ReplacePattern { } // match index ReplacePiece - result += ReplacePattern._substitute(piece.matchIndex, matches); + let match: string = ReplacePattern._substitute(piece.matchIndex, matches); + if (piece.caseOps !== null && piece.caseOps.length > 0) { + let repl: string[] = []; + let lenOps: number = piece.caseOps.length; + let opIdx: number = 0; + for (let idx: number = 0, len: number = match.length; idx < len; idx++) { + if (opIdx >= lenOps) { + repl.push(match.slice(idx)); + break; + } + switch (piece.caseOps[opIdx]) { + case 'U': + repl.push(match[idx].toUpperCase()); + break; + case 'u': + repl.push(match[idx].toUpperCase()); + opIdx++; + break; + case 'L': + repl.push(match[idx].toLowerCase()); + break; + case 'l': + repl.push(match[idx].toLowerCase()); + opIdx++; + break; + default: + repl.push(match[idx]); + } + } + match = repl.join(''); + } + result += match; } return result; @@ -102,19 +133,29 @@ export class ReplacePattern { export class ReplacePiece { public static staticValue(value: string): ReplacePiece { - return new ReplacePiece(value, -1); + return new ReplacePiece(value, -1, null); } public static matchIndex(index: number): ReplacePiece { - return new ReplacePiece(null, index); + return new ReplacePiece(null, index, null); + } + + public static caseOps(index: number, caseOps: string[]): ReplacePiece { + return new ReplacePiece(null, index, caseOps); } public readonly staticValue: string | null; public readonly matchIndex: number; + public readonly caseOps: string[] | null; - private constructor(staticValue: string | null, matchIndex: number) { + private constructor(staticValue: string | null, matchIndex: number, caseOps: string[] | null) { this.staticValue = staticValue; this.matchIndex = matchIndex; + if (!caseOps || caseOps.length === 0) { + this.caseOps = null; + } else { + this.caseOps = caseOps.slice(0); + } } } @@ -151,12 +192,12 @@ class ReplacePieceBuilder { this._currentStaticPiece += value; } - public emitMatchIndex(index: number, toCharIndex: number): void { + public emitMatchIndex(index: number, toCharIndex: number, caseOps: string[]): void { if (this._currentStaticPiece.length !== 0) { this._result[this._resultLen++] = ReplacePiece.staticValue(this._currentStaticPiece); this._currentStaticPiece = ''; } - this._result[this._resultLen++] = ReplacePiece.matchIndex(index); + this._result[this._resultLen++] = ReplacePiece.caseOps(index, caseOps); this._lastCharIndex = toCharIndex; } @@ -175,6 +216,10 @@ class ReplacePieceBuilder { * \n => inserts a LF * \t => inserts a TAB * \\ => inserts a "\". + * \u => upper-cases one character in a match. + * \U => upper-cases ALL remaining characters in a match. + * \l => lower-cases one character in a match. + * \L => lower-cases ALL remaining characters in a match. * $$ => inserts a "$". * $& and $0 => inserts the matched substring. * $n => Where n is a non-negative integer lesser than 100, inserts the nth parenthesized submatch string @@ -187,6 +232,7 @@ export function parseReplaceString(replaceString: string): ReplacePattern { return new ReplacePattern(null); } + let caseOps: string[] = []; let result = new ReplacePieceBuilder(replaceString); for (let i = 0, len = replaceString.length; i < len; i++) { @@ -221,6 +267,20 @@ export function parseReplaceString(replaceString: string): ReplacePattern { result.emitUnchanged(i - 1); result.emitStatic('\t', i + 1); break; + // Case modification of string replacements, patterned after Boost, but only applied + // to the replacement text, not subsequent content. + case CharCode.u: + // \u => upper-cases one character. + case CharCode.U: + // \U => upper-cases ALL following characters. + case CharCode.l: + // \l => lower-cases one character. + case CharCode.L: + // \L => lower-cases ALL following characters. + result.emitUnchanged(i - 1); + result.emitStatic('', i + 1); + caseOps.push(String.fromCharCode(nextChCode)); + break; } continue; @@ -248,7 +308,8 @@ export function parseReplaceString(replaceString: string): ReplacePattern { if (nextChCode === CharCode.Digit0 || nextChCode === CharCode.Ampersand) { // $& and $0 => inserts the matched substring. result.emitUnchanged(i - 1); - result.emitMatchIndex(0, i + 1); + result.emitMatchIndex(0, i + 1, caseOps); + caseOps.length = 0; continue; } @@ -268,13 +329,15 @@ export function parseReplaceString(replaceString: string): ReplacePattern { matchIndex = matchIndex * 10 + (nextNextChCode - CharCode.Digit0); result.emitUnchanged(i - 2); - result.emitMatchIndex(matchIndex, i + 1); + result.emitMatchIndex(matchIndex, i + 1, caseOps); + caseOps.length = 0; continue; } } result.emitUnchanged(i - 1); - result.emitMatchIndex(matchIndex, i + 1); + result.emitMatchIndex(matchIndex, i + 1, caseOps); + caseOps.length = 0; continue; } } diff --git a/src/vs/editor/contrib/find/test/replacePattern.test.ts b/src/vs/editor/contrib/find/test/replacePattern.test.ts index d9d876ecb4..6443d5f275 100644 --- a/src/vs/editor/contrib/find/test/replacePattern.test.ts +++ b/src/vs/editor/contrib/find/test/replacePattern.test.ts @@ -69,6 +69,38 @@ suite('Replace Pattern test', () => { testParse('hello$\'', [ReplacePiece.staticValue('hello$\'')]); }); + test('parse replace string with case modifiers', () => { + let testParse = (input: string, expectedPieces: ReplacePiece[]) => { + let actual = parseReplaceString(input); + let expected = new ReplacePattern(expectedPieces); + assert.deepEqual(actual, expected, 'Parsing ' + input); + }; + function assertReplace(target: string, search: RegExp, replaceString: string, expected: string): void { + let replacePattern = parseReplaceString(replaceString); + let m = search.exec(target); + let actual = replacePattern.buildReplaceString(m); + + assert.equal(actual, expected, `${target}.replace(${search}, ${replaceString}) === ${expected}`); + } + + // \U, \u => uppercase \L, \l => lowercase \E => cancel + + testParse('hello\\U$1', [ReplacePiece.staticValue('hello'), ReplacePiece.caseOps(1, ['U'])]); + assertReplace('func privateFunc(', /func (\w+)\(/, 'func \\U$1(', 'func PRIVATEFUNC('); + + testParse('hello\\u$1', [ReplacePiece.staticValue('hello'), ReplacePiece.caseOps(1, ['u'])]); + assertReplace('func privateFunc(', /func (\w+)\(/, 'func \\u$1(', 'func PrivateFunc('); + + testParse('hello\\L$1', [ReplacePiece.staticValue('hello'), ReplacePiece.caseOps(1, ['L'])]); + assertReplace('func privateFunc(', /func (\w+)\(/, 'func \\L$1(', 'func privatefunc('); + + testParse('hello\\l$1', [ReplacePiece.staticValue('hello'), ReplacePiece.caseOps(1, ['l'])]); + assertReplace('func PrivateFunc(', /func (\w+)\(/, 'func \\l$1(', 'func privateFunc('); + + testParse('hello$1\\u\\u\\U$4goodbye', [ReplacePiece.staticValue('hello'), ReplacePiece.matchIndex(1), ReplacePiece.caseOps(4, ['u', 'u', 'U']), ReplacePiece.staticValue('goodbye')]); + assertReplace('hellogooDbye', /hello(\w+)/, 'hello\\u\\u\\l\\l\\U$1', 'helloGOodBYE'); + }); + test('replace has JavaScript semantics', () => { let testJSReplaceSemantics = (target: string, search: RegExp, replaceString: string, expected: string) => { let replacePattern = parseReplaceString(replaceString); diff --git a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts b/src/vs/editor/contrib/gotoSymbol/goToCommands.ts index 331dfbc4ca..fc3f5d9264 100644 --- a/src/vs/editor/contrib/gotoSymbol/goToCommands.ts +++ b/src/vs/editor/contrib/gotoSymbol/goToCommands.ts @@ -722,9 +722,10 @@ CommandsRegistry.registerCommand({ { name: 'position', description: 'The position at which to start', constraint: corePosition.Position.isIPosition }, { name: 'locations', description: 'An array of locations.', constraint: Array }, { name: 'multiple', description: 'Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto' }, + { name: 'noResultsMessage', description: 'Human readable message that shows when locations is empty.' }, ] }, - handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any, openInPeek?: boolean) => { + handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any, noResultsMessage?: string, openInPeek?: boolean) => { assertType(URI.isUri(resource)); assertType(corePosition.Position.isIPosition(position)); assertType(Array.isArray(references)); @@ -739,7 +740,16 @@ CommandsRegistry.registerCommand({ editor.revealPositionInCenterIfOutsideViewport(position, ScrollType.Smooth); return editor.invokeWithinContext(accessor => { - const command = new GenericGoToLocationAction({ muteMessage: true, openInPeek: Boolean(openInPeek), openToSide: false }, references, multiple as GoToLocationValues); + const command = new class extends GenericGoToLocationAction { + _getNoResultFoundMessage(info: IWordAtPosition | null) { + return noResultsMessage || super._getNoResultFoundMessage(info); + } + }({ + muteMessage: !Boolean(noResultsMessage), + openInPeek: Boolean(openInPeek), + openToSide: false + }, references, multiple as GoToLocationValues); + accessor.get(IInstantiationService).invokeFunction(command.run.bind(command), editor); }); } @@ -758,7 +768,7 @@ CommandsRegistry.registerCommand({ ] }, handler: async (accessor: ServicesAccessor, resource: any, position: any, references: any, multiple?: any) => { - accessor.get(ICommandService).executeCommand('editor.action.goToLocations', resource, position, references, multiple, true); + accessor.get(ICommandService).executeCommand('editor.action.goToLocations', resource, position, references, multiple, undefined, true); } }); diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts b/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts index c37726638d..c814099e0b 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts +++ b/src/vs/editor/contrib/gotoSymbol/peek/referencesTree.ts @@ -172,8 +172,8 @@ class OneReferenceTemplate { set(element: OneReference, score?: FuzzyScore): void { const preview = element.parent.getPreview(element)?.preview(element.range); - if (!preview) { - // this means we FAILED to resolve the document... + if (!preview || !preview.value) { + // this means we FAILED to resolve the document or the value is the empty string this.label.set(`${basename(element.uri)}:${element.range.startLineNumber + 1}:${element.range.startColumn + 1}`); } else { // render search match as highlight unless diff --git a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts b/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts index 5fd133809b..03508fe154 100644 --- a/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts +++ b/src/vs/editor/contrib/gotoSymbol/peek/referencesWidget.ts @@ -6,7 +6,6 @@ import 'vs/css!./referencesWidget'; import * as dom from 'vs/base/browser/dom'; import { IMouseEvent } from 'vs/base/browser/mouseEvent'; -import { GestureEvent } from 'vs/base/browser/touch'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; @@ -87,6 +86,9 @@ class DecorationsManager implements IDisposable { if (this._decorationIgnoreSet.has(oneReference.id)) { continue; } + if (oneReference.uri.toString() !== this._editor.getModel().uri.toString()) { + continue; + } newDecorations.push({ range: oneReference.range, options: DecorationsManager.DecorationOptions @@ -108,19 +110,21 @@ class DecorationsManager implements IDisposable { return; } - this._decorations.forEach((reference, decorationId) => { + for (let [decorationId, reference] of this._decorations) { + const newRange = model.getDecorationRange(decorationId); if (!newRange) { - return; + continue; } let ignore = false; - if (Range.equalsRange(newRange, reference.range)) { - return; + continue; - } else if (Range.spansMultipleLines(newRange)) { + } + + if (Range.spansMultipleLines(newRange)) { ignore = true; } else { @@ -138,7 +142,7 @@ class DecorationsManager implements IDisposable { } else { reference.range = newRange; } - }); + } for (let i = 0, len = toRemove.length; i < len; i++) { this._decorations.delete(toRemove[i]); @@ -147,11 +151,7 @@ class DecorationsManager implements IDisposable { } removeDecorations(): void { - let toRemove: string[] = []; - this._decorations.forEach((value, key) => { - toRemove.push(key); - }); - this._editor.deltaDecorations(toRemove, []); + this._editor.deltaDecorations([...this._decorations.keys()], []); this._decorations.clear(); } } @@ -316,6 +316,8 @@ export class ReferenceWidget extends peekView.PeekViewWidget { accessibilityProvider: new AccessibilityProvider(), keyboardNavigationLabelProvider: this._instantiationService.createInstance(StringRepresentationProvider), identityProvider: new IdentityProvider(), + openOnSingleClick: true, + openOnFocus: true, overrideStyles: { listBackground: peekView.peekViewResultsBackground } @@ -371,22 +373,13 @@ export class ReferenceWidget extends peekView.PeekViewWidget { this._onDidSelectReference.fire({ element, kind, source: 'tree' }); } }; - this._tree.onDidChangeFocus(e => { - onEvent(e.elements[0], 'show'); - }); this._tree.onDidOpen(e => { - if (e.browserEvent instanceof MouseEvent && (e.browserEvent.ctrlKey || e.browserEvent.metaKey || e.browserEvent.altKey)) { - // modifier-click -> open to the side - onEvent(e.elements[0], 'side'); - } else if (e.browserEvent instanceof KeyboardEvent || (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2) || (e.browserEvent).tapCount === 2) { - // keybinding (list service command) - // OR double click - // OR double tap - // -> close widget and goto target - onEvent(e.elements[0], 'goto'); + if (e.sideBySide) { + onEvent(e.element, 'side'); + } else if (e.editorOptions.pinned) { + onEvent(e.element, 'goto'); } else { - // preview location - onEvent(e.elements[0], 'show'); + onEvent(e.element, 'show'); } }); diff --git a/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts b/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts index b32caa2b9d..9a1c11b5d0 100644 --- a/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts +++ b/src/vs/editor/contrib/gotoSymbol/symbolNavigation.ts @@ -26,7 +26,7 @@ export const ctxHasSymbols = new RawContextKey('hasSymbols', false); export const ISymbolNavigationService = createDecorator('ISymbolNavigationService'); export interface ISymbolNavigationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; reset(): void; put(anchor: OneReference): void; revealNext(source: ICodeEditor): Promise; @@ -34,7 +34,7 @@ export interface ISymbolNavigationService { class SymbolNavigationService implements ISymbolNavigationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _ctxHasSymbols: IContextKey; @@ -198,7 +198,7 @@ class EditorState { dispose(): void { this._disposables.dispose(); this._onDidChange.dispose(); - this._listener.forEach(dispose); + dispose(this._listener.values()); } private _onDidAddEditor(editor: ICodeEditor): void { diff --git a/src/vs/editor/contrib/hover/hover.ts b/src/vs/editor/contrib/hover/hover.ts index 4e0299a26b..63b4fb19c4 100644 --- a/src/vs/editor/contrib/hover/hover.ts +++ b/src/vs/editor/contrib/hover/hover.ts @@ -26,6 +26,7 @@ import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDeco import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { AccessibilitySupport } from 'vs/platform/accessibility/common/accessibility'; import { GotoDefinitionAtPositionEditorContribution } from 'vs/editor/contrib/gotoSymbol/link/goToDefinitionAtPosition'; +import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; export class ModesHoverController implements IEditorContribution { @@ -56,6 +57,8 @@ export class ModesHoverController implements IEditorContribution { private _isHoverEnabled!: boolean; private _isHoverSticky!: boolean; + private _hoverVisibleKey: IContextKey; + static get(editor: ICodeEditor): ModesHoverController { return editor.getContribution(ModesHoverController.ID); } @@ -65,7 +68,8 @@ export class ModesHoverController implements IEditorContribution { @IModeService private readonly _modeService: IModeService, @IMarkerDecorationsService private readonly _markerDecorationsService: IMarkerDecorationsService, @IKeybindingService private readonly _keybindingService: IKeybindingService, - @IThemeService private readonly _themeService: IThemeService + @IThemeService private readonly _themeService: IThemeService, + @IContextKeyService _contextKeyService: IContextKeyService ) { this._isMouseDown = false; this._hoverClicked = false; @@ -79,6 +83,8 @@ export class ModesHoverController implements IEditorContribution { this._hookEvents(); } }); + + this._hoverVisibleKey = EditorContextKeys.hoverVisible.bindTo(_contextKeyService); } private _hookEvents(): void { @@ -204,7 +210,7 @@ export class ModesHoverController implements IEditorContribution { } private _createHoverWidgets() { - this._contentWidget.value = new ModesContentHoverWidget(this._editor, this._markerDecorationsService, this._keybindingService, this._themeService, this._modeService, this._openerService); + this._contentWidget.value = new ModesContentHoverWidget(this._editor, this._hoverVisibleKey, this._markerDecorationsService, this._keybindingService, this._themeService, this._modeService, this._openerService); this._glyphWidget.value = new ModesGlyphHoverWidget(this._editor, this._modeService, this._openerService); } diff --git a/src/vs/editor/contrib/hover/hoverWidgets.ts b/src/vs/editor/contrib/hover/hoverWidgets.ts index ff21e2cb3e..2b9a7dca2b 100644 --- a/src/vs/editor/contrib/hover/hoverWidgets.ts +++ b/src/vs/editor/contrib/hover/hoverWidgets.ts @@ -14,6 +14,7 @@ import { Range } from 'vs/editor/common/core/range'; import { renderHoverAction, HoverWidget } from 'vs/base/browser/ui/hover/hoverWidget'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; +import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; export class ContentHoverWidget extends Widget implements IContentWidget { @@ -40,6 +41,7 @@ export class ContentHoverWidget extends Widget implements IContentWidget { constructor( id: string, editor: ICodeEditor, + private readonly _hoverVisibleKey: IContextKey, private readonly _keybindingService: IKeybindingService ) { super(); @@ -83,6 +85,7 @@ export class ContentHoverWidget extends Widget implements IContentWidget { // Position has changed this._showAtPosition = position; this._showAtRange = range; + this._hoverVisibleKey.set(true); this.isVisible = true; this._editor.layoutContentWidget(this); @@ -100,6 +103,12 @@ export class ContentHoverWidget extends Widget implements IContentWidget { return; } + setTimeout(() => { + // Give commands a chance to see the key + if (!this.isVisible) { + this._hoverVisibleKey.set(false); + } + }, 0); this.isVisible = false; this._editor.layoutContentWidget(this); diff --git a/src/vs/editor/contrib/hover/modesContentHover.ts b/src/vs/editor/contrib/hover/modesContentHover.ts index c6cb4b38fd..256be275ea 100644 --- a/src/vs/editor/contrib/hover/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/modesContentHover.ts @@ -41,6 +41,7 @@ import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { Constants } from 'vs/base/common/uint'; import { textLinkForeground } from 'vs/platform/theme/common/colorRegistry'; import { Progress } from 'vs/platform/progress/common/progress'; +import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; const $ = dom.$; @@ -212,13 +213,14 @@ export class ModesContentHoverWidget extends ContentHoverWidget { constructor( editor: ICodeEditor, + _hoverVisibleKey: IContextKey, markerDecorationsService: IMarkerDecorationsService, keybindingService: IKeybindingService, private readonly _themeService: IThemeService, private readonly _modeService: IModeService, private readonly _openerService: IOpenerService = NullOpenerService, ) { - super(ModesContentHoverWidget.ID, editor, keybindingService); + super(ModesContentHoverWidget.ID, editor, _hoverVisibleKey, keybindingService); this._messages = []; this._lastRange = null; diff --git a/src/vs/editor/contrib/peekView/peekView.ts b/src/vs/editor/contrib/peekView/peekView.ts index 209ca2ba4a..f180d187aa 100644 --- a/src/vs/editor/contrib/peekView/peekView.ts +++ b/src/vs/editor/contrib/peekView/peekView.ts @@ -30,12 +30,12 @@ import { Codicon } from 'vs/base/common/codicons'; export const IPeekViewService = createDecorator('IPeekViewService'); export interface IPeekViewService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; addExclusiveWidget(editor: ICodeEditor, widget: PeekViewWidget): void; } registerSingleton(IPeekViewService, class implements IPeekViewService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _widgets = new Map(); @@ -103,7 +103,7 @@ const defaultOptions: IPeekViewOptions = { export abstract class PeekViewWidget extends ZoneWidget { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidClose = new Emitter(); readonly onDidClose = this._onDidClose.event; diff --git a/src/vs/editor/contrib/snippet/snippetParser.ts b/src/vs/editor/contrib/snippet/snippetParser.ts index f5dd81189d..1fdc1dd914 100644 --- a/src/vs/editor/contrib/snippet/snippetParser.ts +++ b/src/vs/editor/contrib/snippet/snippetParser.ts @@ -586,6 +586,10 @@ export class SnippetParser { return value.replace(/\$|}|\\/g, '\\$&'); } + static guessNeedsClipboard(template: string): boolean { + return /\${?CLIPBOARD/.test(template); + } + private _scanner: Scanner = new Scanner(); private _token: Token = { type: TokenType.EOF, pos: 0, len: 0 }; diff --git a/src/vs/editor/contrib/snippet/snippetSession.ts b/src/vs/editor/contrib/snippet/snippetSession.ts index 6c65a14042..b3b61dd303 100644 --- a/src/vs/editor/contrib/snippet/snippetSession.ts +++ b/src/vs/editor/contrib/snippet/snippetSession.ts @@ -14,7 +14,6 @@ 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 { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { Choice, Placeholder, SnippetParser, Text, TextmateSnippet, Marker } from './snippetParser'; @@ -65,9 +64,7 @@ export class OneSnippet { dispose(): void { if (this._placeholderDecorations) { - let toRemove: string[] = []; - this._placeholderDecorations.forEach(handle => toRemove.push(handle)); - this._editor.deltaDecorations(toRemove, []); + this._editor.deltaDecorations([...this._placeholderDecorations.values()], []); } this._placeholderGroups.length = 0; } @@ -170,11 +167,11 @@ export class OneSnippet { // change stickness to never grow when typing at its edges // so that in-active tabstops never grow - this._placeholderDecorations!.forEach((id, placeholder) => { + for (const [placeholder, id] of this._placeholderDecorations!) { if (!activePlaceholders.has(placeholder)) { accessor.changeDecorationOptions(id, placeholder.isFinalTabstop ? OneSnippet._decor.inactiveFinal : OneSnippet._decor.inactive); } - }); + } return selections; })!; @@ -305,14 +302,14 @@ export class OneSnippet { public getEnclosingRange(): Range | undefined { let result: Range | undefined; const model = this._editor.getModel(); - this._placeholderDecorations!.forEach((decorationId) => { + for (const decorationId of this._placeholderDecorations!.values()) { const placeholderRange = withNullAsUndefined(model.getDecorationRange(decorationId)); if (!result) { result = placeholderRange; } else { result = result.plusRange(placeholderRange!); } - }); + } return result; } } @@ -396,9 +393,7 @@ export class SnippetSession { const workspaceService = editor.invokeWithinContext(accessor => accessor.get(IWorkspaceContextService, optional)); const modelBasedVariableResolver = editor.invokeWithinContext(accessor => new ModelBasedVariableResolver(accessor.get(ILabelService, optional), model)); - - const clipboardService = editor.invokeWithinContext(accessor => accessor.get(IClipboardService, optional)); - const readClipboardText = () => clipboardText || clipboardService && clipboardService.readTextSync(); + const readClipboardText = () => clipboardText; let delta = 0; @@ -603,8 +598,7 @@ export class SnippetSession { // that contain at least one selection. for all remaining snippets // the same placeholder (and their ranges) must be used. if (allPossibleSelections.size === 0) { - possibleSelections.forEach((ranges, index) => { - + for (const [index, ranges] of possibleSelections) { ranges.sort(Range.compareRangesUsingStarts); for (const selection of selections) { if (ranges[0].containsRange(selection)) { @@ -612,7 +606,7 @@ export class SnippetSession { break; } } - }); + } } if (allPossibleSelections.size === 0) { @@ -633,11 +627,10 @@ export class SnippetSession { // selection selections.sort(Range.compareRangesUsingStarts); - allPossibleSelections.forEach((ranges, index) => { - + for (let [index, ranges] of allPossibleSelections) { if (ranges.length !== selections.length) { allPossibleSelections.delete(index); - return; + continue; } ranges.sort(Range.compareRangesUsingStarts); @@ -645,10 +638,10 @@ export class SnippetSession { for (let i = 0; i < ranges.length; i++) { if (!ranges[i].containsRange(selections[i])) { allPossibleSelections.delete(index); - return; + continue; } } - }); + } // from all possible selections we have deleted those // that don't match with the current selection. if we don't diff --git a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts index f6c0ea5795..b3529582b4 100644 --- a/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts +++ b/src/vs/editor/contrib/snippet/test/snippetVariables.test.ts @@ -302,7 +302,7 @@ suite('Snippet Variables Resolver', function () { let workspace: IWorkspace; let resolver: VariableResolver; const workspaceService = new class implements IWorkspaceContextService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; _throw = () => { throw new Error(); }; onDidChangeWorkbenchState = this._throw; onDidChangeWorkspaceName = this._throw; diff --git a/src/vs/editor/contrib/suggest/completionModel.ts b/src/vs/editor/contrib/suggest/completionModel.ts index dacfcaaa75..22adf05026 100644 --- a/src/vs/editor/contrib/suggest/completionModel.ts +++ b/src/vs/editor/contrib/suggest/completionModel.ts @@ -41,6 +41,9 @@ const enum Refilter { Incr = 2 } +/** + * Sorted, filtered completion view model + * */ export class CompletionModel { private readonly _items: CompletionItem[]; @@ -61,7 +64,8 @@ export class CompletionModel { lineContext: LineContext, wordDistance: WordDistance, options: InternalSuggestOptions, - snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none' + snippetSuggestions: 'top' | 'bottom' | 'inline' | 'none', + readonly clipboardText: string | undefined ) { this._items = items; this._column = column; diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/suggest.ts index d6f5cbd568..98b7679364 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/suggest.ts @@ -14,8 +14,9 @@ import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Range } from 'vs/editor/common/core/range'; import { FuzzyScore } from 'vs/base/common/filters'; -import { isDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { isDisposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { MenuId } from 'vs/platform/actions/common/actions'; +import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; export const Context = { Visible: new RawContextKey('suggestWidgetVisible', false), @@ -55,12 +56,15 @@ export class CompletionItem { idx?: number; word?: string; + // resolving + private _isResolved?: boolean; + private _resolveCache?: Promise; + constructor( readonly position: IPosition, readonly completion: modes.CompletionItem, readonly container: modes.CompletionList, readonly provider: modes.CompletionItemProvider, - model: ITextModel ) { this.textLabel = typeof completion.label === 'string' ? completion.label @@ -104,13 +108,11 @@ export class CompletionItem { } } - // resolving - get isResolved() { - return Boolean(this._isResolved); - } + // ---- resolving - private _resolveCache?: Promise; - private _isResolved?: boolean; + get isResolved(): boolean { + return !!this._isResolved; + } async resolve(token: CancellationToken) { if (!this._resolveCache) { @@ -162,13 +164,21 @@ export function setSnippetSuggestSupport(support: modes.CompletionItemProvider): return old; } +class CompletionItemModel { + constructor( + readonly items: CompletionItem[], + readonly needsClipboard: boolean, + readonly dispoables: IDisposable, + ) { } +} + export async function provideSuggestionItems( model: ITextModel, position: Position, options: CompletionOptions = CompletionOptions.default, context: modes.CompletionContext = { triggerKind: modes.CompletionTriggerKind.Invoke }, token: CancellationToken = CancellationToken.None -): Promise { +): Promise { // const t1 = Date.now(); position = position.clone(); @@ -179,6 +189,7 @@ export async function provideSuggestionItems( const result: CompletionItem[] = []; const disposables = new DisposableStore(); + let needsClipboard = false; const onCompletionList = (provider: modes.CompletionItemProvider, container: modes.CompletionList | null | undefined) => { if (!container) { @@ -194,7 +205,10 @@ export async function provideSuggestionItems( if (!suggestion.sortText) { suggestion.sortText = typeof suggestion.label === 'string' ? suggestion.label : suggestion.label.name; } - result.push(new CompletionItem(position, suggestion, container, provider, model)); + if (!needsClipboard && suggestion.insertTextRules && suggestion.insertTextRules & modes.CompletionItemInsertTextRule.InsertAsSnippet) { + needsClipboard = SnippetParser.guessNeedsClipboard(suggestion.insertText); + } + result.push(new CompletionItem(position, suggestion, container, provider)); } } if (isDisposable(container)) { @@ -247,7 +261,11 @@ export async function provideSuggestionItems( return Promise.reject(canceled()); } // console.log(`${result.length} items AFTER ${Date.now() - t1}ms`); - return result.sort(getSuggestionComparator(options.snippetSortOrder)); + return new CompletionItemModel( + result.sort(getSuggestionComparator(options.snippetSortOrder)), + needsClipboard, + disposables + ); } @@ -309,27 +327,23 @@ registerDefaultLanguageCommand('_executeCompletionItemProvider', async (model, p suggestions: [] }; - const disposables = new DisposableStore(); const resolving: Promise[] = []; const maxItemsToResolve = args['maxItemsToResolve'] || 0; - const items = await provideSuggestionItems(model, position); - for (const item of items) { + const completions = await provideSuggestionItems(model, position); + for (const item of completions.items) { if (resolving.length < maxItemsToResolve) { resolving.push(item.resolve(CancellationToken.None)); } result.incomplete = result.incomplete || item.container.incomplete; result.suggestions.push(item.completion); - if (isDisposable(item.container)) { - disposables.add(item.container); - } } try { await Promise.all(resolving); return result; } finally { - setTimeout(() => disposables.dispose(), 100); + setTimeout(() => completions.dispoables.dispose(), 100); } }); diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index d732e81a3d..6565976c01 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -42,6 +42,7 @@ import { MenuRegistry } from 'vs/platform/actions/common/actions'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { ILogService } from 'vs/platform/log/common/log'; import { StopWatch } from 'vs/base/common/stopwatch'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; // sticky suggest widget which doesn't disappear on focus out and such let _sticky = false; @@ -120,9 +121,10 @@ export class SuggestController implements IEditorContribution { @IContextKeyService private readonly _contextKeyService: IContextKeyService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILogService private readonly _logService: ILogService, + @IClipboardService clipboardService: IClipboardService, ) { this.editor = editor; - this.model = new SuggestModel(this.editor, editorWorker); + this.model = new SuggestModel(this.editor, editorWorker, clipboardService); this.widget = this._toDispose.add(new IdleValue(() => { @@ -358,7 +360,8 @@ export class SuggestController implements IEditorContribution { overwriteAfter: info.overwriteAfter, undoStopBefore: false, undoStopAfter: false, - adjustWhitespace: !(item.completion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace) + adjustWhitespace: !(item.completion.insertTextRules! & CompletionItemInsertTextRule.KeepWhitespace), + clipboardText: event.model.clipboardText }); if (!(flags & InsertFlags.NoAfterUndoStop)) { diff --git a/src/vs/editor/contrib/suggest/suggestMemory.ts b/src/vs/editor/contrib/suggest/suggestMemory.ts index ad3bd43cea..be738bab47 100644 --- a/src/vs/editor/contrib/suggest/suggestMemory.ts +++ b/src/vs/editor/contrib/suggest/suggestMemory.ts @@ -132,11 +132,7 @@ export class LRUMemory extends Memory { } toJSON(): object { - let data: [string, MemItem][] = []; - this._cache.forEach((value, key) => { - data.push([key, value]); - }); - return data; + return this._cache.toJSON(); } fromJSON(data: [string, MemItem][]): void { @@ -308,7 +304,7 @@ export class SuggestMemoryService implements ISuggestMemoryService { export const ISuggestMemoryService = createDecorator('ISuggestMemories'); export interface ISuggestMemoryService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; memorize(model: ITextModel, pos: IPosition, item: CompletionItem): void; select(model: ITextModel, pos: IPosition, items: CompletionItem[]): number; } diff --git a/src/vs/editor/contrib/suggest/suggestModel.ts b/src/vs/editor/contrib/suggest/suggestModel.ts index bec341a59f..45eb4a6033 100644 --- a/src/vs/editor/contrib/suggest/suggestModel.ts +++ b/src/vs/editor/contrib/suggest/suggestModel.ts @@ -7,7 +7,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { TimeoutTimer } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { IDisposable, dispose, DisposableStore, isDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CursorChangeReason, ICursorSelectionChangedEvent } from 'vs/editor/common/controller/cursorEvents'; import { Position, IPosition } from 'vs/editor/common/core/position'; @@ -22,6 +22,7 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import { WordDistance } from 'vs/editor/contrib/suggest/wordDistance'; import { EditorOption } from 'vs/editor/common/config/editorOptions'; import { isLowSurrogate, isHighSurrogate } from 'vs/base/common/strings'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; export interface ICancelEvent { readonly retrigger: boolean; @@ -116,7 +117,8 @@ export class SuggestModel implements IDisposable { constructor( private readonly _editor: ICodeEditor, - private readonly _editorWorker: IEditorWorkerService + private readonly _editorWorkerService: IEditorWorkerService, + private readonly _clipboardService: IClipboardService ) { this._currentSelection = this._editor.getSelection() || new Selection(1, 1, 1, 1); @@ -422,9 +424,9 @@ export class SuggestModel implements IDisposable { } let itemKindFilter = SuggestModel._createItemKindFilter(this._editor); - let wordDistance = WordDistance.create(this._editorWorker, this._editor); + let wordDistance = WordDistance.create(this._editorWorkerService, this._editor); - let items = provideSuggestionItems( + let completions = provideSuggestionItems( model, this._editor.getPosition(), new CompletionOptions(snippetSortOrder, itemKindFilter, onlyFrom), @@ -432,7 +434,7 @@ export class SuggestModel implements IDisposable { this._requestToken.token ); - Promise.all([items, wordDistance]).then(([items, wordDistance]) => { + Promise.all([completions, wordDistance]).then(async ([completions, wordDistance]) => { dispose(this._requestToken); @@ -444,7 +446,13 @@ export class SuggestModel implements IDisposable { return; } + let clipboardText: string | undefined; + if (completions.needsClipboard) { + clipboardText = await this._clipboardService.readText(); + } + const model = this._editor.getModel(); + let items = completions.items; if (isNonEmptyArray(existingItems)) { const cmpFn = getSuggestionComparator(snippetSortOrder); @@ -458,15 +466,12 @@ export class SuggestModel implements IDisposable { }, wordDistance, this._editor.getOption(EditorOption.suggest), - this._editor.getOption(EditorOption.snippetSuggestions) + this._editor.getOption(EditorOption.snippetSuggestions), + clipboardText ); // store containers so that they can be disposed later - for (const item of items) { - if (isDisposable(item.container)) { - this._completionDisposables.add(item.container); - } - } + this._completionDisposables.add(completions.dispoables); this._onNewContext(ctx); diff --git a/src/vs/editor/contrib/suggest/suggestWidget.ts b/src/vs/editor/contrib/suggest/suggestWidget.ts index de1e17094b..cafa4130b7 100644 --- a/src/vs/editor/contrib/suggest/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/suggestWidget.ts @@ -159,7 +159,7 @@ class ItemRenderer implements IListRenderer { const options = this.editor.getOptions(); @@ -321,7 +321,7 @@ class SuggestionDetails { this.header = append(this.body, $('.header')); this.close = append(this.header, $('span' + Codicon.close.cssSelector)); - this.close.title = nls.localize('readLess', "Read less...{0}", this.kbToggleDetails); + this.close.title = nls.localize('readLess', "Read Less ({0})", this.kbToggleDetails); this.type = append(this.header, $('p.type')); this.docs = append(this.body, $('p.docs')); @@ -605,7 +605,6 @@ export class SuggestWidget implements IContentWidget, IListVirtualDelegate false }, mouseSupport: false, accessibilityProvider: { getRole: () => 'option', diff --git a/src/vs/editor/contrib/suggest/test/completionModel.test.ts b/src/vs/editor/contrib/suggest/test/completionModel.test.ts index 646c87af01..4a9a15f8ab 100644 --- a/src/vs/editor/contrib/suggest/test/completionModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/completionModel.test.ts @@ -29,7 +29,7 @@ export function createSuggestItem(label: string, overwriteBefore: number, kind = } }; - return new CompletionItem(position, suggestion, container, provider, undefined!); + return new CompletionItem(position, suggestion, container, provider); } suite('CompletionModel', function () { @@ -79,7 +79,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: 'foo', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); }); test('filtering - cached', function () { @@ -110,7 +110,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: 'foo', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(incompleteModel.incomplete.size, 1); }); @@ -119,7 +119,7 @@ suite('CompletionModel', function () { const completeItem = createSuggestItem('foobar', 1, undefined, false, { lineNumber: 1, column: 2 }); const incompleteItem = createSuggestItem('foofoo', 1, undefined, true, { lineNumber: 1, column: 2 }); - const model = new CompletionModel([completeItem, incompleteItem], 2, { leadingLineContent: 'f', characterCountDelta: 0 }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + const model = new CompletionModel([completeItem, incompleteItem], 2, { leadingLineContent: 'f', characterCountDelta: 0 }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(model.incomplete.size, 1); assert.equal(model.items.length, 2); @@ -148,7 +148,7 @@ suite('CompletionModel', function () { completeItem4, completeItem5, incompleteItem1, - ], 2, { leadingLineContent: 'f', characterCountDelta: 0 }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue + ], 2, { leadingLineContent: 'f', characterCountDelta: 0 }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined ); assert.equal(model.incomplete.size, 1); assert.equal(model.items.length, 6); @@ -172,7 +172,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: ' <', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(model.items.length, 4); @@ -192,7 +192,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: 's', characterCountDelta: 0 - }, WordDistance.None, defaultOptions, 'top'); + }, WordDistance.None, defaultOptions, 'top', undefined); assert.equal(model.items.length, 2); const [a, b] = model.items; @@ -211,7 +211,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: 's', characterCountDelta: 0 - }, WordDistance.None, defaultOptions, 'bottom'); + }, WordDistance.None, defaultOptions, 'bottom', undefined); assert.equal(model.items.length, 2); const [a, b] = model.items; @@ -229,7 +229,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: 's', characterCountDelta: 0 - }, WordDistance.None, defaultOptions, 'inline'); + }, WordDistance.None, defaultOptions, 'inline', undefined); assert.equal(model.items.length, 2); const [a, b] = model.items; @@ -246,7 +246,7 @@ suite('CompletionModel', function () { model = new CompletionModel([item1, item2], 1, { leadingLineContent: 'M', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(model.items.length, 2); @@ -266,7 +266,7 @@ suite('CompletionModel', function () { model = new CompletionModel(items, 3, { leadingLineContent: ' ', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(model.items.length, 2); @@ -285,7 +285,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: '', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); assert.equal(model.items.length, 5); @@ -312,7 +312,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: '', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); // query gets longer, narrow down the narrow-down'ed-set from before model.lineContext = { leadingLineContent: 'rlut', characterCountDelta: 4 }; @@ -334,7 +334,7 @@ suite('CompletionModel', function () { ], 1, { leadingLineContent: '', characterCountDelta: 0 - }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue); + }, WordDistance.None, EditorOptions.suggest.defaultValue, EditorOptions.snippetSuggestions.defaultValue, undefined); model.lineContext = { leadingLineContent: 'form', characterCountDelta: 4 }; assert.equal(model.items.length, 5); diff --git a/src/vs/editor/contrib/suggest/test/suggest.test.ts b/src/vs/editor/contrib/suggest/test/suggest.test.ts index 129702abbe..5b64db77ea 100644 --- a/src/vs/editor/contrib/suggest/test/suggest.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggest.test.ts @@ -52,7 +52,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(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Inline)); assert.equal(items.length, 3); assert.equal(items[0].completion.label, 'aaa'); assert.equal(items[1].completion.label, 'fff'); @@ -60,7 +60,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(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Top)); assert.equal(items.length, 3); assert.equal(items[0].completion.label, 'aaa'); assert.equal(items[1].completion.label, 'zzz'); @@ -68,7 +68,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(model, new Position(1, 1), new CompletionOptions(SnippetSortOrder.Bottom)); assert.equal(items.length, 3); assert.equal(items[0].completion.label, 'fff'); assert.equal(items[1].completion.label, 'aaa'); @@ -76,7 +76,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(model, new Position(1, 1), new CompletionOptions(undefined, new Set().add(CompletionItemKind.Snippet))); assert.equal(items.length, 1); assert.equal(items[0].completion.label, 'fff'); }); @@ -99,7 +99,7 @@ suite('Suggest', function () { }; const registration = CompletionProviderRegistry.register({ pattern: 'bar/path', scheme: 'foo' }, foo); - provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set().add(foo))).then(items => { + provideSuggestionItems(model, new Position(1, 1), new CompletionOptions(undefined, undefined, new Set().add(foo))).then(({ items }) => { registration.dispose(); assert.equal(items.length, 1); @@ -138,7 +138,7 @@ 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 { items } = await provideSuggestionItems(model, new Position(0, 0), new CompletionOptions(undefined, undefined, new Set().add(foo))); registration.dispose(); assert.equal(items.length, 2); diff --git a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts index f29c705a98..ac597c8d83 100644 --- a/src/vs/editor/contrib/suggest/test/suggestModel.test.ts +++ b/src/vs/editor/contrib/suggest/test/suggestModel.test.ts @@ -33,6 +33,7 @@ import { ITextModel } from 'vs/editor/common/model'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MockKeybindingService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; import { createTextModel } from 'vs/editor/test/common/editorTestUtils'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; export interface Ctor { new(): T; @@ -51,7 +52,7 @@ function createMockEditor(model: TextModel): ITestCodeEditor { [IStorageService, new InMemoryStorageService()], [IKeybindingService, new MockKeybindingService()], [ISuggestMemoryService, new class implements ISuggestMemoryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; memorize(): void { } select(): number { @@ -196,12 +197,19 @@ suite('SuggestModel - TriggerAndCancelOracle', function () { return new Promise((resolve, reject) => { const editor = createMockEditor(model); - const oracle = new SuggestModel(editor, new class extends mock() { - computeWordRanges() { - return Promise.resolve({}); + const oracle = new SuggestModel( + editor, + new class extends mock() { + computeWordRanges() { + return Promise.resolve({}); + } + }, + new class extends mock() { + readText() { + return Promise.resolve('CLIPPY'); + } } - - }); + ); disposables.push(oracle, editor); try { diff --git a/src/vs/editor/contrib/suggest/test/wordDistance.test.ts b/src/vs/editor/contrib/suggest/test/wordDistance.test.ts index c0e5a3f91e..337ee01b80 100644 --- a/src/vs/editor/contrib/suggest/test/wordDistance.test.ts +++ b/src/vs/editor/contrib/suggest/test/wordDistance.test.ts @@ -101,7 +101,7 @@ suite('suggest, word distance', function () { return; } }; - return new CompletionItem(position, suggestion, container, provider, undefined!); + return new CompletionItem(position, suggestion, container, provider); } test('Suggest locality bonus can boost current word #90515', function () { diff --git a/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts b/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts index 0fe9929b63..1c6c77a5df 100644 --- a/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts +++ b/src/vs/editor/contrib/unusualLineTerminators/unusualLineTerminators.ts @@ -16,18 +16,18 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; const ignoreUnusualLineTerminators = 'ignoreUnusualLineTerminators'; function writeIgnoreState(codeEditorService: ICodeEditorService, model: ITextModel, state: boolean): void { - codeEditorService.setTransientModelProperty(model, ignoreUnusualLineTerminators, state); + codeEditorService.setModelProperty(model.uri, ignoreUnusualLineTerminators, state); } function readIgnoreState(codeEditorService: ICodeEditorService, model: ITextModel): boolean | undefined { - return codeEditorService.getTransientModelProperty(model, ignoreUnusualLineTerminators); + return codeEditorService.getModelProperty(model.uri, ignoreUnusualLineTerminators); } class UnusualLineTerminatorsDetector extends Disposable implements IEditorContribution { public static readonly ID = 'editor.contrib.unusualLineTerminatorsDetector'; - private _enabled: boolean; + private _config: 'off' | 'prompt' | 'auto'; constructor( private readonly _editor: ICodeEditor, @@ -36,10 +36,10 @@ class UnusualLineTerminatorsDetector extends Disposable implements IEditorContri ) { super(); - this._enabled = this._editor.getOption(EditorOption.removeUnusualLineTerminators); + this._config = this._editor.getOption(EditorOption.unusualLineTerminators); this._register(this._editor.onDidChangeConfiguration((e) => { - if (e.hasChanged(EditorOption.removeUnusualLineTerminators)) { - this._enabled = this._editor.getOption(EditorOption.removeUnusualLineTerminators); + if (e.hasChanged(EditorOption.unusualLineTerminators)) { + this._config = this._editor.getOption(EditorOption.unusualLineTerminators); this._checkForUnusualLineTerminators(); } })); @@ -48,13 +48,17 @@ class UnusualLineTerminatorsDetector extends Disposable implements IEditorContri this._checkForUnusualLineTerminators(); })); - this._register(this._editor.onDidChangeModelContent(() => { + this._register(this._editor.onDidChangeModelContent((e) => { + if (e.isUndoing) { + // skip checking in case of undoing + return; + } this._checkForUnusualLineTerminators(); })); } private async _checkForUnusualLineTerminators(): Promise { - if (!this._enabled) { + if (this._config === 'off') { return; } if (!this._editor.hasModel()) { @@ -74,10 +78,16 @@ class UnusualLineTerminatorsDetector extends Disposable implements IEditorContri return; } + if (this._config === 'auto') { + // just do it! + model.removeUnusualLineTerminators(this._editor.getSelections()); + return; + } + const result = await this._dialogService.confirm({ title: nls.localize('unusualLineTerminators.title', "Unusual Line Terminators"), message: nls.localize('unusualLineTerminators.message', "Detected unusual line terminators"), - detail: nls.localize('unusualLineTerminators.detail', "Your file contains one or more unusual line terminator characters, like Line Separator (LS), Paragraph Separator (PS) or Next Line (NEL).\n\nThese characters can cause subtle problems with language servers, due to how each programming language specifies its line terminators. e.g. what is line 11 for VS Code might be line 12 for a language server.\n\nThis check can be disabled via `editor.removeUnusualLineTerminators`."), + detail: nls.localize('unusualLineTerminators.detail', "This file contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`."), primaryButton: nls.localize('unusualLineTerminators.fix', "Fix this file"), secondaryButton: nls.localize('unusualLineTerminators.ignore', "Ignore problem for this file") }); diff --git a/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.css b/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.css index 8c91b0f954..e76f55b50f 100644 --- a/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.css +++ b/src/vs/editor/standalone/browser/inspectTokens/inspectTokens.css @@ -17,7 +17,7 @@ } .monaco-editor .tokens-inspect-widget .tm-token { - font-family: monospace; + font-family: var(--monaco-monospace-font); } .monaco-editor .tokens-inspect-widget .tm-token-length { @@ -31,10 +31,10 @@ } .monaco-editor .tokens-inspect-widget .tm-metadata-value { - font-family: monospace; + font-family: var(--monaco-monospace-font); text-align: right; } .monaco-editor .tokens-inspect-widget .tm-token-type { - font-family: monospace; + font-family: var(--monaco-monospace-font); } diff --git a/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl.ts b/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl.ts index f02bc1dc79..5538afeb56 100644 --- a/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl.ts +++ b/src/vs/editor/standalone/browser/quickInput/standaloneQuickInputServiceImpl.ts @@ -52,7 +52,7 @@ export class EditorScopedQuickInputServiceImpl extends QuickInputService { export class StandaloneQuickInputServiceImpl implements IQuickInputService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private mapEditorToService = new Map(); private get activeService(): IQuickInputService { diff --git a/src/vs/editor/standalone/browser/simpleServices.ts b/src/vs/editor/standalone/browser/simpleServices.ts index 84dd91dd46..7ce37993a8 100644 --- a/src/vs/editor/standalone/browser/simpleServices.ts +++ b/src/vs/editor/standalone/browser/simpleServices.ts @@ -155,7 +155,7 @@ export class SimpleEditorModelResolverService implements ITextModelService { } export class SimpleEditorProgressService implements IEditorProgressService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static NULL_PROGRESS_RUNNER: IProgressRunner = { done: () => { }, @@ -251,7 +251,7 @@ export class SimpleNotificationService implements INotificationService { } export class StandaloneCommandService implements ICommandService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _instantiationService: IInstantiationService; @@ -420,7 +420,7 @@ function isConfigurationOverrides(thing: any): thing is IConfigurationOverrides export class SimpleConfigurationService implements IConfigurationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeConfiguration = new Emitter(); public readonly onDidChangeConfiguration: Event = this._onDidChangeConfiguration.event; @@ -498,7 +498,7 @@ export class SimpleConfigurationService implements IConfigurationService { export class SimpleResourceConfigurationService implements ITextResourceConfigurationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeConfiguration = new Emitter(); public readonly onDidChangeConfiguration = this._onDidChangeConfiguration.event; @@ -527,7 +527,7 @@ export class SimpleResourceConfigurationService implements ITextResourceConfigur export class SimpleResourcePropertiesService implements ITextResourcePropertiesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, @@ -544,7 +544,7 @@ export class SimpleResourcePropertiesService implements ITextResourcePropertiesS } export class StandaloneTelemetryService implements ITelemetryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public isOptedIn = false; public sendErrorTelemetry = false; @@ -648,7 +648,7 @@ export function applyConfigurationValues(configurationService: IConfigurationSer } export class SimpleBulkEditService implements IBulkEditService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly _modelService: IModelService) { // @@ -703,7 +703,7 @@ export class SimpleBulkEditService implements IBulkEditService { export class SimpleUriLabelService implements ILabelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public readonly onDidChangeFormatters: Event = Event.None; @@ -736,7 +736,7 @@ export class SimpleUriLabelService implements ILabelService { } export class SimpleLayoutService implements ILayoutService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public onLayout = Event.None; diff --git a/src/vs/editor/standalone/browser/standalone-tokens.css b/src/vs/editor/standalone/browser/standalone-tokens.css index c4188df11e..0fae1a9e63 100644 --- a/src/vs/editor/standalone/browser/standalone-tokens.css +++ b/src/vs/editor/standalone/browser/standalone-tokens.css @@ -4,9 +4,10 @@ *--------------------------------------------------------------------------------------------*/ -/* Default standalone editor font */ +/* Default standalone editor fonts */ .monaco-editor { - font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", "Ubuntu", "Droid Sans", sans-serif; + font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "HelveticaNeue-Light", system-ui, "Ubuntu", "Droid Sans", sans-serif; + --monaco-monospace-font: "SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace; } .monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label { diff --git a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts index 78506d9087..0e4a445609 100644 --- a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts @@ -172,7 +172,7 @@ function newBuiltInTheme(builtinTheme: BuiltinTheme): StandaloneTheme { export class StandaloneThemeServiceImpl extends Disposable implements IStandaloneThemeService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onColorThemeChange = this._register(new Emitter()); public readonly onDidColorThemeChange = this._onColorThemeChange.event; diff --git a/src/vs/editor/standalone/common/monarch/monarchCommon.ts b/src/vs/editor/standalone/common/monarch/monarchCommon.ts index 05514ab400..bb437f9a8a 100644 --- a/src/vs/editor/standalone/common/monarch/monarchCommon.ts +++ b/src/vs/editor/standalone/common/monarch/monarchCommon.ts @@ -24,6 +24,7 @@ export interface ILexerMin { languageId: string; noThrow: boolean; ignoreCase: boolean; + unicode: boolean; usesEmbedded: boolean; defaultToken: string; stateNames: { [stateName: string]: any; }; @@ -34,6 +35,7 @@ export interface ILexer extends ILexerMin { maxStack: number; start: string | null; ignoreCase: boolean; + unicode: boolean; tokenPostfix: string; tokenizer: { [stateName: string]: IRule[]; }; diff --git a/src/vs/editor/standalone/common/monarch/monarchCompile.ts b/src/vs/editor/standalone/common/monarch/monarchCompile.ts index eb33b55d6a..cda7ec8418 100644 --- a/src/vs/editor/standalone/common/monarch/monarchCompile.ts +++ b/src/vs/editor/standalone/common/monarch/monarchCompile.ts @@ -79,7 +79,7 @@ function createKeywordMatcher(arr: string[], caseInsensitive: boolean = false): // Lexer helpers /** - * Compiles a regular expression string, adding the 'i' flag if 'ignoreCase' is set. + * Compiles a regular expression string, adding the 'i' flag if 'ignoreCase' is set, and the 'u' flag if 'unicode' is set. * Also replaces @\w+ or sequences with the content of the specified attribute */ function compileRegExp(lexer: monarchCommon.ILexerMin, str: string): RegExp { @@ -103,7 +103,8 @@ function compileRegExp(lexer: monarchCommon.ILexerMin, str: string): RegExp { }); } - return new RegExp(str, (lexer.ignoreCase ? 'i' : '')); + let flags = (lexer.ignoreCase ? 'i' : '') + (lexer.unicode ? 'u' : ''); + return new RegExp(str, flags); } /** @@ -400,6 +401,7 @@ export function compile(languageId: string, json: IMonarchLanguage): monarchComm // Set standard fields: be defensive about types lexer.start = (typeof json.start === 'string' ? json.start : null); lexer.ignoreCase = bool(json.ignoreCase, false); + lexer.unicode = bool(json.unicode, false); lexer.tokenPostfix = string(json.tokenPostfix, '.' + lexer.languageId); lexer.defaultToken = string(json.defaultToken, 'source'); @@ -410,6 +412,7 @@ export function compile(languageId: string, json: IMonarchLanguage): monarchComm let lexerMin: monarchCommon.ILexerMin = json; lexerMin.languageId = languageId; lexerMin.ignoreCase = lexer.ignoreCase; + lexerMin.unicode = lexer.unicode; lexerMin.noThrow = lexer.noThrow; lexerMin.usesEmbedded = lexer.usesEmbedded; lexerMin.stateNames = json.tokenizer; diff --git a/src/vs/editor/standalone/common/monarch/monarchLexer.ts b/src/vs/editor/standalone/common/monarch/monarchLexer.ts index cbbe9a1620..e8e1c7db18 100644 --- a/src/vs/editor/standalone/common/monarch/monarchLexer.ts +++ b/src/vs/editor/standalone/common/monarch/monarchLexer.ts @@ -497,7 +497,8 @@ export class MonarchTokenizer implements modes.ITokenizationSupport { let regex = rule.regex; let regexSource = rule.regex.source; if (regexSource.substr(0, 4) === '^(?:' && regexSource.substr(regexSource.length - 1, 1) === ')') { - regex = new RegExp(regexSource.substr(4, regexSource.length - 5), regex.ignoreCase ? 'i' : ''); + let flags = (regex.ignoreCase ? 'i' : '') + (regex.unicode ? 'u' : ''); + regex = new RegExp(regexSource.substr(4, regexSource.length - 5), flags); } let result = line.search(regex); diff --git a/src/vs/editor/standalone/common/monarch/monarchTypes.ts b/src/vs/editor/standalone/common/monarch/monarchTypes.ts index 8fa873c72b..a48a92faa9 100644 --- a/src/vs/editor/standalone/common/monarch/monarchTypes.ts +++ b/src/vs/editor/standalone/common/monarch/monarchTypes.ts @@ -21,6 +21,10 @@ export interface IMonarchLanguage { * is the language case insensitive? */ ignoreCase?: boolean; + /** + * is the language unicode-aware? (i.e., /\u{1D306}/) + */ + unicode?: boolean; /** * if no match in the tokenizer assign this token class (default 'source') */ diff --git a/src/vs/editor/standalone/common/standaloneThemeService.ts b/src/vs/editor/standalone/common/standaloneThemeService.ts index 5c2396e2ad..ba39c4479c 100644 --- a/src/vs/editor/standalone/common/standaloneThemeService.ts +++ b/src/vs/editor/standalone/common/standaloneThemeService.ts @@ -26,7 +26,7 @@ export interface IStandaloneTheme extends IColorTheme { } export interface IStandaloneThemeService extends IThemeService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; setTheme(themeName: string): string; diff --git a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts index 9049b95975..e3d8b6c364 100644 --- a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts +++ b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts @@ -33,7 +33,7 @@ suite('TokenizationSupport2Adapter', () => { } class MockThemeService implements IStandaloneThemeService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public setTheme(themeName: string): string { throw new Error('Not implemented'); } diff --git a/src/vs/editor/test/browser/controller/cursor.test.ts b/src/vs/editor/test/browser/controller/cursor.test.ts index a275c2b2a1..5e621d0092 100644 --- a/src/vs/editor/test/browser/controller/cursor.test.ts +++ b/src/vs/editor/test/browser/controller/cursor.test.ts @@ -2208,6 +2208,70 @@ suite('Editor Controller - Regression tests', () => { }); }); + test('issue #98320: Multi-Cursor, Wrap lines and cursorSelectRight ==> cursors out of sync', () => { + // a single model line => 4 view lines + withTestCodeEditor([ + [ + 'lorem_ipsum-1993x11x13', + 'dolor_sit_amet-1998x04x27', + 'consectetur-2007x10x08', + 'adipiscing-2012x07x27', + 'elit-2015x02x27', + ].join('\n') + ], { wordWrap: 'wordWrapColumn', wordWrapColumn: 16 }, (editor, viewModel) => { + viewModel.setSelections('test', [ + new Selection(1, 13, 1, 13), + new Selection(2, 16, 2, 16), + new Selection(3, 13, 3, 13), + new Selection(4, 12, 4, 12), + new Selection(5, 6, 5, 6), + ]); + assertCursor(viewModel, [ + new Selection(1, 13, 1, 13), + new Selection(2, 16, 2, 16), + new Selection(3, 13, 3, 13), + new Selection(4, 12, 4, 12), + new Selection(5, 6, 5, 6), + ]); + + moveRight(editor, viewModel, true); + assertCursor(viewModel, [ + new Selection(1, 13, 1, 14), + new Selection(2, 16, 2, 17), + new Selection(3, 13, 3, 14), + new Selection(4, 12, 4, 13), + new Selection(5, 6, 5, 7), + ]); + + moveRight(editor, viewModel, true); + assertCursor(viewModel, [ + new Selection(1, 13, 1, 15), + new Selection(2, 16, 2, 18), + new Selection(3, 13, 3, 15), + new Selection(4, 12, 4, 14), + new Selection(5, 6, 5, 8), + ]); + + moveRight(editor, viewModel, true); + assertCursor(viewModel, [ + new Selection(1, 13, 1, 16), + new Selection(2, 16, 2, 19), + new Selection(3, 13, 3, 16), + new Selection(4, 12, 4, 15), + new Selection(5, 6, 5, 9), + ]); + + moveRight(editor, viewModel, true); + assertCursor(viewModel, [ + new Selection(1, 13, 1, 17), + new Selection(2, 16, 2, 20), + new Selection(3, 13, 3, 17), + new Selection(4, 12, 4, 16), + new Selection(5, 6, 5, 10), + ]); + }); + }); + test('issue #41573 - delete across multiple lines does not shrink the selection when word wraps', () => { withTestCodeEditor([ 'Authorization: \'Bearer pHKRfCTFSnGxs6akKlb9ddIXcca0sIUSZJutPHYqz7vEeHdMTMh0SGN0IGU3a0n59DXjTLRsj5EJ2u33qLNIFi9fk5XF8pK39PndLYUZhPt4QvHGLScgSkK0L4gwzkzMloTQPpKhqiikiIOvyNNSpd2o8j29NnOmdTUOKi9DVt74PD2ohKxyOrWZ6oZprTkb3eKajcpnS0LABKfaw2rmv4\',' diff --git a/src/vs/editor/test/browser/editorTestServices.ts b/src/vs/editor/test/browser/editorTestServices.ts index 50251bf3a8..b43dae4cda 100644 --- a/src/vs/editor/test/browser/editorTestServices.ts +++ b/src/vs/editor/test/browser/editorTestServices.ts @@ -25,7 +25,7 @@ export class TestCodeEditorService extends AbstractCodeEditorService { } export class TestCommandService implements ICommandService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _instantiationService: IInstantiationService; diff --git a/src/vs/editor/test/browser/services/openerService.test.ts b/src/vs/editor/test/browser/services/openerService.test.ts index 332806420d..9c3356700e 100644 --- a/src/vs/editor/test/browser/services/openerService.test.ts +++ b/src/vs/editor/test/browser/services/openerService.test.ts @@ -16,7 +16,7 @@ suite('OpenerService', function () { let lastCommand: { id: string; args: any[] } | undefined; const commandService = new (class implements ICommandService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onWillExecuteCommand = () => Disposable.None; onDidExecuteCommand = () => Disposable.None; executeCommand(id: string, ...args: any[]): Promise { diff --git a/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts b/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts index e1fe8b8e98..7f9bf4de7d 100644 --- a/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts +++ b/src/vs/editor/test/common/modes/supports/javascriptOnEnterRules.ts @@ -18,7 +18,7 @@ export const javascriptOnEnterRules = [ }, { // e.g. * ...| beforeText: /^(\t|[ ])*[ ]\*([ ]([^\*]|\*(?!\/))*)?$/, - oneLineAboveText: /^(\s*(\/\*\*|\*)).*/, + oneLineAboveText: /(?=^(\s*(\/\*\*|\*)).*)(?=(?!(\s*\*\/)))/, action: { indentAction: IndentAction.None, appendText: '* ' } }, { // e.g. */| 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 e2407184f4..df3c92b235 100644 --- a/src/vs/editor/test/common/modes/supports/onEnter.test.ts +++ b/src/vs/editor/test/common/modes/supports/onEnter.test.ts @@ -118,6 +118,7 @@ suite('OnEnter', () => { testIndentAction(' *', ' * asdfsfagadfg * / * / * /*', '', IndentAction.None, '* '); testIndentAction('', ' */', '', IndentAction.None, null, 1); + testIndentAction(' */', ' * test() {', '', IndentAction.Indent, null, 0); testIndentAction('', '\t */', '', IndentAction.None, null, 1); testIndentAction('', '\t\t */', '', IndentAction.None, null, 1); testIndentAction('', ' */', '', IndentAction.None, null, 1); diff --git a/src/vs/editor/test/common/services/modelService.test.ts b/src/vs/editor/test/common/services/modelService.test.ts index a3123447ca..c759a186ab 100644 --- a/src/vs/editor/test/common/services/modelService.test.ts +++ b/src/vs/editor/test/common/services/modelService.test.ts @@ -442,7 +442,7 @@ assertComputeEdits(file1, file2); export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 330b7bffe1..d12548284f 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -2629,10 +2629,10 @@ declare namespace monaco.editor { */ renderFinalNewline?: boolean; /** - * Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS), NEXT LINE (NEL). - * Defaults to true. + * Remove unusual line terminators like LINE SEPARATOR (LS), PARAGRAPH SEPARATOR (PS). + * Defaults to 'prompt'. */ - removeUnusualLineTerminators?: boolean; + unusualLineTerminators?: 'off' | 'prompt' | 'auto'; /** * Should the corresponding line be selected when clicking on the line number? * Defaults to true. @@ -3910,36 +3910,36 @@ declare namespace monaco.editor { quickSuggestions = 70, quickSuggestionsDelay = 71, readOnly = 72, - removeUnusualLineTerminators = 73, - renameOnType = 74, - renderControlCharacters = 75, - renderIndentGuides = 76, - renderFinalNewline = 77, - renderLineHighlight = 78, - renderLineHighlightOnlyWhenFocus = 79, - renderValidationDecorations = 80, - renderWhitespace = 81, - revealHorizontalRightPadding = 82, - roundedSelection = 83, - rulers = 84, - scrollbar = 85, - scrollBeyondLastColumn = 86, - scrollBeyondLastLine = 87, - scrollPredominantAxis = 88, - selectionClipboard = 89, - selectionHighlight = 90, - selectOnLineNumbers = 91, - showFoldingControls = 92, - showUnused = 93, - snippetSuggestions = 94, - smoothScrolling = 95, - stopRenderingLineAfter = 96, - suggest = 97, - suggestFontSize = 98, - suggestLineHeight = 99, - suggestOnTriggerCharacters = 100, - suggestSelection = 101, - tabCompletion = 102, + renameOnType = 73, + renderControlCharacters = 74, + renderIndentGuides = 75, + renderFinalNewline = 76, + renderLineHighlight = 77, + renderLineHighlightOnlyWhenFocus = 78, + renderValidationDecorations = 79, + renderWhitespace = 80, + revealHorizontalRightPadding = 81, + roundedSelection = 82, + rulers = 83, + scrollbar = 84, + scrollBeyondLastColumn = 85, + scrollBeyondLastLine = 86, + scrollPredominantAxis = 87, + selectionClipboard = 88, + selectionHighlight = 89, + selectOnLineNumbers = 90, + showFoldingControls = 91, + showUnused = 92, + snippetSuggestions = 93, + smoothScrolling = 94, + stopRenderingLineAfter = 95, + suggest = 96, + suggestFontSize = 97, + suggestLineHeight = 98, + suggestOnTriggerCharacters = 99, + suggestSelection = 100, + tabCompletion = 101, + unusualLineTerminators = 102, useTabStops = 103, wordSeparators = 104, wordWrap = 105, @@ -4029,7 +4029,6 @@ declare namespace monaco.editor { quickSuggestions: IEditorOption; quickSuggestionsDelay: IEditorOption; readOnly: IEditorOption; - removeUnusualLineTerminators: IEditorOption; renameOnType: IEditorOption; renderControlCharacters: IEditorOption; renderIndentGuides: IEditorOption; @@ -4059,6 +4058,7 @@ declare namespace monaco.editor { suggestOnTriggerCharacters: IEditorOption; suggestSelection: IEditorOption; tabCompletion: IEditorOption; + unusualLineTerminators: IEditorOption; useTabStops: IEditorOption; wordSeparators: IEditorOption; wordWrap: IEditorOption; @@ -6290,6 +6290,10 @@ declare namespace monaco.languages { * is the language case insensitive? */ ignoreCase?: boolean; + /** + * is the language unicode-aware? (i.e., /\u{1D306}/) + */ + unicode?: boolean; /** * if no match in the tokenizer assign this token class (default 'source') */ diff --git a/src/vs/platform/accessibility/common/accessibility.ts b/src/vs/platform/accessibility/common/accessibility.ts index 56c9b5fa1e..84ddd161cd 100644 --- a/src/vs/platform/accessibility/common/accessibility.ts +++ b/src/vs/platform/accessibility/common/accessibility.ts @@ -10,7 +10,7 @@ import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; export const IAccessibilityService = createDecorator('accessibilityService'); export interface IAccessibilityService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidChangeScreenReaderOptimized: Event; diff --git a/src/vs/platform/accessibility/common/accessibilityService.ts b/src/vs/platform/accessibility/common/accessibilityService.ts index 802bb6992a..125e8e3a01 100644 --- a/src/vs/platform/accessibility/common/accessibilityService.ts +++ b/src/vs/platform/accessibility/common/accessibilityService.ts @@ -10,7 +10,7 @@ import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/c import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class AccessibilityService extends Disposable implements IAccessibilityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _accessibilityModeEnabledContext: IContextKey; protected _accessibilitySupport = AccessibilitySupport.Unknown; diff --git a/src/vs/platform/actions/common/actions.ts b/src/vs/platform/actions/common/actions.ts index 43852b867d..caefe60e16 100644 --- a/src/vs/platform/actions/common/actions.ts +++ b/src/vs/platform/actions/common/actions.ts @@ -119,6 +119,7 @@ export class MenuId { static readonly CommentTitle = new MenuId('CommentTitle'); static readonly CommentActions = new MenuId('CommentActions'); static readonly NotebookCellTitle = new MenuId('NotebookCellTitle'); + static readonly NotebookCellBetween = new MenuId('NotebookCellBetween'); static readonly BulkEditTitle = new MenuId('BulkEditTitle'); static readonly BulkEditContext = new MenuId('BulkEditContext'); static readonly ObjectExplorerItemContext = new MenuId('ObjectExplorerItemContext'); // {{SQL CARBON EDIT}} @@ -156,7 +157,7 @@ export const IMenuService = createDecorator('menuService'); export interface IMenuService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createMenu(id: MenuId, scopedKeybindingService: IContextKeyService): IMenu; } diff --git a/src/vs/platform/actions/common/menuService.ts b/src/vs/platform/actions/common/menuService.ts index 8b08a92346..b6570bcef1 100644 --- a/src/vs/platform/actions/common/menuService.ts +++ b/src/vs/platform/actions/common/menuService.ts @@ -11,7 +11,7 @@ import { IContextKeyService, IContextKeyChangeEvent, ContextKeyExpression } from export class MenuService implements IMenuService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ICommandService private readonly _commandService: ICommandService diff --git a/src/vs/platform/authentication/common/authentication.ts b/src/vs/platform/authentication/common/authentication.ts deleted file mode 100644 index 7e1ad64f64..0000000000 --- a/src/vs/platform/authentication/common/authentication.ts +++ /dev/null @@ -1,54 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { Emitter, Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; - -export const IAuthenticationTokenService = createDecorator('IAuthenticationTokenService'); - -export interface IUserDataSyncAuthToken { - readonly authenticationProviderId: string; - readonly token: string; -} - -export interface IAuthenticationTokenService { - _serviceBrand: undefined; - - readonly token: IUserDataSyncAuthToken | undefined; - readonly onDidChangeToken: Event; - - setToken(userDataSyncAuthToken: IUserDataSyncAuthToken | undefined): Promise; - - readonly onTokenFailed: Event; - sendTokenFailed(): void; -} - -export class AuthenticationTokenService extends Disposable implements IAuthenticationTokenService { - - _serviceBrand: any; - - private _token: IUserDataSyncAuthToken | undefined; - get token(): IUserDataSyncAuthToken | undefined { return this._token; } - private _onDidChangeToken = this._register(new Emitter()); - readonly onDidChangeToken = this._onDidChangeToken.event; - - private _onTokenFailed: Emitter = this._register(new Emitter()); - readonly onTokenFailed: Event = this._onTokenFailed.event; - - - async setToken(token: IUserDataSyncAuthToken | undefined): Promise { - if (token && this._token ? token.token !== this._token.token || token.authenticationProviderId !== this._token.authenticationProviderId : token !== this._token) { - this._token = token; - this._onDidChangeToken.fire(token); - } - } - - sendTokenFailed(): void { - this.setToken(undefined); - this._onTokenFailed.fire(); - } -} - diff --git a/src/vs/platform/authentication/electron-browser/authenticationIpc.ts b/src/vs/platform/authentication/electron-browser/authenticationIpc.ts deleted file mode 100644 index e15e5ae7d9..0000000000 --- a/src/vs/platform/authentication/electron-browser/authenticationIpc.ts +++ /dev/null @@ -1,27 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IServerChannel } from 'vs/base/parts/ipc/common/ipc'; -import { Event } from 'vs/base/common/event'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; - -export class AuthenticationTokenServiceChannel implements IServerChannel { - constructor(private readonly service: IAuthenticationTokenService) { } - - listen(_: unknown, event: string): Event { - switch (event) { - case 'onDidChangeToken': return this.service.onDidChangeToken; - case 'onTokenFailed': return this.service.onTokenFailed; - } - throw new Error(`Event not found: ${event}`); - } - - call(context: any, command: string, args?: any): Promise { - switch (command) { - case 'setToken': return this.service.setToken(args); - } - throw new Error('Invalid call'); - } -} diff --git a/src/vs/platform/backup/electron-main/backup.ts b/src/vs/platform/backup/electron-main/backup.ts index 90cdb6a7a9..bc963a2bbb 100644 --- a/src/vs/platform/backup/electron-main/backup.ts +++ b/src/vs/platform/backup/electron-main/backup.ts @@ -22,7 +22,7 @@ export function isWorkspaceBackupInfo(obj: unknown): obj is IWorkspaceBackupInfo } export interface IBackupMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; isHotExitEnabled(): boolean; diff --git a/src/vs/platform/backup/electron-main/backupMainService.ts b/src/vs/platform/backup/electron-main/backupMainService.ts index f28c47767b..cfdb3fd5dd 100644 --- a/src/vs/platform/backup/electron-main/backupMainService.ts +++ b/src/vs/platform/backup/electron-main/backupMainService.ts @@ -17,13 +17,13 @@ import { IFilesConfiguration, HotExitConfiguration } from 'vs/platform/files/com import { ILogService } from 'vs/platform/log/common/log'; import { IWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; -import { isEqual as areResourcesEquals, getComparisonKey } from 'vs/base/common/resources'; import { isEqual } from 'vs/base/common/extpath'; import { Schemas } from 'vs/base/common/network'; +import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; export class BackupMainService implements IBackupMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; protected backupHome: string; protected workspacesJsonPath: string; @@ -32,6 +32,12 @@ export class BackupMainService implements IBackupMainService { private folders: URI[] = []; private emptyWindows: IEmptyWindowBackupInfo[] = []; + // Comparers for paths and resources that will + // - ignore path casing on Windows/macOS + // - respect path casing on Linux + private readonly backupUriComparer = extUriBiasedIgnorePathCase; + private readonly backupPathComparer = { isEqual: (pathA: string, pathB: string) => isEqual(pathA, pathB, !platform.isLinux) }; + constructor( @IEnvironmentService environmentService: INativeEnvironmentService, @IConfigurationService private readonly configurationService: IConfigurationService, @@ -196,7 +202,7 @@ export class BackupMainService implements IBackupMainService { } registerFolderBackupSync(folderUri: URI): string { - if (!this.folders.some(folder => areResourcesEquals(folderUri, folder))) { + if (!this.folders.some(folder => this.backupUriComparer.isEqual(folderUri, folder))) { this.folders.push(folderUri); this.saveSync(); } @@ -205,7 +211,7 @@ export class BackupMainService implements IBackupMainService { } unregisterFolderBackupSync(folderUri: URI): void { - const index = this.folders.findIndex(folder => areResourcesEquals(folderUri, folder)); + const index = this.folders.findIndex(folder => this.backupUriComparer.isEqual(folderUri, folder)); if (index !== -1) { this.folders.splice(index, 1); this.saveSync(); @@ -216,7 +222,7 @@ export class BackupMainService implements IBackupMainService { // Generate a new folder if this is a new empty workspace const backupFolder = backupFolderCandidate || this.getRandomEmptyWindowId(); - if (!this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && isEqual(emptyWindow.backupFolder, backupFolder, !platform.isLinux))) { + if (!this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && this.backupPathComparer.isEqual(emptyWindow.backupFolder, backupFolder))) { this.emptyWindows.push({ backupFolder, remoteAuthority }); this.saveSync(); } @@ -225,7 +231,7 @@ export class BackupMainService implements IBackupMainService { } unregisterEmptyWindowBackupSync(backupFolder: string): void { - const index = this.emptyWindows.findIndex(emptyWindow => !!emptyWindow.backupFolder && isEqual(emptyWindow.backupFolder, backupFolder, !platform.isLinux)); + const index = this.emptyWindows.findIndex(emptyWindow => !!emptyWindow.backupFolder && this.backupPathComparer.isEqual(emptyWindow.backupFolder, backupFolder)); if (index !== -1) { this.emptyWindows.splice(index, 1); this.saveSync(); @@ -282,7 +288,7 @@ export class BackupMainService implements IBackupMainService { const result: URI[] = []; const seenIds: Set = new Set(); for (let folderURI of folderWorkspaces) { - const key = getComparisonKey(folderURI); + const key = this.backupUriComparer.getComparisonKey(folderURI); if (!seenIds.has(key)) { seenIds.add(key); @@ -350,7 +356,7 @@ export class BackupMainService implements IBackupMainService { // New empty window backup let newBackupFolder = this.getRandomEmptyWindowId(); - while (this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && isEqual(emptyWindow.backupFolder, newBackupFolder, platform.isLinux))) { + while (this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && this.backupPathComparer.isEqual(emptyWindow.backupFolder, newBackupFolder))) { newBackupFolder = this.getRandomEmptyWindowId(); } @@ -371,7 +377,7 @@ export class BackupMainService implements IBackupMainService { // New empty window backup let newBackupFolder = this.getRandomEmptyWindowId(); - while (this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && isEqual(emptyWindow.backupFolder, newBackupFolder, platform.isLinux))) { + while (this.emptyWindows.some(emptyWindow => !!emptyWindow.backupFolder && this.backupPathComparer.isEqual(emptyWindow.backupFolder, newBackupFolder))) { newBackupFolder = this.getRandomEmptyWindowId(); } diff --git a/src/vs/platform/clipboard/browser/clipboardService.ts b/src/vs/platform/clipboard/browser/clipboardService.ts index aca3a4a0c0..3eb7c55adc 100644 --- a/src/vs/platform/clipboard/browser/clipboardService.ts +++ b/src/vs/platform/clipboard/browser/clipboardService.ts @@ -9,7 +9,7 @@ import { $ } from 'vs/base/browser/dom'; export class BrowserClipboardService implements IClipboardService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly mapTextToType = new Map(); // unsupported in web (only in-memory) @@ -98,11 +98,6 @@ export class BrowserClipboardService implements IClipboardService { return this.resources.length > 0; } - /** @deprecated */ - readTextSync(): string | undefined { - return undefined; - } - /** @deprecated */ readFindTextSync(): string { return this.findText; diff --git a/src/vs/platform/clipboard/common/clipboardService.ts b/src/vs/platform/clipboard/common/clipboardService.ts index c9052ad1e6..699278df8c 100644 --- a/src/vs/platform/clipboard/common/clipboardService.ts +++ b/src/vs/platform/clipboard/common/clipboardService.ts @@ -10,7 +10,7 @@ export const IClipboardService = createDecorator('clipboardSe export interface IClipboardService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Writes text to the system clipboard. @@ -48,8 +48,6 @@ export interface IClipboardService { hasResources(): Promise; - /** @deprecated */ - readTextSync(): string | undefined; /** @deprecated */ readFindTextSync(): string; diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index d3c50cf447..a47042e9ba 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -19,7 +19,7 @@ export interface ICommandEvent { } export interface ICommandService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onWillExecuteCommand: Event; onDidExecuteCommand: Event; executeCommand(commandId: string, ...args: any[]): Promise; diff --git a/src/vs/platform/configuration/common/configuration.ts b/src/vs/platform/configuration/common/configuration.ts index 27d77e4fd6..ea466271c7 100644 --- a/src/vs/platform/configuration/common/configuration.ts +++ b/src/vs/platform/configuration/common/configuration.ts @@ -88,7 +88,7 @@ export interface IConfigurationValue { } export interface IConfigurationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidChangeConfiguration: Event; @@ -323,14 +323,16 @@ export function getConfigurationValue(config: any, settingPath: string, defau export function merge(base: any, add: any, overwrite: boolean): void { Object.keys(add).forEach(key => { - if (key in base) { - if (types.isObject(base[key]) && types.isObject(add[key])) { - merge(base[key], add[key], overwrite); - } else if (overwrite) { + if (key !== '__proto__') { + if (key in base) { + if (types.isObject(base[key]) && types.isObject(add[key])) { + merge(base[key], add[key], overwrite); + } else if (overwrite) { + base[key] = add[key]; + } + } else { base[key] = add[key]; } - } else { - base[key] = add[key]; } }); } diff --git a/src/vs/platform/configuration/common/configurationService.ts b/src/vs/platform/configuration/common/configurationService.ts index 8fb26a0b87..37109270d5 100644 --- a/src/vs/platform/configuration/common/configurationService.ts +++ b/src/vs/platform/configuration/common/configurationService.ts @@ -15,7 +15,7 @@ import { RunOnceScheduler } from 'vs/base/common/async'; export class ConfigurationService extends Disposable implements IConfigurationService, IDisposable { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private configuration: Configuration; private userConfiguration: UserSettings; diff --git a/src/vs/platform/contextkey/common/contextkey.ts b/src/vs/platform/contextkey/common/contextkey.ts index e032ddb0a8..731c5c5308 100644 --- a/src/vs/platform/contextkey/common/contextkey.ts +++ b/src/vs/platform/contextkey/common/contextkey.ts @@ -1143,7 +1143,7 @@ export interface IContextKeyChangeEvent { } export interface IContextKeyService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; dispose(): void; onDidChangeContext: Event; diff --git a/src/vs/platform/contextview/browser/contextMenuService.ts b/src/vs/platform/contextview/browser/contextMenuService.ts index b89c60d39f..940d5c85f5 100644 --- a/src/vs/platform/contextview/browser/contextMenuService.ts +++ b/src/vs/platform/contextview/browser/contextMenuService.ts @@ -14,7 +14,7 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Disposable } from 'vs/base/common/lifecycle'; export class ContextMenuService extends Disposable implements IContextMenuService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _onDidContextMenu = this._register(new Emitter()); readonly onDidContextMenu: Event = this._onDidContextMenu.event; diff --git a/src/vs/platform/contextview/browser/contextView.ts b/src/vs/platform/contextview/browser/contextView.ts index 38ef10b7db..ced2f3b6d4 100644 --- a/src/vs/platform/contextview/browser/contextView.ts +++ b/src/vs/platform/contextview/browser/contextView.ts @@ -13,7 +13,7 @@ export const IContextViewService = createDecorator('context export interface IContextViewService extends IContextViewProvider { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; showContextView(delegate: IContextViewDelegate, container?: HTMLElement): void; hideContextView(data?: any): void; @@ -37,7 +37,7 @@ export const IContextMenuService = createDecorator('context export interface IContextMenuService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; showContextMenu(delegate: IContextMenuDelegate): void; onDidContextMenu: Event; // TODO@isidor these event should be removed once we get async context menus diff --git a/src/vs/platform/contextview/browser/contextViewService.ts b/src/vs/platform/contextview/browser/contextViewService.ts index 6259dc64fb..6951394896 100644 --- a/src/vs/platform/contextview/browser/contextViewService.ts +++ b/src/vs/platform/contextview/browser/contextViewService.ts @@ -9,7 +9,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; export class ContextViewService extends Disposable implements IContextViewService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private contextView: ContextView; private container: HTMLElement; diff --git a/src/vs/platform/credentials/common/credentials.ts b/src/vs/platform/credentials/common/credentials.ts index f8f4dedc95..73402fdf2c 100644 --- a/src/vs/platform/credentials/common/credentials.ts +++ b/src/vs/platform/credentials/common/credentials.ts @@ -9,7 +9,7 @@ export const ICredentialsService = createDecorator('ICreden export interface ICredentialsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getPassword(service: string, account: string): Promise; setPassword(service: string, account: string, password: string): Promise; diff --git a/src/vs/platform/credentials/node/credentialsService.ts b/src/vs/platform/credentials/node/credentialsService.ts index c6720c71d2..bf994e37e3 100644 --- a/src/vs/platform/credentials/node/credentialsService.ts +++ b/src/vs/platform/credentials/node/credentialsService.ts @@ -9,7 +9,7 @@ import { IdleValue } from 'vs/base/common/async'; type KeytarModule = typeof import('keytar'); export class KeytarCredentialsService implements ICredentialsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _keytar = new IdleValue>(() => import('keytar')); diff --git a/src/vs/platform/debug/common/extensionHostDebug.ts b/src/vs/platform/debug/common/extensionHostDebug.ts index c3b4cf58e0..18d17e975b 100644 --- a/src/vs/platform/debug/common/extensionHostDebug.ts +++ b/src/vs/platform/debug/common/extensionHostDebug.ts @@ -35,7 +35,7 @@ export interface ICloseSessionEvent { } export interface IExtensionHostDebugService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; reload(sessionId: string): void; readonly onReload: Event; diff --git a/src/vs/platform/debug/common/extensionHostDebugIpc.ts b/src/vs/platform/debug/common/extensionHostDebugIpc.ts index 89cf5f446e..1ec08748c2 100644 --- a/src/vs/platform/debug/common/extensionHostDebugIpc.ts +++ b/src/vs/platform/debug/common/extensionHostDebugIpc.ts @@ -55,7 +55,7 @@ export class ExtensionHostDebugBroadcastChannel implements IServerChan export class ExtensionHostDebugChannelClient extends Disposable implements IExtensionHostDebugService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel) { super(); diff --git a/src/vs/platform/diagnostics/node/diagnosticsIpc.ts b/src/vs/platform/diagnostics/node/diagnosticsIpc.ts index b023a18021..49ffb84b4a 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsIpc.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsIpc.ts @@ -36,7 +36,7 @@ export class DiagnosticsChannel implements IServerChannel { export class DiagnosticsService implements IDiagnosticsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel) { } diff --git a/src/vs/platform/diagnostics/node/diagnosticsService.ts b/src/vs/platform/diagnostics/node/diagnosticsService.ts index 5e742ed518..86d6263e05 100644 --- a/src/vs/platform/diagnostics/node/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/node/diagnosticsService.ts @@ -23,7 +23,7 @@ export const ID = 'diagnosticsService'; export const IDiagnosticsService = createDecorator(ID); export interface IDiagnosticsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getPerformanceInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise; getSystemInfo(mainProcessInfo: IMainProcessInfo, remoteInfo: (IRemoteDiagnosticInfo | IRemoteDiagnosticError)[]): Promise; @@ -223,7 +223,7 @@ export function collectLaunchConfigs(folder: string): Promise('fileDialo */ export interface IFileDialogService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * The default path for a new file based on previously used files. diff --git a/src/vs/platform/dialogs/electron-main/dialogs.ts b/src/vs/platform/dialogs/electron-main/dialogs.ts index e6a28d81c5..4cd8216f46 100644 --- a/src/vs/platform/dialogs/electron-main/dialogs.ts +++ b/src/vs/platform/dialogs/electron-main/dialogs.ts @@ -21,7 +21,7 @@ export const IDialogMainService = createDecorator('dialogMai export interface IDialogMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; pickFileFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; pickFolder(options: INativeOpenDialogOptions, window?: BrowserWindow): Promise; @@ -44,7 +44,7 @@ interface IInternalNativeOpenDialogOptions extends INativeOpenDialogOptions { export class DialogMainService implements IDialogMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly workingDirPickerStorageKey = 'pickerWorkingDir'; diff --git a/src/vs/platform/dialogs/test/common/testDialogService.ts b/src/vs/platform/dialogs/test/common/testDialogService.ts index 589a42f76e..2accf763dd 100644 --- a/src/vs/platform/dialogs/test/common/testDialogService.ts +++ b/src/vs/platform/dialogs/test/common/testDialogService.ts @@ -8,7 +8,7 @@ import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions, ISh export class TestDialogService implements IDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; confirm(_confirmation: IConfirmation): Promise { return Promise.resolve({ confirmed: false }); } show(_severity: Severity, _message: string, _buttons: string[], _options?: IDialogOptions): Promise { return Promise.resolve({ choice: 0 }); } diff --git a/src/vs/platform/download/common/download.ts b/src/vs/platform/download/common/download.ts index 011c733146..4b634d0e41 100644 --- a/src/vs/platform/download/common/download.ts +++ b/src/vs/platform/download/common/download.ts @@ -11,7 +11,7 @@ export const IDownloadService = createDecorator('downloadServi export interface IDownloadService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; download(uri: URI, to: URI, cancellationToken?: CancellationToken): Promise; diff --git a/src/vs/platform/download/common/downloadIpc.ts b/src/vs/platform/download/common/downloadIpc.ts index 37627eb0e1..22e5bcfb82 100644 --- a/src/vs/platform/download/common/downloadIpc.ts +++ b/src/vs/platform/download/common/downloadIpc.ts @@ -27,7 +27,7 @@ export class DownloadServiceChannel implements IServerChannel { export class DownloadServiceChannelClient implements IDownloadService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel, private getUriTransformer: () => IURITransformer | null) { } @@ -39,4 +39,4 @@ export class DownloadServiceChannelClient implements IDownloadService { } await this.channel.call('download', [from, to]); } -} \ No newline at end of file +} diff --git a/src/vs/platform/download/common/downloadService.ts b/src/vs/platform/download/common/downloadService.ts index 2553aa5429..31d016a6f5 100644 --- a/src/vs/platform/download/common/downloadService.ts +++ b/src/vs/platform/download/common/downloadService.ts @@ -12,7 +12,7 @@ import { Schemas } from 'vs/base/common/network'; export class DownloadService implements IDownloadService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IRequestService private readonly requestService: IRequestService, diff --git a/src/vs/platform/driver/common/driver.ts b/src/vs/platform/driver/common/driver.ts index b48cc825d8..9d4e5fb6a7 100644 --- a/src/vs/platform/driver/common/driver.ts +++ b/src/vs/platform/driver/common/driver.ts @@ -19,7 +19,7 @@ export interface IElement { } export interface IDriver { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getWindowIds(): Promise; capturePage(windowId: number): Promise; diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index 06e65bb8ad..457e6c76c7 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -27,7 +27,7 @@ function isSilentKeyCode(keyCode: KeyCode) { export class Driver implements IDriver, IWindowDriverRegistry { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private registeredWindowIds = new Set(); private reloadingWindowIds = new Set(); diff --git a/src/vs/platform/driver/node/driver.ts b/src/vs/platform/driver/node/driver.ts index 92a96fd755..0ea4a7ff63 100644 --- a/src/vs/platform/driver/node/driver.ts +++ b/src/vs/platform/driver/node/driver.ts @@ -42,7 +42,7 @@ export class DriverChannel implements IServerChannel { export class DriverChannelClient implements IDriver { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel) { } @@ -136,7 +136,7 @@ export class WindowDriverRegistryChannel implements IServerChannel { export class WindowDriverRegistryChannelClient implements IWindowDriverRegistry { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel) { } @@ -177,7 +177,7 @@ export class WindowDriverChannel implements IServerChannel { export class WindowDriverChannelClient implements IWindowDriver { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private channel: IChannel) { } diff --git a/src/vs/platform/editor/common/editor.ts b/src/vs/platform/editor/common/editor.ts index 5fc94a7d6c..6f9679ff90 100644 --- a/src/vs/platform/editor/common/editor.ts +++ b/src/vs/platform/editor/common/editor.ts @@ -197,9 +197,12 @@ export interface IEditorOptions { readonly ignoreError?: boolean; /** - * Does not use editor overrides while opening the editor + * Allows to override the editor that should be used to display the input: + * - `undefined`: let the editor decide for itself + * - `false`: disable overrides + * - `string`: specific override by id */ - readonly ignoreOverrides?: boolean; + readonly override?: false | string; /** * A optional hint to signal in which context the editor opens. diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index 1660b18ab7..b929b9de00 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -11,7 +11,7 @@ import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; export interface ICommonElectronService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; // Properties readonly windowId: number; @@ -25,6 +25,8 @@ export interface ICommonElectronService { readonly onWindowFocus: Event; readonly onWindowBlur: Event; + readonly onOSResume: Event; + // Window getWindows(): Promise; getWindowCount(): Promise; @@ -80,11 +82,13 @@ export interface ICommonElectronService { toggleWindowTabsBar(): Promise; // Lifecycle + notifyReady(): Promise relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; reload(options?: { disableExtensions?: boolean }): Promise; closeWindow(): Promise; closeWindowById(windowId: number): Promise; quit(): Promise; + exit(code: number): Promise; // Development openDevTools(options?: OpenDevToolsOptions): Promise; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 490657cc9b..b074f41877 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app, clipboard } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue, CrashReporterStartOptions, crashReporter, Menu, BrowserWindow, app, clipboard, powerMonitor } from 'electron'; import { OpenContext } from 'vs/platform/windows/node/window'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IOpenedWindow, IOpenWindowOptions, IWindowOpenable, IOpenEmptyWindowOptions } from 'vs/platform/windows/common/windows'; @@ -29,7 +29,7 @@ export const IElectronMainService = createDecorator('elect export class ElectronMainService implements IElectronMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IWindowsMainService private readonly windowsMainService: IWindowsMainService, @@ -49,17 +49,19 @@ export class ElectronMainService implements IElectronMainService { //#region Events - readonly onWindowOpen: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowOpen = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-created', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowMaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowUnmaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowMaximize = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowUnmaximize = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowBlur: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); - readonly onWindowFocus: Event = Event.any( + readonly onWindowBlur = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-blur', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)); + readonly onWindowFocus = Event.any( Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), window => !!window), window => window!.id), - Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (_, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)) + Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (event, window: BrowserWindow) => window.id), windowId => !!this.windowsMainService.getWindowById(windowId)) ); + readonly onOSResume = Event.fromNodeEventEmitter(powerMonitor, 'resume'); + //#endregion //#region Window @@ -368,6 +370,13 @@ export class ElectronMainService implements IElectronMainService { //#region Lifecycle + async notifyReady(windowId: number | undefined): Promise { + const window = this.windowById(windowId); + if (window) { + window.setReady(); + } + } + async relaunch(windowId: number | undefined, options?: { addArgs?: string[], removeArgs?: string[] }): Promise { return this.lifecycleMainService.relaunch(options); } @@ -407,6 +416,10 @@ export class ElectronMainService implements IElectronMainService { } } + async exit(windowId: number | undefined, code: number): Promise { + await this.lifecycleMainService.kill(code); + } + //#endregion //#region Connectivity @@ -445,8 +458,9 @@ export class ElectronMainService implements IElectronMainService { } async startCrashReporter(windowId: number | undefined, options: CrashReporterStartOptions): Promise { - crashReporter.start(options); this.logService.trace('ElectronMainService#crashReporter', JSON.stringify(options)); + + crashReporter.start(options); } //#endregion diff --git a/src/vs/platform/electron/electron-sandbox/electron.ts b/src/vs/platform/electron/electron-sandbox/electron.ts index 884eadb726..dd68f651c4 100644 --- a/src/vs/platform/electron/electron-sandbox/electron.ts +++ b/src/vs/platform/electron/electron-sandbox/electron.ts @@ -14,7 +14,7 @@ export interface IElectronService extends ICommonElectronService { } export class ElectronService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( readonly windowId: number, diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 0538fe84de..364c0a8e9e 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -26,7 +26,7 @@ export interface IEnvironmentService { // UNLESS THIS PROPERTY IS SUPPORTED BOTH IN WEB AND DESKTOP!!!! // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - _serviceBrand: undefined; + readonly _serviceBrand: undefined; // --- user roaming data userRoamingDataHome: URI; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index bf3f73aa69..b41435e429 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -72,7 +72,7 @@ export interface ParsedArgs { remote?: string; 'disable-user-env-probe'?: boolean; 'force'?: boolean; - 'donot-sync'?: boolean; + 'do-not-sync'?: boolean; 'force-user-env'?: boolean; 'sync'?: 'on' | 'off'; @@ -197,7 +197,7 @@ export const OPTIONS: OptionDescriptions> = { 'file-chmod': { type: 'boolean' }, 'driver-verbose': { type: 'boolean' }, 'force': { type: 'boolean' }, - 'donot-sync': { type: 'boolean' }, + 'do-not-sync': { type: 'boolean' }, 'trace': { type: 'boolean' }, 'trace-category-filter': { type: 'string' }, 'trace-options': { type: 'string' }, @@ -274,7 +274,7 @@ export function parseArgs(args: string[], options: OptionDescriptions, err const remainingArgs: any = parsedArgs; // https://github.com/microsoft/vscode/issues/58177 - cleanedArgs._ = parsedArgs._.filter(arg => arg.length > 0); + cleanedArgs._ = parsedArgs._.filter(arg => String(arg).length > 0); delete remainingArgs._; diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index f3bd1b75b9..f1178e0884 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -36,7 +36,7 @@ export interface INativeEnvironmentService extends IEnvironmentService { installSourcePath: string; extensionsPath?: string; - extensionsDownloadPath?: string; + extensionsDownloadPath: string; builtinExtensionsPath: string; globalStorageHome: string; @@ -50,7 +50,7 @@ export interface INativeEnvironmentService extends IEnvironmentService { export class EnvironmentService implements INativeEnvironmentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; get args(): ParsedArgs { return this._args; } @@ -151,8 +151,13 @@ export class EnvironmentService implements INativeEnvironmentService { } } - get extensionsDownloadPath(): string | undefined { - return parsePathArg(this._args['extensions-download-dir'], process); + get extensionsDownloadPath(): string { + const fromArgs = parsePathArg(this._args['extensions-download-dir'], process); + if (fromArgs) { + return fromArgs; + } else { + return path.join(this.userDataPath, 'CachedExtensionVSIXs'); + } } @memoize diff --git a/src/vs/platform/extensionManagement/common/configRemotes.ts b/src/vs/platform/extensionManagement/common/configRemotes.ts index c7a8d871c7..834b3a0514 100644 --- a/src/vs/platform/extensionManagement/common/configRemotes.ts +++ b/src/vs/platform/extensionManagement/common/configRemotes.ts @@ -13,7 +13,7 @@ const SecondLevelDomainMatcher = /([^@:.]+\.[^@:.]+)(:\d+)?$/; const RemoteMatcher = /^\s*url\s*=\s*(.+\S)\s*$/mg; const AnyButDot = /[^.]/g; -export const SecondLevelDomainWhitelist = [ +export const AllowedSecondLevelDomains = [ 'github.com', 'bitbucket.org', 'visualstudio.com', @@ -54,7 +54,7 @@ function extractDomain(url: string): string | null { return null; } -export function getDomainsOfRemotes(text: string, whitelist: string[]): string[] { +export function getDomainsOfRemotes(text: string, allowedDomains: readonly string[]): string[] { const domains = new Set(); let match: RegExpExecArray | null; while (match = RemoteMatcher.exec(text)) { @@ -64,16 +64,9 @@ export function getDomainsOfRemotes(text: string, whitelist: string[]): string[] } } - const whitemap = whitelist.reduce((map, key) => { - map[key] = true; - return map; - }, Object.create(null)); - - const elements: string[] = []; - domains.forEach(e => elements.push(e)); - - return elements - .map(key => whitemap[key] ? key : key.replace(AnyButDot, 'a')); + const allowedDomainsSet = new Set(allowedDomains); + return Array.from(domains) + .map(key => allowedDomainsSet.has(key) ? key : key.replace(AnyButDot, 'a')); } function stripPort(authority: string): string | null { diff --git a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts index c22b03c24b..573f975f31 100644 --- a/src/vs/platform/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/platform/extensionManagement/common/extensionEnablementService.ts @@ -12,7 +12,7 @@ import { isUndefinedOrNull } from 'vs/base/common/types'; export class GlobalExtensionEnablementService extends Disposable implements IGlobalExtensionEnablementService { - _serviceBrand: undefined; + 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; diff --git a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts index 772836f344..5307763f42 100644 --- a/src/vs/platform/extensionManagement/common/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/common/extensionGalleryService.ts @@ -225,7 +225,7 @@ function getCoreTranslationAssets(version: IRawGalleryExtensionVersion): [string function getRepositoryAsset(version: IRawGalleryExtensionVersion): IGalleryExtensionAsset | null { if (version.properties) { const results = version.properties.filter(p => p.key === AssetType.Repository); - const gitRegExp = new RegExp('((git|ssh|http(s)?)|(git@[\w\.]+))(:(//)?)([\w\.@\:/\-~]+)(\.git)(/)?'); + const gitRegExp = new RegExp('((git|ssh|http(s)?)|(git@[\w.]+))(:(//)?)([\w.@\:/\-~]+)(.git)(/)?'); const uri = results.filter(r => gitRegExp.test(r.value))[0]; return uri ? { uri: uri.value, fallbackUri: uri.value } : null; @@ -371,7 +371,7 @@ interface IRawExtensionsReport { export class ExtensionGalleryService implements IExtensionGalleryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private extensionsGalleryUrl: string | undefined; private extensionsControlUrl: string | undefined; diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index 59afd22f12..c3579cde72 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -12,7 +12,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionManifest, IExtension, ExtensionType } from 'vs/platform/extensions/common/extensions'; import { IExeBasedExtensionTip } from 'vs/platform/product/common/productService'; -export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$'; +export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9-A-Z]*)\\.([a-z0-9A-Z][a-z0-9-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); export interface IGalleryExtensionProperties { @@ -153,7 +153,7 @@ export interface ITranslation { } export interface IExtensionGalleryService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; isEnabled(): boolean; query(token: CancellationToken): Promise>; query(options: IQueryOptions, token: CancellationToken): Promise>; @@ -200,7 +200,7 @@ export class ExtensionManagementError extends Error { } export interface IExtensionManagementService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onInstallExtension: Event; onDidInstallExtension: Event; @@ -225,7 +225,7 @@ export const ENABLED_EXTENSIONS_STORAGE_PATH = 'extensionsIdentifiers/enabled'; export const IGlobalExtensionEnablementService = createDecorator('IGlobalExtensionEnablementService'); export interface IGlobalExtensionEnablementService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidChangeEnablement: Event<{ readonly extensions: IExtensionIdentifier[], readonly source?: string }>; getDisabledExtensions(): IExtensionIdentifier[]; @@ -246,7 +246,7 @@ export type IWorkspaceTips = { readonly remoteSet: string[]; readonly recommenda export const IExtensionTipsService = createDecorator('IExtensionTipsService'); export interface IExtensionTipsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getConfigBasedTips(folder: URI): Promise; getImportantExecutableBasedTips(): Promise; diff --git a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts index a9d656bb69..8eab687c35 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagementIpc.ts @@ -77,7 +77,7 @@ export class ExtensionManagementChannel implements IServerChannel { export class ExtensionManagementChannelClient implements IExtensionManagementService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( private readonly channel: IChannel, diff --git a/src/vs/platform/extensionManagement/node/extensionDownloader.ts b/src/vs/platform/extensionManagement/node/extensionDownloader.ts index f7e05a2f0d..fd50943797 100644 --- a/src/vs/platform/extensionManagement/node/extensionDownloader.ts +++ b/src/vs/platform/extensionManagement/node/extensionDownloader.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { tmpdir } from 'os'; import { Disposable } from 'vs/base/common/lifecycle'; import { IFileService, IFileStatWithMetadata } from 'vs/platform/files/common/files'; import { IExtensionGalleryService, IGalleryExtension, InstallOperation } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -20,9 +19,9 @@ const ExtensionIdVersionRegex = /^([^.]+\..+)-(\d+\.\d+\.\d+)$/; export class ExtensionsDownloader extends Disposable { - private readonly extensionsDownloadDir: URI = URI.file(tmpdir()); - private readonly cache: number = 0; - private readonly cleanUpPromise: Promise = Promise.resolve(); + private readonly extensionsDownloadDir: URI; + private readonly cache: number; + private readonly cleanUpPromise: Promise; constructor( @IEnvironmentService environmentService: INativeEnvironmentService, @@ -31,11 +30,9 @@ export class ExtensionsDownloader extends Disposable { @ILogService private readonly logService: ILogService, ) { super(); - if (environmentService.extensionsDownloadPath) { - this.extensionsDownloadDir = URI.file(environmentService.extensionsDownloadPath); - this.cache = 20; // Cache 20 downloads - this.cleanUpPromise = this.cleanUp(); - } + this.extensionsDownloadDir = URI.file(environmentService.extensionsDownloadPath); + this.cache = 20; // Cache 20 downloads + this.cleanUpPromise = this.cleanUp(); } async downloadExtension(extension: IGalleryExtension, operation: InstallOperation): Promise { @@ -46,10 +43,7 @@ export class ExtensionsDownloader extends Disposable { } async delete(location: URI): Promise { - // Delete immediately if caching is disabled - if (!this.cache) { - await this.fileService.del(location); - } + // noop as caching is enabled always } private async download(extension: IGalleryExtension, location: URI, operation: InstallOperation): Promise { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index f6276ceb17..b7d7b0053a 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -61,7 +61,7 @@ interface InstallableExtension { export class ExtensionManagementService extends Disposable implements IExtensionManagementService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly extensionsScanner: ExtensionsScanner; private reportedExtensions: Promise | undefined; @@ -178,7 +178,7 @@ export class ExtensionManagementService extends Disposable implements IExtension if (identifierWithVersion.equals(new ExtensionIdentifierWithVersion(existing.identifier, existing.manifest.version))) { return this.extensionsScanner.removeExtension(existing, 'existing').then(null, e => Promise.reject(new Error(nls.localize('restartCode', "Please restart Azure Data Studio before reinstalling {0}.", manifest.displayName || manifest.name)))); } else if (semver.gt(existing.manifest.version, manifest.version)) { - return this.uninstall(existing, true); + return this.uninstallExtension(existing); } } else { // Remove the extension with same version if it is already uninstalled. @@ -309,7 +309,7 @@ export class ExtensionManagementService extends Disposable implements IExtension .then(local => this.extensionsDownloader.delete(URI.file(installableExtension.zipPath)).finally(() => { }).then(() => local)); }) .then(local => this.installDependenciesAndPackExtensions(local, existingExtension) - .then(() => local, error => this.uninstall(local, true).then(() => Promise.reject(error), () => Promise.reject(error)))) + .then(() => local, error => this.uninstall(local).then(() => Promise.reject(error), () => Promise.reject(error)))) .then( async local => { if (existingExtension && semver.neq(existingExtension.manifest.version, extension.version)) { @@ -480,11 +480,11 @@ export class ExtensionManagementService extends Disposable implements IExtension return this.getInstalled(ExtensionType.User) .then(installed => Promise.all(installed.filter(local => extensions.some(galleryExtension => new ExtensionIdentifierWithVersion(local.identifier, local.manifest.version).equals(new ExtensionIdentifierWithVersion(galleryExtension.identifier, galleryExtension.version)))) // Check with version because we want to rollback the exact version - .map(local => this.uninstall(local, true)))) + .map(local => this.uninstall(local)))) .then(() => undefined, () => undefined); } - uninstall(extension: ILocalExtension, force = false): Promise { + uninstall(extension: ILocalExtension): Promise { this.logService.trace('ExtensionManagementService#uninstall', extension.identifier.id); return this.toNonCancellablePromise(this.getInstalled(ExtensionType.User) .then(installed => { diff --git a/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts b/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts index 47e9a94d80..a2302a9317 100644 --- a/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts +++ b/src/vs/platform/extensionManagement/test/common/configRemotes.test.ts @@ -8,7 +8,7 @@ import { getDomainsOfRemotes, getRemotes } from 'vs/platform/extensionManagement suite('Config Remotes', () => { - const whitelist = [ + const allowedDomains = [ 'github.com', 'github2.com', 'github3.com', @@ -20,37 +20,37 @@ suite('Config Remotes', () => { ]; test('HTTPS remotes', function () { - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://github.com/Microsoft/vscode.git'), whitelist), ['github.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://git.example.com/gitproject.git'), whitelist), ['example.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username@github2.com/username/repository.git'), whitelist), ['github2.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@github3.com/username/repository.git'), whitelist), ['github3.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@example2.com:1234/username/repository.git'), whitelist), ['example2.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('https://example3.com:1234/username/repository.git'), whitelist), ['example3.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://github.com/Microsoft/vscode.git'), allowedDomains), ['github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://git.example.com/gitproject.git'), allowedDomains), ['example.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username@github2.com/username/repository.git'), allowedDomains), ['github2.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@github3.com/username/repository.git'), allowedDomains), ['github3.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://username:password@example2.com:1234/username/repository.git'), allowedDomains), ['example2.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('https://example3.com:1234/username/repository.git'), allowedDomains), ['example3.com']); }); test('SSH remotes', function () { - assert.deepStrictEqual(getDomainsOfRemotes(remote('ssh://user@git.server.org/project.git'), whitelist), ['server.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('ssh://user@git.server.org/project.git'), allowedDomains), ['server.org']); }); test('SCP-like remotes', function () { - assert.deepStrictEqual(getDomainsOfRemotes(remote('git@github.com:Microsoft/vscode.git'), whitelist), ['github.com']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('user@git.server.org:project.git'), whitelist), ['server.org']); - assert.deepStrictEqual(getDomainsOfRemotes(remote('git.server2.org:project.git'), whitelist), ['server2.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('git@github.com:Microsoft/vscode.git'), allowedDomains), ['github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('user@git.server.org:project.git'), allowedDomains), ['server.org']); + assert.deepStrictEqual(getDomainsOfRemotes(remote('git.server2.org:project.git'), allowedDomains), ['server2.org']); }); test('Local remotes', function () { - assert.deepStrictEqual(getDomainsOfRemotes(remote('/opt/git/project.git'), whitelist), []); - assert.deepStrictEqual(getDomainsOfRemotes(remote('file:///opt/git/project.git'), whitelist), []); + assert.deepStrictEqual(getDomainsOfRemotes(remote('/opt/git/project.git'), allowedDomains), []); + assert.deepStrictEqual(getDomainsOfRemotes(remote('file:///opt/git/project.git'), allowedDomains), []); }); test('Multiple remotes', function () { const config = ['https://github.com/Microsoft/vscode.git', 'https://git.example.com/gitproject.git'].map(remote).join(''); - assert.deepStrictEqual(getDomainsOfRemotes(config, whitelist).sort(), ['example.com', 'github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(config, allowedDomains).sort(), ['example.com', 'github.com']); }); - test('Whitelisting', () => { + test('Non allowed domains are anonymized', () => { const config = ['https://github.com/Microsoft/vscode.git', 'https://git.foobar.com/gitproject.git'].map(remote).join(''); - assert.deepStrictEqual(getDomainsOfRemotes(config, whitelist).sort(), ['aaaaaa.aaa', 'github.com']); + assert.deepStrictEqual(getDomainsOfRemotes(config, allowedDomains).sort(), ['aaaaaa.aaa', 'github.com']); }); test('HTTPS remotes to be hashed', function () { diff --git a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts index 49a69832cf..f4f3e9d199 100644 --- a/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts +++ b/src/vs/platform/extensionManagement/test/common/extensionManagement.test.ts @@ -15,6 +15,8 @@ suite('Extension Identifier Pattern', () => { assert.equal(true, regEx.test('PUBLISHER.NAME')); assert.equal(true, regEx.test('PUBLISHEr.NAMe')); assert.equal(true, regEx.test('PUBLISHEr.N-AMe')); + assert.equal(true, regEx.test('PUB-LISHEr.NAMe')); + assert.equal(true, regEx.test('PUB-LISHEr.N-AMe')); assert.equal(true, regEx.test('PUBLISH12Er90.N-A54Me123')); assert.equal(true, regEx.test('111PUBLISH12Er90.N-1111A54Me123')); assert.equal(false, regEx.test('publishername')); diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts index 187fd740f0..4e48812f89 100644 --- a/src/vs/platform/files/common/fileService.ts +++ b/src/vs/platform/files/common/fileService.ts @@ -7,22 +7,22 @@ import { Disposable, IDisposable, toDisposable, dispose, DisposableStore } from import { IFileService, IResolveFileOptions, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode, IStat, IFileStatWithMetadata, IResolveMetadataFileOptions, etag, hasReadWriteCapability, hasFileFolderCopyCapability, hasOpenReadWriteCloseCapability, toFileOperationResult, IFileSystemProviderWithOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadWriteCapability, IResolveFileResultWithMetadata, IWatchOptions, IWriteFileOptions, IReadFileOptions, IFileStreamContent, IFileContent, ETAG_DISABLED, hasFileReadStreamCapability, IFileSystemProviderWithFileReadStreamCapability, ensureFileSystemProviderError, IFileSystemProviderCapabilitiesChangeEvent } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { isAbsolutePath, dirname, basename, joinPath, isEqual, ExtUri } from 'vs/base/common/resources'; +import { isAbsolutePath, dirname, basename, joinPath, IExtUri, extUri, extUriIgnorePathCase } from 'vs/base/common/resources'; import { localize } from 'vs/nls'; import { TernarySearchTree } from 'vs/base/common/map'; import { isNonEmptyArray, coalesce } from 'vs/base/common/arrays'; import { getBaseLabel } from 'vs/base/common/labels'; import { ILogService } from 'vs/platform/log/common/log'; -import { VSBuffer, VSBufferReadable, readableToBuffer, bufferToReadable, streamToBuffer, bufferToStream, VSBufferReadableStream } from 'vs/base/common/buffer'; -import { isReadableStream, transform, ReadableStreamEvents, consumeReadableWithLimit, consumeStreamWithLimit } from 'vs/base/common/stream'; +import { VSBuffer, VSBufferReadable, readableToBuffer, bufferToReadable, streamToBuffer, bufferToStream, VSBufferReadableStream, VSBufferReadableBufferedStream, bufferedStreamToBuffer, newWriteableBufferStream } from 'vs/base/common/buffer'; +import { isReadableStream, transform, peekReadable, peekStream, isReadableBufferedStream } from 'vs/base/common/stream'; import { Queue } from 'vs/base/common/async'; import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation'; import { Schemas } from 'vs/base/common/network'; -import { createReadStream } from 'vs/platform/files/common/io'; +import { readFileIntoStream } from 'vs/platform/files/common/io'; export class FileService extends Disposable implements IFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly BUFFER_SIZE = 64 * 1024; @@ -54,7 +54,7 @@ export class FileService extends Disposable implements IFileService { // Forward events from provider const providerDisposables = new DisposableStore(); - providerDisposables.add(provider.onDidChangeFile(changes => this._onDidFilesChange.fire(new FileChangesEvent(changes)))); + providerDisposables.add(provider.onDidChangeFile(changes => this._onDidFilesChange.fire(new FileChangesEvent(changes, this.getExtUri(provider).extUri)))); providerDisposables.add(provider.onDidChangeCapabilities(() => this._onDidChangeFileSystemProviderCapabilities.fire({ provider, scheme }))); if (typeof provider.onDidErrorOccur === 'function') { providerDisposables.add(provider.onDidErrorOccur(error => this._onError.fire(new Error(error)))); @@ -320,22 +320,30 @@ export class FileService extends Disposable implements IFileService { // to write is a Readable, we consume up to 3 chunks and try to write the data // unbuffered to reduce the overhead. If the Readable has more data to provide // we continue to write buffered. + let bufferOrReadableOrStreamOrBufferedStream: VSBuffer | VSBufferReadable | VSBufferReadableStream | VSBufferReadableBufferedStream; if (hasReadWriteCapability(provider) && !(bufferOrReadableOrStream instanceof VSBuffer)) { if (isReadableStream(bufferOrReadableOrStream)) { - bufferOrReadableOrStream = await consumeStreamWithLimit(bufferOrReadableOrStream, data => VSBuffer.concat(data), 3); + const bufferedStream = await peekStream(bufferOrReadableOrStream, 3); + if (bufferedStream.ended) { + bufferOrReadableOrStreamOrBufferedStream = VSBuffer.concat(bufferedStream.buffer); + } else { + bufferOrReadableOrStreamOrBufferedStream = bufferedStream; + } } else { - bufferOrReadableOrStream = consumeReadableWithLimit(bufferOrReadableOrStream, data => VSBuffer.concat(data), 3); + bufferOrReadableOrStreamOrBufferedStream = peekReadable(bufferOrReadableOrStream, data => VSBuffer.concat(data), 3); } + } else { + bufferOrReadableOrStreamOrBufferedStream = bufferOrReadableOrStream; } // write file: unbuffered (only if data to write is a buffer, or the provider has no buffered write capability) - if (!hasOpenReadWriteCloseCapability(provider) || (hasReadWriteCapability(provider) && bufferOrReadableOrStream instanceof VSBuffer)) { - await this.doWriteUnbuffered(provider, resource, bufferOrReadableOrStream); + if (!hasOpenReadWriteCloseCapability(provider) || (hasReadWriteCapability(provider) && bufferOrReadableOrStreamOrBufferedStream instanceof VSBuffer)) { + await this.doWriteUnbuffered(provider, resource, bufferOrReadableOrStreamOrBufferedStream); } // write file: buffered else { - await this.doWriteBuffered(provider, resource, bufferOrReadableOrStream instanceof VSBuffer ? bufferToReadable(bufferOrReadableOrStream) : bufferOrReadableOrStream); + await this.doWriteBuffered(provider, resource, bufferOrReadableOrStreamOrBufferedStream instanceof VSBuffer ? bufferToReadable(bufferOrReadableOrStreamOrBufferedStream) : bufferOrReadableOrStreamOrBufferedStream); } } catch (error) { throw new FileOperationError(localize('err.write', "Unable to write file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), options); @@ -461,25 +469,24 @@ export class FileService extends Disposable implements IFileService { private readFileStreamed(provider: IFileSystemProviderWithFileReadStreamCapability, resource: URI, token: CancellationToken, options: IReadFileOptions = Object.create(null)): VSBufferReadableStream { const fileStream = provider.readFileStream(resource, options, token); - return this.transformFileReadStream(resource, fileStream, options); - } - - private readFileBuffered(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, token: CancellationToken, options: IReadFileOptions = Object.create(null)): VSBufferReadableStream { - const fileStream = createReadStream(provider, resource, { - ...options, - bufferSize: this.BUFFER_SIZE - }, token); - - return this.transformFileReadStream(resource, fileStream, options); - } - - private transformFileReadStream(resource: URI, stream: ReadableStreamEvents, options: IReadFileOptions): VSBufferReadableStream { - return transform(stream, { + return transform(fileStream, { data: data => data instanceof VSBuffer ? data : VSBuffer.wrap(data), error: error => new FileOperationError(localize('err.read', "Unable to read file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), options) }, data => VSBuffer.concat(data)); } + private readFileBuffered(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, token: CancellationToken, options: IReadFileOptions = Object.create(null)): VSBufferReadableStream { + const stream = newWriteableBufferStream(); + + readFileIntoStream(provider, resource, stream, data => data, { + ...options, + bufferSize: this.BUFFER_SIZE, + errorTransformer: error => new FileOperationError(localize('err.read', "Unable to read file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), options) + }, token); + + return stream; + } + private async readFileUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, options?: IReadFileOptions): Promise { let buffer = await provider.readFile(resource); @@ -540,6 +547,29 @@ export class FileService extends Disposable implements IFileService { //#region Move/Copy/Delete/Create Folder + async canMove(source: URI, target: URI, overwrite?: boolean): Promise { + return this.doCanMoveCopy(source, target, 'move', overwrite); + } + + async canCopy(source: URI, target: URI, overwrite?: boolean): Promise { + return this.doCanMoveCopy(source, target, 'copy', overwrite); + } + + private async doCanMoveCopy(source: URI, target: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise { + if (source.toString() !== target.toString()) { + try { + const sourceProvider = mode === 'move' ? this.throwIfFileSystemIsReadonly(await this.withWriteProvider(source), source) : await this.withReadProvider(source); + const targetProvider = this.throwIfFileSystemIsReadonly(await this.withWriteProvider(target), target); + + await this.doValidateMoveCopy(sourceProvider, source, targetProvider, target, mode, overwrite); + } catch (error) { + return error; + } + } + + return true; + } + async move(source: URI, target: URI, overwrite?: boolean): Promise { const sourceProvider = this.throwIfFileSystemIsReadonly(await this.withWriteProvider(source), source); const targetProvider = this.throwIfFileSystemIsReadonly(await this.withWriteProvider(target), target); @@ -673,8 +703,7 @@ export class FileService extends Disposable implements IFileService { // Check if source is equal or parent to target (requires providers to be the same) if (sourceProvider === targetProvider) { - const isPathCaseSensitive = !!(sourceProvider.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); - const extUri = new ExtUri(_ => !isPathCaseSensitive); + const { extUri, isPathCaseSensitive } = this.getExtUri(sourceProvider); if (!isPathCaseSensitive) { isSameResourceWithDifferentPathCase = extUri.isEqual(source, target); } @@ -700,8 +729,7 @@ export class FileService extends Disposable implements IFileService { // Special case: if the target is a parent of the source, we cannot delete // it as it would delete the source as well. In this case we have to throw if (sourceProvider === targetProvider) { - const isPathCaseSensitive = !!(sourceProvider.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); - const extUri = new ExtUri(_ => !isPathCaseSensitive); + const { extUri } = this.getExtUri(sourceProvider); if (extUri.isEqualOrParent(source, target)) { throw new Error(localize('unableToMoveCopyError4', "Unable to move/copy '{0}' into '{1}' since a file would replace the folder it is contained in.", this.resourceForError(source), this.resourceForError(target))); } @@ -711,6 +739,15 @@ export class FileService extends Disposable implements IFileService { return { exists, isSameResourceWithDifferentPathCase }; } + private getExtUri(provider: IFileSystemProvider): { extUri: IExtUri, isPathCaseSensitive: boolean } { + const isPathCaseSensitive = !!(provider.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); + + return { + extUri: isPathCaseSensitive ? extUri : extUriIgnorePathCase, + isPathCaseSensitive + }; + } + async createFolder(resource: URI): Promise { const provider = this.throwIfFileSystemIsReadonly(await this.withProvider(resource), resource); @@ -728,7 +765,8 @@ export class FileService extends Disposable implements IFileService { const directoriesToCreate: string[] = []; // mkdir until we reach root - while (!isEqual(directory, dirname(directory))) { + const { extUri } = this.getExtUri(provider); + while (!extUri.isEqual(directory, dirname(directory))) { try { const stat = await provider.stat(directory); if ((stat.type & FileType.Directory) === 0) { @@ -773,7 +811,17 @@ export class FileService extends Disposable implements IFileService { } } - async del(resource: URI, options?: { useTrash?: boolean; recursive?: boolean; }): Promise { + async canDelete(resource: URI, options?: { useTrash?: boolean; recursive?: boolean; }): Promise { + try { + await this.doValidateDelete(resource, options); + } catch (error) { + return error; + } + + return true; + } + + private async doValidateDelete(resource: URI, options?: { useTrash?: boolean; recursive?: boolean; }): Promise { const provider = this.throwIfFileSystemIsReadonly(await this.withProvider(resource), resource); // Validate trash support @@ -797,6 +845,15 @@ export class FileService extends Disposable implements IFileService { } } + return provider; + } + + async del(resource: URI, options?: { useTrash?: boolean; recursive?: boolean; }): Promise { + const provider = await this.doValidateDelete(resource, options); + + const useTrash = !!options?.useTrash; + const recursive = !!options?.recursive; + // Delete through provider await provider.delete(resource, { recursive, useTrash }); @@ -857,8 +914,10 @@ export class FileService extends Disposable implements IFileService { } private toWatchKey(provider: IFileSystemProvider, resource: URI, options: IWatchOptions): string { + const { extUri } = this.getExtUri(provider); + return [ - this.toMapKey(provider, resource), // lowercase path if the provider is case insensitive + extUri.getComparisonKey(resource), // lowercase path if the provider is case insensitive String(options.recursive), // use recursive: true | false as part of the key options.excludes.join() // use excludes as part of the key ].join(); @@ -878,10 +937,12 @@ export class FileService extends Disposable implements IFileService { private writeQueues: Map> = new Map(); private ensureWriteQueue(provider: IFileSystemProvider, resource: URI): Queue { + const { extUri } = this.getExtUri(provider); + const queueKey = extUri.getComparisonKey(resource); + // ensure to never write to the same resource without finishing // the one write. this ensures a write finishes consistently // (even with error) before another write is done. - const queueKey = this.toMapKey(provider, resource); let writeQueue = this.writeQueues.get(queueKey); if (!writeQueue) { writeQueue = new Queue(); @@ -897,13 +958,7 @@ export class FileService extends Disposable implements IFileService { return writeQueue; } - private toMapKey(provider: IFileSystemProvider, resource: URI): string { - const isPathCaseSensitive = !!(provider.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); - - return isPathCaseSensitive ? resource.toString() : resource.toString().toLowerCase(); - } - - private async doWriteBuffered(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, readableOrStream: VSBufferReadable | VSBufferReadableStream): Promise { + private async doWriteBuffered(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, readableOrStreamOrBufferedStream: VSBufferReadable | VSBufferReadableStream | VSBufferReadableBufferedStream): Promise { return this.ensureWriteQueue(provider, resource).queue(async () => { // open handle @@ -911,10 +966,10 @@ export class FileService extends Disposable implements IFileService { // write into handle until all bytes from buffer have been written try { - if (isReadableStream(readableOrStream)) { - await this.doWriteStreamBufferedQueued(provider, handle, readableOrStream); + if (isReadableStream(readableOrStreamOrBufferedStream) || isReadableBufferedStream(readableOrStreamOrBufferedStream)) { + await this.doWriteStreamBufferedQueued(provider, handle, readableOrStreamOrBufferedStream); } else { - await this.doWriteReadableBufferedQueued(provider, handle, readableOrStream); + await this.doWriteReadableBufferedQueued(provider, handle, readableOrStreamOrBufferedStream); } } catch (error) { throw ensureFileSystemProviderError(error); @@ -926,9 +981,34 @@ export class FileService extends Disposable implements IFileService { }); } - private doWriteStreamBufferedQueued(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, handle: number, stream: VSBufferReadableStream): Promise { - return new Promise((resolve, reject) => { - let posInFile = 0; + private async doWriteStreamBufferedQueued(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, handle: number, streamOrBufferedStream: VSBufferReadableStream | VSBufferReadableBufferedStream): Promise { + let posInFile = 0; + let stream: VSBufferReadableStream; + + // Buffered stream: consume the buffer first by writing + // it to the target before reading from the stream. + if (isReadableBufferedStream(streamOrBufferedStream)) { + if (streamOrBufferedStream.buffer.length > 0) { + const chunk = VSBuffer.concat(streamOrBufferedStream.buffer); + await this.doWriteBuffer(provider, handle, chunk, chunk.byteLength, posInFile, 0); + + posInFile += chunk.byteLength; + } + + // If the stream has been consumed, return early + if (streamOrBufferedStream.ended) { + return; + } + + stream = streamOrBufferedStream.stream; + } + + // Unbuffered stream - just take as is + else { + stream = streamOrBufferedStream; + } + + return new Promise(async (resolve, reject) => { stream.on('data', async chunk => { @@ -969,26 +1049,31 @@ export class FileService extends Disposable implements IFileService { private async doWriteBuffer(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, handle: number, buffer: VSBuffer, length: number, posInFile: number, posInBuffer: number): Promise { let totalBytesWritten = 0; while (totalBytesWritten < length) { + + // Write through the provider const bytesWritten = await provider.write(handle, posInFile + totalBytesWritten, buffer.buffer, posInBuffer + totalBytesWritten, length - totalBytesWritten); totalBytesWritten += bytesWritten; } } - private async doWriteUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream): Promise { - return this.ensureWriteQueue(provider, resource).queue(() => this.doWriteUnbufferedQueued(provider, resource, bufferOrReadableOrStream)); + private async doWriteUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, bufferOrReadableOrStreamOrBufferedStream: VSBuffer | VSBufferReadable | VSBufferReadableStream | VSBufferReadableBufferedStream): Promise { + return this.ensureWriteQueue(provider, resource).queue(() => this.doWriteUnbufferedQueued(provider, resource, bufferOrReadableOrStreamOrBufferedStream)); } - private async doWriteUnbufferedQueued(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, bufferOrReadableOrStream: VSBuffer | VSBufferReadable | VSBufferReadableStream): Promise { + private async doWriteUnbufferedQueued(provider: IFileSystemProviderWithFileReadWriteCapability, resource: URI, bufferOrReadableOrStreamOrBufferedStream: VSBuffer | VSBufferReadable | VSBufferReadableStream | VSBufferReadableBufferedStream): Promise { let buffer: VSBuffer; - if (bufferOrReadableOrStream instanceof VSBuffer) { - buffer = bufferOrReadableOrStream; - } else if (isReadableStream(bufferOrReadableOrStream)) { - buffer = await streamToBuffer(bufferOrReadableOrStream); + if (bufferOrReadableOrStreamOrBufferedStream instanceof VSBuffer) { + buffer = bufferOrReadableOrStreamOrBufferedStream; + } else if (isReadableStream(bufferOrReadableOrStreamOrBufferedStream)) { + buffer = await streamToBuffer(bufferOrReadableOrStreamOrBufferedStream); + } else if (isReadableBufferedStream(bufferOrReadableOrStreamOrBufferedStream)) { + buffer = await bufferedStreamToBuffer(bufferOrReadableOrStreamOrBufferedStream); } else { - buffer = readableToBuffer(bufferOrReadableOrStream); + buffer = readableToBuffer(bufferOrReadableOrStreamOrBufferedStream); } - return provider.writeFile(resource, buffer.buffer, { create: true, overwrite: true }); + // Write through the provider + await provider.writeFile(resource, buffer.buffer, { create: true, overwrite: true }); } private async doPipeBuffered(sourceProvider: IFileSystemProviderWithOpenReadWriteCloseCapability, source: URI, targetProvider: IFileSystemProviderWithOpenReadWriteCloseCapability, target: URI): Promise { diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 94441d9945..7e1c2372da 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -11,7 +11,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { Event } from 'vs/base/common/event'; import { startsWithIgnoreCase } from 'vs/base/common/strings'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { isEqualOrParent, isEqual } from 'vs/base/common/resources'; +import { IExtUri } from 'vs/base/common/resources'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { VSBuffer, VSBufferReadable, VSBufferReadableStream } from 'vs/base/common/buffer'; import { ReadableStreamEvents } from 'vs/base/common/stream'; @@ -21,7 +21,7 @@ export const IFileService = createDecorator('fileService'); export interface IFileService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * An event that is fired when a file system provider is added or removed @@ -121,6 +121,12 @@ export interface IFileService { */ move(source: URI, target: URI, overwrite?: boolean): Promise; + /** + * Find out if a move operation is possible given the arguments. No changes on disk will + * be performed. Returns an Error if the operation cannot be done. + */ + canMove(source: URI, target: URI, overwrite?: boolean): Promise; + /** * Copies the file/folder to a path identified by the resource. * @@ -128,6 +134,12 @@ export interface IFileService { */ copy(source: URI, target: URI, overwrite?: boolean): Promise; + /** + * Find out if a copy operation is possible given the arguments. No changes on disk will + * be performed. Returns an Error if the operation cannot be done. + */ + canCopy(source: URI, target: URI, overwrite?: boolean): Promise; + /** * Creates a new file with the given path and optional contents. The returned promise * will have the stat model object as a result. @@ -149,6 +161,12 @@ export interface IFileService { */ del(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise; + /** + * Find out if a delete operation is possible given the arguments. No changes on disk will + * be performed. Returns an Error if the operation cannot be done. + */ + canDelete(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise; + /** * Allows to start a watcher that reports file/folder change events on the provided resource. * @@ -265,7 +283,7 @@ export interface IFileSystemProvider { readFile?(resource: URI): Promise; writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise; - readFileStream?(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents; + readFileStream?(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents; open?(resource: URI, opts: FileOpenOptions): Promise; close?(fd: number): Promise; @@ -302,7 +320,7 @@ export function hasOpenReadWriteCloseCapability(provider: IFileSystemProvider): } export interface IFileSystemProviderWithFileReadStreamCapability extends IFileSystemProvider { - readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents; + readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents; } export function hasFileReadStreamCapability(provider: IFileSystemProvider): provider is IFileSystemProviderWithFileReadStreamCapability { @@ -473,7 +491,7 @@ export interface IFileChange { export class FileChangesEvent { - constructor(public readonly changes: readonly IFileChange[]) { } + constructor(public readonly changes: readonly IFileChange[], private readonly extUri: IExtUri) { } /** * Returns true if this change event contains the provided file with the given change type (if provided). In case of @@ -494,10 +512,10 @@ export class FileChangesEvent { // For deleted also return true when deleted folder is parent of target path if (change.type === FileChangeType.DELETED) { - return isEqualOrParent(resource, change.resource); + return this.extUri.isEqualOrParent(resource, change.resource); } - return isEqual(resource, change.resource); + return this.extUri.isEqual(resource, change.resource); }); } @@ -552,6 +570,10 @@ export class FileChangesEvent { return change.type === type; }); } + + filter(filterFn: (change: IFileChange) => boolean): FileChangesEvent { + return new FileChangesEvent(this.changes.filter(change => filterFn(change)), this.extUri); + } } export function isParent(path: string, candidate: string, ignoreCase?: boolean): boolean { @@ -843,3 +865,33 @@ export function whenProviderRegistered(file: URI, fileService: IFileService): Pr */ export const MIN_MAX_MEMORY_SIZE_MB = 2048; export const FALLBACK_MAX_MEMORY_SIZE_MB = 4096; + +/** + * Helper to format a raw byte size into a human readable label. + */ +export class BinarySize { + static readonly KB = 1024; + static readonly MB = BinarySize.KB * BinarySize.KB; + static readonly GB = BinarySize.MB * BinarySize.KB; + static readonly TB = BinarySize.GB * BinarySize.KB; + + static formatSize(size: number): string { + if (size < BinarySize.KB) { + return localize('sizeB', "{0}B", size); + } + + if (size < BinarySize.MB) { + return localize('sizeKB', "{0}KB", (size / BinarySize.KB).toFixed(2)); + } + + if (size < BinarySize.GB) { + return localize('sizeMB', "{0}MB", (size / BinarySize.MB).toFixed(2)); + } + + if (size < BinarySize.TB) { + return localize('sizeGB', "{0}GB", (size / BinarySize.GB).toFixed(2)); + } + + return localize('sizeTB', "{0}TB", (size / BinarySize.TB).toFixed(2)); + } +} diff --git a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts index f8ed55455f..d478c6f4d4 100644 --- a/src/vs/platform/files/common/inMemoryFilesystemProvider.ts +++ b/src/vs/platform/files/common/inMemoryFilesystemProvider.ts @@ -52,7 +52,9 @@ export type Entry = File | Directory; export class InMemoryFileSystemProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { - readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; + readonly capabilities: FileSystemProviderCapabilities = + FileSystemProviderCapabilities.FileReadWrite + | FileSystemProviderCapabilities.PathCaseSensitive; readonly onDidChangeCapabilities: Event = Event.None; root = new Directory(''); diff --git a/src/vs/platform/files/common/io.ts b/src/vs/platform/files/common/io.ts index fba64799b2..c28301392b 100644 --- a/src/vs/platform/files/common/io.ts +++ b/src/vs/platform/files/common/io.ts @@ -5,10 +5,11 @@ import { localize } from 'vs/nls'; import { URI } from 'vs/base/common/uri'; -import { VSBuffer, VSBufferWriteableStream, newWriteableBufferStream, VSBufferReadableStream } from 'vs/base/common/buffer'; +import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IFileSystemProviderWithOpenReadWriteCloseCapability, FileReadStreamOptions, createFileSystemProviderError, FileSystemProviderErrorCode, ensureFileSystemProviderError } from 'vs/platform/files/common/files'; import { canceled } from 'vs/base/common/errors'; +import { IErrorTransformer, IDataTransformer, WriteableStream } from 'vs/base/common/stream'; export interface ICreateReadStreamOptions extends FileReadStreamOptions { @@ -16,21 +17,40 @@ export interface ICreateReadStreamOptions extends FileReadStreamOptions { * The size of the buffer to use before sending to the stream. */ bufferSize: number; + + /** + * Allows to massage any possibly error that happens during reading. + */ + errorTransformer?: IErrorTransformer; } -export function createReadStream(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, options: ICreateReadStreamOptions, token?: CancellationToken): VSBufferReadableStream { - const stream = newWriteableBufferStream(); - - // do not await reading but simply return the stream directly since it operates - // via events. finally end the stream and send through the possible error +/** + * A helper to read a file from a provider with open/read/close capability into a stream. + */ +export async function readFileIntoStream( + provider: IFileSystemProviderWithOpenReadWriteCloseCapability, + resource: URI, + target: WriteableStream, + transformer: IDataTransformer, + options: ICreateReadStreamOptions, + token: CancellationToken +): Promise { let error: Error | undefined = undefined; - doReadFileIntoStream(provider, resource, stream, options, token).then(undefined, err => error = err).finally(() => stream.end(error)); + try { + await doReadFileIntoStream(provider, resource, target, transformer, options, token); + } catch (err) { + error = err; + } finally { + if (error && options.errorTransformer) { + error = options.errorTransformer(error); + } - return stream; + target.end(error); + } } -async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, stream: VSBufferWriteableStream, options: ICreateReadStreamOptions, token?: CancellationToken): Promise { +async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWriteCloseCapability, resource: URI, target: WriteableStream, transformer: IDataTransformer, options: ICreateReadStreamOptions, token: CancellationToken): Promise { // Check for cancellation throwIfCancelled(token); @@ -65,7 +85,7 @@ async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWri // when buffer full, create a new one and emit it through stream if (posInBuffer === buffer.byteLength) { - stream.write(buffer); + await target.write(transformer(buffer)); buffer = VSBuffer.alloc(Math.min(options.bufferSize, typeof allowedRemainingBytes === 'number' ? allowedRemainingBytes : options.bufferSize)); @@ -80,7 +100,7 @@ async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWri lastChunkLength = Math.min(posInBuffer, allowedRemainingBytes); } - stream.write(buffer.slice(0, lastChunkLength)); + target.write(transformer(buffer.slice(0, lastChunkLength))); } } catch (error) { throw ensureFileSystemProviderError(error); @@ -89,8 +109,8 @@ async function doReadFileIntoStream(provider: IFileSystemProviderWithOpenReadWri } } -function throwIfCancelled(token?: CancellationToken): boolean { - if (token && token.isCancellationRequested) { +function throwIfCancelled(token: CancellationToken): boolean { + if (token.isCancellationRequested) { throw canceled(); } diff --git a/src/vs/platform/files/node/diskFileSystemProvider.ts b/src/vs/platform/files/node/diskFileSystemProvider.ts index d5870f5508..8856be9eda 100644 --- a/src/vs/platform/files/node/diskFileSystemProvider.ts +++ b/src/vs/platform/files/node/diskFileSystemProvider.ts @@ -22,11 +22,11 @@ import { FileWatcher as UnixWatcherService } from 'vs/platform/files/node/watche import { FileWatcher as WindowsWatcherService } from 'vs/platform/files/node/watcher/win32/watcherService'; import { FileWatcher as NsfwWatcherService } from 'vs/platform/files/node/watcher/nsfw/watcherService'; import { FileWatcher as NodeJSWatcherService } from 'vs/platform/files/node/watcher/nodejs/watcherService'; -import { VSBuffer } from 'vs/base/common/buffer'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { ReadableStreamEvents, transform } from 'vs/base/common/stream'; -import { createReadStream } from 'vs/platform/files/common/io'; +import { ReadableStreamEvents, newWriteableStream } from 'vs/base/common/stream'; +import { readFileIntoStream } from 'vs/platform/files/common/io'; import { insert } from 'vs/base/common/arrays'; +import { VSBuffer } from 'vs/base/common/buffer'; export interface IWatcherOptions { pollingInterval?: number; @@ -154,13 +154,15 @@ export class DiskFileSystemProvider extends Disposable implements } } - readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents { - const fileStream = createReadStream(this, resource, { + readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents { + const stream = newWriteableStream(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer); + + readFileIntoStream(this, resource, stream, data => data.buffer, { ...opts, bufferSize: this.BUFFER_SIZE }, token); - return transform(fileStream, { data: data => data.buffer }, data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer); + return stream; } async writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { @@ -472,12 +474,11 @@ export class DiskFileSystemProvider extends Disposable implements } private async validateTargetDeleted(from: URI, to: URI, mode: 'move' | 'copy', overwrite?: boolean): Promise { - const isPathCaseSensitive = !!(this.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); - const fromFilePath = this.toFilePath(from); const toFilePath = this.toFilePath(to); let isSameResourceWithDifferentPathCase = false; + const isPathCaseSensitive = !!(this.capabilities & FileSystemProviderCapabilities.PathCaseSensitive); if (!isPathCaseSensitive) { isSameResourceWithDifferentPathCase = isEqual(fromFilePath, toFilePath, true /* ignore case */); } diff --git a/src/vs/platform/files/test/common/files.test.ts b/src/vs/platform/files/test/common/files.test.ts index 843f487138..697db97674 100644 --- a/src/vs/platform/files/test/common/files.test.ts +++ b/src/vs/platform/files/test/common/files.test.ts @@ -8,8 +8,8 @@ import { URI } from 'vs/base/common/uri'; import { isEqual, isEqualOrParent } from 'vs/base/common/extpath'; import { FileChangeType, FileChangesEvent, isParent } from 'vs/platform/files/common/files'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; -// eslint-disable-next-line code-import-patterns import { toResource } from 'vs/base/test/common/utils'; +import { extUri } from 'vs/base/common/resources'; suite('Files', () => { @@ -22,7 +22,7 @@ suite('Files', () => { { resource: toResource.call(this, '/bar/folder'), type: FileChangeType.DELETED } ]; - let r1 = new FileChangesEvent(changes); + let r1 = new FileChangesEvent(changes, extUri); assert(!r1.contains(toResource.call(this, '/foo'), FileChangeType.UPDATED)); assert(r1.contains(toResource.call(this, '/foo/updated.txt'), FileChangeType.UPDATED)); diff --git a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts index 33fefc969d..9e508d9d9d 100644 --- a/src/vs/platform/files/test/electron-browser/diskFileService.test.ts +++ b/src/vs/platform/files/test/electron-browser/diskFileService.test.ts @@ -463,6 +463,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const resource = URI.file(join(testDir, 'deep', 'conway.js')); const source = await service.resolve(resource); + assert.equal(await service.canDelete(source.resource, { useTrash }), true); await service.del(source.resource, { useTrash }); assert.equal(existsSync(source.resource.fsPath), false); @@ -492,6 +493,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ let event: FileOperationEvent; disposables.add(service.onDidRunOperation(e => event = e)); + assert.equal(await service.canDelete(source.resource), true); await service.del(source.resource); assert.equal(existsSync(source.resource.fsPath), false); @@ -511,6 +513,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ let event: FileOperationEvent; disposables.add(service.onDidRunOperation(e => event = e)); + assert.equal(await service.canDelete(link), true); await service.del(link); assert.equal(existsSync(link.fsPath), false); @@ -535,6 +538,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const resource = URI.file(join(testDir, 'deep')); const source = await service.resolve(resource); + assert.equal(await service.canDelete(source.resource, { recursive: true, useTrash }), true); await service.del(source.resource, { recursive: true, useTrash }); assert.equal(existsSync(source.resource.fsPath), false); @@ -547,6 +551,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const resource = URI.file(join(testDir, 'deep')); const source = await service.resolve(resource); + assert.ok((await service.canDelete(source.resource)) instanceof Error); + let error; try { await service.del(source.resource); @@ -566,6 +572,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const target = URI.file(join(dirname(source.fsPath), 'other.html')); + assert.equal(await service.canMove(source, target), true); const renamed = await service.move(source, target); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -646,6 +653,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const target = URI.file(join(dirname(source.fsPath), 'other.html')).with({ scheme: testSchema }); + assert.equal(await service.canMove(source, target), true); const renamed = await service.move(source, target); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -670,6 +678,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const source = URI.file(join(testDir, 'index.html')); + assert.equal(await service.canMove(source, URI.file(join(dirname(source.fsPath), renameToPath))), true); const renamed = await service.move(source, URI.file(join(dirname(source.fsPath), renameToPath))); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -686,6 +695,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const source = URI.file(join(testDir, 'deep')); + assert.equal(await service.canMove(source, URI.file(join(dirname(source.fsPath), 'deeper'))), true); const renamed = await service.move(source, URI.file(join(dirname(source.fsPath), 'deeper'))); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -733,6 +743,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const target = URI.file(join(dirname(source.fsPath), 'deeper')).with({ scheme: testSchema }); + assert.equal(await service.canMove(source, target), true); const renamed = await service.move(source, target); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -757,6 +768,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ assert.ok(source.size > 0); const renamedResource = URI.file(join(dirname(source.resource.fsPath), 'INDEX.html')); + assert.equal(await service.canMove(source.resource, renamedResource), true); let renamed = await service.move(source.resource, renamedResource); assert.equal(existsSync(renamedResource.fsPath), true); @@ -777,6 +789,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const source = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); assert.ok(source.size > 0); + assert.equal(await service.canMove(source.resource, URI.file(source.resource.fsPath)), true); let renamed = await service.move(source.resource, URI.file(source.resource.fsPath)); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -800,6 +813,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const targetParent = URI.file(testDir); const target = targetParent.with({ path: posix.join(targetParent.path, posix.basename(source.resource.path)) }); + assert.equal(await service.canMove(source.resource, target), true); let renamed = await service.move(source.resource, target); assert.equal(existsSync(renamed.resource.fsPath), true); @@ -821,6 +835,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const originalSize = source.size; assert.ok(originalSize > 0); + assert.ok((await service.canMove(URI.file(testDir), URI.file(join(testDir, 'binary.txt'))) instanceof Error)); + let error; try { await service.move(URI.file(testDir), URI.file(join(testDir, 'binary.txt'))); @@ -843,6 +859,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const originalSize = source.size; assert.ok(originalSize > 0); + assert.ok((await service.canMove(source.resource, URI.file(join(testDir, 'binary.txt'))) instanceof Error)); + let error; try { await service.move(source.resource, URI.file(join(testDir, 'binary.txt'))); @@ -876,6 +894,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const f = await service.createFolder(folderResource); const source = URI.file(join(testDir, 'deep', 'conway.js')); + assert.equal(await service.canMove(source, f.resource, true), true); const moved = await service.move(source, f.resource, true); assert.equal(existsSync(moved.resource.fsPath), true); @@ -930,6 +949,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const source = await service.resolve(URI.file(join(testDir, sourceName))); const target = URI.file(join(testDir, 'other.html')); + assert.equal(await service.canCopy(source.resource, target), true); const copied = await service.copy(source.resource, target); assert.equal(existsSync(copied.resource.fsPath), true); @@ -965,6 +985,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const f = await service.createFolder(folderResource); const source = URI.file(join(testDir, 'deep', 'conway.js')); + assert.equal(await service.canCopy(source, f.resource, true), true); const copied = await service.copy(source, f.resource, true); assert.equal(existsSync(copied.resource.fsPath), true); @@ -984,6 +1005,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const target = URI.file(join(dirname(source.resource.fsPath), 'INDEX.html')); + const canCopy = await service.canCopy(source.resource, target); + let error; let copied: IFileStatWithMetadata; try { @@ -994,12 +1017,14 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ if (isLinux) { assert.ok(!error); + assert.equal(canCopy, true); assert.equal(existsSync(copied!.resource.fsPath), true); assert.ok(readdirSync(testDir).some(f => f === 'INDEX.html')); assert.equal(source.size, copied!.size); } else { assert.ok(error); + assert.ok(canCopy instanceof Error); source = await service.resolve(source.resource, { resolveMetadata: true }); assert.equal(originalSize, source.size); @@ -1013,6 +1038,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const target = URI.file(join(dirname(source.resource.fsPath), 'INDEX.html')); + const canCopy = await service.canCopy(source.resource, target, true); + let error; let copied: IFileStatWithMetadata; try { @@ -1023,12 +1050,14 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ if (isLinux) { assert.ok(!error); + assert.equal(canCopy, true); assert.equal(existsSync(copied!.resource.fsPath), true); assert.ok(readdirSync(testDir).some(f => f === 'INDEX.html')); assert.equal(source.size, copied!.size); } else { assert.ok(error); + assert.ok(canCopy instanceof Error); source = await service.resolve(source.resource, { resolveMetadata: true }); assert.equal(originalSize, source.size); @@ -1036,21 +1065,22 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ }); test('copy - MIX CASE different taget - overwrite', async () => { - const source = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); - assert.ok(source.size > 0); + const source1 = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); + assert.ok(source1.size > 0); - const renamed = await service.move(source.resource, URI.file(join(dirname(source.resource.fsPath), 'CONWAY.js'))); + const renamed = await service.move(source1.resource, URI.file(join(dirname(source1.resource.fsPath), 'CONWAY.js'))); assert.equal(existsSync(renamed.resource.fsPath), true); assert.ok(readdirSync(testDir).some(f => f === 'CONWAY.js')); - assert.equal(source.size, renamed.size); + assert.equal(source1.size, renamed.size); - const source_1 = await service.resolve(URI.file(join(testDir, 'deep', 'conway.js')), { resolveMetadata: true }); - const target = URI.file(join(testDir, basename(source_1.resource.path))); + const source2 = await service.resolve(URI.file(join(testDir, 'deep', 'conway.js')), { resolveMetadata: true }); + const target = URI.file(join(testDir, basename(source2.resource.path))); - const res = await service.copy(source_1.resource, target, true); + assert.equal(await service.canCopy(source2.resource, target, true), true); + const res = await service.copy(source2.resource, target, true); assert.equal(existsSync(res.resource.fsPath), true); assert.ok(readdirSync(testDir).some(f => f === 'conway.js')); - assert.equal(source_1.size, res.size); + assert.equal(source2.size, res.size); }); test('copy - same file', async () => { @@ -1060,6 +1090,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const source = await service.resolve(URI.file(join(testDir, 'index.html')), { resolveMetadata: true }); assert.ok(source.size > 0); + assert.equal(await service.canCopy(source.resource, URI.file(source.resource.fsPath)), true); let copied = await service.copy(source.resource, URI.file(source.resource.fsPath)); assert.equal(existsSync(copied.resource.fsPath), true); @@ -1083,6 +1114,7 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const targetParent = URI.file(testDir); const target = targetParent.with({ path: posix.join(targetParent.path, posix.basename(source.resource.path)) }); + assert.equal(await service.canCopy(source.resource, URI.file(target.fsPath)), true); let copied = await service.copy(source.resource, URI.file(target.fsPath)); assert.equal(existsSync(copied.resource.fsPath), true); @@ -1517,23 +1549,23 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ assert.equal(error!.fileOperationResult, FileOperationResult.FILE_EXCEEDS_MEMORY_LIMIT); } - test('readFile - FILE_TOO_LARGE - default', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - default', async () => { return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - buffered', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - buffered', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileOpenReadWriteClose); return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - unbuffered', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - unbuffered', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileReadWrite); return testFileTooLarge(); }); - test('readFile - FILE_TOO_LARGE - streamed', async () => { + (isWindows ? test.skip /* flaky test */ : test)('readFile - FILE_TOO_LARGE - streamed', async () => { setCapabilities(fileProvider, FileSystemProviderCapabilities.FileReadStream); return testFileTooLarge(); @@ -1806,7 +1838,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const fileStat = await service.writeFile(target, streamToBufferReadableStream(createReadStream(source.fsPath))); assert.equal(fileStat.name, 'small-copy.txt'); - assert.equal(readFileSync(source.fsPath).toString(), readFileSync(target.fsPath).toString()); + const targetContents = readFileSync(target.fsPath).toString(); + assert.equal(readFileSync(source.fsPath).toString(), targetContents); } test('writeFile (large file - stream) - default', async () => { @@ -1832,7 +1865,8 @@ suite.skip('Disk File Service', function () { // {{SQL CARBON EDIT}} Disable occ const fileStat = await service.writeFile(target, streamToBufferReadableStream(createReadStream(source.fsPath))); assert.equal(fileStat.name, 'lorem-copy.txt'); - assert.equal(readFileSync(source.fsPath).toString(), readFileSync(target.fsPath).toString()); + const targetContents = readFileSync(target.fsPath).toString(); + assert.equal(readFileSync(source.fsPath).toString(), targetContents); } test('writeFile (file is created including parents)', async () => { diff --git a/src/vs/platform/files/test/electron-browser/normalizer.test.ts b/src/vs/platform/files/test/electron-browser/normalizer.test.ts index 1cab97925e..5a3d95c205 100644 --- a/src/vs/platform/files/test/electron-browser/normalizer.test.ts +++ b/src/vs/platform/files/test/electron-browser/normalizer.test.ts @@ -9,9 +9,10 @@ import { FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files import { URI as uri } from 'vs/base/common/uri'; import { IDiskFileChange, normalizeFileChanges, toFileChanges } from 'vs/platform/files/node/watcher/watcher'; import { Event, Emitter } from 'vs/base/common/event'; +import { ExtUri } from 'vs/base/common/resources'; function toFileChangesEvent(changes: IDiskFileChange[]): FileChangesEvent { - return new FileChangesEvent(toFileChanges(changes)); + return new FileChangesEvent(toFileChanges(changes), new ExtUri(() => !platform.isLinux)); } class TestFileWatcher { diff --git a/src/vs/platform/instantiation/common/instantiation.ts b/src/vs/platform/instantiation/common/instantiation.ts index 92fd176774..ea5c8a7bee 100644 --- a/src/vs/platform/instantiation/common/instantiation.ts +++ b/src/vs/platform/instantiation/common/instantiation.ts @@ -85,7 +85,7 @@ type GetLeadingNonServiceArgs = export interface IInstantiationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Synchronously creates an instance that is denoted by diff --git a/src/vs/platform/instantiation/common/instantiationService.ts b/src/vs/platform/instantiation/common/instantiationService.ts index 4e470cc1ba..a9ced9ded4 100644 --- a/src/vs/platform/instantiation/common/instantiationService.ts +++ b/src/vs/platform/instantiation/common/instantiationService.ts @@ -22,7 +22,7 @@ class CyclicDependencyError extends Error { export class InstantiationService implements IInstantiationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _services: ServiceCollection; private readonly _strict: boolean; @@ -96,8 +96,7 @@ export class InstantiationService implements IInstantiationService { // check for argument mismatches, adjust static args if needed if (args.length !== firstServiceArgPos) { - console.warn(`[createInstance] First service dependency of ${ctor.name} at position ${ - firstServiceArgPos + 1} conflicts with ${args.length} static arguments`); + console.warn(`[createInstance] First service dependency of ${ctor.name} at position ${firstServiceArgPos + 1} conflicts with ${args.length} static arguments`); let delta = firstServiceArgPos - args.length; if (delta > 0) { diff --git a/src/vs/platform/instantiation/common/serviceCollection.ts b/src/vs/platform/instantiation/common/serviceCollection.ts index f3e17be6a3..01ecb84961 100644 --- a/src/vs/platform/instantiation/common/serviceCollection.ts +++ b/src/vs/platform/instantiation/common/serviceCollection.ts @@ -22,10 +22,6 @@ export class ServiceCollection { return result; } - forEach(callback: (id: ServiceIdentifier, instanceOrDescriptor: any) => any): void { - this._entries.forEach((value, key) => callback(key, value)); - } - has(id: ServiceIdentifier): boolean { return this._entries.has(id); } diff --git a/src/vs/platform/instantiation/test/common/instantiationService.test.ts b/src/vs/platform/instantiation/test/common/instantiationService.test.ts index 15213916b5..2bd8680912 100644 --- a/src/vs/platform/instantiation/test/common/instantiationService.test.ts +++ b/src/vs/platform/instantiation/test/common/instantiationService.test.ts @@ -12,48 +12,48 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; let IService1 = createDecorator('service1'); interface IService1 { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; c: number; } class Service1 implements IService1 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; c = 1; } let IService2 = createDecorator('service2'); interface IService2 { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; d: boolean; } class Service2 implements IService2 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; d = true; } let IService3 = createDecorator('service3'); interface IService3 { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; s: string; } class Service3 implements IService3 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; s = 'farboo'; } let IDependentService = createDecorator('dependentService'); interface IDependentService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; name: string; } class DependentService implements IDependentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(@IService1 service: IService1) { assert.equal(service.c, 1); } @@ -116,7 +116,7 @@ class DependentServiceTarget2 { class ServiceLoop1 implements IService1 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; c = 1; constructor(@IService2 s: IService2) { @@ -125,7 +125,7 @@ class ServiceLoop1 implements IService1 { } class ServiceLoop2 implements IService2 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; d = true; constructor(@IService1 s: IService1) { @@ -364,7 +364,7 @@ suite('Instantiation Service', () => { let serviceInstanceCount = 0; const CtorCounter = class implements Service1 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; c = 1; constructor() { serviceInstanceCount += 1; diff --git a/src/vs/platform/ipc/electron-browser/sharedProcessService.ts b/src/vs/platform/ipc/electron-browser/sharedProcessService.ts index 5d57185249..b1f5d1c7c8 100644 --- a/src/vs/platform/ipc/electron-browser/sharedProcessService.ts +++ b/src/vs/platform/ipc/electron-browser/sharedProcessService.ts @@ -10,7 +10,7 @@ export const ISharedProcessService = createDecorator('sha export interface ISharedProcessService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getChannel(channelName: string): IChannel; registerChannel(channelName: string, channel: IServerChannel): void; diff --git a/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts b/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts index db654a3b12..4ac5810377 100644 --- a/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts +++ b/src/vs/platform/ipc/electron-main/sharedProcessMainService.ts @@ -9,7 +9,7 @@ export const ISharedProcessMainService = createDecorator; toggleSharedProcessWindow(): Promise; @@ -22,7 +22,7 @@ export interface ISharedProcess { export class SharedProcessMainService implements ISharedProcessMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private sharedProcess: ISharedProcess) { } diff --git a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts index 0e914631a9..a6f54d0afa 100644 --- a/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts +++ b/src/vs/platform/ipc/electron-sandbox/mainProcessService.ts @@ -12,7 +12,7 @@ export const IMainProcessService = createDecorator('mainPro export interface IMainProcessService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getChannel(channelName: string): IChannel; @@ -21,7 +21,7 @@ export interface IMainProcessService { export class MainProcessService extends Disposable implements IMainProcessService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private mainProcessConnection: Client; diff --git a/src/vs/platform/issue/common/issue.ts b/src/vs/platform/issue/common/issue.ts index 3dfa3f79ce..fd0c92f823 100644 --- a/src/vs/platform/issue/common/issue.ts +++ b/src/vs/platform/issue/common/issue.ts @@ -88,7 +88,7 @@ export interface ProcessExplorerData extends WindowData { } export interface ICommonIssueService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; openReporter(data: IssueReporterData): Promise; openProcessExplorer(data: ProcessExplorerData): Promise; getSystemStatus(): Promise; diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts index 53547af445..a8d8cc969e 100644 --- a/src/vs/platform/issue/electron-main/issueMainService.ts +++ b/src/vs/platform/issue/electron-main/issueMainService.ts @@ -28,7 +28,7 @@ export const IIssueMainService = createDecorator('issueMainSe export interface IIssueMainService extends ICommonIssueService { } export class IssueMainService implements ICommonIssueService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; _issueWindow: BrowserWindow | null = null; _issueParentWindow: BrowserWindow | null = null; _processExplorerWindow: BrowserWindow | null = null; @@ -196,7 +196,8 @@ export class IssueMainService implements ICommonIssueService { webPreferences: { preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, - enableWebSQL: false + enableWebSQL: false, + nativeWindowOpen: true } }); @@ -247,7 +248,8 @@ export class IssueMainService implements ICommonIssueService { webPreferences: { preload: URI.parse(require.toUrl('vs/base/parts/sandbox/electron-browser/preload.js')).fsPath, nodeIntegration: true, - enableWebSQL: false + enableWebSQL: false, + nativeWindowOpen: true } }); diff --git a/src/vs/platform/keybinding/common/keybinding.ts b/src/vs/platform/keybinding/common/keybinding.ts index 2aeac6ec9c..876d804532 100644 --- a/src/vs/platform/keybinding/common/keybinding.ts +++ b/src/vs/platform/keybinding/common/keybinding.ts @@ -48,7 +48,7 @@ export interface KeybindingsSchemaContribution { export const IKeybindingService = createDecorator('keybindingService'); export interface IKeybindingService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly inChordMode: boolean; diff --git a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts index f5f73be960..2b6b260a0f 100644 --- a/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts +++ b/src/vs/platform/keybinding/test/common/keybindingLabels.test.ts @@ -167,4 +167,7 @@ suite('KeybindingLabels', () => { assertElectronAcceleratorLabel(OperatingSystem.Macintosh, KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_A, KeyMod.CtrlCmd | KeyCode.KEY_B), 'cmd+a cmd+b'); }); + test('issue #91235: Do not end with a +', () => { + assertUSLabel(OperatingSystem.Windows, KeyMod.CtrlCmd | KeyMod.Alt | KeyCode.Alt, 'Ctrl+Alt'); + }); }); diff --git a/src/vs/platform/label/common/label.ts b/src/vs/platform/label/common/label.ts index c08d6a9d3a..913e2585ff 100644 --- a/src/vs/platform/label/common/label.ts +++ b/src/vs/platform/label/common/label.ts @@ -12,8 +12,12 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderW import { localize } from 'vs/nls'; import { isEqualOrParent, basename } from 'vs/base/common/resources'; +export const ILabelService = createDecorator('labelService'); + export interface ILabelService { - _serviceBrand: undefined; + + readonly _serviceBrand: undefined; + /** * Gets the human readable label for a uri. * If relative is passed returns a label relative to the workspace root that the uri belongs to. @@ -24,6 +28,7 @@ export interface ILabelService { getWorkspaceLabel(workspace: (IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | IWorkspace), options?: { verbose: boolean }): string; getHostLabel(scheme: string, authority?: string): string; getSeparator(scheme: string, authority?: string): '/' | '\\'; + registerFormatter(formatter: ResourceLabelFormatter): IDisposable; onDidChangeFormatters: Event; } @@ -48,12 +53,11 @@ export interface ResourceLabelFormatting { authorityPrefix?: string; } -const LABEL_SERVICE_ID = 'label'; - export function getSimpleWorkspaceLabel(workspace: IWorkspaceIdentifier | URI, workspaceHome: URI): string { if (isSingleFolderWorkspaceIdentifier(workspace)) { return basename(workspace); } + // Workspace: Untitled if (isEqualOrParent(workspace.configPath, workspaceHome)) { return localize('untitledWorkspace', "Untitled (Workspace)"); @@ -63,8 +67,6 @@ export function getSimpleWorkspaceLabel(workspace: IWorkspaceIdentifier | URI, w if (filename.endsWith(WORKSPACE_EXTENSION)) { filename = filename.substr(0, filename.length - WORKSPACE_EXTENSION.length - 1); } + return localize('workspaceName', "{0} (Workspace)", filename); } - - -export const ILabelService = createDecorator(LABEL_SERVICE_ID); diff --git a/src/vs/platform/launch/electron-main/launchMainService.ts b/src/vs/platform/launch/electron-main/launchMainService.ts index 11e0d3bfc5..3c560e1d32 100644 --- a/src/vs/platform/launch/electron-main/launchMainService.ts +++ b/src/vs/platform/launch/electron-main/launchMainService.ts @@ -51,7 +51,7 @@ function parseOpenUrl(args: ParsedArgs): URI[] { } export interface ILaunchMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; start(args: ParsedArgs, userEnv: IProcessEnvironment): Promise; getMainProcessId(): Promise; getMainProcessInfo(): Promise; @@ -60,7 +60,7 @@ export interface ILaunchMainService { export class LaunchMainService implements ILaunchMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ILogService private readonly logService: ILogService, diff --git a/src/vs/platform/layout/browser/layoutService.ts b/src/vs/platform/layout/browser/layoutService.ts index cba10389fb..46a6a11167 100644 --- a/src/vs/platform/layout/browser/layoutService.ts +++ b/src/vs/platform/layout/browser/layoutService.ts @@ -11,7 +11,7 @@ export const ILayoutService = createDecorator('layoutService'); export interface ILayoutService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * The dimensions of the container. diff --git a/src/vs/platform/lifecycle/common/lifecycle.ts b/src/vs/platform/lifecycle/common/lifecycle.ts index 266e48d6ab..c8cf6d67f1 100644 --- a/src/vs/platform/lifecycle/common/lifecycle.ts +++ b/src/vs/platform/lifecycle/common/lifecycle.ts @@ -123,7 +123,7 @@ export function LifecyclePhaseToString(phase: LifecyclePhase) { */ export interface ILifecycleService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Value indicates how this window got loaded. diff --git a/src/vs/platform/lifecycle/common/lifecycleService.ts b/src/vs/platform/lifecycle/common/lifecycleService.ts index 9fd995dad5..8f52b32cdf 100644 --- a/src/vs/platform/lifecycle/common/lifecycleService.ts +++ b/src/vs/platform/lifecycle/common/lifecycleService.ts @@ -12,7 +12,7 @@ import { mark } from 'vs/base/common/performance'; export abstract class AbstractLifecycleService extends Disposable implements ILifecycleService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; protected readonly _onBeforeShutdown = this._register(new Emitter()); readonly onBeforeShutdown = this._onBeforeShutdown.event; diff --git a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts index 1a3f58f8ee..d297b5b4a3 100644 --- a/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts +++ b/src/vs/platform/lifecycle/electron-main/lifecycleMainService.ts @@ -41,7 +41,7 @@ export interface ShutdownEvent { export interface ILifecycleMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Will be true if the program was restarted (e.g. due to explicit request or update). @@ -137,7 +137,7 @@ export const enum LifecycleMainPhase { export class LifecycleMainService extends Disposable implements ILifecycleMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly QUIT_FROM_RESTART_MARKER = 'quit.from.restart'; // use a marker to find out if the session was restarted diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 17ec57e0d4..0184293387 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -6,68 +6,64 @@ import { createStyleSheet } from 'vs/base/browser/dom'; import { IListMouseEvent, IListTouchEvent, IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer, PagedList, IPagedListOptions } from 'vs/base/browser/ui/list/listPaging'; -import { DefaultStyleController, IListOptions, IMultipleSelectionController, IOpenController, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, List, IListAccessibilityProvider, IListOptionsUpdate } from 'vs/base/browser/ui/list/listWidget'; +import { DefaultStyleController, IListOptions, IMultipleSelectionController, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, List, IListAccessibilityProvider, IListOptionsUpdate } from 'vs/base/browser/ui/list/listWidget'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, dispose, IDisposable, toDisposable, DisposableStore, combinedDisposable } from 'vs/base/common/lifecycle'; -import { ScrollbarVisibility } from 'vs/base/common/scrollable'; -import { isUndefinedOrNull } from 'vs/base/common/types'; -import { ITree, ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; -import { ClickBehavior, DefaultController, DefaultTreestyler, IControllerOptions, OpenMode } from 'vs/base/parts/tree/browser/treeDefaults'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { localize } from 'vs/nls'; -import { IConfigurationService, getMigratedSettingValue } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Registry } from 'vs/platform/registry/common/platform'; import { attachListStyler, computeStyles, defaultListStyles, IColorMapping } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { InputFocusedContextKey } from 'vs/platform/contextkey/common/contextkeys'; import { ObjectTree, IObjectTreeOptions, ICompressibleTreeRenderer, CompressibleObjectTree, ICompressibleObjectTreeOptions, ICompressibleObjectTreeOptionsUpdate } from 'vs/base/browser/ui/tree/objectTree'; -import { ITreeRenderer, IAsyncDataSource, IDataSource } from 'vs/base/browser/ui/tree/tree'; +import { ITreeRenderer, IAsyncDataSource, IDataSource, ITreeEvent } from 'vs/base/browser/ui/tree/tree'; import { AsyncDataTree, IAsyncDataTreeOptions, CompressibleAsyncDataTree, ITreeCompressionDelegate, ICompressibleAsyncDataTreeOptions, IAsyncDataTreeOptionsUpdate } from 'vs/base/browser/ui/tree/asyncDataTree'; import { DataTree, IDataTreeOptions } from 'vs/base/browser/ui/tree/dataTree'; import { IKeyboardNavigationEventFilter, IAbstractTreeOptions, RenderIndentGuides, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; -export type ListWidget = List | PagedList | ITree | ObjectTree | DataTree | AsyncDataTree; +export type ListWidget = List | PagedList | ObjectTree | DataTree | AsyncDataTree; +export type WorkbenchListWidget = WorkbenchList | WorkbenchPagedList | WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree; export const IListService = createDecorator('listService'); export interface IListService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Returns the currently focused list widget if any. */ - readonly lastFocusedList: ListWidget | undefined; + readonly lastFocusedList: WorkbenchListWidget | undefined; } interface IRegisteredList { - widget: ListWidget; + widget: WorkbenchListWidget; extraContextKeys?: (IContextKey)[]; } export class ListService implements IListService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private disposables = new DisposableStore(); private lists: IRegisteredList[] = []; - private _lastFocusedWidget: ListWidget | undefined = undefined; + private _lastFocusedWidget: WorkbenchListWidget | undefined = undefined; private _hasCreatedStyleController: boolean = false; - get lastFocusedList(): ListWidget | undefined { + get lastFocusedList(): WorkbenchListWidget | undefined { return this._lastFocusedWidget; } constructor(@IThemeService private readonly _themeService: IThemeService) { } - register(widget: ListWidget, extraContextKeys?: (IContextKey)[]): IDisposable { + register(widget: WorkbenchListWidget, extraContextKeys?: (IContextKey)[]): IDisposable { if (!this._hasCreatedStyleController) { this._hasCreatedStyleController = true; // create a shared default tree style sheet for performance reasons @@ -131,18 +127,10 @@ const treeIndentKey = 'workbench.tree.indent'; const treeRenderIndentGuidesKey = 'workbench.tree.renderIndentGuides'; const listSmoothScrolling = 'workbench.list.smoothScrolling'; -function getHorizontalScrollingSetting(configurationService: IConfigurationService): boolean { - return getMigratedSettingValue(configurationService, horizontalScrollingKey, 'workbench.tree.horizontalScrolling'); -} - function useAltAsMultipleSelectionModifier(configurationService: IConfigurationService): boolean { return configurationService.getValue(multiSelectModifierSettingKey) === 'alt'; } -function useSingleClickToOpen(configurationService: IConfigurationService): boolean { - return configurationService.getValue(openModeSettingKey) !== 'doubleClick'; -} - class MultipleSelectionController extends Disposable implements IMultipleSelectionController { private useAltAsMultipleSelectionModifier: boolean; @@ -175,44 +163,6 @@ class MultipleSelectionController extends Disposable implements IMultipleSele } } -class WorkbenchOpenController extends Disposable implements IOpenController { - private openOnSingleClick: boolean; - - constructor(private configurationService: IConfigurationService, private existingOpenController?: IOpenController) { - super(); - - this.openOnSingleClick = useSingleClickToOpen(configurationService); - - this.registerListeners(); - } - - private registerListeners(): void { - this._register(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(openModeSettingKey)) { - this.openOnSingleClick = useSingleClickToOpen(this.configurationService); - } - })); - } - - shouldOpen(event: UIEvent): boolean { - if (event instanceof MouseEvent) { - const isLeftButton = event.button === 0; - const isDoubleClick = event.detail === 2; - if (isLeftButton && !this.openOnSingleClick && !isDoubleClick) { - return false; - } - - if (isLeftButton /* left mouse button */ || event.button === 1 /* middle mouse button */) { - return this.existingOpenController ? this.existingOpenController.shouldOpen(event) : true; - } - - return false; - } - - return this.existingOpenController ? this.existingOpenController.shouldOpen(event) : true; - } -} - function toWorkbenchListOptions(options: IListOptions, configurationService: IConfigurationService, keybindingService: IKeybindingService): [IListOptions, IDisposable] { const disposables = new DisposableStore(); const result = { ...options }; @@ -223,10 +173,6 @@ function toWorkbenchListOptions(options: IListOptions, configurationServic disposables.add(multipleSelectionController); } - const openController = new WorkbenchOpenController(configurationService, options.openController); - result.openController = openController; - disposables.add(openController); - result.keyboardNavigationDelegate = { mightProducePrintableCharacter(e) { return keybindingService.mightProducePrintableCharacter(e); @@ -253,6 +199,7 @@ export class WorkbenchList extends List { private listHasSelectionOrFocus: IContextKey; private listDoubleSelection: IContextKey; private listMultiSelection: IContextKey; + private horizontalScrolling: boolean | undefined; private _styler: IDisposable | undefined; private _useAltAsMultipleSelectionModifier: boolean; @@ -269,7 +216,7 @@ export class WorkbenchList extends List { @IConfigurationService configurationService: IConfigurationService, @IKeybindingService keybindingService: IKeybindingService ) { - const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : getHorizontalScrollingSetting(configurationService); + const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : configurationService.getValue(horizontalScrollingKey); const [workbenchListOptions, workbenchListOptionsDisposable] = toWorkbenchListOptions(options, configurationService, keybindingService); super(user, container, delegate, renderers, @@ -293,6 +240,7 @@ export class WorkbenchList extends List { this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService); this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); + this.horizontalScrolling = options.horizontalScrolling; this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); @@ -349,6 +297,10 @@ export class WorkbenchList extends List { if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); } + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) { + const horizontalScrolling = this.configurationService.getValue(horizontalScrollingKey); + this.updateOptions({ horizontalScrolling }); + } })); } @@ -369,6 +321,7 @@ export class WorkbenchPagedList extends PagedList { private readonly disposables: DisposableStore; private _useAltAsMultipleSelectionModifier: boolean; + private horizontalScrolling: boolean | undefined; constructor( user: string, @@ -382,7 +335,7 @@ export class WorkbenchPagedList extends PagedList { @IConfigurationService configurationService: IConfigurationService, @IKeybindingService keybindingService: IKeybindingService ) { - const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : getHorizontalScrollingSetting(configurationService); + const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : configurationService.getValue(horizontalScrollingKey); const [workbenchListOptions, workbenchListOptionsDisposable] = toWorkbenchListOptions(options, configurationService, keybindingService); super(user, container, delegate, renderers, { @@ -398,6 +351,7 @@ export class WorkbenchPagedList extends PagedList { this.contextKeyService = createScopedContextKeyService(contextKeyService, this); this.configurationService = configurationService; + this.horizontalScrolling = options.horizontalScrolling; const listSupportsMultiSelect = WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); listSupportsMultiSelect.set(!(options.multipleSelectionSupport === false)); @@ -419,6 +373,10 @@ export class WorkbenchPagedList extends PagedList { if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(this.configurationService); } + if (e.affectsConfiguration(horizontalScrollingKey) && this.horizontalScrolling === undefined) { + const horizontalScrolling = this.configurationService.getValue(horizontalScrollingKey); + this.updateOptions({ horizontalScrolling }); + } })); } @@ -433,182 +391,6 @@ export class WorkbenchPagedList extends PagedList { } } -/** - * @deprecated - */ -let sharedTreeStyleSheet: HTMLStyleElement; -function getSharedTreeStyleSheet(): HTMLStyleElement { - if (!sharedTreeStyleSheet) { - sharedTreeStyleSheet = createStyleSheet(); - } - - return sharedTreeStyleSheet; -} - -/** - * @deprecated - */ -function handleTreeController(configuration: ITreeConfiguration, instantiationService: IInstantiationService): ITreeConfiguration { - if (!configuration.controller) { - configuration.controller = instantiationService.createInstance(WorkbenchTreeController, {}); - } - - if (!configuration.styler) { - configuration.styler = new DefaultTreestyler(getSharedTreeStyleSheet()); - } - - return configuration; -} - -/** - * @deprecated - */ -export class WorkbenchTree extends Tree { - - readonly contextKeyService: IContextKeyService; - - protected disposables: IDisposable[]; - - private listHasSelectionOrFocus: IContextKey; - private listDoubleSelection: IContextKey; - private listMultiSelection: IContextKey; - - private _openOnSingleClick: boolean; - private _useAltAsMultipleSelectionModifier: boolean; - - constructor( - container: HTMLElement, - configuration: ITreeConfiguration, - options: ITreeOptions | undefined, - @IContextKeyService contextKeyService: IContextKeyService, - @IListService listService: IListService, - @IThemeService themeService: IThemeService, - @IInstantiationService instantiationService: IInstantiationService, - @IConfigurationService configurationService: IConfigurationService - ) { - const config = handleTreeController(configuration, instantiationService); - const horizontalScrollMode = configurationService.getValue(horizontalScrollingKey) ? ScrollbarVisibility.Auto : ScrollbarVisibility.Hidden; - const opts = { - horizontalScrollMode, - keyboardSupport: false, - ...computeStyles(themeService.getColorTheme(), defaultListStyles), - ...options - }; - - super(container, config, opts); - - this.disposables = []; - this.contextKeyService = createScopedContextKeyService(contextKeyService, this); - - WorkbenchListSupportsMultiSelectContextKey.bindTo(this.contextKeyService); - - this.listHasSelectionOrFocus = WorkbenchListHasSelectionOrFocus.bindTo(this.contextKeyService); - this.listDoubleSelection = WorkbenchListDoubleSelection.bindTo(this.contextKeyService); - this.listMultiSelection = WorkbenchListMultiSelection.bindTo(this.contextKeyService); - - this._openOnSingleClick = useSingleClickToOpen(configurationService); - this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); - - this.disposables.push( - this.contextKeyService, - (listService as ListService).register(this), - attachListStyler(this, themeService) - ); - - this.disposables.push(this.onDidChangeSelection(() => { - const selection = this.getSelection(); - const focus = this.getFocus(); - - this.listHasSelectionOrFocus.set((selection && selection.length > 0) || !!focus); - this.listDoubleSelection.set(selection && selection.length === 2); - this.listMultiSelection.set(selection && selection.length > 1); - })); - - this.disposables.push(this.onDidChangeFocus(() => { - const selection = this.getSelection(); - const focus = this.getFocus(); - - this.listHasSelectionOrFocus.set((selection && selection.length > 0) || !!focus); - })); - - this.disposables.push(configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(openModeSettingKey)) { - this._openOnSingleClick = useSingleClickToOpen(configurationService); - } - - if (e.affectsConfiguration(multiSelectModifierSettingKey)) { - this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); - } - })); - } - - get openOnSingleClick(): boolean { - return this._openOnSingleClick; - } - - get useAltAsMultipleSelectionModifier(): boolean { - return this._useAltAsMultipleSelectionModifier; - } - - dispose(): void { - super.dispose(); - - this.disposables = dispose(this.disposables); - } -} - -/** - * @deprecated - */ -function massageControllerOptions(options: IControllerOptions): IControllerOptions { - if (typeof options.keyboardSupport !== 'boolean') { - options.keyboardSupport = false; - } - - if (typeof options.clickBehavior !== 'number') { - options.clickBehavior = ClickBehavior.ON_MOUSE_DOWN; - } - - return options; -} - -/** - * @deprecated - */ -export class WorkbenchTreeController extends DefaultController { - - protected readonly disposables = new DisposableStore(); - - constructor( - options: IControllerOptions, - @IConfigurationService private readonly configurationService: IConfigurationService - ) { - super(massageControllerOptions(options)); - - // if the open mode is not set, we configure it based on settings - if (isUndefinedOrNull(options.openMode)) { - this.setOpenMode(this.getOpenModeSetting()); - this.registerListeners(); - } - } - - private registerListeners(): void { - this.disposables.add(this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration(openModeSettingKey)) { - this.setOpenMode(this.getOpenModeSetting()); - } - })); - } - - private getOpenModeSetting(): OpenMode { - return useSingleClickToOpen(this.configurationService) ? OpenMode.SINGLE_CLICK : OpenMode.DOUBLE_CLICK; - } - - dispose(): void { - this.disposables.dispose(); - } -} - export interface IOpenResourceOptions { editorOptions: IEditorOptions; sideBySide: boolean; @@ -628,8 +410,8 @@ export interface IOpenEvent { } export interface IResourceNavigatorOptions { + readonly configurationService?: IConfigurationService; readonly openOnFocus?: boolean; - readonly openOnSelection?: boolean; readonly openOnSingleClick?: boolean; } @@ -646,101 +428,119 @@ export function getSelectionKeyboardEvent(typeArg = 'keydown', preserveFocus?: b abstract class ResourceNavigator extends Disposable { - private readonly options: IResourceNavigatorOptions; + private readonly openOnFocus: boolean; + private openOnSingleClick: boolean; - private readonly _onDidOpenResource = new Emitter>(); - readonly onDidOpenResource: Event> = this._onDidOpenResource.event; + private readonly _onDidOpen = new Emitter>(); + readonly onDidOpen: Event> = this._onDidOpen.event; constructor( - private readonly treeOrList: { - getFocus(): (T | null)[], - getSelection(): (T | null)[], - setSelection(elements: (T | null)[], browserEvent?: UIEvent): void, - onDidChangeFocus: Event<{ browserEvent?: UIEvent }>, - onDidChangeSelection: Event<{ browserEvent?: UIEvent }>, - onDidOpen: Event<{ browserEvent?: UIEvent }>, - readonly openOnSingleClick?: boolean - }, + private readonly widget: ListWidget, options?: IResourceNavigatorOptions ) { super(); - this.options = { openOnSelection: true, ...(options || {}) }; + this.openOnFocus = options?.openOnFocus ?? false; + this.openOnSingleClick = options?.openOnSingleClick ?? true; - this.registerListeners(); - } + this._register(Event.filter(this.widget.onDidChangeSelection, e => e.browserEvent instanceof KeyboardEvent)(e => this.onSelectionFromKeyboard(e))); + this._register(this.widget.onPointer((e: { browserEvent: MouseEvent }) => this.onPointer(e.browserEvent))); + this._register(this.widget.onMouseDblClick((e: { browserEvent: MouseEvent }) => this.onMouseDblClick(e.browserEvent))); - private registerListeners(): void { - if (this.options && this.options.openOnFocus) { - this._register(this.treeOrList.onDidChangeFocus(e => this.onFocus(e.browserEvent))); + if (this.openOnFocus) { + this._register(Event.filter(this.widget.onDidChangeFocus, e => e.browserEvent instanceof KeyboardEvent)(e => this.onFocusFromKeyboard(e))); } - if (this.options && this.options.openOnSelection) { - this._register(this.treeOrList.onDidChangeSelection(e => this.onSelection(e.browserEvent))); + if (typeof options?.openOnSingleClick !== 'boolean' && options?.configurationService) { + this._register(options?.configurationService.onDidChangeConfiguration(() => { + this.openOnSingleClick = options?.configurationService!.getValue(openModeSettingKey) !== 'doubleClick'; + })); } - - this._register(this.treeOrList.onDidOpen(e => this.onSelection(e.browserEvent))); } - private onFocus(browserEvent?: UIEvent): void { - const focus = this.treeOrList.getFocus(); - this.treeOrList.setSelection(focus, browserEvent); + private onFocusFromKeyboard(event: ITreeEvent): void { + const focus = this.widget.getFocus(); + this.widget.setSelection(focus, event.browserEvent); + const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true; + const pinned = false; + const sideBySide = false; + + this._open(preserveFocus, pinned, sideBySide, event.browserEvent); + } + + private onSelectionFromKeyboard(event: ITreeEvent): void { + if (event.elements.length !== 1) { + return; + } + + const preserveFocus = typeof (event.browserEvent as SelectionKeyboardEvent).preserveFocus === 'boolean' ? (event.browserEvent as SelectionKeyboardEvent).preserveFocus! : true; + const pinned = false; + const sideBySide = false; + + this._open(preserveFocus, pinned, sideBySide, event.browserEvent); + } + + private onPointer(browserEvent: MouseEvent): void { + const isDoubleClick = browserEvent.detail === 2; + + if (!this.openOnSingleClick && !isDoubleClick) { + return; + } + + const isMiddleClick = browserEvent.button === 1; + const preserveFocus = !isDoubleClick; + const pinned = isDoubleClick || isMiddleClick; + const sideBySide = browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey; + + this._open(preserveFocus, pinned, sideBySide, browserEvent); + } + + private onMouseDblClick(browserEvent?: MouseEvent): void { if (!browserEvent) { return; } - const isMouseEvent = browserEvent && browserEvent instanceof MouseEvent; + const preserveFocus = false; + const pinned = true; + const sideBySide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); - if (!isMouseEvent) { - const preserveFocus = (browserEvent instanceof KeyboardEvent && typeof (browserEvent).preserveFocus === 'boolean') ? - !!(browserEvent).preserveFocus : - true; - - this.open(preserveFocus, false, false, browserEvent); - } + this._open(preserveFocus, pinned, sideBySide, browserEvent); } - private onSelection(browserEvent?: MouseEvent | UIEvent): void { - if (!browserEvent || browserEvent.type === 'contextmenu') { - return; - } - - const isKeyboardEvent = browserEvent instanceof KeyboardEvent; - const isMiddleClick = browserEvent instanceof MouseEvent ? browserEvent.button === 1 : false; - const isDoubleClick = browserEvent.detail === 2; - const preserveFocus = (browserEvent instanceof KeyboardEvent && typeof (browserEvent).preserveFocus === 'boolean') ? - !!(browserEvent).preserveFocus : - !isDoubleClick; - - if (this.options.openOnSingleClick || this.treeOrList.openOnSingleClick || isDoubleClick || isKeyboardEvent) { - const sideBySide = browserEvent instanceof MouseEvent && (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); - this.open(preserveFocus, isDoubleClick || isMiddleClick, sideBySide, browserEvent); - } - } - - private open(preserveFocus: boolean, pinned: boolean, sideBySide: boolean, browserEvent?: UIEvent): void { - this._onDidOpenResource.fire({ + private _open(preserveFocus: boolean, pinned: boolean, sideBySide: boolean, browserEvent?: UIEvent): void { + this._onDidOpen.fire({ editorOptions: { preserveFocus, pinned, revealIfVisible: true }, sideBySide, - element: this.treeOrList.getSelection()[0], + element: this.widget.getSelection()[0], browserEvent }); } + + // hack for References Widget: pressing Enter on already selected tree element + open(browserEvent?: UIEvent): void { + this._open((browserEvent as any)?.preserveFocus || false, true, false, browserEvent); + } } export class ListResourceNavigator extends ResourceNavigator { - constructor(list: WorkbenchList | WorkbenchPagedList, options?: IResourceNavigatorOptions) { + constructor( + list: List | PagedList, + options?: IResourceNavigatorOptions + ) { super(list, options); } } -export class TreeResourceNavigator extends ResourceNavigator { - constructor(tree: WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, options: IResourceNavigatorOptions = {}) { +class TreeResourceNavigator extends ResourceNavigator { + constructor( + tree: ObjectTree | CompressibleObjectTree | DataTree | AsyncDataTree | CompressibleAsyncDataTree, + options: IResourceNavigatorOptions + ) { super(tree, options); } } @@ -766,7 +566,7 @@ function createKeyboardNavigationEventFilter(container: HTMLElement, keybindingS }; } -export interface IWorkbenchObjectTreeOptions extends IObjectTreeOptions { +export interface IWorkbenchObjectTreeOptions extends IObjectTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; readonly overrideStyles?: IColorMapping; } @@ -776,6 +576,7 @@ export class WorkbenchObjectTree, TFilterData = void> private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -793,16 +594,20 @@ export class WorkbenchObjectTree, TFilterData = void> const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble>(container, options, contextKeyService, configurationService, keybindingService, accessibilityService); super(user, container, delegate, renderers, treeOptions); this.disposables.add(disposable); - this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); + this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } export interface IWorkbenchCompressibleObjectTreeOptionsUpdate extends ICompressibleObjectTreeOptionsUpdate { readonly overrideStyles?: IColorMapping; } -export interface IWorkbenchCompressibleObjectTreeOptions extends IWorkbenchCompressibleObjectTreeOptionsUpdate, ICompressibleObjectTreeOptions { +export interface IWorkbenchCompressibleObjectTreeOptions extends IWorkbenchCompressibleObjectTreeOptionsUpdate, ICompressibleObjectTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -811,6 +616,7 @@ export class WorkbenchCompressibleObjectTree, TFilter private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -828,7 +634,7 @@ export class WorkbenchCompressibleObjectTree, TFilter const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble>(container, options, contextKeyService, configurationService, keybindingService, accessibilityService); super(user, container, delegate, renderers, treeOptions); this.disposables.add(disposable); - this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); + this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } @@ -839,13 +645,17 @@ export class WorkbenchCompressibleObjectTree, TFilter this.internals.updateStyleOverrides(options.overrideStyles); } } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } export interface IWorkbenchDataTreeOptionsUpdate extends IAbstractTreeOptionsUpdate { readonly overrideStyles?: IColorMapping; } -export interface IWorkbenchDataTreeOptions extends IWorkbenchDataTreeOptionsUpdate, IDataTreeOptions { +export interface IWorkbenchDataTreeOptions extends IWorkbenchDataTreeOptionsUpdate, IDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -854,6 +664,7 @@ export class WorkbenchDataTree extends DataTree; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -872,7 +683,7 @@ export class WorkbenchDataTree extends DataTree>(container, options, contextKeyService, configurationService, keybindingService, accessibilityService); super(user, container, delegate, renderers, dataSource, treeOptions); this.disposables.add(disposable); - this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); + this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } @@ -883,13 +694,17 @@ export class WorkbenchDataTree extends DataTree extends IWorkbenchAsyncDataTreeOptionsUpdate, IAsyncDataTreeOptions { +export interface IWorkbenchAsyncDataTreeOptions extends IWorkbenchAsyncDataTreeOptionsUpdate, IAsyncDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; } @@ -898,6 +713,7 @@ export class WorkbenchAsyncDataTree extends Async private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -916,7 +732,7 @@ export class WorkbenchAsyncDataTree extends Async const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble>(container, options, contextKeyService, configurationService, keybindingService, accessibilityService); super(user, container, delegate, renderers, dataSource, treeOptions); this.disposables.add(disposable); - this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); + this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } @@ -927,9 +743,13 @@ export class WorkbenchAsyncDataTree extends Async this.internals.updateStyleOverrides(options.overrideStyles); } } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } -export interface IWorkbenchCompressibleAsyncDataTreeOptions extends ICompressibleAsyncDataTreeOptions { +export interface IWorkbenchCompressibleAsyncDataTreeOptions extends ICompressibleAsyncDataTreeOptions, IResourceNavigatorOptions { readonly accessibilityProvider: IListAccessibilityProvider; readonly overrideStyles?: IColorMapping; } @@ -939,6 +759,7 @@ export class WorkbenchCompressibleAsyncDataTree e private internals: WorkbenchTreeInternals; get contextKeyService(): IContextKeyService { return this.internals.contextKeyService; } get useAltAsMultipleSelectionModifier(): boolean { return this.internals.useAltAsMultipleSelectionModifier; } + get onDidOpen(): Event> { return this.internals.onDidOpen; } constructor( user: string, @@ -958,9 +779,13 @@ export class WorkbenchCompressibleAsyncDataTree e const { options: treeOptions, getAutomaticKeyboardNavigation, disposable } = workbenchTreeDataPreamble>(container, options, contextKeyService, configurationService, keybindingService, accessibilityService); super(user, container, virtualDelegate, compressionDelegate, renderers, dataSource, treeOptions); this.disposables.add(disposable); - this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); + this.internals = new WorkbenchTreeInternals(this, options, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService); this.disposables.add(this.internals); } + + open(browserEvent?: UIEvent): void { + this.internals.open(browserEvent); + } } function workbenchTreeDataPreamble | IAsyncDataTreeOptions>( @@ -991,8 +816,7 @@ function workbenchTreeDataPreamble(keyboardNavigationSettingKey); - const horizontalScrolling = typeof options.horizontalScrolling !== 'undefined' ? options.horizontalScrolling : getHorizontalScrollingSetting(configurationService); - const openOnSingleClick = useSingleClickToOpen(configurationService); + const horizontalScrolling = options.horizontalScrolling !== undefined ? options.horizontalScrolling : configurationService.getValue(horizontalScrollingKey); const [workbenchListOptions, disposable] = toWorkbenchListOptions(options, configurationService, keybindingService); const additionalScrollHeight = options.additionalScrollHeight; @@ -1010,7 +834,6 @@ function workbenchTreeDataPreamble { private _useAltAsMultipleSelectionModifier: boolean; private disposables: IDisposable[] = []; private styler: IDisposable | undefined; + private navigator: TreeResourceNavigator; + + get onDidOpen(): Event> { return this.navigator.onDidOpen; } constructor( - private tree: WorkbenchObjectTree | CompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, - options: IAbstractTreeOptions | IAsyncDataTreeOptions, + private tree: WorkbenchObjectTree | WorkbenchCompressibleObjectTree | WorkbenchDataTree | WorkbenchAsyncDataTree | WorkbenchCompressibleAsyncDataTree, + options: IWorkbenchObjectTreeOptions | IWorkbenchCompressibleObjectTreeOptions | IWorkbenchDataTreeOptions | IWorkbenchAsyncDataTreeOptions | IWorkbenchCompressibleAsyncDataTreeOptions, getAutomaticKeyboardNavigation: () => boolean | undefined, overrideStyles: IColorMapping | undefined, @IContextKeyService contextKeyService: IContextKeyService, @@ -1081,33 +907,34 @@ class WorkbenchTreeInternals { this.hasSelectionOrFocus.set(selection.length > 0 || focus.length > 0); }), configurationService.onDidChangeConfiguration(e => { - let options: any = {}; - if (e.affectsConfiguration(openModeSettingKey)) { - options = { ...options, openOnSingleClick: useSingleClickToOpen(configurationService) }; - } + let newOptions: any = {}; if (e.affectsConfiguration(multiSelectModifierSettingKey)) { this._useAltAsMultipleSelectionModifier = useAltAsMultipleSelectionModifier(configurationService); } if (e.affectsConfiguration(treeIndentKey)) { const indent = configurationService.getValue(treeIndentKey); - options = { ...options, indent }; + newOptions = { ...newOptions, indent }; } if (e.affectsConfiguration(treeRenderIndentGuidesKey)) { const renderIndentGuides = configurationService.getValue(treeRenderIndentGuidesKey); - options = { ...options, renderIndentGuides }; + newOptions = { ...newOptions, renderIndentGuides }; } if (e.affectsConfiguration(listSmoothScrolling)) { const smoothScrolling = configurationService.getValue(listSmoothScrolling); - options = { ...options, smoothScrolling }; + newOptions = { ...newOptions, smoothScrolling }; } if (e.affectsConfiguration(keyboardNavigationSettingKey)) { updateKeyboardNavigation(); } if (e.affectsConfiguration(automaticKeyboardNavigationSettingKey)) { - options = { ...options, automaticKeyboardNavigation: getAutomaticKeyboardNavigation() }; + newOptions = { ...newOptions, automaticKeyboardNavigation: getAutomaticKeyboardNavigation() }; } - if (Object.keys(options).length > 0) { - tree.updateOptions(options); + if (e.affectsConfiguration(horizontalScrollingKey) && options.horizontalScrolling === undefined) { + const horizontalScrolling = configurationService.getValue(horizontalScrollingKey); + newOptions = { ...newOptions, horizontalScrolling }; + } + if (Object.keys(newOptions).length > 0) { + tree.updateOptions(newOptions); } }), this.contextKeyService.onDidChangeContext(e => { @@ -1117,6 +944,9 @@ class WorkbenchTreeInternals { }), accessibilityService.onDidChangeScreenReaderOptimized(() => updateKeyboardNavigation()) ); + + this.navigator = new TreeResourceNavigator(tree, { configurationService, ...options }); + this.disposables.push(this.navigator); } get useAltAsMultipleSelectionModifier(): boolean { @@ -1128,6 +958,10 @@ class WorkbenchTreeInternals { this.styler = overrideStyles ? attachListStyler(this.tree, this.themeService, overrideStyles) : Disposable.None; } + open(browserEvent?: UIEvent): void { + this.navigator.open(browserEvent); + } + dispose(): void { this.disposables = dispose(this.disposables); dispose(this.styler); @@ -1173,12 +1007,6 @@ configurationRegistry.registerConfiguration({ 'default': false, 'description': localize('horizontalScrolling setting', "Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.") }, - 'workbench.tree.horizontalScrolling': { - 'type': 'boolean', - 'default': false, - 'description': localize('tree horizontalScrolling setting', "Controls whether trees support horizontal scrolling in the workbench."), - 'deprecationMessage': localize('deprecated', "This setting is deprecated, please use '{0}' instead.", horizontalScrollingKey) - }, [treeIndentKey]: { 'type': 'number', 'default': 8, diff --git a/src/vs/platform/localizations/common/localizations.ts b/src/vs/platform/localizations/common/localizations.ts index 7a6240eacb..ca701d7ecb 100644 --- a/src/vs/platform/localizations/common/localizations.ts +++ b/src/vs/platform/localizations/common/localizations.ts @@ -19,17 +19,12 @@ export interface ITranslation { path: string; } -export const enum LanguageType { - Core = 1, - Contributed -} - export const ILocalizationsService = createDecorator('localizationsService'); export interface ILocalizationsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidLanguagesChange: Event; - getLanguageIds(type?: LanguageType): Promise; + getLanguageIds(): Promise; } export function isValidLocalization(localization: ILocalization): boolean { @@ -54,4 +49,4 @@ export function isValidLocalization(localization: ILocalization): boolean { return false; } return true; -} \ No newline at end of file +} diff --git a/src/vs/platform/localizations/node/localizations.ts b/src/vs/platform/localizations/node/localizations.ts index 94662663c4..945f16cade 100644 --- a/src/vs/platform/localizations/node/localizations.ts +++ b/src/vs/platform/localizations/node/localizations.ts @@ -12,8 +12,7 @@ import { INativeEnvironmentService } from 'vs/platform/environment/node/environm import { Queue } from 'vs/base/common/async'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ILogService } from 'vs/platform/log/common/log'; -import { isValidLocalization, ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; -import product from 'vs/platform/product/common/product'; +import { isValidLocalization, ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { distinct, equals } from 'vs/base/common/arrays'; import { Event, Emitter } from 'vs/base/common/event'; import { Schemas } from 'vs/base/common/network'; @@ -28,14 +27,9 @@ interface ILanguagePack { translations: { [id: string]: string }; } -const systemLanguages: string[] = ['de', 'en', 'en-US', 'es', 'fr', 'it', 'ja', 'ko', 'ru', 'zh-CN', 'zh-TW']; -if (product.quality !== 'stable') { - systemLanguages.push('hu'); -} - export class LocalizationsService extends Disposable implements ILocalizationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly cache: LanguagePacksCache; @@ -54,13 +48,11 @@ export class LocalizationsService extends Disposable implements ILocalizationsSe this._register(extensionManagementService.onDidUninstallExtension(({ identifier }) => this.onDidUninstallExtension(identifier))); } - getLanguageIds(type: LanguageType): Promise { - if (type === LanguageType.Core) { - return Promise.resolve([...systemLanguages]); - } + getLanguageIds(): Promise { return this.cache.getLanguagePacks() .then(languagePacks => { - const languages = type === LanguageType.Contributed ? Object.keys(languagePacks) : [...systemLanguages, ...Object.keys(languagePacks)]; + // Contributed languages are those installed via extension packs, so does not include English + const languages = ['en', ...Object.keys(languagePacks)]; return distinct(languages); }); } diff --git a/src/vs/platform/log/browser/log.ts b/src/vs/platform/log/browser/log.ts index f9638feb69..6228b0d826 100644 --- a/src/vs/platform/log/browser/log.ts +++ b/src/vs/platform/log/browser/log.ts @@ -18,7 +18,7 @@ export class ConsoleLogInAutomationService extends LogServiceAdapter implements declare codeAutomationLog: any; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { super({ consoleLog: (type, args) => this.consoleLog(type, args) }, logLevel); diff --git a/src/vs/platform/log/common/bufferLog.ts b/src/vs/platform/log/common/bufferLog.ts index 3d74dd0741..cf3c7d6d3b 100644 --- a/src/vs/platform/log/common/bufferLog.ts +++ b/src/vs/platform/log/common/bufferLog.ts @@ -24,7 +24,7 @@ function getLogFunction(logger: ILogService, level: LogLevel): Function { export class BufferLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private buffer: ILog[] = []; private _logger: ILogService | undefined = undefined; diff --git a/src/vs/platform/log/common/fileLogService.ts b/src/vs/platform/log/common/fileLogService.ts index 2462a6b9cf..58fb9e4dd0 100644 --- a/src/vs/platform/log/common/fileLogService.ts +++ b/src/vs/platform/log/common/fileLogService.ts @@ -17,7 +17,7 @@ const MAX_FILE_SIZE = 1024 * 1024 * 5; export class FileLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly initializePromise: Promise; private readonly queue: Queue; @@ -157,7 +157,7 @@ export class FileLogService extends AbstractLogService implements ILogService { export class FileLoggerService extends Disposable implements ILoggerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly loggers = new Map(); diff --git a/src/vs/platform/log/common/log.ts b/src/vs/platform/log/common/log.ts index 916700adc0..c052fd9fe1 100644 --- a/src/vs/platform/log/common/log.ts +++ b/src/vs/platform/log/common/log.ts @@ -50,11 +50,11 @@ export interface ILogger extends IDisposable { } export interface ILogService extends ILogger { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } export interface ILoggerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getLogger(file: URI): ILogger; } @@ -80,7 +80,7 @@ export abstract class AbstractLogService extends Disposable { export class ConsoleLogMainService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private useColors: boolean; constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { @@ -161,7 +161,7 @@ export class ConsoleLogMainService extends AbstractLogService implements ILogSer export class ConsoleLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(logLevel: LogLevel = DEFAULT_LOG_LEVEL) { super(); @@ -215,7 +215,7 @@ export class ConsoleLogService extends AbstractLogService implements ILogService export class LogServiceAdapter extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly adapter: { consoleLog: (type: string, args: any[]) => void }, logLevel: LogLevel = DEFAULT_LOG_LEVEL) { super(); @@ -277,7 +277,7 @@ export class LogServiceAdapter extends AbstractLogService implements ILogService export class ConsoleLogInMainService extends LogServiceAdapter implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(client: LoggerChannelClient, logLevel: LogLevel = DEFAULT_LOG_LEVEL) { super({ consoleLog: (type, args) => client.consoleLog(type, args) }, logLevel); @@ -285,7 +285,7 @@ export class ConsoleLogInMainService extends LogServiceAdapter implements ILogSe } export class MultiplexLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly logServices: ReadonlyArray) { super(); @@ -351,7 +351,7 @@ export class MultiplexLogService extends AbstractLogService implements ILogServi } export class DelegatedLogService extends Disposable implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private logService: ILogService) { super(); @@ -400,7 +400,7 @@ export class DelegatedLogService extends Disposable implements ILogService { } export class NullLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly onDidChangeLogLevel: Event = new Emitter().event; setLevel(level: LogLevel): void { } getLevel(): LogLevel { return LogLevel.Info; } diff --git a/src/vs/platform/log/common/logIpc.ts b/src/vs/platform/log/common/logIpc.ts index abbc7f78bc..55aafb0ebe 100644 --- a/src/vs/platform/log/common/logIpc.ts +++ b/src/vs/platform/log/common/logIpc.ts @@ -73,7 +73,7 @@ export class LoggerChannelClient { } export class FollowerLogService extends DelegatedLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private master: LoggerChannelClient, logService: ILogService) { super(logService); diff --git a/src/vs/platform/log/node/loggerService.ts b/src/vs/platform/log/node/loggerService.ts index 5fd73bfcc5..e465db7471 100644 --- a/src/vs/platform/log/node/loggerService.ts +++ b/src/vs/platform/log/node/loggerService.ts @@ -14,7 +14,7 @@ import { SpdLogService } from 'vs/platform/log/node/spdlogService'; export class LoggerService extends Disposable implements ILoggerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly loggers = new Map(); diff --git a/src/vs/platform/log/node/spdlogService.ts b/src/vs/platform/log/node/spdlogService.ts index 42158af6d7..a7f49e37ad 100644 --- a/src/vs/platform/log/node/spdlogService.ts +++ b/src/vs/platform/log/node/spdlogService.ts @@ -44,7 +44,7 @@ function log(logger: spdlog.RotatingLogger, level: LogLevel, message: string): v export class SpdLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private buffer: ILog[] = []; private _loggerCreationPromise: Promise | undefined = undefined; diff --git a/src/vs/platform/markers/common/markerService.ts b/src/vs/platform/markers/common/markerService.ts index 577b2c7c29..5af7b1170f 100644 --- a/src/vs/platform/markers/common/markerService.ts +++ b/src/vs/platform/markers/common/markerService.ts @@ -139,7 +139,7 @@ class MarkerStats implements MarkerStatistics { export class MarkerService implements IMarkerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onMarkerChanged = new Emitter(); readonly onMarkerChanged: Event = Event.debounce(this._onMarkerChanged.event, MarkerService._debouncer, 0); diff --git a/src/vs/platform/markers/common/markers.ts b/src/vs/platform/markers/common/markers.ts index 1ce413141c..b1b072c0a7 100644 --- a/src/vs/platform/markers/common/markers.ts +++ b/src/vs/platform/markers/common/markers.ts @@ -10,7 +10,7 @@ import { localize } from 'vs/nls'; import Severity from 'vs/base/common/severity'; export interface IMarkerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getStatistics(): MarkerStatistics; diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index c80c939de7..c80a97d6e2 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -61,7 +61,7 @@ export class Menubar { private keybindings: { [commandId: string]: IMenubarKeybinding }; - private readonly fallbackMenuHandlers: { [id: string]: (menuItem: MenuItem, browserWindow: BrowserWindow, event: Event) => void } = Object.create(null); + private readonly fallbackMenuHandlers: { [id: string]: (menuItem: MenuItem, browserWindow: BrowserWindow | undefined, event: Event) => void } = Object.create(null); constructor( @IUpdateService private readonly updateService: IUpdateService, @@ -113,8 +113,8 @@ export class Menubar { private addFallbackHandlers(): void { // File Menu Items - this.fallbackMenuHandlers['workbench.action.files.newUntitledFile'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win.id }); - this.fallbackMenuHandlers['workbench.action.newWindow'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win.id }); + this.fallbackMenuHandlers['workbench.action.files.newUntitledFile'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win?.id }); + this.fallbackMenuHandlers['workbench.action.newWindow'] = (menuItem, win, event) => this.windowsMainService.openEmptyWindow({ context: OpenContext.MENU, contextWindowId: win?.id }); this.fallbackMenuHandlers['workbench.action.files.openFileFolder'] = (menuItem, win, event) => this.electronMainService.pickFileFolderAndOpen(undefined, { forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }); this.fallbackMenuHandlers['workbench.action.openWorkspace'] = (menuItem, win, event) => this.electronMainService.pickWorkspaceAndOpen(undefined, { forceNewWindow: this.isOptionClick(event), telemetryExtraData: { from: telemetryFrom } }); @@ -433,7 +433,7 @@ export class Menubar { menu.append(__separator__()); } else if (isMenubarMenuItemSubmenu(item)) { const submenu = new Menu(); - const submenuItem = new MenuItem({ label: this.mnemonicLabel(item.label), submenu: submenu }); + const submenuItem = new MenuItem({ label: this.mnemonicLabel(item.label), submenu }); this.setMenu(submenu, item.submenu.items); menu.append(submenuItem); } else if (isMenubarMenuItemUriAction(item)) { diff --git a/src/vs/platform/menubar/electron-main/menubarMainService.ts b/src/vs/platform/menubar/electron-main/menubarMainService.ts index 393fe1525f..4d7e1b1c99 100644 --- a/src/vs/platform/menubar/electron-main/menubarMainService.ts +++ b/src/vs/platform/menubar/electron-main/menubarMainService.ts @@ -12,12 +12,12 @@ import { ILifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle export const IMenubarMainService = createDecorator('menubarMainService'); export interface IMenubarMainService extends ICommonMenubarService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } export class MenubarMainService implements IMenubarMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private menubar: Promise; diff --git a/src/vs/platform/menubar/electron-sandbox/menubar.ts b/src/vs/platform/menubar/electron-sandbox/menubar.ts index d18766b8d6..2f06d890d9 100644 --- a/src/vs/platform/menubar/electron-sandbox/menubar.ts +++ b/src/vs/platform/menubar/electron-sandbox/menubar.ts @@ -9,5 +9,5 @@ import { ICommonMenubarService } from 'vs/platform/menubar/common/menubar'; export const IMenubarService = createDecorator('menubarService'); export interface IMenubarService extends ICommonMenubarService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } diff --git a/src/vs/platform/notification/common/notification.ts b/src/vs/platform/notification/common/notification.ts index b505d9e185..bb54971b7c 100644 --- a/src/vs/platform/notification/common/notification.ts +++ b/src/vs/platform/notification/common/notification.ts @@ -284,7 +284,7 @@ export enum NotificationsFilter { */ export interface INotificationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Show the provided notification to the user. The returned `INotificationHandle` diff --git a/src/vs/platform/notification/test/common/testNotificationService.ts b/src/vs/platform/notification/test/common/testNotificationService.ts index cc3a5bb626..946b85789f 100644 --- a/src/vs/platform/notification/test/common/testNotificationService.ts +++ b/src/vs/platform/notification/test/common/testNotificationService.ts @@ -8,7 +8,7 @@ import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; export class TestNotificationService implements INotificationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly NO_OP: INotificationHandle = new NoOpNotification(); diff --git a/src/vs/platform/opener/common/opener.ts b/src/vs/platform/opener/common/opener.ts index 8f2f72cd93..db808dbae9 100644 --- a/src/vs/platform/opener/common/opener.ts +++ b/src/vs/platform/opener/common/opener.ts @@ -53,7 +53,7 @@ export interface IExternalUriResolver { export interface IOpenerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Register a participant that can handle the open() call. diff --git a/src/vs/platform/product/common/product.ts b/src/vs/platform/product/common/product.ts index 61c31d799d..7cebce2edb 100644 --- a/src/vs/platform/product/common/product.ts +++ b/src/vs/platform/product/common/product.ts @@ -21,7 +21,7 @@ if (isWeb) { if (Object.keys(product).length === 0) { Object.assign(product, { version: '1.17.0-dev', - vscodeVersion: '1.46.0-dev', + vscodeVersion: '1.47.0-dev', nameLong: 'Azure Data Studio Web Dev', nameShort: 'Azure Data Studio Web Dev', urlProtocol: 'azuredatastudio-oss' diff --git a/src/vs/platform/product/common/productService.ts b/src/vs/platform/product/common/productService.ts index 565a99e30e..ac4546088c 100644 --- a/src/vs/platform/product/common/productService.ts +++ b/src/vs/platform/product/common/productService.ts @@ -11,7 +11,7 @@ export const IProductService = createDecorator('productService' export interface IProductService extends Readonly { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } @@ -108,12 +108,7 @@ export interface IProductConfiguration { readonly checksums?: { [path: string]: string; }; readonly checksumFailMoreInfoUrl?: string; - readonly appCenter?: { - readonly 'win32-ia32': string; - readonly 'win32-x64': string; - readonly 'linux-x64': string; - readonly 'darwin': string; - }; + readonly appCenter?: IAppCenterConfiguration; readonly portable?: string; @@ -126,6 +121,13 @@ export interface IProductConfiguration { readonly 'configurationSync.store'?: ConfigurationSyncStore; } +export interface IAppCenterConfiguration { + readonly 'win32-ia32': string; + readonly 'win32-x64': string; + readonly 'linux-x64': string; + readonly 'darwin': string; +} + export interface IConfigBasedExtensionTip { configPath: string; configName: string; diff --git a/src/vs/platform/progress/common/progress.ts b/src/vs/platform/progress/common/progress.ts index 997c62504d..3d6b48caf6 100644 --- a/src/vs/platform/progress/common/progress.ts +++ b/src/vs/platform/progress/common/progress.ts @@ -15,7 +15,7 @@ export const IProgressService = createDecorator('progressServi */ export interface IProgressService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; withProgress( options: IProgressOptions | IProgressNotificationOptions | IProgressWindowOptions | IProgressCompositeOptions, @@ -179,5 +179,5 @@ export const IEditorProgressService = createDecorator('e */ export interface IEditorProgressService extends IProgressIndicator { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } diff --git a/src/vs/platform/quickinput/browser/quickInput.ts b/src/vs/platform/quickinput/browser/quickInput.ts index b89f5cd285..f83b147d99 100644 --- a/src/vs/platform/quickinput/browser/quickInput.ts +++ b/src/vs/platform/quickinput/browser/quickInput.ts @@ -23,7 +23,7 @@ export interface IQuickInputControllerHost extends ILayoutService { } export class QuickInputService extends Themable implements IQuickInputService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; get backButton(): IQuickInputButton { return this.controller.backButton; } diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index 08a6d3f3f0..dcb215ff73 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -17,7 +17,7 @@ export type Omit = Pick>; export interface IQuickInputService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Provides access to the back button in quick input. diff --git a/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts b/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts index ae9f2e7e87..7cab2b21e4 100644 --- a/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts +++ b/src/vs/platform/remote/browser/remoteAuthorityResolverService.ts @@ -3,41 +3,74 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ResolvedAuthority, IRemoteAuthorityResolverService, ResolverResult } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ResolvedAuthority, IRemoteAuthorityResolverService, ResolverResult, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAuthorities } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; +import { Emitter } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; -export class RemoteAuthorityResolverService implements IRemoteAuthorityResolverService { +export class RemoteAuthorityResolverService extends Disposable implements IRemoteAuthorityResolverService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; - constructor( - resourceUriProvider: ((uri: URI) => URI) | undefined - ) { + private readonly _onDidChangeConnectionData = this._register(new Emitter()); + public readonly onDidChangeConnectionData = this._onDidChangeConnectionData.event; + + private readonly _cache: Map; + private readonly _connectionTokens: Map; + + constructor(resourceUriProvider: ((uri: URI) => URI) | undefined) { + super(); + this._cache = new Map(); + this._connectionTokens = new Map(); if (resourceUriProvider) { RemoteAuthorities.setDelegate(resourceUriProvider); } } - resolveAuthority(authority: string): Promise { + async resolveAuthority(authority: string): Promise { + if (!this._cache.has(authority)) { + const result = this._doResolveAuthority(authority); + RemoteAuthorities.set(authority, result.authority.host, result.authority.port); + this._cache.set(authority, result); + this._onDidChangeConnectionData.fire(); + } + return this._cache.get(authority)!; + } + + getConnectionData(authority: string): IRemoteConnectionData | null { + if (!this._cache.has(authority)) { + return null; + } + const resolverResult = this._cache.get(authority)!; + const connectionToken = this._connectionTokens.get(authority); + return { + host: resolverResult.authority.host, + port: resolverResult.authority.port, + connectionToken: connectionToken + }; + } + + private _doResolveAuthority(authority: string): ResolverResult { if (authority.indexOf(':') >= 0) { const pieces = authority.split(':'); - return Promise.resolve(this._createResolvedAuthority(authority, pieces[0], parseInt(pieces[1], 10))); + return { authority: { authority, host: pieces[0], port: parseInt(pieces[1], 10) } }; } - return Promise.resolve(this._createResolvedAuthority(authority, authority, 80)); + return { authority: { authority, host: authority, port: 80 } }; } - private _createResolvedAuthority(authority: string, host: string, port: number): ResolverResult { - RemoteAuthorities.set(authority, host, port); - return { authority: { authority, host, port } }; + _clearResolvedAuthority(authority: string): void { } - clearResolvedAuthority(authority: string): void { + _setResolvedAuthority(resolvedAuthority: ResolvedAuthority) { } - setResolvedAuthority(resolvedAuthority: ResolvedAuthority) { + _setResolvedAuthorityError(authority: string, err: any): void { } - setResolvedAuthorityError(authority: string, err: any): void { + _setAuthorityConnectionToken(authority: string, connectionToken: string): void { + this._connectionTokens.set(authority, connectionToken); + RemoteAuthorities.setConnectionToken(authority, connectionToken); + this._onDidChangeConnectionData.fire(); } } diff --git a/src/vs/platform/remote/common/remoteAuthorityResolver.ts b/src/vs/platform/remote/common/remoteAuthorityResolver.ts index a2322cb501..9daa1f5268 100644 --- a/src/vs/platform/remote/common/remoteAuthorityResolver.ts +++ b/src/vs/platform/remote/common/remoteAuthorityResolver.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { Event } from 'vs/base/common/event'; export const IRemoteAuthorityResolverService = createDecorator('remoteAuthorityResolverService'); @@ -31,6 +32,12 @@ export interface ResolverResult { tunnelInformation?: TunnelInformation; } +export interface IRemoteConnectionData { + host: string; + port: number; + connectionToken: string | undefined; +} + export enum RemoteAuthorityResolverErrorCode { Unknown = 'Unknown', NotAvailable = 'NotAvailable', @@ -77,11 +84,15 @@ export class RemoteAuthorityResolverError extends Error { export interface IRemoteAuthorityResolverService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; + + readonly onDidChangeConnectionData: Event; resolveAuthority(authority: string): Promise; + getConnectionData(authority: string): IRemoteConnectionData | null; - clearResolvedAuthority(authority: string): void; - setResolvedAuthority(resolvedAuthority: ResolvedAuthority, resolvedOptions?: ResolvedOptions): void; - setResolvedAuthorityError(authority: string, err: any): void; + _clearResolvedAuthority(authority: string): void; + _setResolvedAuthority(resolvedAuthority: ResolvedAuthority, resolvedOptions?: ResolvedOptions): void; + _setResolvedAuthorityError(authority: string, err: any): void; + _setAuthorityConnectionToken(authority: string, connectionToken: string): void; } diff --git a/src/vs/platform/remote/common/tunnel.ts b/src/vs/platform/remote/common/tunnel.ts index 5cf39447a1..6591bbddca 100644 --- a/src/vs/platform/remote/common/tunnel.ts +++ b/src/vs/platform/remote/common/tunnel.ts @@ -3,10 +3,12 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { URI } from 'vs/base/common/uri'; -import { Event } from 'vs/base/common/event'; +import { Emitter, 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 { ILogService } from 'vs/platform/log/common/log'; +import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; export const ITunnelService = createDecorator('tunnelService'); @@ -29,13 +31,13 @@ export interface ITunnelProvider { } export interface ITunnelService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly tunnels: Promise; readonly onTunnelOpened: Event; readonly onTunnelClosed: Event<{ host: string, port: number }>; - openTunnel(remoteHost: string | undefined, remotePort: number, localPort?: number): Promise | undefined; + openTunnel(resolveAuthority: IAddress | undefined, remoteHost: string | undefined, remotePort: number, localPort?: number): Promise | undefined; closeTunnel(remoteHost: string, remotePort: number): Promise; setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable; } @@ -53,3 +55,144 @@ export function extractLocalHostUriMetaDataForPortMapping(uri: URI): { address: port: +localhostMatch[2], }; } + + + +export abstract class AbstractTunnelService implements ITunnelService { + declare readonly _serviceBrand: undefined; + + 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; + protected readonly _tunnels = new Map }>>(); + protected _tunnelProvider: ITunnelProvider | undefined; + + public constructor( + @ILogService protected readonly logService: ILogService + ) { } + + setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable { + if (!provider) { + return { + dispose: () => { } + }; + } + this._tunnelProvider = provider; + return { + dispose: () => { + this._tunnelProvider = undefined; + } + }; + } + + public get tunnels(): Promise { + const promises: Promise[] = []; + Array.from(this._tunnels.values()).forEach(portMap => Array.from(portMap.values()).forEach(x => promises.push(x.value))); + return Promise.all(promises); + } + + dispose(): void { + for (const portMap of this._tunnels.values()) { + for (const { value } of portMap.values()) { + value.then(tunnel => tunnel.dispose()); + } + portMap.clear(); + } + this._tunnels.clear(); + } + + openTunnel(resolvedAuthority: IAddress | undefined, remoteHost: string | undefined, remotePort: number, localPort: number): Promise | undefined { + if (!resolvedAuthority) { + return undefined; + } + + if (!remoteHost || (remoteHost === '127.0.0.1')) { + remoteHost = 'localhost'; + } + + const resolvedTunnel = this.retainOrCreateTunnel(resolvedAuthority, remoteHost, remotePort, localPort); + if (!resolvedTunnel) { + return resolvedTunnel; + } + + return resolvedTunnel.then(tunnel => { + const newTunnel = this.makeTunnel(tunnel); + if (tunnel.tunnelRemoteHost !== remoteHost || tunnel.tunnelRemotePort !== remotePort) { + this.logService.warn('Created tunnel does not match requirements of requested tunnel. Host or port mismatch.'); + } + this._onTunnelOpened.fire(newTunnel); + return newTunnel; + }); + } + + private makeTunnel(tunnel: RemoteTunnel): RemoteTunnel { + return { + tunnelRemotePort: tunnel.tunnelRemotePort, + tunnelRemoteHost: tunnel.tunnelRemoteHost, + tunnelLocalPort: tunnel.tunnelLocalPort, + localAddress: tunnel.localAddress, + dispose: () => { + const existingHost = this._tunnels.get(tunnel.tunnelRemoteHost); + if (existingHost) { + const existing = existingHost.get(tunnel.tunnelRemotePort); + if (existing) { + existing.refcount--; + this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing); + } + } + } + }; + } + + private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise }): Promise { + if (tunnel.refcount <= 0) { + const disposePromise: Promise = tunnel.value.then(tunnel => { + tunnel.dispose(true); + this._onTunnelClosed.fire({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort }); + }); + if (this._tunnels.has(remoteHost)) { + this._tunnels.get(remoteHost)!.delete(remotePort); + } + return disposePromise; + } + } + + async closeTunnel(remoteHost: string, remotePort: number): Promise { + const portMap = this._tunnels.get(remoteHost); + if (portMap && portMap.has(remotePort)) { + const value = portMap.get(remotePort)!; + value.refcount = 0; + await this.tryDisposeTunnel(remoteHost, remotePort, value); + } + } + + protected addTunnelToMap(remoteHost: string, remotePort: number, tunnel: Promise) { + if (!this._tunnels.has(remoteHost)) { + this._tunnels.set(remoteHost, new Map()); + } + this._tunnels.get(remoteHost)!.set(remotePort, { refcount: 1, value: tunnel }); + } + + protected abstract retainOrCreateTunnel(resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined; +} + +export class TunnelService extends AbstractTunnelService { + protected retainOrCreateTunnel(_resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise | undefined { + const portMap = this._tunnels.get(remoteHost); + const existing = portMap ? portMap.get(remotePort) : undefined; + if (existing) { + ++existing.refcount; + return existing.value; + } + + if (this._tunnelProvider) { + const tunnel = this._tunnelProvider.forwardPort({ remoteAddress: { host: remoteHost, port: remotePort } }); + if (tunnel) { + this.addTunnelToMap(remoteHost, remotePort, tunnel); + } + return tunnel; + } + return undefined; + } +} diff --git a/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts b/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts index ab58192100..e0e2621dd5 100644 --- a/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts +++ b/src/vs/platform/remote/electron-browser/remoteAuthorityResolverService.ts @@ -3,61 +3,105 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ResolvedAuthority, IRemoteAuthorityResolverService, ResolverResult, ResolvedOptions } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ResolvedAuthority, IRemoteAuthorityResolverService, ResolverResult, ResolvedOptions, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import * as errors from 'vs/base/common/errors'; import { RemoteAuthorities } from 'vs/base/common/network'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { Emitter } from 'vs/base/common/event'; class PendingResolveAuthorityRequest { + + public value: ResolverResult | null; + constructor( - public readonly resolve: (value: ResolverResult) => void, - public readonly reject: (err: any) => void, + private readonly _resolve: (value: ResolverResult) => void, + private readonly _reject: (err: any) => void, public readonly promise: Promise, ) { + this.value = null; + } + + resolve(value: ResolverResult): void { + this.value = value; + this._resolve(this.value); + } + + reject(err: any): void { + this._reject(err); } } -export class RemoteAuthorityResolverService implements IRemoteAuthorityResolverService { +export class RemoteAuthorityResolverService extends Disposable implements IRemoteAuthorityResolverService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; - private _resolveAuthorityRequests: { [authority: string]: PendingResolveAuthorityRequest; }; + private readonly _onDidChangeConnectionData = this._register(new Emitter()); + public readonly onDidChangeConnectionData = this._onDidChangeConnectionData.event; + + private readonly _resolveAuthorityRequests: Map; + private readonly _connectionTokens: Map; constructor() { - this._resolveAuthorityRequests = Object.create(null); + super(); + this._resolveAuthorityRequests = new Map(); + this._connectionTokens = new Map(); } resolveAuthority(authority: string): Promise { - if (!this._resolveAuthorityRequests[authority]) { + if (!this._resolveAuthorityRequests.has(authority)) { let resolve: (value: ResolverResult) => void; let reject: (err: any) => void; - let promise = new Promise((_resolve, _reject) => { + const promise = new Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; }); - this._resolveAuthorityRequests[authority] = new PendingResolveAuthorityRequest(resolve!, reject!, promise); + this._resolveAuthorityRequests.set(authority, new PendingResolveAuthorityRequest(resolve!, reject!, promise)); } - return this._resolveAuthorityRequests[authority].promise; + return this._resolveAuthorityRequests.get(authority)!.promise; } - clearResolvedAuthority(authority: string): void { - if (this._resolveAuthorityRequests[authority]) { - this._resolveAuthorityRequests[authority].reject(errors.canceled()); - delete this._resolveAuthorityRequests[authority]; + getConnectionData(authority: string): IRemoteConnectionData | null { + if (!this._resolveAuthorityRequests.has(authority)) { + return null; + } + const request = this._resolveAuthorityRequests.get(authority)!; + if (!request.value) { + return null; + } + const connectionToken = this._connectionTokens.get(authority); + return { + host: request.value.authority.host, + port: request.value.authority.port, + connectionToken: connectionToken + }; + } + + _clearResolvedAuthority(authority: string): void { + if (this._resolveAuthorityRequests.has(authority)) { + this._resolveAuthorityRequests.get(authority)!.reject(errors.canceled()); + this._resolveAuthorityRequests.delete(authority); } } - setResolvedAuthority(resolvedAuthority: ResolvedAuthority, options?: ResolvedOptions) { - if (this._resolveAuthorityRequests[resolvedAuthority.authority]) { - let request = this._resolveAuthorityRequests[resolvedAuthority.authority]; + _setResolvedAuthority(resolvedAuthority: ResolvedAuthority, options?: ResolvedOptions): void { + if (this._resolveAuthorityRequests.has(resolvedAuthority.authority)) { + const request = this._resolveAuthorityRequests.get(resolvedAuthority.authority)!; RemoteAuthorities.set(resolvedAuthority.authority, resolvedAuthority.host, resolvedAuthority.port); request.resolve({ authority: resolvedAuthority, options }); + this._onDidChangeConnectionData.fire(); } } - setResolvedAuthorityError(authority: string, err: any): void { - if (this._resolveAuthorityRequests[authority]) { - let request = this._resolveAuthorityRequests[authority]; + _setResolvedAuthorityError(authority: string, err: any): void { + if (this._resolveAuthorityRequests.has(authority)) { + const request = this._resolveAuthorityRequests.get(authority)!; request.reject(err); } } + + _setAuthorityConnectionToken(authority: string, connectionToken: string): void { + this._connectionTokens.set(authority, connectionToken); + RemoteAuthorities.setConnectionToken(authority, connectionToken); + this._onDidChangeConnectionData.fire(); + } } diff --git a/src/vs/workbench/services/remote/node/tunnelService.ts b/src/vs/platform/remote/node/tunnelService.ts similarity index 81% rename from src/vs/workbench/services/remote/node/tunnelService.ts rename to src/vs/platform/remote/node/tunnelService.ts index fed5288272..b56cb1373b 100644 --- a/src/vs/workbench/services/remote/node/tunnelService.ts +++ b/src/vs/platform/remote/node/tunnelService.ts @@ -6,18 +6,14 @@ import * as net from 'net'; import { Barrier } from 'vs/base/common/async'; import { Disposable } from 'vs/base/common/lifecycle'; +import { findFreePortFaster } from 'vs/base/node/ports'; import { NodeSocket } from 'vs/base/parts/ipc/node/ipc.net'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import product from 'vs/platform/product/common/product'; -import { connectRemoteAgentTunnel, IConnectionOptions } from 'vs/platform/remote/common/remoteAgentConnection'; -import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { connectRemoteAgentTunnel, IAddress, IConnectionOptions } from 'vs/platform/remote/common/remoteAgentConnection'; +import { AbstractTunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { nodeSocketFactory } from 'vs/platform/remote/node/nodeSocketFactory'; import { ISignService } from 'vs/platform/sign/common/sign'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ILogService } from 'vs/platform/log/common/log'; -import { findFreePortFaster } from 'vs/base/node/ports'; -import { AbstractTunnelService } from 'vs/workbench/services/remote/common/tunnelService'; async function createRemoteTunnel(options: IConnectionOptions, tunnelRemoteHost: string, tunnelRemotePort: number, tunnelLocalPort?: number): Promise { const tunnel = new NodeRemoteTunnel(options, tunnelRemoteHost, tunnelRemotePort, tunnelLocalPort); @@ -128,15 +124,14 @@ class NodeRemoteTunnel extends Disposable implements RemoteTunnel { export class TunnelService extends AbstractTunnelService { public constructor( - @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @ILogService logService: ILogService, - @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, @ISignService private readonly signService: ISignService, + @IProductService private readonly productService: IProductService ) { - super(environmentService, logService); + super(logService); } - protected retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined { + protected retainOrCreateTunnel(resolveRemoteAuthority: IAddress, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined { const portMap = this._tunnels.get(remoteHost); const existing = portMap ? portMap.get(remotePort) : undefined; if (existing) { @@ -152,12 +147,11 @@ export class TunnelService extends AbstractTunnelService { return tunnel; } else { const options: IConnectionOptions = { - commit: product.commit, + commit: this.productService.commit, socketFactory: nodeSocketFactory, addressProvider: { getAddress: async () => { - const { authority } = await this.remoteAuthorityResolverService.resolveAuthority(remoteAuthority); - return { host: authority.host, port: authority.port }; + return resolveRemoteAuthority; } }, signService: this.signService, @@ -170,5 +164,3 @@ export class TunnelService extends AbstractTunnelService { } } } - -registerSingleton(ITunnelService, TunnelService, true); diff --git a/src/vs/platform/request/browser/requestService.ts b/src/vs/platform/request/browser/requestService.ts index a61b65fde2..07e36e0696 100644 --- a/src/vs/platform/request/browser/requestService.ts +++ b/src/vs/platform/request/browser/requestService.ts @@ -16,7 +16,7 @@ import { IRequestService } from 'vs/platform/request/common/request'; */ export class RequestService implements IRequestService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index d462822037..49b939865f 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -14,7 +14,7 @@ import { IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/r export const IRequestService = createDecorator('requestService'); export interface IRequestService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; request(options: IRequestOptions, token: CancellationToken): Promise; diff --git a/src/vs/platform/request/common/requestIpc.ts b/src/vs/platform/request/common/requestIpc.ts index 6dc94ac8de..85b1685722 100644 --- a/src/vs/platform/request/common/requestIpc.ts +++ b/src/vs/platform/request/common/requestIpc.ts @@ -40,7 +40,7 @@ export class RequestChannel implements IServerChannel { export class RequestChannelClient { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly channel: IChannel) { } diff --git a/src/vs/platform/request/node/requestService.ts b/src/vs/platform/request/node/requestService.ts index 986622b53c..97f049609e 100644 --- a/src/vs/platform/request/node/requestService.ts +++ b/src/vs/platform/request/node/requestService.ts @@ -36,7 +36,7 @@ export interface NodeRequestOptions extends IRequestOptions { */ export class RequestService extends Disposable implements IRequestService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private proxyUrl?: string; private strictSSL: boolean | undefined; diff --git a/src/vs/platform/resource/common/resourceIdentityService.ts b/src/vs/platform/resource/common/resourceIdentityService.ts index abab283a8f..57961cbc75 100644 --- a/src/vs/platform/resource/common/resourceIdentityService.ts +++ b/src/vs/platform/resource/common/resourceIdentityService.ts @@ -10,12 +10,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; export const IResourceIdentityService = createDecorator('IResourceIdentityService'); export interface IResourceIdentityService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; resolveResourceIdentity(resource: URI): Promise; } export class WebResourceIdentityService extends Disposable implements IResourceIdentityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; async resolveResourceIdentity(resource: URI): Promise { return hash(resource.toString()).toString(16); } diff --git a/src/vs/platform/resource/node/resourceIdentityServiceImpl.ts b/src/vs/platform/resource/node/resourceIdentityServiceImpl.ts index 1bdc68f96b..3b09879143 100644 --- a/src/vs/platform/resource/node/resourceIdentityServiceImpl.ts +++ b/src/vs/platform/resource/node/resourceIdentityServiceImpl.ts @@ -14,7 +14,7 @@ import { ResourceMap } from 'vs/base/common/map'; export class NativeResourceIdentityService extends Disposable implements IResourceIdentityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly cache: ResourceMap> = new ResourceMap>(); diff --git a/src/vs/platform/sign/browser/signService.ts b/src/vs/platform/sign/browser/signService.ts index a356d5a62d..2b53d62561 100644 --- a/src/vs/platform/sign/browser/signService.ts +++ b/src/vs/platform/sign/browser/signService.ts @@ -7,7 +7,7 @@ import { ISignService } from 'vs/platform/sign/common/sign'; export class SignService implements ISignService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _tkn: string | null; diff --git a/src/vs/platform/sign/common/sign.ts b/src/vs/platform/sign/common/sign.ts index 37e5ec8f84..7e6f946862 100644 --- a/src/vs/platform/sign/common/sign.ts +++ b/src/vs/platform/sign/common/sign.ts @@ -9,7 +9,7 @@ export const SIGN_SERVICE_ID = 'signService'; export const ISignService = createDecorator(SIGN_SERVICE_ID); export interface ISignService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; sign(value: string): Promise; } diff --git a/src/vs/platform/sign/node/signService.ts b/src/vs/platform/sign/node/signService.ts index f16a76e17f..ecaf302ca3 100644 --- a/src/vs/platform/sign/node/signService.ts +++ b/src/vs/platform/sign/node/signService.ts @@ -6,14 +6,14 @@ import { ISignService } from 'vs/platform/sign/common/sign'; declare module vsda { - // eslint-disable-next-line @typescript-eslint/class-name-casing + // eslint-disable-next-line @typescript-eslint/naming-convention export class signer { sign(arg: any): any; } } export class SignService implements ISignService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private vsda(): Promise { return new Promise((resolve, reject) => require(['vsda'], resolve, reject)); diff --git a/src/vs/platform/state/node/state.ts b/src/vs/platform/state/node/state.ts index de826c4c2b..b9233afe1e 100644 --- a/src/vs/platform/state/node/state.ts +++ b/src/vs/platform/state/node/state.ts @@ -8,10 +8,10 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const IStateService = createDecorator('stateService'); export interface IStateService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getItem(key: string, defaultValue: T): T; getItem(key: string, defaultValue?: T): T | undefined; setItem(key: string, data?: object | string | number | boolean | undefined | null): void; removeItem(key: string): void; -} \ No newline at end of file +} diff --git a/src/vs/platform/state/node/stateService.ts b/src/vs/platform/state/node/stateService.ts index 0f81b29f23..88882ff091 100644 --- a/src/vs/platform/state/node/stateService.ts +++ b/src/vs/platform/state/node/stateService.ts @@ -126,7 +126,7 @@ export class FileStorage { export class StateService implements IStateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly STATE_FILE = 'storage.json'; diff --git a/src/vs/platform/storage/browser/storageService.ts b/src/vs/platform/storage/browser/storageService.ts index 86c5b1f6d7..62ed5f25da 100644 --- a/src/vs/platform/storage/browser/storageService.ts +++ b/src/vs/platform/storage/browser/storageService.ts @@ -5,7 +5,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { IFileService, FileChangeType } from 'vs/platform/files/common/files'; @@ -18,7 +18,7 @@ import { assertIsDefined, assertAllDefined } from 'vs/base/common/types'; export class BrowserStorageService extends Disposable implements IStorageService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeStorage = this._register(new Emitter()); readonly onDidChangeStorage = this._onDidChangeStorage.event; @@ -67,6 +67,13 @@ export class BrowserStorageService extends Disposable implements IStorageService this.workspaceStorage = this._register(new Storage(this.workspaceStorageDatabase)); this._register(this.workspaceStorage.onDidChangeStorage(key => this._onDidChangeStorage.fire({ key, scope: StorageScope.WORKSPACE }))); + const firstOpen = this.workspaceStorage.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN); + if (firstOpen === undefined) { + this.workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, !(await this.fileService.exists(this.workspaceStorageFile))); + } else if (firstOpen) { + this.workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, false); + } + // Global Storage this.globalStorageFile = joinPath(stateRoot, 'global.json'); this.globalStorageDatabase = this._register(new FileStorageDatabase(this.globalStorageFile, true /* watch for external changes */, this.fileService)); diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index 45ab1da6f9..02c59d4b3e 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -9,6 +9,10 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { IWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +export enum WorkspaceStorageSettings { + WORKSPACE_FIRST_OPEN = 'workbench.workspaceFirstOpen' +} + export const IStorageService = createDecorator('storageService'); export enum WillSaveStateReason { @@ -22,7 +26,7 @@ export interface IWillSaveStateEvent { export interface IStorageService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Emitted whenever data is updated or deleted. @@ -131,7 +135,7 @@ export interface IWorkspaceStorageChangeEvent { export class InMemoryStorageService extends Disposable implements IStorageService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeStorage = this._register(new Emitter()); readonly onDidChangeStorage = this._onDidChangeStorage.event; diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 6defaff70e..a755bffb66 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -164,7 +164,7 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC export class GlobalStorageDatabaseChannelClient extends Disposable implements IStorageDatabase { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeItemsExternal = this._register(new Emitter()); readonly onDidChangeItemsExternal = this._onDidChangeItemsExternal.event; diff --git a/src/vs/platform/storage/node/storageMainService.ts b/src/vs/platform/storage/node/storageMainService.ts index 112e21bf0e..ebeec7ea30 100644 --- a/src/vs/platform/storage/node/storageMainService.ts +++ b/src/vs/platform/storage/node/storageMainService.ts @@ -17,7 +17,7 @@ export const IStorageMainService = createDecorator('storage export interface IStorageMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Emitted whenever data is updated or deleted. @@ -86,7 +86,7 @@ export interface IStorageChangeEvent { export class StorageMainService extends Disposable implements IStorageMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly STORAGE_NAME = 'state.vscdb'; diff --git a/src/vs/platform/storage/node/storageService.ts b/src/vs/platform/storage/node/storageService.ts index d43e4d3abb..cdf4c7749c 100644 --- a/src/vs/platform/storage/node/storageService.ts +++ b/src/vs/platform/storage/node/storageService.ts @@ -6,7 +6,7 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; -import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage } from 'vs/platform/storage/common/storage'; +import { IWorkspaceStorageChangeEvent, IStorageService, StorageScope, IWillSaveStateEvent, WillSaveStateReason, logStorage, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; import { SQLiteStorageDatabase, ISQLiteStorageDatabaseLoggingOptions } from 'vs/base/parts/storage/node/storage'; import { Storage, IStorageDatabase, IStorage, StorageHint } from 'vs/base/parts/storage/common/storage'; import { mark } from 'vs/base/common/performance'; @@ -20,7 +20,7 @@ import { RunOnceScheduler, runWhenIdle } from 'vs/base/common/async'; export class NativeStorageService extends Disposable implements IStorageService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly WORKSPACE_STORAGE_NAME = 'state.vscdb'; private static readonly WORKSPACE_META_NAME = 'workspace.json'; @@ -104,6 +104,13 @@ export class NativeStorageService extends Disposable implements IStorageService result.wasCreated ? StorageHint.STORAGE_DOES_NOT_EXIST : undefined ); await workspaceStorage.init(); + + const firstOpen = workspaceStorage.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN); + if (firstOpen === undefined) { + workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, !result.wasCreated); + } else if (firstOpen) { + workspaceStorage.set(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, false); + } } finally { mark('didInitWorkspaceStorage'); } diff --git a/src/vs/platform/telemetry/common/telemetry.ts b/src/vs/platform/telemetry/common/telemetry.ts index a1cb8139b7..b8b57eed0f 100644 --- a/src/vs/platform/telemetry/common/telemetry.ts +++ b/src/vs/platform/telemetry/common/telemetry.ts @@ -28,7 +28,7 @@ export interface ITelemetryService { */ readonly sendErrorTelemetry: boolean; - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Sends a telemetry event that has been privacy approved. @@ -55,5 +55,4 @@ export const currentSessionDateStorageKey = 'telemetry.currentSessionDate'; export const firstSessionDateStorageKey = 'telemetry.firstSessionDate'; export const lastSessionDateStorageKey = 'telemetry.lastSessionDate'; export const machineIdKey = 'telemetry.machineId'; -export const trueMachineIdKey = 'telemetry.trueMachineId'; export const crashReporterIdStorageKey = 'crashReporter.guid'; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index b57fc86147..4288f10e99 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -20,7 +20,6 @@ export interface ITelemetryServiceConfig { sendErrorTelemetry?: boolean; commonProperties?: Promise<{ [name: string]: any }>; piiPaths?: string[]; - trueMachineId?: string; } export class TelemetryService implements ITelemetryService { @@ -28,7 +27,7 @@ export class TelemetryService implements ITelemetryService { static readonly IDLE_START_EVENT_NAME = 'UserIdleStart'; static readonly IDLE_STOP_EVENT_NAME = 'UserIdleStop'; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _appender: ITelemetryAppender; private _commonProperties: Promise<{ [name: string]: any; }>; @@ -76,13 +75,6 @@ export class TelemetryService implements ITelemetryService { usingFallbackGuid: { classification: 'SystemMetaData', purpose: 'BusinessInsight', isMeasurement: true }; }; this.publicLog2<{ usingFallbackGuid: boolean }, MachineIdFallbackClassification>('machineIdFallback', { usingFallbackGuid: !isHashedId }); - - if (config.trueMachineId) { - type MachineIdDisambiguationClassification = { - correctedMachineId: { endPoint: 'MacAddressHash', classification: 'EndUserPseudonymizedInformation', purpose: 'FeatureInsight' }; - }; - this.publicLog2<{ correctedMachineId: string }, MachineIdDisambiguationClassification>('machineIdDisambiguation', { correctedMachineId: config.trueMachineId }); - } }); } } diff --git a/src/vs/platform/telemetry/common/telemetryUtils.ts b/src/vs/platform/telemetry/common/telemetryUtils.ts index 5a655fb2bd..40f9a7571d 100644 --- a/src/vs/platform/telemetry/common/telemetryUtils.ts +++ b/src/vs/platform/telemetry/common/telemetryUtils.ts @@ -12,7 +12,7 @@ import { safeStringify } from 'vs/base/common/objects'; import { isObject } from 'vs/base/common/types'; export const NullTelemetryService = new class implements ITelemetryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly sendErrorTelemetry = false; publicLog(eventName: string, data?: ITelemetryData) { @@ -156,8 +156,8 @@ export function cleanRemoteAuthority(remoteAuthority?: string): string { } let ret = 'other'; - // Whitelisted remote authorities - ['ssh-remote', 'dev-container', 'attached-container', 'wsl'].forEach((res: string) => { + const allowedAuthorities = ['ssh-remote', 'dev-container', 'attached-container', 'wsl']; + allowedAuthorities.forEach((res: string) => { if (remoteAuthority!.indexOf(`${res}+`) === 0) { ret = res; } diff --git a/src/vs/platform/telemetry/test/electron-browser/appInsightsAppender.test.ts b/src/vs/platform/telemetry/test/electron-browser/appInsightsAppender.test.ts index c8518a04f1..0582d3011f 100644 --- a/src/vs/platform/telemetry/test/electron-browser/appInsightsAppender.test.ts +++ b/src/vs/platform/telemetry/test/electron-browser/appInsightsAppender.test.ts @@ -28,7 +28,7 @@ class AppInsightsMock extends TelemetryClient { } class TestableLogService extends AbstractLogService implements ILogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public logs: string[] = []; diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 7fe08ceddf..cf21e98b5b 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -178,7 +178,7 @@ export const errorForeground = registerColor('errorForeground', { dark: '#F48771 export const descriptionForeground = registerColor('descriptionForeground', { light: '#717171', dark: transparent(foreground, 0.7), hc: transparent(foreground, 0.7) }, nls.localize('descriptionForeground', "Foreground color for description text providing additional information, for example for a label.")); export const iconForeground = registerColor('icon.foreground', { dark: '#C5C5C5', light: '#424242', hc: '#FFFFFF' }, nls.localize('iconForeground', "The default color for icons in the workbench.")); -export const focusBorder = registerColor('focusBorder', { dark: Color.fromHex('#0E639C').transparent(0.8), light: Color.fromHex('#007ACC').transparent(0.4), hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); +export const focusBorder = registerColor('focusBorder', { dark: '#007FD4', light: '#0090F1', hc: '#F38518' }, nls.localize('focusBorder', "Overall border color for focused elements. This color is only used if not overridden by a component.")); // {{SQL CARBON EDIT}} -- Update contrastBorder color for HC export const contrastBorder = registerColor('contrastBorder', { light: null, dark: null, hc: '#2b56f2' }, nls.localize('contrastBorder', "An extra border around elements to separate them from others for greater contrast.")); @@ -204,7 +204,8 @@ export const inputBackground = registerColor('input.background', { dark: '#3C3C3 export const inputForeground = registerColor('input.foreground', { dark: foreground, light: foreground, hc: foreground }, nls.localize('inputBoxForeground', "Input box foreground.")); export const inputBorder = registerColor('input.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('inputBoxBorder', "Input box border.")); export const inputActiveOptionBorder = registerColor('inputOption.activeBorder', { dark: '#007ACC00', light: '#007ACC00', hc: contrastBorder }, nls.localize('inputBoxActiveOptionBorder', "Border color of activated options in input fields.")); -export const inputActiveOptionBackground = registerColor('inputOption.activeBackground', { dark: transparent(focusBorder, 0.5), light: transparent(focusBorder, 0.3), hc: null }, nls.localize('inputOption.activeBackground', "Background color of activated options in input fields.")); +export const inputActiveOptionBackground = registerColor('inputOption.activeBackground', { dark: transparent(focusBorder, 0.7), light: transparent(focusBorder, 0.5), hc: Color.transparent }, nls.localize('inputOption.activeBackground', "Background color of activated options in input fields.")); +export const inputActiveOptionForeground = registerColor('inputOption.activeForeground', { dark: '#FFFFFF', light: Color.black, hc: null }, nls.localize('inputOption.activeForeground', "Foreground color of activated options in input fields.")); export const inputPlaceholderForeground = registerColor('input.placeholderForeground', { light: transparent(foreground, 0.5), dark: transparent(foreground, 0.5), hc: transparent(foreground, 0.7) }, nls.localize('inputPlaceholderForeground', "Input box foreground color for placeholder text.")); export const inputValidationInfoBackground = registerColor('inputValidation.infoBackground', { dark: '#063B49', light: '#D6ECF2', hc: Color.black }, nls.localize('inputValidationInfoBackground', "Input validation background color for information severity.")); @@ -230,6 +231,10 @@ export const buttonForeground = registerColor('button.foreground', { dark: Color export const buttonBackground = registerColor('button.background', { dark: '#0078D4', light: '#007ACC', hc: '#0078D4' }, nls.localize('buttonBackground', "Button background color.")); export const buttonHoverBackground = registerColor('button.hoverBackground', { dark: lighten(buttonBackground, 0.2), light: darken(buttonBackground, 0.2), hc: null }, nls.localize('buttonHoverBackground', "Button background color when hovering.")); +export const buttonSecondaryForeground = registerColor('button.secondaryForeground', { dark: Color.white, light: Color.white, hc: Color.white }, nls.localize('buttonSecondaryForeground', "Secondary button foreground color.")); +export const buttonSecondaryBackground = registerColor('button.secondaryBackground', { dark: '#3A3D41', light: '#5F6A79', hc: null }, nls.localize('buttonSecondaryBackground', "Secondary button background color.")); +export const buttonSecondaryHoverBackground = registerColor('button.secondaryHoverBackground', { dark: lighten(buttonSecondaryBackground, 0.2), light: darken(buttonSecondaryBackground, 0.2), hc: null }, nls.localize('buttonSecondaryHoverBackground', "Secondary button background color when hovering.")); + export const badgeBackground = registerColor('badge.background', { dark: '#4D4D4D', light: '#C4C4C4', hc: Color.black }, nls.localize('badgeBackground', "Badge background color. Badges are small information labels, e.g. for search results count.")); export const badgeForeground = registerColor('badge.foreground', { dark: Color.white, light: '#333', hc: Color.white }, nls.localize('badgeForeground', "Badge foreground color. Badges are small information labels, e.g. for search results count.")); diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index fd4a139e6c..081db91bea 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IColorTheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke, editorWidgetForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, ColorValue, resolveColorValue, textLinkForeground, problemsWarningIconForeground, problemsErrorIconForeground, problemsInfoIconForeground } from 'vs/platform/theme/common/colorRegistry'; +import { focusBorder, inputBackground, inputForeground, ColorIdentifier, selectForeground, selectBackground, selectListBackground, selectBorder, inputBorder, foreground, editorBackground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground, listFocusBackground, listFocusForeground, listActiveSelectionBackground, listActiveSelectionForeground, listInactiveSelectionForeground, listInactiveSelectionBackground, listInactiveFocusBackground, listHoverBackground, listHoverForeground, listDropBackground, pickerGroupBorder, pickerGroupForeground, widgetShadow, inputValidationInfoBorder, inputValidationInfoBackground, inputValidationWarningBorder, inputValidationWarningBackground, inputValidationErrorBorder, inputValidationErrorBackground, activeContrastBorder, buttonForeground, buttonBackground, buttonHoverBackground, ColorFunction, badgeBackground, badgeForeground, progressBarBackground, breadcrumbsForeground, breadcrumbsFocusForeground, breadcrumbsActiveSelectionForeground, breadcrumbsBackground, editorWidgetBorder, inputValidationInfoForeground, inputValidationWarningForeground, inputValidationErrorForeground, menuForeground, menuBackground, menuSelectionForeground, menuSelectionBackground, menuSelectionBorder, menuBorder, menuSeparatorBackground, darken, listFilterWidgetOutline, listFilterWidgetNoMatchesOutline, listFilterWidgetBackground, editorWidgetBackground, treeIndentGuidesStroke, editorWidgetForeground, simpleCheckboxBackground, simpleCheckboxBorder, simpleCheckboxForeground, ColorValue, resolveColorValue, textLinkForeground, problemsWarningIconForeground, problemsErrorIconForeground, problemsInfoIconForeground, buttonSecondaryBackground, buttonSecondaryForeground, buttonSecondaryHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { IThemable, styleFn } from 'vs/base/common/styler'; @@ -51,12 +51,14 @@ export function attachStyler(themeService: IThemeServic export interface ICheckboxStyleOverrides extends IStyleOverrides { inputActiveOptionBorderColor?: ColorIdentifier; + inputActiveOptionForegroundColor?: ColorIdentifier; inputActiveOptionBackgroundColor?: ColorIdentifier; } export function attachCheckboxStyler(widget: IThemable, themeService: IThemeService, style?: ICheckboxStyleOverrides): IDisposable { return attachStyler(themeService, { inputActiveOptionBorder: (style && style.inputActiveOptionBorderColor) || inputActiveOptionBorder, + inputActiveOptionForeground: (style && style.inputActiveOptionForegroundColor) || inputActiveOptionForeground, inputActiveOptionBackground: (style && style.inputActiveOptionBackgroundColor) || inputActiveOptionBackground } as ICheckboxStyleOverrides, widget); } @@ -79,6 +81,7 @@ export interface IInputBoxStyleOverrides extends IStyleOverrides { inputForeground?: ColorIdentifier; inputBorder?: ColorIdentifier; inputActiveOptionBorder?: ColorIdentifier; + inputActiveOptionForeground?: ColorIdentifier; inputActiveOptionBackground?: ColorIdentifier; inputValidationInfoBorder?: ColorIdentifier; inputValidationInfoBackground?: ColorIdentifier; @@ -141,6 +144,7 @@ export function attachFindReplaceInputBoxStyler(widget: IThemable, themeService: inputForeground: (style && style.inputForeground) || inputForeground, inputBorder: (style && style.inputBorder) || inputBorder, inputActiveOptionBorder: (style && style.inputActiveOptionBorder) || inputActiveOptionBorder, + inputActiveOptionForeground: (style && style.inputActiveOptionForeground) || inputActiveOptionForeground, inputActiveOptionBackground: (style && style.inputActiveOptionBackground) || inputActiveOptionBackground, inputValidationInfoBorder: (style && style.inputValidationInfoBorder) || inputValidationInfoBorder, inputValidationInfoBackground: (style && style.inputValidationInfoBackground) || inputValidationInfoBackground, @@ -258,6 +262,9 @@ export interface IButtonStyleOverrides extends IStyleOverrides { buttonForeground?: ColorIdentifier; buttonBackground?: ColorIdentifier; buttonHoverBackground?: ColorIdentifier; + buttonSecondaryForeground?: ColorIdentifier; + buttonSecondaryBackground?: ColorIdentifier; + buttonSecondaryHoverBackground?: ColorIdentifier; } export function attachButtonStyler(widget: IThemable, themeService: IThemeService, style?: IButtonStyleOverrides): IDisposable { @@ -265,6 +272,9 @@ export function attachButtonStyler(widget: IThemable, themeService: IThemeServic buttonForeground: (style && style.buttonForeground) || buttonForeground, buttonBackground: (style && style.buttonBackground) || buttonBackground, buttonHoverBackground: (style && style.buttonHoverBackground) || buttonHoverBackground, + buttonSecondaryForeground: (style && style.buttonSecondaryForeground) || buttonSecondaryForeground, + buttonSecondaryBackground: (style && style.buttonSecondaryBackground) || buttonSecondaryBackground, + buttonSecondaryHoverBackground: (style && style.buttonSecondaryHoverBackground) || buttonSecondaryHoverBackground, buttonBorder: contrastBorder } as IButtonStyleOverrides, widget); } diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index c79c22ab2d..ced9e33067 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -137,7 +137,7 @@ export interface IThemingParticipant { } export interface IThemeService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getColorTheme(): IColorTheme; diff --git a/src/vs/platform/theme/electron-main/themeMainService.ts b/src/vs/platform/theme/electron-main/themeMainService.ts index 63dbcf942a..83fad91610 100644 --- a/src/vs/platform/theme/electron-main/themeMainService.ts +++ b/src/vs/platform/theme/electron-main/themeMainService.ts @@ -18,14 +18,14 @@ const THEME_BG_STORAGE_KEY = 'themeBackground'; export const IThemeMainService = createDecorator('themeMainService'); export interface IThemeMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getBackgroundColor(): string; } export class ThemeMainService implements IThemeMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(@IStateService private stateService: IStateService) { ipc.on('vscode:changeColorTheme', (e: Event, windowId: number, broadcast: string) => { diff --git a/src/vs/platform/theme/test/common/testThemeService.ts b/src/vs/platform/theme/test/common/testThemeService.ts index c17e1e1df1..b901cba0db 100644 --- a/src/vs/platform/theme/test/common/testThemeService.ts +++ b/src/vs/platform/theme/test/common/testThemeService.ts @@ -45,7 +45,7 @@ export class TestFileIconTheme implements IFileIconTheme { export class TestThemeService implements IThemeService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; _colorTheme: IColorTheme; _fileIconTheme: IFileIconTheme; _onThemeChange = new Emitter(); diff --git a/src/vs/platform/undoRedo/common/undoRedo.ts b/src/vs/platform/undoRedo/common/undoRedo.ts index 22fc6ee0bc..09427e116f 100644 --- a/src/vs/platform/undoRedo/common/undoRedo.ts +++ b/src/vs/platform/undoRedo/common/undoRedo.ts @@ -53,10 +53,12 @@ export interface UriComparisonKeyComputer { } export interface IUndoRedoService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; registerUriComparisonKeyComputer(uriComparisonKeyComputer: UriComparisonKeyComputer): IDisposable; + getUriComparisonKey(resource: URI): string; + /** * Add a new element to the `undo` stack. * This will destroy the `redo` stack. @@ -72,7 +74,7 @@ export interface IUndoRedoService { hasElements(resource: URI): boolean; - setElementsIsValid(resource: URI, isValid: boolean): void; + setElementsValidFlag(resource: URI, isValid: boolean, filter: (element: IUndoRedoElement) => boolean): void; /** * Remove elements that target `resource`. diff --git a/src/vs/platform/undoRedo/common/undoRedoService.ts b/src/vs/platform/undoRedo/common/undoRedoService.ts index cbb19c0c5e..08b6f08048 100644 --- a/src/vs/platform/undoRedo/common/undoRedoService.ts +++ b/src/vs/platform/undoRedo/common/undoRedoService.ts @@ -14,6 +14,8 @@ import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IDisposable, Disposable, isDisposable } from 'vs/base/common/lifecycle'; +const DEBUG = false; + function getResourceLabel(resource: URI): string { return resource.scheme === Schemas.file ? resource.fsPath : resource.path; } @@ -42,6 +44,10 @@ class ResourceStackElement { public setValid(isValid: boolean): void { this.isValid = isValid; } + + public toString(): string { + return `[VALID] ${this.actual}`; + } } const enum RemovedResourceReason { @@ -143,6 +149,10 @@ class WorkspaceStackElement { } } } + + public toString(): string { + return `[VALID] ${this.actual}`; + } } type StackElement = ResourceStackElement | WorkspaceStackElement; @@ -178,6 +188,18 @@ class ResourceEditStack { this.versionId++; } + public toString(): string { + let result: string[] = []; + result.push(`* ${this.strResource}:`); + for (let i = 0; i < this._past.length; i++) { + result.push(` * [UNDO] ${this._past[i]}`); + } + for (let i = this._future.length - 1; i >= 0; i--) { + result.push(` * [REDO] ${this._future[i]}`); + } + return result.join('\n'); + } + public flushAllElements(): void { this._past = []; this._future = []; @@ -201,6 +223,27 @@ class ResourceEditStack { } } + private _setElementValidFlag(element: StackElement, isValid: boolean): void { + if (element.type === UndoRedoElementType.Workspace) { + element.setValid(this.resourceLabel, this.strResource, isValid); + } else { + element.setValid(isValid); + } + } + + public setElementsValidFlag(isValid: boolean, filter: (element: IUndoRedoElement) => boolean): void { + for (const element of this._past) { + if (filter(element.actual)) { + this._setElementValidFlag(element, isValid); + } + } + for (const element of this._future) { + if (filter(element.actual)) { + this._setElementValidFlag(element, isValid); + } + } + } + public pushElement(element: StackElement): void { // remove the future for (const futureElement of this._future) { @@ -325,7 +368,7 @@ class EditStackSnapshot { } export class UndoRedoService implements IUndoRedoService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _editStacks: Map; private readonly _uriComparisonKeyComputers: UriComparisonKeyComputer[]; @@ -352,7 +395,7 @@ export class UndoRedoService implements IUndoRedoService { }; } - private _uriGetComparisonKey(resource: URI): string { + public getUriComparisonKey(resource: URI): string { for (const uriComparisonKeyComputer of this._uriComparisonKeyComputers) { const result = uriComparisonKeyComputer.getComparisonKey(resource); if (result !== null) { @@ -362,10 +405,20 @@ export class UndoRedoService implements IUndoRedoService { return resource.toString(); } + private _print(label: string): void { + console.log(`------------------------------------`); + console.log(`AFTER ${label}: `); + let str: string[] = []; + for (const element of this._editStacks) { + str.push(element[1].toString()); + } + console.log(str.join('\n')); + } + public pushElement(element: IUndoRedoElement): void { if (element.type === UndoRedoElementType.Resource) { const resourceLabel = getResourceLabel(element.resource); - const strResource = this._uriGetComparisonKey(element.resource); + const strResource = this.getUriComparisonKey(element.resource); this._pushElement(new ResourceStackElement(element, resourceLabel, strResource)); } else { const seen = new Set(); @@ -373,7 +426,7 @@ export class UndoRedoService implements IUndoRedoService { const strResources: string[] = []; for (const resource of element.resources) { const resourceLabel = getResourceLabel(resource); - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (seen.has(strResource)) { continue; @@ -389,6 +442,9 @@ export class UndoRedoService implements IUndoRedoService { this._pushElement(new WorkspaceStackElement(element, resourceLabels, strResources)); } } + if (DEBUG) { + this._print('pushElement'); + } } private _pushElement(element: StackElement): void { @@ -409,7 +465,7 @@ export class UndoRedoService implements IUndoRedoService { } public getLastElement(resource: URI): IUndoRedoElement | null { - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; if (editStack.hasFutureElements()) { @@ -426,7 +482,7 @@ export class UndoRedoService implements IUndoRedoService { const individualMap = new Map(); for (const _element of individualArr) { const resourceLabel = getResourceLabel(_element.resource); - const strResource = this._uriGetComparisonKey(_element.resource); + const strResource = this.getUriComparisonKey(_element.resource); const element = new ResourceStackElement(_element, resourceLabel, strResource); individualMap.set(element.strResource, element); } @@ -445,7 +501,7 @@ export class UndoRedoService implements IUndoRedoService { const individualMap = new Map(); for (const _element of individualArr) { const resourceLabel = getResourceLabel(_element.resource); - const strResource = this._uriGetComparisonKey(_element.resource); + const strResource = this.getUriComparisonKey(_element.resource); const element = new ResourceStackElement(_element, resourceLabel, strResource); individualMap.set(element.strResource, element); } @@ -460,26 +516,30 @@ export class UndoRedoService implements IUndoRedoService { } public removeElements(resource: URI | string): void { - const strResource = typeof resource === 'string' ? resource : this._uriGetComparisonKey(resource); + const strResource = typeof resource === 'string' ? resource : this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; editStack.dispose(); this._editStacks.delete(strResource); } - } - - public setElementsIsValid(resource: URI, isValid: boolean): void { - const strResource = this._uriGetComparisonKey(resource); - if (this._editStacks.has(strResource)) { - const editStack = this._editStacks.get(strResource)!; - editStack.setElementsIsValid(isValid); + if (DEBUG) { + this._print('removeElements'); } } - // resource + public setElementsValidFlag(resource: URI, isValid: boolean, filter: (element: IUndoRedoElement) => boolean): void { + const strResource = this.getUriComparisonKey(resource); + if (this._editStacks.has(strResource)) { + const editStack = this._editStacks.get(strResource)!; + editStack.setElementsValidFlag(isValid, filter); + } + if (DEBUG) { + this._print('setElementsValidFlag'); + } + } public hasElements(resource: URI): boolean { - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; return (editStack.hasPastElements() || editStack.hasFutureElements()); @@ -488,7 +548,7 @@ export class UndoRedoService implements IUndoRedoService { } public getElements(resource: URI): IPastFutureElements { - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; return editStack.getElements(); @@ -497,7 +557,7 @@ export class UndoRedoService implements IUndoRedoService { } public canUndo(resource: URI): boolean { - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; return editStack.hasPastElements(); @@ -677,7 +737,7 @@ export class UndoRedoService implements IUndoRedoService { Severity.Info, nls.localize('confirmWorkspace', "Would you like to undo '{0}' across all files?", element.label), [ - nls.localize('ok', "Undo in {0} Files", editStackSnapshot.editStacks.length), + nls.localize({ key: 'ok', comment: ['{0} denotes a number that is > 1'] }, "Undo in {0} Files", editStackSnapshot.editStacks.length), nls.localize('nok', "Undo this File"), nls.localize('cancel', "Cancel"), ], @@ -744,7 +804,7 @@ export class UndoRedoService implements IUndoRedoService { } public undo(resource: URI | string): Promise | void { - const strResource = typeof resource === 'string' ? resource : this._uriGetComparisonKey(resource); + const strResource = typeof resource === 'string' ? resource : this.getUriComparisonKey(resource); if (!this._editStacks.has(strResource)) { return; } @@ -755,15 +815,21 @@ export class UndoRedoService implements IUndoRedoService { return; } - if (element.type === UndoRedoElementType.Workspace) { - return this._workspaceUndo(strResource, element); - } else { - return this._resourceUndo(editStack, element); + try { + if (element.type === UndoRedoElementType.Workspace) { + return this._workspaceUndo(strResource, element); + } else { + return this._resourceUndo(editStack, element); + } + } finally { + if (DEBUG) { + this._print('undo'); + } } } public canRedo(resource: URI): boolean { - const strResource = this._uriGetComparisonKey(resource); + const strResource = this.getUriComparisonKey(resource); if (this._editStacks.has(strResource)) { const editStack = this._editStacks.get(strResource)!; return editStack.hasFutureElements(); @@ -873,7 +939,7 @@ export class UndoRedoService implements IUndoRedoService { } public redo(resource: URI | string): Promise | void { - const strResource = typeof resource === 'string' ? resource : this._uriGetComparisonKey(resource); + const strResource = typeof resource === 'string' ? resource : this.getUriComparisonKey(resource); if (!this._editStacks.has(strResource)) { return; } @@ -884,10 +950,16 @@ export class UndoRedoService implements IUndoRedoService { return; } - if (element.type === UndoRedoElementType.Workspace) { - return this._workspaceRedo(strResource, element); - } else { - return this._resourceRedo(editStack, element); + try { + if (element.type === UndoRedoElementType.Workspace) { + return this._workspaceRedo(strResource, element); + } else { + return this._resourceRedo(editStack, element); + } + } finally { + if (DEBUG) { + this._print('redo'); + } } } } diff --git a/src/vs/platform/update/common/update.ts b/src/vs/platform/update/common/update.ts index f5009fd50b..14d216fc5a 100644 --- a/src/vs/platform/update/common/update.ts +++ b/src/vs/platform/update/common/update.ts @@ -81,7 +81,7 @@ export interface IAutoUpdater extends Event.NodeEventEmitter { export const IUpdateService = createDecorator('updateService'); export interface IUpdateService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onStateChange: Event; readonly state: State; diff --git a/src/vs/platform/update/electron-main/abstractUpdateService.ts b/src/vs/platform/update/electron-main/abstractUpdateService.ts index ee9bbfac46..e2b42410bb 100644 --- a/src/vs/platform/update/electron-main/abstractUpdateService.ts +++ b/src/vs/platform/update/electron-main/abstractUpdateService.ts @@ -25,7 +25,7 @@ export type UpdateNotAvailableClassification = { export abstract class AbstractUpdateService implements IUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; protected url: string | undefined; diff --git a/src/vs/platform/update/electron-main/updateService.darwin.ts b/src/vs/platform/update/electron-main/updateService.darwin.ts index 2a743f4b67..8f358ca228 100644 --- a/src/vs/platform/update/electron-main/updateService.darwin.ts +++ b/src/vs/platform/update/electron-main/updateService.darwin.ts @@ -19,7 +19,7 @@ import { IRequestService } from 'vs/platform/request/common/request'; export class DarwinUpdateService extends AbstractUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly disposables = new DisposableStore(); diff --git a/src/vs/platform/update/electron-main/updateService.linux.ts b/src/vs/platform/update/electron-main/updateService.linux.ts index ea57d513da..dd2fbf0fa6 100644 --- a/src/vs/platform/update/electron-main/updateService.linux.ts +++ b/src/vs/platform/update/electron-main/updateService.linux.ts @@ -18,7 +18,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; export class LinuxUpdateService extends AbstractUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ILifecycleMainService lifecycleMainService: ILifecycleMainService, diff --git a/src/vs/platform/update/electron-main/updateService.snap.ts b/src/vs/platform/update/electron-main/updateService.snap.ts index 0358d78e2c..891f08fd31 100644 --- a/src/vs/platform/update/electron-main/updateService.snap.ts +++ b/src/vs/platform/update/electron-main/updateService.snap.ts @@ -18,7 +18,7 @@ import { UpdateNotAvailableClassification } from 'vs/platform/update/electron-ma abstract class AbstractUpdateService2 implements IUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _state: State = State.Uninitialized; @@ -135,7 +135,7 @@ abstract class AbstractUpdateService2 implements IUpdateService { export class SnapUpdateService extends AbstractUpdateService2 { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( private snap: string, diff --git a/src/vs/platform/update/electron-main/updateService.win32.ts b/src/vs/platform/update/electron-main/updateService.win32.ts index 317af38379..3455bcaafb 100644 --- a/src/vs/platform/update/electron-main/updateService.win32.ts +++ b/src/vs/platform/update/electron-main/updateService.win32.ts @@ -50,7 +50,7 @@ function getUpdateType(): UpdateType { export class Win32UpdateService extends AbstractUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private availableUpdate: IAvailableUpdate | undefined; diff --git a/src/vs/platform/url/common/url.ts b/src/vs/platform/url/common/url.ts index e759d722ad..808300580f 100644 --- a/src/vs/platform/url/common/url.ts +++ b/src/vs/platform/url/common/url.ts @@ -26,7 +26,7 @@ export interface IURLHandler { export interface IURLService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Create a URL that can be called to trigger IURLhandlers. diff --git a/src/vs/platform/url/common/urlService.ts b/src/vs/platform/url/common/urlService.ts index 8cdaded61f..4dbd8e008e 100644 --- a/src/vs/platform/url/common/urlService.ts +++ b/src/vs/platform/url/common/urlService.ts @@ -5,21 +5,20 @@ import { IURLService, IURLHandler, IOpenURLOptions } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { values } from 'vs/base/common/map'; import { first } from 'vs/base/common/async'; import { toDisposable, IDisposable, Disposable } from 'vs/base/common/lifecycle'; import product from 'vs/platform/product/common/product'; export abstract class AbstractURLService extends Disposable implements IURLService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private handlers = new Set(); abstract create(options?: Partial): URI; open(uri: URI, options?: IOpenURLOptions): Promise { - const handlers = values(this.handlers); + const handlers = [...this.handlers.values()]; return first(handlers.map(h => () => h.handleURL(uri, options)), undefined, false).then(val => val || false); } diff --git a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts index 6b2f256336..3af0a48cd8 100644 --- a/src/vs/platform/userDataSync/common/abstractSynchronizer.ts +++ b/src/vs/platform/userDataSync/common/abstractSynchronizer.ts @@ -7,10 +7,13 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IFileService, IFileContent, FileChangesEvent, FileOperationResult, FileOperationError } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer'; import { URI } from 'vs/base/common/uri'; -import { SyncResource, SyncStatus, IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, UserDataSyncError, IUserDataSyncLogService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, Conflict, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, ISyncPreviewResult, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync'; +import { + SyncResource, SyncStatus, IUserData, IUserDataSyncStoreService, UserDataSyncErrorCode, UserDataSyncError, IUserDataSyncLogService, IUserDataSyncUtilService, + IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, Conflict, ISyncResourceHandle, USER_DATA_SYNC_SCHEME, ISyncPreview, IUserDataManifest, ISyncData, IRemoteUserData +} from 'vs/platform/userDataSync/common/userDataSync'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { joinPath, dirname, isEqual, basename } from 'vs/base/common/resources'; -import { CancelablePromise, RunOnceScheduler } from 'vs/base/common/async'; +import { CancelablePromise, RunOnceScheduler, createCancelablePromise } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ParseError, parse } from 'vs/base/common/json'; @@ -23,22 +26,13 @@ import { uppercaseFirstLetter } from 'vs/base/common/strings'; import { equals } from 'vs/base/common/arrays'; import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IHeaders } from 'vs/base/parts/request/common/request'; type SyncSourceClassification = { source?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -export interface IRemoteUserData { - ref: string; - syncData: ISyncData | null; -} - -export interface ISyncData { - version: number; - machineId?: string; - content: string; -} - function isSyncData(thing: any): thing is ISyncData { if (thing && (thing.version !== undefined && typeof thing.version === 'number') @@ -58,9 +52,10 @@ function isSyncData(thing: any): thing is ISyncData { return false; } - export abstract class AbstractSynchroniser extends Disposable { + private syncPreviewPromise: CancelablePromise | null = null; + protected readonly syncFolder: URI; private readonly currentMachineIdPromise: Promise; @@ -81,6 +76,8 @@ export abstract class AbstractSynchroniser extends Disposable { protected readonly lastSyncResource: URI; protected readonly syncResourceLogLabel: string; + private syncHeaders: IHeaders = {}; + constructor( readonly resource: SyncResource, @IFileService protected readonly fileService: IFileService, @@ -88,7 +85,7 @@ export abstract class AbstractSynchroniser extends Disposable { @IStorageService storageService: IStorageService, @IUserDataSyncStoreService protected readonly userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService protected readonly userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService protected readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService protected readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService protected readonly telemetryService: ITelemetryService, @IUserDataSyncLogService protected readonly logService: IUserDataSyncLogService, @IConfigurationService protected readonly configurationService: IConfigurationService, @@ -100,6 +97,8 @@ export abstract class AbstractSynchroniser extends Disposable { this.currentMachineIdPromise = getServiceMachineId(environmentService, fileService, storageService); } + protected isEnabled(): boolean { return this.userDataSyncResourceEnablementService.isResourceEnabled(this.resource); } + protected async triggerLocalChange(): Promise { if (this.isEnabled()) { this.localChangeTriggerScheduler.schedule(); @@ -107,11 +106,24 @@ export abstract class AbstractSynchroniser extends Disposable { } protected async doTriggerLocalChange(): Promise { - this.logService.trace(`${this.syncResourceLogLabel}: Checking for local changes...`); - const lastSyncUserData = await this.getLastSyncUserData(); - const hasRemoteChanged = lastSyncUserData ? (await this.generatePreview(lastSyncUserData, lastSyncUserData)).hasRemoteChanged : true; - if (hasRemoteChanged) { - this._onDidChangeLocal.fire(); + + // Sync again if current status is in conflicts + if (this.status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: In conflicts state and local change detected. Syncing again...`); + const preview = await this.syncPreviewPromise!; + this.syncPreviewPromise = null; + const status = await this.performSync(preview.remoteUserData, preview.lastSyncUserData); + this.setStatus(status); + } + + // Check if local change causes remote change + else { + this.logService.trace(`${this.syncResourceLogLabel}: Checking for local changes...`); + const lastSyncUserData = await this.getLastSyncUserData(); + const hasRemoteChanged = lastSyncUserData ? (await this.generatePreview(lastSyncUserData, lastSyncUserData, CancellationToken.None)).hasRemoteChanged : true; + if (hasRemoteChanged) { + this._onDidChangeLocal.fire(); + } } } @@ -141,41 +153,91 @@ export abstract class AbstractSynchroniser extends Disposable { } } - protected isEnabled(): boolean { return this.userDataSyncEnablementService.isResourceEnabled(this.resource); } - - async sync(manifest: IUserDataManifest | null): Promise { + async pull(): Promise { if (!this.isEnabled()) { - if (this.status !== SyncStatus.Idle) { - await this.stop(); - } - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is disabled.`); - return; - } - if (this.status === SyncStatus.HasConflicts) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as there are conflicts.`); - return; - } - if (this.status === SyncStatus.Syncing) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is running already.`); + this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling ${this.syncResourceLogLabel.toLowerCase()} as it is disabled.`); return; } - this.logService.trace(`${this.syncResourceLogLabel}: Started synchronizing ${this.resource.toLowerCase()}...`); - this.setStatus(SyncStatus.Syncing); + await this.stop(); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData); - - let status: SyncStatus = SyncStatus.Idle; try { - status = await this.doSync(remoteUserData, lastSyncUserData); - if (status === SyncStatus.HasConflicts) { - this.logService.info(`${this.syncResourceLogLabel}: Detected conflicts while synchronizing ${this.resource.toLowerCase()}.`); - } else if (status === SyncStatus.Idle) { - this.logService.trace(`${this.syncResourceLogLabel}: Finished synchronizing ${this.resource.toLowerCase()}.`); + this.logService.info(`${this.syncResourceLogLabel}: Started pulling ${this.syncResourceLogLabel.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + const preview = await this.generatePullPreview(remoteUserData, lastSyncUserData, CancellationToken.None); + + await this.applyPreview(preview, false); + this.logService.info(`${this.syncResourceLogLabel}: Finished pulling ${this.syncResourceLogLabel.toLowerCase()}.`); + } finally { + this.setStatus(SyncStatus.Idle); + } + } + + async push(): Promise { + if (!this.isEnabled()) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing ${this.syncResourceLogLabel.toLowerCase()} as it is disabled.`); + return; + } + + this.stop(); + + try { + this.logService.info(`${this.syncResourceLogLabel}: Started pushing ${this.syncResourceLogLabel.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + const preview = await this.generatePushPreview(remoteUserData, lastSyncUserData, CancellationToken.None); + + await this.applyPreview(preview, true); + this.logService.info(`${this.syncResourceLogLabel}: Finished pushing ${this.syncResourceLogLabel.toLowerCase()}.`); + + } finally { + this.setStatus(SyncStatus.Idle); + } + } + + async sync(manifest: IUserDataManifest | null, headers: IHeaders = {}): Promise { + try { + this.syncHeaders = { ...headers }; + if (!this.isEnabled()) { + if (this.status !== SyncStatus.Idle) { + await this.stop(); + } + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is disabled.`); + return; + } + if (this.status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as there are conflicts.`); + return; + } + if (this.status === SyncStatus.Syncing) { + this.logService.info(`${this.syncResourceLogLabel}: Skipped synchronizing ${this.resource.toLowerCase()} as it is running already.`); + return; + } + + this.logService.trace(`${this.syncResourceLogLabel}: Started synchronizing ${this.resource.toLowerCase()}...`); + this.setStatus(SyncStatus.Syncing); + + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getLatestRemoteUserData(manifest, lastSyncUserData); + + let status: SyncStatus = SyncStatus.Idle; + try { + status = await this.performSync(remoteUserData, lastSyncUserData); + if (status === SyncStatus.HasConflicts) { + this.logService.info(`${this.syncResourceLogLabel}: Detected conflicts while synchronizing ${this.resource.toLowerCase()}.`); + } else if (status === SyncStatus.Idle) { + this.logService.trace(`${this.syncResourceLogLabel}: Finished synchronizing ${this.resource.toLowerCase()}.`); + } + } finally { + this.setStatus(status); } } finally { - this.setStatus(status); + this.syncHeaders = {}; } } @@ -197,7 +259,8 @@ export abstract class AbstractSynchroniser extends Disposable { this.setStatus(SyncStatus.Syncing); const lastSyncUserData = await this.getLastSyncUserData(); const remoteUserData = await this.getLatestRemoteUserData(null, lastSyncUserData); - await this.performReplace(syncData, remoteUserData, lastSyncUserData); + const preview = await this.generateReplacePreview(syncData, remoteUserData, lastSyncUserData); + await this.applyPreview(preview, false); this.logService.info(`${this.syncResourceLogLabel}: Finished resetting ${this.resource.toLowerCase()}.`); } finally { this.setStatus(SyncStatus.Idle); @@ -224,28 +287,33 @@ export abstract class AbstractSynchroniser extends Disposable { return this.getRemoteUserData(lastSyncUserData); } - async getSyncPreview(): Promise { - if (!this.isEnabled()) { - return { hasLocalChanged: false, hasRemoteChanged: false }; + async generateSyncPreview(): Promise { + if (this.isEnabled()) { + const lastSyncUserData = await this.getLastSyncUserData(); + const remoteUserData = await this.getRemoteUserData(lastSyncUserData); + return this.generatePreview(remoteUserData, lastSyncUserData, CancellationToken.None); } - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - return this.generatePreview(remoteUserData, lastSyncUserData); + return null; } - protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + private async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { if (remoteUserData.syncData && remoteUserData.syncData.version > this.version) { // current version is not compatible with cloud version this.telemetryService.publicLog2<{ source: string }, SyncSourceClassification>('sync/incompatible', { source: this.resource }); throw new UserDataSyncError(localize({ key: 'incompatible', comment: ['This is an error while syncing a resource that its local version is not compatible with its remote version.'] }, "Cannot sync {0} as its local version {1} is not compatible with its remote version {2}", this.resource, this.version, remoteUserData.syncData.version), UserDataSyncErrorCode.Incompatible, this.resource); } + try { - const status = await this.performSync(remoteUserData, lastSyncUserData); - return status; + return await this.doSync(remoteUserData, lastSyncUserData); } catch (e) { if (e instanceof UserDataSyncError) { switch (e.code) { + + case UserDataSyncErrorCode.LocalPreconditionFailed: + // Rejected as there is a new local version. Syncing again... + this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize ${this.syncResourceLogLabel} as there is a new local version available. Synchronizing again...`); + return this.performSync(remoteUserData, lastSyncUserData); + case UserDataSyncErrorCode.PreconditionFailed: // Rejected as there is a new remote version. Syncing again... this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize as there is a new remote version available. Synchronizing again...`); @@ -257,18 +325,79 @@ export abstract class AbstractSynchroniser extends Disposable { // and one of them successfully updated remote and last sync state. lastSyncUserData = await this.getLastSyncUserData(); - return this.doSync(remoteUserData, lastSyncUserData); + return this.performSync(remoteUserData, lastSyncUserData); } } throw e; } } + protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + try { + // generate or use existing preview + if (!this.syncPreviewPromise) { + this.syncPreviewPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); + } + const preview = await this.syncPreviewPromise; + + if (preview.hasConflicts) { + return SyncStatus.HasConflicts; + } + + // apply preview + await this.applyPreview(preview, false); + + // reset preview + this.syncPreviewPromise = null; + + return SyncStatus.Idle; + } catch (error) { + + // reset preview on error + this.syncPreviewPromise = null; + + throw error; + } + } + + protected async getSyncPreviewInProgress(): Promise { + return this.syncPreviewPromise ? this.syncPreviewPromise : null; + } + + async acceptConflict(conflictUri: URI, conflictContent: string): Promise { + let preview = await this.getSyncPreviewInProgress(); + + if (!preview || !preview.hasConflicts) { + return; + } + + + this.syncPreviewPromise = createCancelablePromise(token => this.updatePreviewWithConflict(preview!, conflictUri, conflictContent, token)); + preview = await this.syncPreviewPromise; + + if (!preview.hasConflicts) { + + // apply preview + await this.applyPreview(preview, false); + + // reset preview + this.syncPreviewPromise = null; + + this.setStatus(SyncStatus.Idle); + } + + } + async hasPreviouslySynced(): Promise { const lastSyncData = await this.getLastSyncUserData(); return !!lastSyncData; } + protected async isLastSyncFromCurrentMachine(remoteUserData: IRemoteUserData): Promise { + const machineId = await this.currentMachineIdPromise; + return !!remoteUserData.syncData?.machineId && remoteUserData.syncData.machineId === machineId; + } + async getRemoteSyncResourceHandles(): Promise { const handles = await this.userDataSyncStoreService.getAllRefs(this.resource); return handles.map(({ created, ref }) => ({ created, uri: this.toRemoteBackupResource(ref) })); @@ -373,14 +502,14 @@ export abstract class AbstractSynchroniser extends Disposable { return { ref: refOrLastSyncData, content }; } else { const lastSyncUserData: IUserData | null = refOrLastSyncData ? { ref: refOrLastSyncData.ref, content: refOrLastSyncData.syncData ? JSON.stringify(refOrLastSyncData.syncData) : null } : null; - return this.userDataSyncStoreService.read(this.resource, lastSyncUserData); + return this.userDataSyncStoreService.read(this.resource, lastSyncUserData, this.syncHeaders); } } protected async updateRemoteUserData(content: string, ref: string | null): Promise { const machineId = await this.currentMachineIdPromise; const syncData: ISyncData = { version: this.version, machineId, content }; - ref = await this.userDataSyncStoreService.write(this.resource, JSON.stringify(syncData), ref); + ref = await this.userDataSyncStoreService.write(this.resource, JSON.stringify(syncData), ref, this.syncHeaders); return { ref, syncData }; } @@ -389,26 +518,31 @@ export abstract class AbstractSynchroniser extends Disposable { return this.userDataSyncBackupStoreService.backup(this.resource, JSON.stringify(syncData)); } - abstract stop(): Promise; + async stop(): Promise { + this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.resource.toLowerCase()}.`); + if (this.syncPreviewPromise) { + this.syncPreviewPromise.cancel(); + this.syncPreviewPromise = null; + } + this.setStatus(SyncStatus.Idle); + } protected abstract readonly version: number; - protected abstract performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; - protected abstract performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; - protected abstract generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; + protected abstract generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise; + protected abstract generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise; + protected abstract updatePreviewWithConflict(preview: ISyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise; + protected abstract applyPreview(preview: ISyncPreview, forcePush: boolean): Promise; } -export interface IFileSyncPreviewResult extends ISyncPreviewResult { +export interface IFileSyncPreview extends ISyncPreview { readonly fileContent: IFileContent | null; - readonly remoteUserData: IRemoteUserData; - readonly lastSyncUserData: IRemoteUserData | null; readonly content: string | null; - readonly hasConflicts: boolean; } export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { - protected syncPreviewResultPromise: CancelablePromise | null = null; - constructor( protected readonly file: URI, resource: SyncResource, @@ -417,34 +551,32 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { @IStorageService storageService: IStorageService, @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, ) { - super(resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register(this.fileService.watch(dirname(file))); this._register(this.fileService.onDidFilesChange(e => this.onFileChanges(e))); } async stop(): Promise { - this.cancel(); - this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.resource.toLowerCase()}.`); + await super.stop(); try { await this.fileService.del(this.localPreviewResource); } catch (e) { /* ignore */ } - this.setStatus(SyncStatus.Idle); } protected async getConflictContent(conflictResource: URI): Promise { if (isEqual(this.remotePreviewResource, conflictResource) || isEqual(this.localPreviewResource, conflictResource)) { - if (this.syncPreviewResultPromise) { - const result = await this.syncPreviewResultPromise; + const syncPreview = await this.getSyncPreviewInProgress(); + if (syncPreview) { if (isEqual(this.remotePreviewResource, conflictResource)) { - return result.remoteUserData && result.remoteUserData.syncData ? result.remoteUserData.syncData.content : null; + return syncPreview.remoteUserData && syncPreview.remoteUserData.syncData ? syncPreview.remoteUserData.syncData.content : null; } if (isEqual(this.localPreviewResource, conflictResource)) { - return result.fileContent ? result.fileContent.value.toString() : null; + return (syncPreview as IFileSyncPreview).fileContent ? (syncPreview as IFileSyncPreview).fileContent!.value.toString() : null; } } } @@ -482,31 +614,7 @@ export abstract class AbstractFileSynchroniser extends AbstractSynchroniser { if (!e.contains(this.file)) { return; } - - if (!this.isEnabled()) { - return; - } - - // Sync again if local file has changed and current status is in conflicts - if (this.status === SyncStatus.HasConflicts) { - this.syncPreviewResultPromise?.then(result => { - this.cancel(); - this.doSync(result.remoteUserData, result.lastSyncUserData).then(status => this.setStatus(status)); - }); - } - - // Otherwise fire change event - else { - this.triggerLocalChange(); - } - - } - - protected cancel(): void { - if (this.syncPreviewResultPromise) { - this.syncPreviewResultPromise.cancel(); - this.syncPreviewResultPromise = null; - } + this.triggerLocalChange(); } protected abstract readonly localPreviewResource: URI; @@ -523,13 +631,13 @@ export abstract class AbstractJsonFileSynchroniser extends AbstractFileSynchroni @IStorageService storageService: IStorageService, @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncUtilService protected readonly userDataSyncUtilService: IUserDataSyncUtilService, @IConfigurationService configurationService: IConfigurationService, ) { - super(file, resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(file, resource, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); } protected hasErrors(content: string): boolean { diff --git a/src/vs/platform/userDataSync/common/extensionsSync.ts b/src/vs/platform/userDataSync/common/extensionsSync.ts index 2c16206340..5e62418718 100644 --- a/src/vs/platform/userDataSync/common/extensionsSync.ts +++ b/src/vs/platform/userDataSync/common/extensionsSync.ts @@ -3,7 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, ISyncExtension, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, ISyncPreviewResult, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, ISyncExtension, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncResourceEnablementService, + IUserDataSyncBackupStoreService, ISyncResourceHandle, ISyncPreview, USER_DATA_SYNC_SCHEME, IRemoteUserData, ISyncData +} from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IExtensionManagementService, IExtensionGalleryService, IGlobalExtensionEnablementService, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -12,8 +15,7 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { merge, getIgnoredExtensions } from 'vs/platform/userDataSync/common/extensionsMerge'; -import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { joinPath, dirname, basename, isEqual } from 'vs/base/common/resources'; @@ -21,8 +23,9 @@ import { format } from 'vs/base/common/jsonFormatter'; import { applyEdits } from 'vs/base/common/jsonEdit'; import { compare } from 'vs/base/common/strings'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { CancellationToken } from 'vs/base/common/cancellation'; -interface IExtensionsSyncPreviewResult extends ISyncPreviewResult { +interface IExtensionsSyncPreview extends ISyncPreview { readonly localExtensions: ISyncExtension[]; readonly remoteUserData: IRemoteUserData; readonly lastSyncUserData: ILastSyncUserData | null; @@ -37,7 +40,6 @@ interface ILastSyncUserData extends IRemoteUserData { skippedExtensions: ISyncExtension[] | undefined; } - export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUserDataSynchroniser { private static readonly EXTENSIONS_DATA_URI = URI.from({ scheme: USER_DATA_SYNC_SCHEME, authority: 'extensions', path: `/current.json` }); @@ -58,10 +60,10 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse @IUserDataSyncLogService logService: IUserDataSyncLogService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(SyncResource.Extensions, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.Extensions, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register( Event.debounce( Event.any( @@ -71,77 +73,134 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse () => undefined, 500)(() => this.triggerLocalChange())); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling extensions as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling extensions...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const remoteExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, updated, remote, removed } = merge(localExtensions, remoteExtensions, localExtensions, [], ignoredExtensions); - await this.apply({ - added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null - }); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote extensions does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling extensions.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing extensions as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing extensions...`); - this.setStatus(SyncStatus.Syncing); - - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, removed, updated, remote } = merge(localExtensions, null, null, [], ignoredExtensions); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - await this.apply({ - added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + if (remoteUserData.syncData !== null) { + const remoteExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData); + const { added, updated, remote, removed } = merge(localExtensions, remoteExtensions, localExtensions, [], ignoredExtensions); + return { + remoteUserData, lastSyncUserData, + added, removed, updated, remote, localExtensions, skippedExtensions: [], hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null - }, true); - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing extensions.`); - } finally { - this.setStatus(SyncStatus.Idle); + hasRemoteChanged: remote !== null, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; + } else { + return { + remoteUserData, lastSyncUserData, + added: [], removed: [], updated: [], remote: null, localExtensions, skippedExtensions: [], + hasLocalChanged: false, + hasRemoteChanged: false, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; } - } - async stop(): Promise { } + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + const { added, removed, updated, remote } = merge(localExtensions, null, null, [], ignoredExtensions); + return { + added, removed, updated, remote, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, + hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, + hasRemoteChanged: remote !== null, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + }; + } + + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const syncExtensions = await this.parseAndMigrateExtensions(syncData); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + const { added, updated, removed } = merge(localExtensions, syncExtensions, localExtensions, [], ignoredExtensions); + + return { + added, removed, updated, remote: syncExtensions, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, + hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const remoteExtensions: ISyncExtension[] | null = remoteUserData.syncData ? await this.parseAndMigrateExtensions(remoteUserData.syncData) : null; + const skippedExtensions: ISyncExtension[] = lastSyncUserData ? lastSyncUserData.skippedExtensions || [] : []; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSyncExtensions: ISyncExtension[] | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncExtensions = await this.parseAndMigrateExtensions(remoteUserData.syncData!); + } + } else { + lastSyncExtensions = await this.parseAndMigrateExtensions(lastSyncUserData.syncData!); + } + + const installedExtensions = await this.extensionManagementService.getInstalled(); + const localExtensions = this.getLocalExtensions(installedExtensions); + const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); + + if (remoteExtensions) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); + } else { + this.logService.trace(`${this.syncResourceLogLabel}: Remote extensions does not exist. Synchronizing extensions for the first time.`); + } + + const { added, removed, updated, remote } = merge(localExtensions, remoteExtensions, lastSyncExtensions, skippedExtensions, ignoredExtensions); + + return { + added, + removed, + updated, + remote, + skippedExtensions, + remoteUserData, + localExtensions, + lastSyncUserData, + hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, + hasRemoteChanged: remote !== null, + isLastSyncFromCurrentMachine, + hasConflicts: false + }; + } + + protected async updatePreviewWithConflict(preview: IExtensionsSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); + } + + protected async applyPreview({ added, removed, updated, remote, remoteUserData, skippedExtensions, lastSyncUserData, localExtensions, hasLocalChanged, hasRemoteChanged }: IExtensionsSyncPreview, forcePush: boolean): Promise { + + if (!hasLocalChanged && !hasRemoteChanged) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing extensions.`); + } + + if (hasLocalChanged) { + await this.backupLocal(JSON.stringify(localExtensions)); + skippedExtensions = await this.updateLocalExtensions(added, removed, updated, skippedExtensions); + } + + if (remote) { + // update remote + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote extensions...`); + const content = JSON.stringify(remote); + remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote extensions`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + // update last sync + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized extensions...`); + await this.updateLastSyncUserData(remoteUserData, { skippedExtensions }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized extensions`); + } + } async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { return [{ resource: joinPath(uri, 'extensions.json'), comparableResource: ExtensionsSynchroniser.EXTENSIONS_DATA_URI }]; @@ -188,15 +247,11 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse return applyEdits(content, edits); } - async acceptConflict(conflict: URI, content: string): Promise { - throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); - } - async hasLocalData(): Promise { try { const installedExtensions = await this.extensionManagementService.getInstalled(); const localExtensions = this.getLocalExtensions(installedExtensions); - if (isNonEmptyArray(localExtensions)) { + if (localExtensions.some(e => e.installed || e.disabled)) { return true; } } catch (error) { @@ -205,84 +260,6 @@ export class ExtensionsSynchroniser extends AbstractSynchroniser implements IUse return false; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const previewResult = await this.generatePreview(remoteUserData, lastSyncUserData); - await this.apply(previewResult); - return SyncStatus.Idle; - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const syncExtensions = await this.parseAndMigrateExtensions(syncData); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - const { added, updated, removed } = merge(localExtensions, syncExtensions, localExtensions, [], ignoredExtensions); - - await this.apply({ - added, removed, updated, remote: syncExtensions, remoteUserData, localExtensions, skippedExtensions: [], lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: true - }); - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const remoteExtensions: ISyncExtension[] | null = remoteUserData.syncData ? await this.parseAndMigrateExtensions(remoteUserData.syncData) : null; - const lastSyncExtensions: ISyncExtension[] | null = lastSyncUserData ? await this.parseAndMigrateExtensions(lastSyncUserData.syncData!) : null; - const skippedExtensions: ISyncExtension[] = lastSyncUserData ? lastSyncUserData.skippedExtensions || [] : []; - - const installedExtensions = await this.extensionManagementService.getInstalled(); - const localExtensions = this.getLocalExtensions(installedExtensions); - const ignoredExtensions = getIgnoredExtensions(installedExtensions, this.configurationService); - - if (remoteExtensions) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote extensions with local extensions...`); - } else { - this.logService.trace(`${this.syncResourceLogLabel}: Remote extensions does not exist. Synchronizing extensions for the first time.`); - } - - const { added, removed, updated, remote } = merge(localExtensions, remoteExtensions, lastSyncExtensions, skippedExtensions, ignoredExtensions); - - return { - added, - removed, - updated, - remote, - skippedExtensions, - remoteUserData, - localExtensions, - lastSyncUserData, - hasLocalChanged: added.length > 0 || removed.length > 0 || updated.length > 0, - hasRemoteChanged: remote !== null - }; - } - - private async apply({ added, removed, updated, remote, remoteUserData, skippedExtensions, lastSyncUserData, localExtensions, hasLocalChanged, hasRemoteChanged }: IExtensionsSyncPreviewResult, forcePush?: boolean): Promise { - - if (!hasLocalChanged && !hasRemoteChanged) { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing extensions.`); - } - - if (hasLocalChanged) { - await this.backupLocal(JSON.stringify(localExtensions)); - skippedExtensions = await this.updateLocalExtensions(added, removed, updated, skippedExtensions); - } - - if (remote) { - // update remote - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote extensions...`); - const content = JSON.stringify(remote); - remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote extensions`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - // update last sync - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized extensions...`); - await this.updateLastSyncUserData(remoteUserData, { skippedExtensions }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized extensions`); - } - } - private async updateLocalExtensions(added: ISyncExtension[], removed: IExtensionIdentifier[], updated: ISyncExtension[], skippedExtensions: ISyncExtension[]): Promise { const removeFromSkipped: IExtensionIdentifier[] = []; const addToSkipped: ISyncExtension[] = []; diff --git a/src/vs/platform/userDataSync/common/globalStateSync.ts b/src/vs/platform/userDataSync/common/globalStateSync.ts index 813d4a28ea..51524969a7 100644 --- a/src/vs/platform/userDataSync/common/globalStateSync.ts +++ b/src/vs/platform/userDataSync/common/globalStateSync.ts @@ -3,7 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, ISyncPreviewResult, USER_DATA_SYNC_SCHEME } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, IUserDataSyncLogService, IGlobalState, SyncResource, IUserDataSynchroniser, IUserDataSyncResourceEnablementService, + IUserDataSyncBackupStoreService, ISyncResourceHandle, IStorageValue, ISyncPreview, USER_DATA_SYNC_SCHEME, IRemoteUserData, ISyncData +} from 'vs/platform/userDataSync/common/userDataSync'; import { VSBuffer } from 'vs/base/common/buffer'; import { Event } from 'vs/base/common/event'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -13,7 +16,7 @@ import { IStringDictionary } from 'vs/base/common/collections'; import { edit } from 'vs/platform/userDataSync/common/content'; import { merge } from 'vs/platform/userDataSync/common/globalStateMerge'; import { parse } from 'vs/base/common/json'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { URI } from 'vs/base/common/uri'; @@ -22,11 +25,12 @@ import { applyEdits } from 'vs/base/common/jsonEdit'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IStorageKeysSyncRegistryService, IStorageKey } from 'vs/platform/userDataSync/common/storageKeys'; import { equals } from 'vs/base/common/arrays'; +import { CancellationToken } from 'vs/base/common/cancellation'; const argvStoragePrefx = 'globalState.argv.'; const argvProperties: string[] = ['locale']; -interface IGlobalSyncPreviewResult extends ISyncPreviewResult { +interface IGlobalStateSyncPreview extends ISyncPreview { readonly local: { added: IStringDictionary, removed: string[], updated: IStringDictionary }; readonly remote: IStringDictionary | null; readonly skippedStorageKeys: string[]; @@ -50,13 +54,13 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IEnvironmentService private readonly environmentService: IEnvironmentService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @IStorageService private readonly storageService: IStorageService, @IStorageKeysSyncRegistryService private readonly storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, ) { - super(SyncResource.GlobalState, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.GlobalState, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this._register(this.fileService.watch(dirname(this.environmentService.argvResource))); this._register( Event.any( @@ -70,74 +74,122 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs ); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling ui state as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling ui state...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const localGlobalState = await this.getLocalGlobalState(); - const remoteGlobalState: IGlobalState = JSON.parse(remoteUserData.syncData.content); - const { local, remote, skipped } = merge(localGlobalState.storage, remoteGlobalState.storage, null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - await this.apply({ - local, remote, remoteUserData, localUserData: localGlobalState, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: remote !== null - }); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote UI state does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling UI state.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing UI State as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing UI State...`); - this.setStatus(SyncStatus.Syncing); - - const localUserData = await this.getLocalGlobalState(); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - await this.apply({ - local: { added: {}, removed: [], updated: {} }, remote: localUserData.storage, remoteUserData, localUserData, lastSyncUserData, - skippedStorageKeys: [], + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const localGlobalState = await this.getLocalGlobalState(); + if (remoteUserData.syncData !== null) { + const remoteGlobalState: IGlobalState = JSON.parse(remoteUserData.syncData.content); + const { local, remote, skipped } = merge(localGlobalState.storage, remoteGlobalState.storage, null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + return { + remoteUserData, lastSyncUserData, + local, remote, localUserData: localGlobalState, skippedStorageKeys: skipped, + hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, + hasRemoteChanged: remote !== null, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; + } else { + return { + remoteUserData, lastSyncUserData, + local: { added: {}, removed: [], updated: {} }, remote: null, localUserData: localGlobalState, skippedStorageKeys: [], hasLocalChanged: false, - hasRemoteChanged: true - }, true); - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing UI State.`); - } finally { - this.setStatus(SyncStatus.Idle); + hasRemoteChanged: false, + hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; } - } - async stop(): Promise { } + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const localUserData = await this.getLocalGlobalState(); + return { + local: { added: {}, removed: [], updated: {} }, remote: localUserData.storage, remoteUserData, localUserData, lastSyncUserData, + skippedStorageKeys: [], + hasLocalChanged: false, + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false + }; + } + + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { + const localUserData = await this.getLocalGlobalState(); + const syncGlobalState: IGlobalState = JSON.parse(syncData.content); + const { local, skipped } = merge(localUserData.storage, syncGlobalState.storage, localUserData.storage, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + return { + local, remote: syncGlobalState.storage, remoteUserData, localUserData, lastSyncUserData, + skippedStorageKeys: skipped, + hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + hasConflicts: false + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null, token: CancellationToken): Promise { + const remoteGlobalState: IGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSyncGlobalState: IGlobalState | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; + } + } else { + lastSyncGlobalState = lastSyncUserData.syncData ? JSON.parse(lastSyncUserData.syncData.content) : null; + } + + const localGloablState = await this.getLocalGlobalState(); + + if (remoteGlobalState) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote ui state with local ui state...`); + } else { + this.logService.trace(`${this.syncResourceLogLabel}: Remote ui state does not exist. Synchronizing ui state for the first time.`); + } + + const { local, remote, skipped } = merge(localGloablState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); + + return { + local, remote, remoteUserData, localUserData: localGloablState, lastSyncUserData, + skippedStorageKeys: skipped, + hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, + hasRemoteChanged: remote !== null, + isLastSyncFromCurrentMachine, + hasConflicts: false + }; + } + + protected async updatePreviewWithConflict(preview: IGlobalStateSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); + } + + protected async applyPreview({ local, remote, remoteUserData, lastSyncUserData, localUserData, hasLocalChanged, hasRemoteChanged, skippedStorageKeys }: IGlobalStateSyncPreview, forcePush: boolean): Promise { + + if (!hasLocalChanged && !hasRemoteChanged) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing ui state.`); + } + + if (hasLocalChanged) { + // update local + this.logService.trace(`${this.syncResourceLogLabel}: Updating local ui state...`); + await this.backupLocal(JSON.stringify(localUserData)); + await this.writeLocalGlobalState(local); + this.logService.info(`${this.syncResourceLogLabel}: Updated local ui state`); + } + + if (hasRemoteChanged) { + // update remote + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote ui state...`); + const content = JSON.stringify({ storage: remote }); + remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote ui state`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref || !equals(lastSyncUserData.skippedStorageKeys, skippedStorageKeys)) { + // update last sync + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized ui state...`); + await this.updateLastSyncUserData(remoteUserData, { skippedStorageKeys }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized ui state`); + } + } async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { return [{ resource: joinPath(uri, 'globalState.json'), comparableResource: GlobalStateSynchroniser.GLOBAL_STATE_DATA_URI }]; @@ -178,10 +230,6 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return applyEdits(content, edits); } - async acceptConflict(conflict: URI, content: string): Promise { - throw new Error(`${this.syncResourceLogLabel}: Conflicts should not occur`); - } - async hasLocalData(): Promise { try { const { storage } = await this.getLocalGlobalState(); @@ -194,76 +242,6 @@ export class GlobalStateSynchroniser extends AbstractSynchroniser implements IUs return false; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const result = await this.generatePreview(remoteUserData, lastSyncUserData); - await this.apply(result); - return SyncStatus.Idle; - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const localUserData = await this.getLocalGlobalState(); - const syncGlobalState: IGlobalState = JSON.parse(syncData.content); - const { local, skipped } = merge(localUserData.storage, syncGlobalState.storage, localUserData.storage, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - await this.apply({ - local, remote: syncGlobalState.storage, remoteUserData, localUserData, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: true - }); - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: ILastSyncUserData | null): Promise { - const remoteGlobalState: IGlobalState = remoteUserData.syncData ? JSON.parse(remoteUserData.syncData.content) : null; - const lastSyncGlobalState: IGlobalState = lastSyncUserData && lastSyncUserData.syncData ? JSON.parse(lastSyncUserData.syncData.content) : null; - - const localGloablState = await this.getLocalGlobalState(); - - if (remoteGlobalState) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote ui state with local ui state...`); - } else { - this.logService.trace(`${this.syncResourceLogLabel}: Remote ui state does not exist. Synchronizing ui state for the first time.`); - } - - const { local, remote, skipped } = merge(localGloablState.storage, remoteGlobalState ? remoteGlobalState.storage : null, lastSyncGlobalState ? lastSyncGlobalState.storage : null, this.getSyncStorageKeys(), lastSyncUserData?.skippedStorageKeys || [], this.logService); - - return { - local, remote, remoteUserData, localUserData: localGloablState, lastSyncUserData, - skippedStorageKeys: skipped, - hasLocalChanged: Object.keys(local.added).length > 0 || Object.keys(local.updated).length > 0 || local.removed.length > 0, - hasRemoteChanged: remote !== null - }; - } - - private async apply({ local, remote, remoteUserData, lastSyncUserData, localUserData, hasLocalChanged, hasRemoteChanged, skippedStorageKeys }: IGlobalSyncPreviewResult, forcePush?: boolean): Promise { - - if (!hasLocalChanged && !hasRemoteChanged) { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing ui state.`); - } - - if (hasLocalChanged) { - // update local - this.logService.trace(`${this.syncResourceLogLabel}: Updating local ui state...`); - await this.backupLocal(JSON.stringify(localUserData)); - await this.writeLocalGlobalState(local); - this.logService.info(`${this.syncResourceLogLabel}: Updated local ui state`); - } - - if (hasRemoteChanged) { - // update remote - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote ui state...`); - const content = JSON.stringify({ storage: remote }); - remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote ui state`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref || !equals(lastSyncUserData.skippedStorageKeys, skippedStorageKeys)) { - // update last sync - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized ui state...`); - await this.updateLastSyncUserData(remoteUserData, { skippedStorageKeys }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized ui state`); - } - } - private async getLocalGlobalState(): Promise { const storage: IStringDictionary = {}; const argvContent: string = await this.getLocalArgvContent(); diff --git a/src/vs/platform/userDataSync/common/keybindingsSync.ts b/src/vs/platform/userDataSync/common/keybindingsSync.ts index 1ded20757b..5cd45a197b 100644 --- a/src/vs/platform/userDataSync/common/keybindingsSync.ts +++ b/src/vs/platform/userDataSync/common/keybindingsSync.ts @@ -4,19 +4,22 @@ *--------------------------------------------------------------------------------------------*/ import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; -import { UserDataSyncError, UserDataSyncErrorCode, SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, SyncResource, IUserDataSynchroniser, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { + UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, SyncResource, + IUserDataSynchroniser, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle, + IRemoteUserData, ISyncData +} from 'vs/platform/userDataSync/common/userDataSync'; import { merge } from 'vs/platform/userDataSync/common/keybindingsMerge'; import { VSBuffer } from 'vs/base/common/buffer'; import { parse } from 'vs/base/common/json'; import { localize } from 'vs/nls'; -import { createCancelablePromise } from 'vs/base/common/async'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancellationToken } from 'vs/base/common/cancellation'; import { OS, OperatingSystem } from 'vs/base/common/platform'; import { isUndefined } from 'vs/base/common/types'; import { isNonEmptyArray } from 'vs/base/common/arrays'; -import { IFileSyncPreviewResult, AbstractJsonFileSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { IFileSyncPreview, AbstractJsonFileSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { joinPath, isEqual, dirname, basename } from 'vs/base/common/resources'; @@ -40,109 +43,167 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IFileService fileService: IFileService, @IEnvironmentService environmentService: IEnvironmentService, @IStorageService storageService: IStorageService, @IUserDataSyncUtilService userDataSyncUtilService: IUserDataSyncUtilService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(environmentService.keybindingsResource, SyncResource.Keybindings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); + super(environmentService.keybindingsResource, SyncResource.Keybindings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling keybindings as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling keybindings...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - const content = remoteUserData.syncData !== null ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; - - if (content !== null) { - const fileContent = await this.getLocalFileContent(); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasConflicts: false, - hasLocalChanged: true, - hasRemoteChanged: false, - })); - await this.apply(); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote keybindings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling keybindings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const fileContent = await this.getLocalFileContent(); + const content = remoteUserData.syncData !== null ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; + const hasLocalChanged = content !== null; + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasConflicts: false, + hasLocalChanged, + hasRemoteChanged: false, + isLastSyncFromCurrentMachine: false + }; } - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing keybindings as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing keybindings...`); - this.setStatus(SyncStatus.Syncing); - - const fileContent = await this.getLocalFileContent(); - - if (fileContent !== null) { - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content: fileContent.value.toString(), - hasLocalChanged: false, - hasRemoteChanged: true, - hasConflicts: false, - })); - await this.apply(true); - } - - // No local exists to push - else { - this.logService.info(`${this.syncResourceLogLabel}: Local keybindings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing keybindings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const fileContent = await this.getLocalFileContent(); + const content: string | null = fileContent ? fileContent.value.toString() : null; + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged: false, + hasRemoteChanged: content !== null, + hasConflicts: false, + isLastSyncFromCurrentMachine: false + }; } - async acceptConflict(conflict: URI, content: string): Promise { - if (this.status === SyncStatus.HasConflicts - && (isEqual(this.localPreviewResource, conflict) || isEqual(this.remotePreviewResource, conflict)) - ) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); - this.syncPreviewResultPromise = createCancelablePromise(async () => ({ ...preview, content })); - await this.apply(true); - this.setStatus(SyncStatus.Idle); + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + const fileContent = await this.getLocalFileContent(); + const content = this.getKeybindingsContentFromSyncContent(syncData.content); + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasConflicts: false, + hasLocalChanged: content !== null, + hasRemoteChanged: content !== null, + isLastSyncFromCurrentMachine: false + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + const remoteContent = remoteUserData.syncData ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSyncContent: string | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncContent = remoteUserData.syncData ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; + } + } else { + lastSyncContent = lastSyncUserData.syncData ? this.getKeybindingsContentFromSyncContent(lastSyncUserData.syncData.content) : null; } + + // Get file content last to get the latest + const fileContent = await this.getLocalFileContent(); + const formattingOptions = await this.getFormattingOptions(); + + let content: string | null = null; + let hasLocalChanged: boolean = false; + let hasRemoteChanged: boolean = false; + let hasConflicts: boolean = false; + + if (remoteContent) { + const localContent: string = fileContent ? fileContent.value.toString() : '[]'; + if (!localContent.trim() || this.hasErrors(localContent)) { + throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings because the content in the file is not valid. Please open the file and correct it."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); + } + + if (!lastSyncContent // First time sync + || lastSyncContent !== localContent // Local has forwarded + || lastSyncContent !== remoteContent // Remote has forwarded + ) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote keybindings with local keybindings...`); + const result = await merge(localContent, remoteContent, lastSyncContent, formattingOptions, this.userDataSyncUtilService); + // Sync only if there are changes + if (result.hasChanges) { + content = result.mergeContent; + hasConflicts = result.hasConflicts; + hasLocalChanged = hasConflicts || result.mergeContent !== localContent; + hasRemoteChanged = hasConflicts || result.mergeContent !== remoteContent; + } + } + } + + // First time syncing to remote + else if (fileContent) { + this.logService.trace(`${this.syncResourceLogLabel}: Remote keybindings does not exist. Synchronizing keybindings for the first time.`); + content = fileContent.value.toString(); + hasRemoteChanged = true; + } + + if (content && !token.isCancellationRequested) { + await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(content)); + } + + this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); + + return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine }; + } + + protected async updatePreviewWithConflict(preview: IFileSyncPreview, conflictResource: URI, conflictContent: string, token: CancellationToken): Promise { + if (isEqual(this.localPreviewResource, conflictResource) || isEqual(this.remotePreviewResource, conflictResource)) { + preview = { ...preview, content: conflictContent, hasConflicts: false }; + } + return preview; + } + + protected async applyPreview(preview: IFileSyncPreview, forcePush: boolean): Promise { + let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = preview; + + if (content !== null) { + if (this.hasErrors(content)) { + throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings because the content in the file is not valid. Please open the file and correct it."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); + } + + if (hasLocalChanged) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating local keybindings...`); + if (fileContent) { + await this.backupLocal(this.toSyncContent(fileContent.value.toString(), null)); + } + await this.updateLocalFileContent(content, fileContent); + this.logService.info(`${this.syncResourceLogLabel}: Updated local keybindings`); + } + + if (hasRemoteChanged) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote keybindings...`); + const remoteContents = this.toSyncContent(content, remoteUserData.syncData ? remoteUserData.syncData.content : null); + remoteUserData = await this.updateRemoteUserData(remoteContents, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote keybindings`); + } + + // Delete the preview + try { + await this.fileService.del(this.localPreviewResource); + } catch (e) { /* ignore */ } + } else { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing keybindings.`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized keybindings...`); + const lastSyncContent = content !== null || fileContent !== null ? this.toSyncContent(content !== null ? content : fileContent!.value.toString(), null) : null; + await this.updateLastSyncUserData({ ref: remoteUserData.ref, syncData: lastSyncContent ? { version: remoteUserData.syncData!.version, machineId: remoteUserData.syncData!.machineId, content: lastSyncContent } : null }); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized keybindings`); + } + } async hasLocalData(): Promise { @@ -192,149 +253,6 @@ export class KeybindingsSynchroniser extends AbstractJsonFileSynchroniser implem return content !== null ? this.getKeybindingsContentFromSyncContent(content) : null; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - try { - const result = await this.getPreview(remoteUserData, lastSyncUserData); - if (result.hasConflicts) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize keybindings as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - const content = this.getKeybindingsContentFromSyncContent(syncData.content); - - if (content !== null) { - const fileContent = await this.getLocalFileContent(); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasConflicts: false, - hasLocalChanged: true, - hasRemoteChanged: true, - })); - await this.apply(); - } - } - - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; - } - - let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; - - if (content !== null) { - if (this.hasErrors(content)) { - throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings as there are errors/warning in keybindings file."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); - } - - if (hasLocalChanged) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating local keybindings...`); - if (fileContent) { - await this.backupLocal(this.toSyncContent(fileContent.value.toString(), null)); - } - await this.updateLocalFileContent(content, fileContent); - this.logService.info(`${this.syncResourceLogLabel}: Updated local keybindings`); - } - - if (hasRemoteChanged) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote keybindings...`); - const remoteContents = this.toSyncContent(content, remoteUserData.syncData ? remoteUserData.syncData.content : null); - remoteUserData = await this.updateRemoteUserData(remoteContents, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote keybindings`); - } - - // Delete the preview - try { - await this.fileService.del(this.localPreviewResource); - } catch (e) { /* ignore */ } - } else { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing keybindings.`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized keybindings...`); - const lastSyncContent = content !== null || fileContent !== null ? this.toSyncContent(content !== null ? content : fileContent!.value.toString(), null) : null; - await this.updateLastSyncUserData({ ref: remoteUserData.ref, syncData: lastSyncContent ? { version: remoteUserData.syncData!.version, machineId: remoteUserData.syncData!.machineId, content: lastSyncContent } : null }); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized keybindings`); - } - - this.syncPreviewResultPromise = null; - } - - private getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); - } - return this.syncPreviewResultPromise; - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { - const remoteContent = remoteUserData.syncData ? this.getKeybindingsContentFromSyncContent(remoteUserData.syncData.content) : null; - const lastSyncContent = lastSyncUserData && lastSyncUserData.syncData ? this.getKeybindingsContentFromSyncContent(lastSyncUserData.syncData.content) : null; - // Get file content last to get the latest - const fileContent = await this.getLocalFileContent(); - const formattingOptions = await this.getFormattingOptions(); - - let content: string | null = null; - let hasLocalChanged: boolean = false; - let hasRemoteChanged: boolean = false; - let hasConflicts: boolean = false; - - if (remoteContent) { - const localContent: string = fileContent ? fileContent.value.toString() : '[]'; - if (this.hasErrors(localContent)) { - throw new UserDataSyncError(localize('errorInvalidSettings', "Unable to sync keybindings as there are errors/warning in keybindings file."), UserDataSyncErrorCode.LocalInvalidContent, this.resource); - } - - if (!lastSyncContent // First time sync - || lastSyncContent !== localContent // Local has forwarded - || lastSyncContent !== remoteContent // Remote has forwarded - ) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote keybindings with local keybindings...`); - const result = await merge(localContent, remoteContent, lastSyncContent, formattingOptions, this.userDataSyncUtilService); - // Sync only if there are changes - if (result.hasChanges) { - content = result.mergeContent; - hasConflicts = result.hasConflicts; - hasLocalChanged = hasConflicts || result.mergeContent !== localContent; - hasRemoteChanged = hasConflicts || result.mergeContent !== remoteContent; - } - } - } - - // First time syncing to remote - else if (fileContent) { - this.logService.trace(`${this.syncResourceLogLabel}: Remote keybindings does not exist. Synchronizing keybindings for the first time.`); - content = fileContent.value.toString(); - hasRemoteChanged = true; - } - - if (content && !token.isCancellationRequested) { - await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(content)); - } - - this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); - - return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts }; - } - getKeybindingsContentFromSyncContent(syncContent: string): string | null { try { const parsed = JSON.parse(syncContent); diff --git a/src/vs/platform/userDataSync/common/settingsSync.ts b/src/vs/platform/userDataSync/common/settingsSync.ts index a10800aac5..6ff552c5a2 100644 --- a/src/vs/platform/userDataSync/common/settingsSync.ts +++ b/src/vs/platform/userDataSync/common/settingsSync.ts @@ -4,17 +4,20 @@ *--------------------------------------------------------------------------------------------*/ import { IFileService, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; -import { UserDataSyncError, UserDataSyncErrorCode, SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, CONFIGURATION_SYNC_STORE_KEY, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { + UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSyncUtilService, CONFIGURATION_SYNC_STORE_KEY, + SyncResource, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle, IUserDataSynchroniser, + IRemoteUserData, ISyncData +} from 'vs/platform/userDataSync/common/userDataSync'; import { VSBuffer } from 'vs/base/common/buffer'; import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; -import { createCancelablePromise } from 'vs/base/common/async'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CancellationToken } from 'vs/base/common/cancellation'; import { updateIgnoredSettings, merge, getIgnoredSettings, isEmpty } from 'vs/platform/userDataSync/common/settingsMerge'; import { edit } from 'vs/platform/userDataSync/common/content'; -import { IFileSyncPreviewResult, AbstractJsonFileSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { IFileSyncPreview, AbstractJsonFileSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { URI } from 'vs/base/common/uri'; import { IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -33,9 +36,7 @@ function isSettingsSyncContent(thing: any): thing is ISettingsSyncContent { && Object.keys(thing).length === 1; } -export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { - - _serviceBrand: any; +export class SettingsSynchroniser extends AbstractJsonFileSynchroniser implements IUserDataSynchroniser { protected readonly version: number = 1; protected readonly localPreviewResource: URI = joinPath(this.syncFolder, PREVIEW_DIR_NAME, 'settings.json'); @@ -50,110 +51,187 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { @IUserDataSyncLogService logService: IUserDataSyncLogService, @IUserDataSyncUtilService userDataSyncUtilService: IUserDataSyncUtilService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, ) { - super(environmentService.settingsResource, SyncResource.Settings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); + super(environmentService.settingsResource, SyncResource.Settings, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, userDataSyncUtilService, configurationService); } - protected setStatus(status: SyncStatus): void { - super.setStatus(status); - if (this.status !== SyncStatus.HasConflicts) { - this.setConflicts([]); + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); + const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + + let content: string | null = null; + if (remoteSettingsSyncContent !== null) { + // Update ignored settings from local file content + content = updateIgnoredSettings(remoteSettingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); } + + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged: content !== null, + hasRemoteChanged: false, + hasConflicts: false, + isLastSyncFromCurrentMachine: false + }; } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling settings as it is disabled.`); - return; + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); + + let content: string | null = null; + if (fileContent !== null) { + // Remove ignored settings + content = updateIgnoredSettings(fileContent.value.toString(), '{}', ignoredSettings, formatUtils); } - this.stop(); + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged: false, + hasRemoteChanged: content !== null, + hasConflicts: false, + isLastSyncFromCurrentMachine: false + }; + } - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling settings...`); - this.setStatus(SyncStatus.Syncing); + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + const fileContent = await this.getLocalFileContent(); + const formatUtils = await this.getFormattingOptions(); + const ignoredSettings = await this.getIgnoredSettings(); - if (remoteSettingsSyncContent !== null) { - const fileContent = await this.getLocalFileContent(); + let content: string | null = null; + const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); + if (settingsSyncContent) { + content = updateIgnoredSettings(settingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); + } + + return { + fileContent, + remoteUserData, + lastSyncUserData, + content, + hasLocalChanged: content !== null, + hasRemoteChanged: content !== null, + hasConflicts: false, + isLastSyncFromCurrentMachine: false + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + const fileContent = await this.getLocalFileContent(); + const formattingOptions = await this.getFormattingOptions(); + const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + let lastSettingsSyncContent: ISettingsSyncContent | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + } + } else { + lastSettingsSyncContent = this.getSettingsSyncContent(lastSyncUserData); + } + + let content: string | null = null; + let hasLocalChanged: boolean = false; + let hasRemoteChanged: boolean = false; + let hasConflicts: boolean = false; + + if (remoteSettingsSyncContent) { + const localContent: string = fileContent ? fileContent.value.toString() : '{}'; + this.validateContent(localContent); + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote settings with local settings...`); + const ignoredSettings = await this.getIgnoredSettings(); + const result = merge(localContent, remoteSettingsSyncContent.settings, lastSettingsSyncContent ? lastSettingsSyncContent.settings : null, ignoredSettings, [], formattingOptions); + content = result.localContent || result.remoteContent; + hasLocalChanged = result.localContent !== null; + hasRemoteChanged = result.remoteContent !== null; + hasConflicts = result.hasConflicts; + } + + // First time syncing to remote + else if (fileContent) { + this.logService.trace(`${this.syncResourceLogLabel}: Remote settings does not exist. Synchronizing settings for the first time.`); + content = fileContent.value.toString(); + hasRemoteChanged = true; + } + + if (content && !token.isCancellationRequested) { + // Remove the ignored settings from the preview. + const ignoredSettings = await this.getIgnoredSettings(); + const previewContent = updateIgnoredSettings(content, '{}', ignoredSettings, formattingOptions); + await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(previewContent)); + } + + this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); + + return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts, isLastSyncFromCurrentMachine }; + } + + protected async updatePreviewWithConflict(preview: IFileSyncPreview, conflictResource: URI, conflictContent: string, token: CancellationToken): Promise { + if (isEqual(this.localPreviewResource, conflictResource) || isEqual(this.remotePreviewResource, conflictResource)) { + const formatUtils = await this.getFormattingOptions(); + // Add ignored settings from local file content + const ignoredSettings = await this.getIgnoredSettings(); + const content = updateIgnoredSettings(conflictContent, preview.fileContent ? preview.fileContent.value.toString() : '{}', ignoredSettings, formatUtils); + preview = { ...preview, content, hasConflicts: false }; + } + return preview; + } + + protected async applyPreview(preview: IFileSyncPreview, forcePush: boolean): Promise { + let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = preview; + + if (content !== null) { + + this.validateContent(content); + + if (hasLocalChanged) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating local settings...`); + if (fileContent) { + await this.backupLocal(JSON.stringify(this.toSettingsSyncContent(fileContent.value.toString()))); + } + await this.updateLocalFileContent(content, fileContent); + this.logService.info(`${this.syncResourceLogLabel}: Updated local settings`); + } + if (hasRemoteChanged) { const formatUtils = await this.getFormattingOptions(); - // Update ignored settings from local file content - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(remoteSettingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasLocalChanged: true, - hasRemoteChanged: false, - hasConflicts: false, - })); - - await this.apply(); + // Update ignored settings from remote + const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); + const ignoredSettings = await this.getIgnoredSettings(content); + content = updateIgnoredSettings(content, remoteSettingsSyncContent ? remoteSettingsSyncContent.settings : '{}', ignoredSettings, formatUtils); + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote settings...`); + remoteUserData = await this.updateRemoteUserData(JSON.stringify(this.toSettingsSyncContent(content)), forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote settings`); } - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote settings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling settings.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing settings as it is disabled.`); - return; + // Delete the preview + try { + await this.fileService.del(this.localPreviewResource); + } catch (e) { /* ignore */ } + } else { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing settings.`); } - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing settings...`); - this.setStatus(SyncStatus.Syncing); - - const fileContent = await this.getLocalFileContent(); - - if (fileContent !== null) { - const formatUtils = await this.getFormattingOptions(); - // Remove ignored settings - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(fileContent.value.toString(), '{}', ignoredSettings, formatUtils); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasRemoteChanged: true, - hasLocalChanged: false, - hasConflicts: false, - })); - - await this.apply(true); - } - - // No local exists to push - else { - this.logService.info(`${this.syncResourceLogLabel}: Local settings does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing settings.`); - } finally { - this.setStatus(SyncStatus.Idle); + if (lastSyncUserData?.ref !== remoteUserData.ref) { + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized settings...`); + await this.updateLastSyncUserData(remoteUserData); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized settings`); } + } async hasLocalData(): Promise { @@ -215,169 +293,6 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { return content; } - async acceptConflict(conflict: URI, content: string): Promise { - if (this.status === SyncStatus.HasConflicts - && (isEqual(this.localPreviewResource, conflict) || isEqual(this.remotePreviewResource, conflict)) - ) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); - const formatUtils = await this.getFormattingOptions(); - // Add ignored settings from local file content - const ignoredSettings = await this.getIgnoredSettings(); - content = updateIgnoredSettings(content, preview.fileContent ? preview.fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(async () => ({ ...preview, content })); - await this.apply(true); - this.setStatus(SyncStatus.Idle); - } - } - - async resolveSettingsConflicts(resolvedConflicts: { key: string, value: any | undefined }[]): Promise { - if (this.status === SyncStatus.HasConflicts) { - const preview = await this.syncPreviewResultPromise!; - this.cancel(); - await this.performSync(preview.remoteUserData, preview.lastSyncUserData, resolvedConflicts); - } - } - - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any | undefined }[] = []): Promise { - try { - const result = await this.getPreview(remoteUserData, lastSyncUserData, resolvedConflicts); - if (result.hasConflicts) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize settings as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData, resolvedConflicts); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - const settingsSyncContent = this.parseSettingsSyncContent(syncData.content); - if (settingsSyncContent) { - const fileContent = await this.getLocalFileContent(); - const formatUtils = await this.getFormattingOptions(); - const ignoredSettings = await this.getIgnoredSettings(); - const content = updateIgnoredSettings(settingsSyncContent.settings, fileContent ? fileContent.value.toString() : '{}', ignoredSettings, formatUtils); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - fileContent, - remoteUserData, - lastSyncUserData, - content, - hasLocalChanged: true, - hasRemoteChanged: true, - hasConflicts: false, - })); - - await this.apply(); - } - } - - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; - } - - let { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; - - if (content !== null) { - - this.validateContent(content); - - if (hasLocalChanged) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating local settings...`); - if (fileContent) { - await this.backupLocal(JSON.stringify(this.toSettingsSyncContent(fileContent.value.toString()))); - } - await this.updateLocalFileContent(content, fileContent); - this.logService.info(`${this.syncResourceLogLabel}: Updated local settings`); - } - if (hasRemoteChanged) { - const formatUtils = await this.getFormattingOptions(); - // Update ignored settings from remote - const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); - const ignoredSettings = await this.getIgnoredSettings(content); - content = updateIgnoredSettings(content, remoteSettingsSyncContent ? remoteSettingsSyncContent.settings : '{}', ignoredSettings, formatUtils); - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote settings...`); - remoteUserData = await this.updateRemoteUserData(JSON.stringify(this.toSettingsSyncContent(content)), forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote settings`); - } - - // Delete the preview - try { - await this.fileService.del(this.localPreviewResource); - } catch (e) { /* ignore */ } - } else { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing settings.`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized settings...`); - await this.updateLastSyncUserData(remoteUserData); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized settings`); - } - - this.syncPreviewResultPromise = null; - } - - private getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any }[] = []): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, resolvedConflicts, token)); - } - return this.syncPreviewResultPromise; - } - - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: { key: string, value: any }[] = [], token: CancellationToken = CancellationToken.None): Promise { - const fileContent = await this.getLocalFileContent(); - const formattingOptions = await this.getFormattingOptions(); - const remoteSettingsSyncContent = this.getSettingsSyncContent(remoteUserData); - const lastSettingsSyncContent = lastSyncUserData ? this.getSettingsSyncContent(lastSyncUserData) : null; - - let content: string | null = null; - let hasLocalChanged: boolean = false; - let hasRemoteChanged: boolean = false; - let hasConflicts: boolean = false; - - if (remoteSettingsSyncContent) { - const localContent: string = fileContent ? fileContent.value.toString() : '{}'; - this.validateContent(localContent); - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote settings with local settings...`); - const ignoredSettings = await this.getIgnoredSettings(); - const result = merge(localContent, remoteSettingsSyncContent.settings, lastSettingsSyncContent ? lastSettingsSyncContent.settings : null, ignoredSettings, resolvedConflicts, formattingOptions); - content = result.localContent || result.remoteContent; - hasLocalChanged = result.localContent !== null; - hasRemoteChanged = result.remoteContent !== null; - hasConflicts = result.hasConflicts; - } - - // First time syncing to remote - else if (fileContent) { - this.logService.trace(`${this.syncResourceLogLabel}: Remote settings does not exist. Synchronizing settings for the first time.`); - content = fileContent.value.toString(); - hasRemoteChanged = true; - } - - if (content && !token.isCancellationRequested) { - // Remove the ignored settings from the preview. - const ignoredSettings = await this.getIgnoredSettings(); - const previewContent = updateIgnoredSettings(content, '{}', ignoredSettings, formattingOptions); - await this.fileService.writeFile(this.localPreviewResource, VSBuffer.fromString(previewContent)); - } - - this.setConflicts(hasConflicts && !token.isCancellationRequested ? [{ local: this.localPreviewResource, remote: this.remotePreviewResource }] : []); - - return { fileContent, remoteUserData, lastSyncUserData, content, hasLocalChanged, hasRemoteChanged, hasConflicts }; - } - private getSettingsSyncContent(remoteUserData: IRemoteUserData): ISettingsSyncContent | null { return remoteUserData.syncData ? this.parseSettingsSyncContent(remoteUserData.syncData.content) : null; } @@ -397,7 +312,7 @@ export class SettingsSynchroniser extends AbstractJsonFileSynchroniser { } private _defaultIgnoredSettings: Promise | undefined = undefined; - protected async getIgnoredSettings(content?: string): Promise { + private async getIgnoredSettings(content?: string): Promise { if (!this._defaultIgnoredSettings) { this._defaultIgnoredSettings = this.userDataSyncUtilService.resolveDefaultIgnoredSettings(); const disposable = Event.any( diff --git a/src/vs/platform/userDataSync/common/snippetsSync.ts b/src/vs/platform/userDataSync/common/snippetsSync.ts index 01992c2cbd..3759d8ef11 100644 --- a/src/vs/platform/userDataSync/common/snippetsSync.ts +++ b/src/vs/platform/userDataSync/common/snippetsSync.ts @@ -3,25 +3,25 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncEnablementService, IUserDataSyncBackupStoreService, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, UserDataSyncError, UserDataSyncErrorCode, ISyncResourceHandle, ISyncPreviewResult } from 'vs/platform/userDataSync/common/userDataSync'; +import { + IUserDataSyncStoreService, IUserDataSyncLogService, IUserDataSynchroniser, SyncResource, IUserDataSyncResourceEnablementService, IUserDataSyncBackupStoreService, + Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncResourceHandle, IRemoteUserData, ISyncData, ISyncPreview +} from 'vs/platform/userDataSync/common/userDataSync'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService, FileChangesEvent, IFileStat, IFileContent, FileOperationError, FileOperationResult } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStringDictionary } from 'vs/base/common/collections'; import { URI } from 'vs/base/common/uri'; import { joinPath, extname, relativePath, isEqualOrParent, isEqual, basename, dirname } from 'vs/base/common/resources'; import { VSBuffer } from 'vs/base/common/buffer'; import { merge } from 'vs/platform/userDataSync/common/snippetsMerge'; -import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IStorageService } from 'vs/platform/storage/common/storage'; -interface ISinppetsSyncPreviewResult extends ISyncPreviewResult { +interface ISinppetsSyncPreview extends ISyncPreview { readonly local: IStringDictionary; - readonly remoteUserData: IRemoteUserData; - readonly lastSyncUserData: IRemoteUserData | null; readonly added: IStringDictionary; readonly updated: IStringDictionary; readonly removed: string[]; @@ -35,7 +35,6 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD protected readonly version: number = 1; private readonly snippetsFolder: URI; private readonly snippetsPreviewFolder: URI; - private syncPreviewResultPromise: CancelablePromise | null = null; constructor( @IEnvironmentService environmentService: IEnvironmentService, @@ -45,10 +44,10 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD @IUserDataSyncBackupStoreService userDataSyncBackupStoreService: IUserDataSyncBackupStoreService, @IUserDataSyncLogService logService: IUserDataSyncLogService, @IConfigurationService configurationService: IConfigurationService, - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @ITelemetryService telemetryService: ITelemetryService, ) { - super(SyncResource.Snippets, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncEnablementService, telemetryService, logService, configurationService); + super(SyncResource.Snippets, fileService, environmentService, storageService, userDataSyncStoreService, userDataSyncBackupStoreService, userDataSyncResourceEnablementService, telemetryService, logService, configurationService); this.snippetsFolder = environmentService.snippetsHome; this.snippetsPreviewFolder = joinPath(this.syncFolder, PREVIEW_DIR_NAME); this._register(this.fileService.watch(environmentService.userRoamingDataHome)); @@ -60,98 +59,171 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD if (!e.changes.some(change => isEqualOrParent(change.resource, this.snippetsFolder))) { return; } - if (!this.isEnabled()) { - return; - } - // Sync again if local file has changed and current status is in conflicts - if (this.status === SyncStatus.HasConflicts) { - this.syncPreviewResultPromise!.then(result => { - this.cancel(); - this.doSync(result.remoteUserData, result.lastSyncUserData).then(status => this.setStatus(status)); - }); - } - // Otherwise fire change event - else { - this.triggerLocalChange(); - } + this.triggerLocalChange(); } - async pull(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pulling snippets as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pulling snippets...`); - this.setStatus(SyncStatus.Syncing); - - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - - if (remoteUserData.syncData !== null) { - const local = await this.getSnippetsFileContents(); - const localSnippets = this.toSnippetsContents(local); - const remoteSnippets = this.parseSnippets(remoteUserData.syncData); - const { added, updated, remote, removed } = merge(localSnippets, remoteSnippets, localSnippets); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, - hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, - hasRemoteChanged: remote !== null - })); - await this.apply(); - } - - // No remote exists to pull - else { - this.logService.info(`${this.syncResourceLogLabel}: Remote snippets does not exist.`); - } - - this.logService.info(`${this.syncResourceLogLabel}: Finished pulling snippets.`); - } finally { - this.setStatus(SyncStatus.Idle); - } - } - - async push(): Promise { - if (!this.isEnabled()) { - this.logService.info(`${this.syncResourceLogLabel}: Skipped pushing snippets as it is disabled.`); - return; - } - - this.stop(); - - try { - this.logService.info(`${this.syncResourceLogLabel}: Started pushing snippets...`); - this.setStatus(SyncStatus.Syncing); - + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + if (remoteUserData.syncData !== null) { const local = await this.getSnippetsFileContents(); const localSnippets = this.toSnippetsContents(local); - const { added, removed, updated, remote } = merge(localSnippets, null, null); - const lastSyncUserData = await this.getLastSyncUserData(); - const remoteUserData = await this.getRemoteUserData(lastSyncUserData); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, + const remoteSnippets = this.parseSnippets(remoteUserData.syncData); + const { added, updated, remote, removed } = merge(localSnippets, remoteSnippets, localSnippets); + return { + remoteUserData, lastSyncUserData, + added, removed, updated, remote, local, hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, - hasRemoteChanged: remote !== null - })); + hasRemoteChanged: remote !== null, + conflicts: [], resolvedConflicts: {}, hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; + } else { + return { + remoteUserData, lastSyncUserData, + added: {}, removed: [], updated: {}, remote: null, local: {}, + hasLocalChanged: false, + hasRemoteChanged: false, + conflicts: [], resolvedConflicts: {}, hasConflicts: false, + isLastSyncFromCurrentMachine: false, + }; + } + } - await this.apply(true); + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + const local = await this.getSnippetsFileContents(); + const localSnippets = this.toSnippetsContents(local); + const { added, removed, updated, remote } = merge(localSnippets, null, null); + return { + added, removed, updated, remote, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, + hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, + hasRemoteChanged: remote !== null, + isLastSyncFromCurrentMachine: false, + hasConflicts: false, + }; + } - this.logService.info(`${this.syncResourceLogLabel}: Finished pushing snippets.`); - } finally { - this.setStatus(SyncStatus.Idle); + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + const local = await this.getSnippetsFileContents(); + const localSnippets = this.toSnippetsContents(local); + const snippets = this.parseSnippets(syncData); + const { added, updated, removed } = merge(localSnippets, snippets, localSnippets); + return { + added, removed, updated, remote: snippets, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, hasConflicts: false, + hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, + hasRemoteChanged: true, + isLastSyncFromCurrentMachine: false, + }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { + const local = await this.getSnippetsFileContents(); + return this.doGeneratePreview(local, remoteUserData, lastSyncUserData, {}, token); + } + + private async doGeneratePreview(local: IStringDictionary, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: IStringDictionary = {}, token: CancellationToken = CancellationToken.None): Promise { + const localSnippets = this.toSnippetsContents(local); + const remoteSnippets: IStringDictionary | null = remoteUserData.syncData ? this.parseSnippets(remoteUserData.syncData) : null; + const isLastSyncFromCurrentMachine = await this.isLastSyncFromCurrentMachine(remoteUserData); + + let lastSyncSnippets: IStringDictionary | null = null; + if (lastSyncUserData === null) { + if (isLastSyncFromCurrentMachine) { + lastSyncSnippets = remoteUserData.syncData ? this.parseSnippets(remoteUserData.syncData) : null; + } + } else { + lastSyncSnippets = lastSyncUserData.syncData ? this.parseSnippets(lastSyncUserData.syncData) : null; + } + + if (remoteSnippets) { + this.logService.trace(`${this.syncResourceLogLabel}: Merging remote snippets with local snippets...`); + } else { + this.logService.trace(`${this.syncResourceLogLabel}: Remote snippets does not exist. Synchronizing snippets for the first time.`); + } + + const mergeResult = merge(localSnippets, remoteSnippets, lastSyncSnippets, resolvedConflicts); + + const conflicts: Conflict[] = []; + for (const key of mergeResult.conflicts) { + const localPreview = joinPath(this.snippetsPreviewFolder, key); + conflicts.push({ local: localPreview, remote: localPreview.with({ scheme: USER_DATA_SYNC_SCHEME }) }); + const content = local[key]; + if (!token.isCancellationRequested) { + await this.fileService.writeFile(localPreview, content ? content.value : VSBuffer.fromString('')); + } + } + + for (const conflict of this.conflicts) { + // clear obsolete conflicts + if (!conflicts.some(({ local }) => isEqual(local, conflict.local))) { + try { + await this.fileService.del(conflict.local); + } catch (error) { + // Ignore & log + this.logService.error(error); + } + } + } + + this.setConflicts(conflicts); + + return { + remoteUserData, local, + lastSyncUserData, + added: mergeResult.added, + removed: mergeResult.removed, + updated: mergeResult.updated, + conflicts, + hasConflicts: conflicts.length > 0, + remote: mergeResult.remote, + resolvedConflicts, + hasLocalChanged: Object.keys(mergeResult.added).length > 0 || mergeResult.removed.length > 0 || Object.keys(mergeResult.updated).length > 0, + hasRemoteChanged: mergeResult.remote !== null, + isLastSyncFromCurrentMachine + }; + } + + protected async updatePreviewWithConflict(preview: ISinppetsSyncPreview, conflictResource: URI, content: string, token: CancellationToken): Promise { + const conflict = this.conflicts.filter(({ local, remote }) => isEqual(local, conflictResource) || isEqual(remote, conflictResource))[0]; + if (conflict) { + const key = relativePath(this.snippetsPreviewFolder, conflict.local)!; + preview.resolvedConflicts[key] = content || null; + preview = await this.doGeneratePreview(preview.local, preview.remoteUserData, preview.lastSyncUserData, preview.resolvedConflicts, token); + } + return preview; + } + + protected async applyPreview(preview: ISinppetsSyncPreview, forcePush: boolean): Promise { + let { added, removed, updated, local, remote, remoteUserData, lastSyncUserData, hasLocalChanged, hasRemoteChanged } = preview; + + if (!hasLocalChanged && !hasRemoteChanged) { + this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing snippets.`); + } + + if (hasLocalChanged) { + // back up all snippets + await this.backupLocal(JSON.stringify(this.toSnippetsContents(local))); + await this.updateLocalSnippets(added, removed, updated, local); + } + + if (remote) { + // update remote + this.logService.trace(`${this.syncResourceLogLabel}: Updating remote snippets...`); + const content = JSON.stringify(remote); + remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); + this.logService.info(`${this.syncResourceLogLabel}: Updated remote snippets`); + } + + if (lastSyncUserData?.ref !== remoteUserData.ref) { + // update last sync + this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized snippets...`); + await this.updateLastSyncUserData(remoteUserData); + this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized snippets`); } } async stop(): Promise { await this.clearConflicts(); - this.cancel(); - this.logService.info(`${this.syncResourceLogLabel}: Stopped synchronizing ${this.syncResourceLogLabel}.`); - this.setStatus(SyncStatus.Idle); + return super.stop(); } async getAssociatedResources({ uri }: ISyncResourceHandle): Promise<{ resource: URI, comparableResource?: URI }[]> { @@ -192,37 +264,20 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD return null; } - protected async getConflictContent(conflictResource: URI): Promise { - if (this.syncPreviewResultPromise) { - const result = await this.syncPreviewResultPromise; + private async getConflictContent(conflictResource: URI): Promise { + const syncPreview = await this.getSyncPreviewInProgress(); + if (syncPreview) { const key = relativePath(this.snippetsPreviewFolder, conflictResource.with({ scheme: this.snippetsPreviewFolder.scheme }))!; if (conflictResource.scheme === this.snippetsPreviewFolder.scheme) { - return result.local[key] ? result.local[key].value.toString() : null; - } else if (result.remoteUserData && result.remoteUserData.syncData) { - const snippets = this.parseSnippets(result.remoteUserData.syncData); + return (syncPreview as ISinppetsSyncPreview).local[key] ? (syncPreview as ISinppetsSyncPreview).local[key].value.toString() : null; + } else if (syncPreview.remoteUserData && syncPreview.remoteUserData.syncData) { + const snippets = this.parseSnippets(syncPreview.remoteUserData.syncData); return snippets[key] || null; } } return null; } - async acceptConflict(conflictResource: URI, content: string): Promise { - const conflict = this.conflicts.filter(({ local, remote }) => isEqual(local, conflictResource) || isEqual(remote, conflictResource))[0]; - if (this.status === SyncStatus.HasConflicts && conflict) { - const key = relativePath(this.snippetsPreviewFolder, conflict.local)!; - let previewResult = await this.syncPreviewResultPromise!; - this.cancel(); - previewResult.resolvedConflicts[key] = content || null; - this.syncPreviewResultPromise = createCancelablePromise(token => this.doGeneratePreview(previewResult.local, previewResult.remoteUserData, previewResult.lastSyncUserData, previewResult.resolvedConflicts, token)); - previewResult = await this.syncPreviewResultPromise; - this.setConflicts(previewResult.conflicts); - if (!this.conflicts.length) { - await this.apply(); - this.setStatus(SyncStatus.Idle); - } - } - } - async hasLocalData(): Promise { try { const localSnippets = await this.getSnippetsFileContents(); @@ -235,56 +290,6 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD return false; } - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - try { - const previewResult = await this.getPreview(remoteUserData, lastSyncUserData); - this.setConflicts(previewResult.conflicts); - if (this.conflicts.length) { - return SyncStatus.HasConflicts; - } - await this.apply(); - return SyncStatus.Idle; - } catch (e) { - this.syncPreviewResultPromise = null; - if (e instanceof UserDataSyncError) { - switch (e.code) { - case UserDataSyncErrorCode.LocalPreconditionFailed: - // Rejected as there is a new local version. Syncing again. - this.logService.info(`${this.syncResourceLogLabel}: Failed to synchronize snippets as there is a new local version available. Synchronizing again...`); - return this.performSync(remoteUserData, lastSyncUserData); - } - } - throw e; - } - } - - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - const local = await this.getSnippetsFileContents(); - const localSnippets = this.toSnippetsContents(local); - const snippets = this.parseSnippets(syncData); - const { added, updated, removed } = merge(localSnippets, snippets, localSnippets); - this.syncPreviewResultPromise = createCancelablePromise(() => Promise.resolve({ - added, removed, updated, remote: snippets, remoteUserData, local, lastSyncUserData, conflicts: [], resolvedConflicts: {}, - hasLocalChanged: Object.keys(added).length > 0 || removed.length > 0 || Object.keys(updated).length > 0, - hasRemoteChanged: true - })); - await this.apply(); - } - - protected getPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - if (!this.syncPreviewResultPromise) { - this.syncPreviewResultPromise = createCancelablePromise(token => this.generatePreview(remoteUserData, lastSyncUserData, token)); - } - return this.syncPreviewResultPromise; - } - - protected cancel(): void { - if (this.syncPreviewResultPromise) { - this.syncPreviewResultPromise.cancel(); - this.syncPreviewResultPromise = null; - } - } - private async clearConflicts(): Promise { if (this.conflicts.length) { await Promise.all(this.conflicts.map(({ local }) => this.fileService.del(local))); @@ -292,95 +297,6 @@ export class SnippetsSynchroniser extends AbstractSynchroniser implements IUserD } } - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken = CancellationToken.None): Promise { - return this.getSnippetsFileContents() - .then(local => this.doGeneratePreview(local, remoteUserData, lastSyncUserData, {}, token)); - } - - private async doGeneratePreview(local: IStringDictionary, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, resolvedConflicts: IStringDictionary = {}, token: CancellationToken = CancellationToken.None): Promise { - const localSnippets = this.toSnippetsContents(local); - const remoteSnippets: IStringDictionary | null = remoteUserData.syncData ? this.parseSnippets(remoteUserData.syncData) : null; - const lastSyncSnippets: IStringDictionary | null = lastSyncUserData && lastSyncUserData.syncData ? this.parseSnippets(lastSyncUserData.syncData) : null; - - if (remoteSnippets) { - this.logService.trace(`${this.syncResourceLogLabel}: Merging remote snippets with local snippets...`); - } else { - this.logService.trace(`${this.syncResourceLogLabel}: Remote snippets does not exist. Synchronizing snippets for the first time.`); - } - - const mergeResult = merge(localSnippets, remoteSnippets, lastSyncSnippets, resolvedConflicts); - - const conflicts: Conflict[] = []; - for (const key of mergeResult.conflicts) { - const localPreview = joinPath(this.snippetsPreviewFolder, key); - conflicts.push({ local: localPreview, remote: localPreview.with({ scheme: USER_DATA_SYNC_SCHEME }) }); - const content = local[key]; - if (!token.isCancellationRequested) { - await this.fileService.writeFile(localPreview, content ? content.value : VSBuffer.fromString('')); - } - } - - for (const conflict of this.conflicts) { - // clear obsolete conflicts - if (!conflicts.some(({ local }) => isEqual(local, conflict.local))) { - try { - await this.fileService.del(conflict.local); - } catch (error) { - // Ignore & log - this.logService.error(error); - } - } - } - - return { - remoteUserData, local, - lastSyncUserData, - added: mergeResult.added, - removed: mergeResult.removed, - updated: mergeResult.updated, - conflicts, - remote: mergeResult.remote, - resolvedConflicts, - hasLocalChanged: Object.keys(mergeResult.added).length > 0 || mergeResult.removed.length > 0 || Object.keys(mergeResult.updated).length > 0, - hasRemoteChanged: mergeResult.remote !== null - }; - } - - private async apply(forcePush?: boolean): Promise { - if (!this.syncPreviewResultPromise) { - return; - } - - let { added, removed, updated, local, remote, remoteUserData, lastSyncUserData, hasLocalChanged, hasRemoteChanged } = await this.syncPreviewResultPromise; - - if (!hasLocalChanged && !hasRemoteChanged) { - this.logService.info(`${this.syncResourceLogLabel}: No changes found during synchronizing snippets.`); - } - - if (hasLocalChanged) { - // back up all snippets - await this.backupLocal(JSON.stringify(this.toSnippetsContents(local))); - await this.updateLocalSnippets(added, removed, updated, local); - } - - if (remote) { - // update remote - this.logService.trace(`${this.syncResourceLogLabel}: Updating remote snippets...`); - const content = JSON.stringify(remote); - remoteUserData = await this.updateRemoteUserData(content, forcePush ? null : remoteUserData.ref); - this.logService.info(`${this.syncResourceLogLabel}: Updated remote snippets`); - } - - if (lastSyncUserData?.ref !== remoteUserData.ref) { - // update last sync - this.logService.trace(`${this.syncResourceLogLabel}: Updating last synchronized snippets...`); - await this.updateLastSyncUserData(remoteUserData); - this.logService.info(`${this.syncResourceLogLabel}: Updated last synchronized snippets`); - } - - this.syncPreviewResultPromise = null; - } - private async updateLocalSnippets(added: IStringDictionary, removed: string[], updated: IStringDictionary, local: IStringDictionary): Promise { for (const key of removed) { const resource = joinPath(this.snippetsFolder, key); diff --git a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts index 1486538df2..1357128ea7 100644 --- a/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataAutoSyncService.ts @@ -3,22 +3,73 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Delayer, disposableTimeout } from 'vs/base/common/async'; +import { Delayer, disposableTimeout, CancelablePromise, createCancelablePromise, timeout } from 'vs/base/common/async'; import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, toDisposable, MutableDisposable, IDisposable } from 'vs/base/common/lifecycle'; -import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncEnablementService, ALL_SYNC_RESOURCES, getUserDataSyncStore } from 'vs/platform/userDataSync/common/userDataSync'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncLogService, IUserDataSyncService, IUserDataAutoSyncService, UserDataSyncError, UserDataSyncErrorCode, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService, UserDataAutoSyncError } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IStorageService, StorageScope, IWorkspaceStorageChangeEvent } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; +import { localize } from 'vs/nls'; type AutoSyncClassification = { sources: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -export const RESOURCE_ENABLEMENT_SOURCE = 'resourceEnablement'; +type AutoSyncEnablementClassification = { + enabled?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; +}; -export class UserDataAutoSyncService extends Disposable implements IUserDataAutoSyncService { +type AutoSyncErrorClassification = { + code: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; +}; + +const enablementKey = 'sync.enable'; +const disableMachineEventuallyKey = 'sync.disableMachineEventually'; +const sessionIdKey = 'sync.sessionId'; + +export class UserDataAutoSyncEnablementService extends Disposable { + + private _onDidChangeEnablement = new Emitter(); + readonly onDidChangeEnablement: Event = this._onDidChangeEnablement.event; + + constructor( + @IStorageService protected readonly storageService: IStorageService, + @IEnvironmentService private readonly environmentService: IEnvironmentService + ) { + super(); + this._register(storageService.onDidChangeStorage(e => this.onDidStorageChange(e))); + } + + isEnabled(): boolean { + switch (this.environmentService.sync) { + case 'on': + return true; + case 'off': + return false; + } + return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, this.environmentService.enableSyncByDefault); + } + + canToggleEnablement(): boolean { + return this.environmentService.sync === undefined; + } + + private onDidStorageChange(workspaceStorageChangeEvent: IWorkspaceStorageChangeEvent): void { + if (workspaceStorageChangeEvent.scope === StorageScope.GLOBAL) { + if (enablementKey === workspaceStorageChangeEvent.key) { + this._onDidChangeEnablement.fire(this.isEnabled()); + } + } + } + +} + +export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService implements IUserDataAutoSyncService { _serviceBrand: any; @@ -31,21 +82,27 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto readonly onError: Event = this._onError.event; constructor( - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, - @IAuthenticationTokenService private readonly authTokenService: IAuthenticationTokenService, + @IUserDataSyncAccountService private readonly userDataSyncAccountService: IUserDataSyncAccountService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IProductService private readonly productService: IProductService, - @IConfigurationService private readonly configurationService: IConfigurationService, + @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService ) { - super(); + super(storageService, environmentService); this.syncTriggerDelayer = this._register(new Delayer(0)); - if (getUserDataSyncStore(this.productService, this.configurationService)) { + if (userDataSyncStoreService.userDataSyncStore) { this.updateAutoSync(); - this._register(Event.any(authTokenService.onDidChangeToken, this.userDataSyncEnablementService.onDidChangeEnablement)(() => this.updateAutoSync())); - this._register(Event.filter(this.userDataSyncEnablementService.onDidChangeResourceEnablement, ([, enabled]) => enabled)(() => this.triggerAutoSync([RESOURCE_ENABLEMENT_SOURCE]))); + if (this.hasToDisableMachineEventually()) { + this.disableMachineEventually(); + } + this._register(userDataSyncAccountService.onDidChangeAccount(() => this.updateAutoSync())); + this._register(Event.debounce(userDataSyncService.onDidChangeLocal, (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, false))); + this._register(Event.filter(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, ([, enabled]) => enabled)(() => this.triggerSync(['resourceEnablement'], false))); } } @@ -53,7 +110,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto const { enabled, reason } = this.isAutoSyncEnabled(); if (enabled) { if (this.autoSync.value === undefined) { - this.autoSync.value = new AutoSync(1000 * 60 * 5 /* 5 miutes */, this.userDataSyncService, this.logService); + this.autoSync.value = new AutoSync(1000 * 60 * 5 /* 5 miutes */, this.userDataSyncStoreService, this.userDataSyncService, this.userDataSyncMachinesService, this.logService, this.storageService); this.autoSync.value.register(this.autoSync.value.onDidStartSync(() => this.lastSyncTriggerTime = new Date().getTime())); this.autoSync.value.register(this.autoSync.value.onDidFinishSync(e => this.onDidFinishSync(e))); if (this.startAutoSync()) { @@ -61,6 +118,7 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto } } } else { + this.syncTriggerDelayer.cancel(); if (this.autoSync.value !== undefined) { this.logService.info('Auto Sync: Disabled because', reason); this.autoSync.clear(); @@ -72,15 +130,66 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto protected startAutoSync(): boolean { return true; } private isAutoSyncEnabled(): { enabled: boolean, reason?: string } { - if (!this.userDataSyncEnablementService.isEnabled()) { + if (!this.isEnabled()) { return { enabled: false, reason: 'sync is disabled' }; } - if (!this.authTokenService.token) { + if (!this.userDataSyncAccountService.account) { return { enabled: false, reason: 'token is not avaialable' }; } return { enabled: true }; } + async turnOn(pullFirst: boolean): Promise { + this.stopDisableMachineEventually(); + + if (pullFirst) { + await this.userDataSyncService.pull(); + } else { + await this.userDataSyncService.sync(); + } + + this.setEnablement(true); + } + + async turnOff(everywhere: boolean, softTurnOffOnError?: boolean, donotRemoveMachine?: boolean): Promise { + try { + + // Remove machine + if (!donotRemoveMachine) { + await this.userDataSyncMachinesService.removeCurrentMachine(); + } + + // Disable Auto Sync + this.setEnablement(false); + + // Reset Session + this.storageService.remove(sessionIdKey, StorageScope.GLOBAL); + + // Reset + if (everywhere) { + this.telemetryService.publicLog2('sync/turnOffEveryWhere'); + await this.userDataSyncService.reset(); + } else { + await this.userDataSyncService.resetLocal(); + } + } catch (error) { + if (softTurnOffOnError) { + this.logService.error(error); + this.setEnablement(false); + } else { + throw error; + } + } + } + + private setEnablement(enabled: boolean): void { + if (this.isEnabled() !== enabled) { + this.telemetryService.publicLog2<{ enabled: boolean }, AutoSyncEnablementClassification>(enablementKey, { enabled }); + this.storageService.store(enablementKey, enabled, StorageScope.GLOBAL); + this.updateAutoSync(); + } + } + private async onDidFinishSync(error: Error | undefined): Promise { if (!error) { // Sync finished without errors @@ -90,52 +199,89 @@ export class UserDataAutoSyncService extends Disposable implements IUserDataAuto // Error while syncing const userDataSyncError = UserDataSyncError.toUserDataSyncError(error); + + // Log to telemetry + if (userDataSyncError instanceof UserDataAutoSyncError) { + this.telemetryService.publicLog2<{ code: string }, AutoSyncErrorClassification>(`autosync/error`, { code: userDataSyncError.code }); + } + + // Turned off from another device or session got expired if (userDataSyncError.code === UserDataSyncErrorCode.TurnedOff || userDataSyncError.code === UserDataSyncErrorCode.SessionExpired) { - this.logService.info('Auto Sync: Sync is turned off in the cloud.'); - await this.userDataSyncService.resetLocal(); - this.logService.info('Auto Sync: Did reset the local sync state.'); - this.userDataSyncEnablementService.setEnablement(false); + await this.turnOff(false, true /* force soft turnoff on error */); this.logService.info('Auto Sync: Turned off sync because sync is turned off in the cloud'); - } else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests) { - this.userDataSyncEnablementService.setEnablement(false); + } + + // Exceeded Rate Limit + else if (userDataSyncError.code === UserDataSyncErrorCode.LocalTooManyRequests || 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(); this.logService.info('Auto Sync: Turned off sync because of making too many requests to server'); - } else { + } + + else { this.logService.error(userDataSyncError); this.successiveFailures++; } + this._onError.fire(userDataSyncError); } + private async disableMachineEventually(): Promise { + this.storageService.store(disableMachineEventuallyKey, true, StorageScope.GLOBAL); + await timeout(1000 * 60 * 10); + + // Return if got stopped meanwhile. + if (!this.hasToDisableMachineEventually()) { + return; + } + + this.stopDisableMachineEventually(); + + // disable only if sync is disabled + if (!this.isEnabled() && this.userDataSyncAccountService.account) { + await this.userDataSyncMachinesService.removeCurrentMachine(); + } + } + + private hasToDisableMachineEventually(): boolean { + return this.storageService.getBoolean(disableMachineEventuallyKey, StorageScope.GLOBAL, false); + } + + private stopDisableMachineEventually(): void { + this.storageService.remove(disableMachineEventuallyKey, StorageScope.GLOBAL); + } + private sources: string[] = []; - async triggerAutoSync(sources: string[]): Promise { + async triggerSync(sources: string[], skipIfSyncedRecently: boolean): Promise { if (this.autoSync.value === undefined) { return this.syncTriggerDelayer.cancel(); } - /* - If sync is not triggered by sync resource (triggered by other sources like window focus etc.,) or by resource enablement - then limit sync to once per 10s - */ - const hasToLimitSync = sources.indexOf(RESOURCE_ENABLEMENT_SOURCE) === -1 && ALL_SYNC_RESOURCES.every(syncResource => sources.indexOf(syncResource) === -1); - if (hasToLimitSync && this.lastSyncTriggerTime + if (skipIfSyncedRecently && this.lastSyncTriggerTime && Math.round((new Date().getTime() - this.lastSyncTriggerTime) / 1000) < 10) { - this.logService.debug('Auto Sync Skipped: Limited to once per 10 seconds.'); + this.logService.debug('Auto Sync: Skipped. Limited to once per 10 seconds.'); return; } 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.sources = []; if (this.autoSync.value) { await this.autoSync.value.sync('Activity'); } }, this.successiveFailures - ? 1000 * 1 * Math.min(Math.pow(2, this.successiveFailures), 60) /* Delay exponentially until max 1 minute */ - : 1000); /* Debounce for a second if there are no failures */ + ? this.getSyncTriggerDelayTime() * 1 * Math.min(Math.pow(2, this.successiveFailures), 60) /* Delay exponentially until max 1 minute */ + : this.getSyncTriggerDelayTime()); } + protected getSyncTriggerDelayTime(): number { + return 1000; /* Debounce for a second if there are no failures */ + } + } class AutoSync extends Disposable { @@ -150,10 +296,15 @@ class AutoSync extends Disposable { private readonly _onDidFinishSync = this._register(new Emitter()); readonly onDidFinishSync = this._onDidFinishSync.event; + private syncPromise: CancelablePromise | undefined; + constructor( private readonly interval: number /* in milliseconds */, + private readonly userDataSyncStoreService: IUserDataSyncStoreService, private readonly userDataSyncService: IUserDataSyncService, + private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, private readonly logService: IUserDataSyncLogService, + private readonly storageService: IStorageService, ) { super(); } @@ -161,6 +312,11 @@ class AutoSync extends Disposable { start(): void { this._register(this.onDidFinishSync(() => this.waitUntilNextIntervalAndSync())); this._register(toDisposable(() => { + if (this.syncPromise) { + this.syncPromise.cancel(); + this.logService.info('Auto sync: Canelled sync that is in progress'); + this.syncPromise = undefined; + } this.userDataSyncService.stop(); this.logService.info('Auto Sync: Stopped'); })); @@ -172,16 +328,87 @@ class AutoSync extends Disposable { this.intervalHandler.value = disposableTimeout(() => this.sync(AutoSync.INTERVAL_SYNCING), this.interval); } - async sync(reason: string): Promise { + sync(reason: string): Promise { + const syncPromise = createCancelablePromise(async token => { + if (this.syncPromise) { + try { + // Wait until existing sync is finished + this.logService.debug('Auto Sync: Waiting until sync is finished.'); + await this.syncPromise; + } catch (error) { + if (isPromiseCanceledError(error)) { + // Cancelled => Disposed. Donot continue sync. + return; + } + } + } + return this.doSync(reason, token); + }); + this.syncPromise = syncPromise; + this.syncPromise.finally(() => this.syncPromise = undefined); + return this.syncPromise; + } + + private async doSync(reason: string, token: CancellationToken): Promise { this.logService.info(`Auto Sync: Triggered by ${reason}`); this._onDidStartSync.fire(); let error: Error | undefined; try { - await this.userDataSyncService.sync(); + const syncTask = await this.userDataSyncService.createSyncTask(); + let manifest = syncTask.manifest; + + // Server has no data but this machine was synced before + if (manifest === null && await this.userDataSyncService.hasPreviouslySynced()) { + // Sync was turned off in the cloud + throw new UserDataAutoSyncError(localize('turned off', "Cannot sync because syncing is turned off in the cloud"), UserDataSyncErrorCode.TurnedOff); + } + + const sessionId = this.storageService.get(sessionIdKey, StorageScope.GLOBAL); + // Server session is different from client session + if (sessionId && manifest && sessionId !== manifest.session) { + throw new UserDataAutoSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired); + } + + const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined); + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } + + const currentMachine = machines.find(machine => machine.isCurrent); + // Check if sync was turned off from other machine + if (currentMachine?.disabled) { + // Throw TurnedOff error + throw new UserDataAutoSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff); + } + + await syncTask.run(token); + + // After syncing, get the manifest if it was not available before + if (manifest === null) { + manifest = await this.userDataSyncStoreService.manifest(); + } + + // Update local session id + if (manifest && manifest.session !== sessionId) { + this.storageService.store(sessionIdKey, manifest.session, StorageScope.GLOBAL); + } + + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } + + // Add current machine + if (!currentMachine) { + await this.userDataSyncMachinesService.addCurrentMachine(manifest || undefined); + } + } catch (e) { this.logService.error(e); error = e; } + this._onDidFinishSync.fire(error); } diff --git a/src/vs/platform/userDataSync/common/userDataSync.ts b/src/vs/platform/userDataSync/common/userDataSync.ts index be8538d292..d579848300 100644 --- a/src/vs/platform/userDataSync/common/userDataSync.ts +++ b/src/vs/platform/userDataSync/common/userDataSync.ts @@ -22,6 +22,8 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IProductService, ConfigurationSyncStore } from 'vs/platform/product/common/productService'; import { distinct } from 'vs/base/common/arrays'; import { isArray, isString, isObject } from 'vs/base/common/types'; +import { IHeaders } from 'vs/base/parts/request/common/request'; +import { CancellationToken } from 'vs/base/common/cancellation'; export const CONFIGURATION_SYNC_STORE_KEY = 'configurationSync.store'; @@ -160,20 +162,27 @@ export interface IResourceRefHandle { export const IUserDataSyncStoreService = createDecorator('IUserDataSyncStoreService'); export type ServerResource = SyncResource | 'machines'; export interface IUserDataSyncStoreService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly userDataSyncStore: IUserDataSyncStore | undefined; - read(resource: ServerResource, oldValue: IUserData | null): Promise; - write(resource: ServerResource, content: string, ref: string | null): Promise; - manifest(): Promise; + + readonly onTokenFailed: Event; + readonly onTokenSucceed: Event; + setAuthToken(token: string, type: string): void; + + // Sync requests + manifest(headers?: IHeaders): Promise; + read(resource: ServerResource, oldValue: IUserData | null, headers?: IHeaders): Promise; + write(resource: ServerResource, content: string, ref: string | null, headers?: IHeaders): Promise; clear(): Promise; + delete(resource: ServerResource): Promise; + getAllRefs(resource: ServerResource): Promise; resolveContent(resource: ServerResource, ref: string): Promise; - delete(resource: ServerResource): Promise; } export const IUserDataSyncBackupStoreService = createDecorator('IUserDataSyncBackupStoreService'); export interface IUserDataSyncBackupStoreService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; backup(resource: SyncResource, content: string): Promise; getAllRefs(resource: SyncResource): Promise; resolveContent(resource: SyncResource, ref?: string): Promise; @@ -186,6 +195,7 @@ export interface IUserDataSyncBackupStoreService { export enum UserDataSyncErrorCode { // Client Errors (>= 400 ) Unauthorized = 'Unauthorized', /* 401 */ + Gone = 'Gone', /* 410 */ PreconditionFailed = 'PreconditionFailed', /* 412 */ TooLarge = 'TooLarge', /* 413 */ UpgradeRequired = 'UpgradeRequired', /* 426 */ @@ -210,11 +220,11 @@ export class UserDataSyncError extends Error { constructor(message: string, public readonly code: UserDataSyncErrorCode, public readonly resource?: SyncResource) { super(message); - this.name = `${this.code} (UserDataSyncError) ${this.resource}`; + this.name = `${this.code} (UserDataSyncError) ${this.resource || ''}`; } static toUserDataSyncError(error: Error): UserDataSyncError { - if (error instanceof UserDataSyncStoreError) { + if (error instanceof UserDataSyncError) { return error; } const match = /^(.+) \(UserDataSyncError\) (.+)?$/.exec(error.name); @@ -232,6 +242,12 @@ export class UserDataSyncStoreError extends UserDataSyncError { } } +export class UserDataAutoSyncError extends UserDataSyncError { + constructor(message: string, code: UserDataSyncErrorCode) { + super(message, code); + } +} + //#endregion // #region User Data Synchroniser @@ -266,9 +282,24 @@ export interface ISyncResourceHandle { export type Conflict = { remote: URI, local: URI }; -export interface ISyncPreviewResult { +export interface IRemoteUserData { + ref: string; + syncData: ISyncData | null; +} + +export interface ISyncData { + version: number; + machineId?: string; + content: string; +} + +export interface ISyncPreview { + readonly remoteUserData: IRemoteUserData; + readonly lastSyncUserData: IRemoteUserData | null; + readonly isLastSyncFromCurrentMachine: boolean; readonly hasLocalChanged: boolean; readonly hasRemoteChanged: boolean; + readonly hasConflicts: boolean; } export interface IUserDataSynchroniser { @@ -282,11 +313,11 @@ export interface IUserDataSynchroniser { pull(): Promise; push(): Promise; - sync(manifest: IUserDataManifest | null): Promise; + sync(manifest: IUserDataManifest | null, headers?: IHeaders): Promise; replace(uri: URI): Promise; stop(): Promise; - getSyncPreview(): Promise + generateSyncPreview(): Promise hasPreviouslySynced(): Promise hasLocalData(): Promise; resetLocal(): Promise; @@ -304,23 +335,22 @@ export interface IUserDataSynchroniser { // #region User Data Sync Services -export const IUserDataSyncEnablementService = createDecorator('IUserDataSyncEnablementService'); -export interface IUserDataSyncEnablementService { +export const IUserDataSyncResourceEnablementService = createDecorator('IUserDataSyncResourceEnablementService'); +export interface IUserDataSyncResourceEnablementService { _serviceBrand: any; - readonly onDidChangeEnablement: Event; readonly onDidChangeResourceEnablement: Event<[SyncResource, boolean]>; - - isEnabled(): boolean; - setEnablement(enabled: boolean): void; - canToggleEnablement(): boolean; - isResourceEnabled(resource: SyncResource): boolean; setResourceEnablement(resource: SyncResource, enabled: boolean): void; } export type SyncResourceConflicts = { syncResource: SyncResource, conflicts: Conflict[] }; +export interface ISyncTask { + manifest: IUserDataManifest | null; + run(token: CancellationToken): Promise; +} + export const IUserDataSyncService = createDecorator('IUserDataSyncService'); export interface IUserDataSyncService { _serviceBrand: any; @@ -344,7 +374,10 @@ export interface IUserDataSyncService { reset(): Promise; resetLocal(): Promise; - isFirstTimeSyncWithMerge(): Promise; + createSyncTask(): Promise + + isFirstTimeSyncingWithAnotherMachine(): Promise; + hasPreviouslySynced(): Promise; resolveContent(resource: URI): Promise; acceptConflict(conflictResource: URI, content: string): Promise; @@ -358,12 +391,17 @@ export const IUserDataAutoSyncService = createDecorator; - triggerAutoSync(sources: string[]): Promise; + readonly onDidChangeEnablement: Event; + isEnabled(): boolean; + canToggleEnablement(): boolean; + turnOn(pullFirst: boolean): Promise; + turnOff(everywhere: boolean): Promise; + triggerSync(sources: string[], hasToLimitSync: boolean): Promise; } export const IUserDataSyncUtilService = createDecorator('IUserDataSyncUtilService'); export interface IUserDataSyncUtilService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; resolveUserBindings(userbindings: string[]): Promise>; resolveFormattingOptions(resource: URI): Promise; resolveDefaultIgnoredSettings(): Promise; diff --git a/src/vs/platform/userDataSync/common/userDataSyncAccount.ts b/src/vs/platform/userDataSync/common/userDataSyncAccount.ts new file mode 100644 index 0000000000..5b6846faea --- /dev/null +++ b/src/vs/platform/userDataSync/common/userDataSyncAccount.ts @@ -0,0 +1,64 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { Emitter, Event } from 'vs/base/common/event'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; + +export interface IUserDataSyncAccount { + readonly authenticationProviderId: string; + readonly token: string; +} + +export const IUserDataSyncAccountService = createDecorator('IUserDataSyncAccountService'); +export interface IUserDataSyncAccountService { + readonly _serviceBrand: undefined; + + readonly onTokenFailed: Event; + readonly account: IUserDataSyncAccount | undefined; + readonly onDidChangeAccount: Event; + updateAccount(account: IUserDataSyncAccount | undefined): Promise; + +} + +export class UserDataSyncAccountService extends Disposable implements IUserDataSyncAccountService { + + _serviceBrand: any; + + private _account: IUserDataSyncAccount | undefined; + get account(): IUserDataSyncAccount | undefined { return this._account; } + private _onDidChangeAccount = this._register(new Emitter()); + readonly onDidChangeAccount = this._onDidChangeAccount.event; + + private _onTokenFailed: Emitter = this._register(new Emitter()); + readonly onTokenFailed: Event = this._onTokenFailed.event; + + private wasTokenFailed: boolean = false; + + constructor( + @IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService + ) { + super(); + this._register(userDataSyncStoreService.onTokenFailed(() => { + this.updateAccount(undefined); + this._onTokenFailed.fire(this.wasTokenFailed); + this.wasTokenFailed = true; + })); + this._register(userDataSyncStoreService.onTokenSucceed(() => this.wasTokenFailed = false)); + } + + async updateAccount(account: IUserDataSyncAccount | undefined): Promise { + if (account && this._account ? account.token !== this._account.token || account.authenticationProviderId !== this._account.authenticationProviderId : account !== this._account) { + this._account = account; + if (this._account) { + this.userDataSyncStoreService.setAuthToken(this._account.token, this._account.authenticationProviderId); + } + this._onDidChangeAccount.fire(account); + } + } + +} + diff --git a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts index 61b05d560d..f9604abc8a 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncIpc.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncIpc.ts @@ -13,6 +13,7 @@ import { IStorageKeysSyncRegistryService, IStorageKey } from 'vs/platform/userDa import { Disposable } from 'vs/base/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; export class UserDataSyncChannel implements IServerChannel { @@ -48,7 +49,8 @@ export class UserDataSyncChannel implements IServerChannel { case 'replace': return this.service.replace(URI.revive(args[0])); case 'reset': return this.service.reset(); case 'resetLocal': return this.service.resetLocal(); - case 'isFirstTimeSyncWithMerge': return this.service.isFirstTimeSyncWithMerge(); + case 'hasPreviouslySynced': return this.service.hasPreviouslySynced(); + case 'isFirstTimeSyncingWithAnotherMachine': return this.service.isFirstTimeSyncingWithAnotherMachine(); case 'acceptConflict': return this.service.acceptConflict(URI.revive(args[0]), args[1]); case 'resolveContent': return this.service.resolveContent(URI.revive(args[0])); case 'getLocalSyncResourceHandles': return this.service.getLocalSyncResourceHandles(args[0]); @@ -73,7 +75,9 @@ export class UserDataAutoSyncChannel implements IServerChannel { call(context: any, command: string, args?: any): Promise { switch (command) { - case 'triggerAutoSync': return this.service.triggerAutoSync(args[0]); + case 'triggerSync': return this.service.triggerSync(args[0], args[1]); + case 'turnOn': return this.service.turnOn(args[0]); + case 'turnOff': return this.service.turnOff(args[0]); } throw new Error('Invalid call'); } @@ -99,7 +103,7 @@ export class UserDataSycnUtilServiceChannel implements IServerChannel { export class UserDataSyncUtilServiceClient implements IUserDataSyncUtilService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly channel: IChannel) { } @@ -140,7 +144,7 @@ export class StorageKeysSyncRegistryChannel implements IServerChannel { export class StorageKeysSyncRegistryChannelClient extends Disposable implements IStorageKeysSyncRegistryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _storageKeys: ReadonlyArray = []; get storageKeys(): ReadonlyArray { return this._storageKeys; } @@ -177,12 +181,33 @@ export class UserDataSyncMachinesServiceChannel implements IServerChannel { async call(context: any, command: string, args?: any): Promise { switch (command) { case 'getMachines': return this.service.getMachines(); - case 'addCurrentMachine': return this.service.addCurrentMachine(args[0]); + case 'addCurrentMachine': return this.service.addCurrentMachine(); case 'removeCurrentMachine': return this.service.removeCurrentMachine(); case 'renameMachine': return this.service.renameMachine(args[0], args[1]); - case 'disableMachine': return this.service.disableMachine(args[0]); + case 'setEnablement': return this.service.setEnablement(args[0], args[1]); } throw new Error('Invalid call'); } } + +export class UserDataSyncAccountServiceChannel implements IServerChannel { + constructor(private readonly service: IUserDataSyncAccountService) { } + + listen(_: unknown, event: string): Event { + switch (event) { + case 'onDidChangeAccount': return this.service.onDidChangeAccount; + case 'onTokenFailed': return this.service.onTokenFailed; + } + throw new Error(`Event not found: ${event}`); + } + + call(context: any, command: string, args?: any): Promise { + switch (command) { + case '_getInitialData': return Promise.resolve(this.service.account); + case 'updateAccount': return this.service.updateAccount(args); + } + throw new Error('Invalid call'); + } +} + diff --git a/src/vs/platform/userDataSync/common/userDataSyncLog.ts b/src/vs/platform/userDataSync/common/userDataSyncLog.ts index 43ebeba16a..d2f4182a03 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncLog.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncLog.ts @@ -9,7 +9,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' export class UserDataSyncLogService extends AbstractLogService implements IUserDataSyncLogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly logger: ILogger; constructor( diff --git a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts index 0253f726fb..d051452b11 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncMachines.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncMachines.ts @@ -8,10 +8,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IFileService } from 'vs/platform/files/common/files'; -import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUserDataSyncStoreService, IUserData, IUserDataSyncLogService, IUserDataManifest } from 'vs/platform/userDataSync/common/userDataSync'; import { localize } from 'vs/nls'; import { IProductService } from 'vs/platform/product/common/productService'; +import { PlatformToString, isWeb, Platform, platform } from 'vs/base/common/platform'; +import { escapeRegExpCharacters } from 'vs/base/common/strings'; interface IMachineData { id: string; @@ -26,20 +28,20 @@ interface IMachinesData { export type IUserDataSyncMachine = Readonly & { readonly isCurrent: boolean }; - export const IUserDataSyncMachinesService = createDecorator('IUserDataSyncMachinesService'); export interface IUserDataSyncMachinesService { _serviceBrand: any; getMachines(manifest?: IUserDataManifest): Promise; - addCurrentMachine(name: string, manifest?: IUserDataManifest): Promise; + addCurrentMachine(manifest?: IUserDataManifest): Promise; removeCurrentMachine(manifest?: IUserDataManifest): Promise; - renameMachine(machineId: string, name: string): Promise; - disableMachine(machineId: string): Promise + setEnablement(machineId: string, enabled: boolean): Promise; } +const currentMachineNameKey = 'sync.currentMachineName'; + export class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMachinesService { private static readonly VERSION = 1; @@ -53,7 +55,7 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData constructor( @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, - @IStorageService storageService: IStorageService, + @IStorageService private readonly storageService: IStorageService, @IUserDataSyncStoreService private readonly userDataSyncStoreService: IUserDataSyncStoreService, @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, @IProductService private readonly productService: IProductService, @@ -68,16 +70,13 @@ export class UserDataSyncMachinesService extends Disposable implements IUserData return machineData.machines.map(machine => ({ ...machine, ...{ isCurrent: machine.id === currentMachineId } })); } - async addCurrentMachine(name: string, manifest?: IUserDataManifest): Promise { + async addCurrentMachine(manifest?: IUserDataManifest): Promise { const currentMachineId = await this.currentMachineIdPromise; const machineData = await this.readMachinesData(manifest); - let currentMachine = machineData.machines.find(({ id }) => id === currentMachineId); - if (currentMachine) { - currentMachine.name = name; - } else { - machineData.machines.push({ id: currentMachineId, name }); + if (!machineData.machines.some(({ id }) => id === currentMachineId)) { + machineData.machines.push({ id: currentMachineId, name: this.computeCurrentMachineName(machineData.machines) }); + await this.writeMachinesData(machineData); } - await this.writeMachinesData(machineData); } async removeCurrentMachine(manifest?: IUserDataManifest): Promise { @@ -91,21 +90,42 @@ 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 currentMachine = machineData.machines.find(({ id }) => id === machineId); - if (currentMachine) { - currentMachine.name = name; + const machine = machineData.machines.find(({ id }) => id === machineId); + if (machine) { + machine.name = name; + await this.writeMachinesData(machineData); + if (machineData.machines.some(({ id }) => id === currentMachineId)) { + this.storageService.store(currentMachineNameKey, name, StorageScope.GLOBAL); + } + } + } + + async setEnablement(machineId: string, enabled: 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); } } - async disableMachine(machineId: string): Promise { - const machineData = await this.readMachinesData(); - const machine = machineData.machines.find(({ id }) => id === machineId); - if (machine) { - machine.disabled = true; - await this.writeMachinesData(machineData); + private computeCurrentMachineName(machines: IMachineData[]): string { + const previousName = this.storageService.get(currentMachineNameKey, StorageScope.GLOBAL); + if (previousName) { + return previousName; } + + const namePrefix = `${this.productService.nameLong} (${PlatformToString(isWeb ? Platform.Web : platform)})`; + const nameRegEx = new RegExp(`${escapeRegExpCharacters(namePrefix)}\\s#(\\d)`); + let nameIndex = 0; + for (const machine of machines) { + const matches = nameRegEx.exec(machine.name); + const index = matches ? parseInt(matches[1]) : 0; + nameIndex = index > nameIndex ? index : nameIndex; + } + return `${namePrefix} #${nameIndex + 1}`; } private async readMachinesData(manifest?: IUserDataManifest): Promise { diff --git a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts b/src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts similarity index 64% rename from src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts rename to src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts index b9536ceb60..33e1f90e59 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncEnablementService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncResourceEnablementService.ts @@ -3,12 +3,11 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncEnablementService, ALL_SYNC_RESOURCES, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncResourceEnablementService, ALL_SYNC_RESOURCES, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IEnvironmentService } from 'vs/platform/environment/common/environment'; type SyncEnablementClassification = { enabled?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; @@ -17,46 +16,21 @@ type SyncEnablementClassification = { const enablementKey = 'sync.enable'; function getEnablementKey(resource: SyncResource) { return `${enablementKey}.${resource}`; } -export class UserDataSyncEnablementService extends Disposable implements IUserDataSyncEnablementService { +export class UserDataSyncResourceEnablementService extends Disposable implements IUserDataSyncResourceEnablementService { _serviceBrand: any; - private _onDidChangeEnablement = new Emitter(); - readonly onDidChangeEnablement: Event = this._onDidChangeEnablement.event; - private _onDidChangeResourceEnablement = new Emitter<[SyncResource, boolean]>(); readonly onDidChangeResourceEnablement: Event<[SyncResource, boolean]> = this._onDidChangeResourceEnablement.event; constructor( @IStorageService private readonly storageService: IStorageService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IEnvironmentService private readonly environmentService: IEnvironmentService, ) { super(); this._register(storageService.onDidChangeStorage(e => this.onDidStorageChange(e))); } - canToggleEnablement(): boolean { - return this.environmentService.sync === undefined; - } - - isEnabled(): boolean { - switch (this.environmentService.sync) { - case 'on': - return true; - case 'off': - return false; - } - return this.storageService.getBoolean(enablementKey, StorageScope.GLOBAL, this.environmentService.enableSyncByDefault); - } - - setEnablement(enabled: boolean): void { - if (this.isEnabled() !== enabled) { - this.telemetryService.publicLog2<{ enabled: boolean }, SyncEnablementClassification>(enablementKey, { enabled }); - this.storageService.store(enablementKey, enabled, StorageScope.GLOBAL); - } - } - isResourceEnabled(resource: SyncResource): boolean { return this.storageService.getBoolean(getEnablementKey(resource), StorageScope.GLOBAL, true); } @@ -71,13 +45,9 @@ export class UserDataSyncEnablementService extends Disposable implements IUserDa private onDidStorageChange(workspaceStorageChangeEvent: IWorkspaceStorageChangeEvent): void { if (workspaceStorageChangeEvent.scope === StorageScope.GLOBAL) { - if (enablementKey === workspaceStorageChangeEvent.key) { - this._onDidChangeEnablement.fire(this.isEnabled()); - return; - } const resourceKey = ALL_SYNC_RESOURCES.filter(resourceKey => getEnablementKey(resourceKey) === workspaceStorageChangeEvent.key)[0]; if (resourceKey) { - this._onDidChangeResourceEnablement.fire([resourceKey, this.isEnabled()]); + this._onDidChangeResourceEnablement.fire([resourceKey, this.isResourceEnabled(resourceKey)]); return; } } diff --git a/src/vs/platform/userDataSync/common/userDataSyncService.ts b/src/vs/platform/userDataSync/common/userDataSyncService.ts index eb1de4249b..006c2b063a 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncResource, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncErrorCode, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncStatus, IUserDataSyncStoreService, SyncResource, IUserDataSyncLogService, IUserDataSynchroniser, UserDataSyncErrorCode, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle, IUserDataManifest, ISyncTask } from 'vs/platform/userDataSync/common/userDataSync'; import { Disposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Emitter, Event } from 'vs/base/common/event'; @@ -13,30 +13,25 @@ import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalS import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { equals } from 'vs/base/common/arrays'; -import { localize } from 'vs/nls'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { URI } from 'vs/base/common/uri'; import { SettingsSynchroniser } from 'vs/platform/userDataSync/common/settingsSync'; import { isEqual } from 'vs/base/common/resources'; import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync'; -import { Throttler } from 'vs/base/common/async'; -import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { platform, PlatformToString } from 'vs/base/common/platform'; -import { escapeRegExpCharacters } from 'vs/base/common/strings'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IHeaders } from 'vs/base/parts/request/common/request'; +import { generateUuid } from 'vs/base/common/uuid'; type SyncClassification = { resource?: { classification: 'SystemMetaData', purpose: 'FeatureInsight', isMeasurement: true }; }; -const SESSION_ID_KEY = 'sync.sessionId'; const LAST_SYNC_TIME_KEY = 'sync.lastSyncTime'; export class UserDataSyncService extends Disposable implements IUserDataSyncService { _serviceBrand: any; - private readonly syncThrottler: Throttler; private readonly synchronisers: IUserDataSynchroniser[]; private _status: SyncStatus = SyncStatus.Uninitialized; @@ -72,11 +67,8 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IStorageService private readonly storageService: IStorageService, - @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, - @IProductService private readonly productService: IProductService ) { super(); - this.syncThrottler = new Throttler(); this.settingsSynchroniser = this._register(this.instantiationService.createInstance(SettingsSynchroniser)); this.keybindingsSynchroniser = this._register(this.instantiationService.createInstance(KeybindingsSynchroniser)); this.snippetsSynchroniser = this._register(this.instantiationService.createInstance(SnippetsSynchroniser)); @@ -107,7 +99,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.updateLastSyncTime(); } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${UserDataSyncErrorCode.TooLarge}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); } throw error; } @@ -126,7 +118,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.updateLastSyncTime(); } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${UserDataSyncErrorCode.TooLarge}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); } throw error; } @@ -134,6 +126,29 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ private recoveredSettings: boolean = false; async sync(): Promise { + const syncTask = await this.createSyncTask(); + return syncTask.run(CancellationToken.None); + } + + async createSyncTask(): Promise { + this.telemetryService.publicLog2('sync/getmanifest'); + const syncHeaders: IHeaders = { 'X-Execution-Id': generateUuid() }; + const manifest = await this.userDataSyncStoreService.manifest(syncHeaders); + + let executed = false; + const that = this; + return { + manifest, + run(token: CancellationToken): Promise { + if (executed) { + throw new Error('Can run a task only once'); + } + return that.doSync(manifest, syncHeaders, token); + } + }; + } + + private async doSync(manifest: IUserDataManifest | null, syncHeaders: IHeaders, token: CancellationToken): Promise { await this.checkEnablement(); if (!this.recoveredSettings) { @@ -141,10 +156,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.recoveredSettings = true; } - await this.syncThrottler.queue(() => this.doSync()); - } + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } - private async doSync(): Promise { const startTime = new Date().getTime(); this._syncErrors = []; try { @@ -153,62 +169,24 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.setStatus(SyncStatus.Syncing); } - this.telemetryService.publicLog2('sync/getmanifest'); - let manifest = await this.userDataSyncStoreService.manifest(); - - // Server has no data but this machine was synced before - if (manifest === null && await this.hasPreviouslySynced()) { - // Sync was turned off in the cloud - throw new UserDataSyncError(localize('turned off', "Cannot sync because syncing is turned off in the cloud"), UserDataSyncErrorCode.TurnedOff); - } - - const sessionId = this.storageService.get(SESSION_ID_KEY, StorageScope.GLOBAL); - // Server session is different from client session - if (sessionId && manifest && sessionId !== manifest.session) { - throw new UserDataSyncError(localize('session expired', "Cannot sync because current session is expired"), UserDataSyncErrorCode.SessionExpired); - } - - const machines = await this.userDataSyncMachinesService.getMachines(manifest || undefined); - const currentMachine = machines.find(machine => machine.isCurrent); - - // Check if sync was turned off from other machine - if (currentMachine?.disabled) { - // Unset the current machine - await this.userDataSyncMachinesService.removeCurrentMachine(manifest || undefined); - // Throw TurnedOff error - throw new UserDataSyncError(localize('turned off machine', "Cannot sync because syncing is turned off on this machine from another machine."), UserDataSyncErrorCode.TurnedOff); - } - for (const synchroniser of this.synchronisers) { + // Return if cancellation is requested + if (token.isCancellationRequested) { + return; + } try { - await synchroniser.sync(manifest); + await synchroniser.sync(manifest, syncHeaders); } catch (e) { this.handleSynchronizerError(e, synchroniser.resource); this._syncErrors.push([synchroniser.resource, UserDataSyncError.toUserDataSyncError(e)]); } } - // After syncing, get the manifest if it was not available before - if (manifest === null) { - manifest = await this.userDataSyncStoreService.manifest(); - } - - // Update local session id - if (manifest && manifest.session !== sessionId) { - this.storageService.store(SESSION_ID_KEY, manifest.session, StorageScope.GLOBAL); - } - - if (!currentMachine) { - const name = this.computeDefaultMachineName(machines); - await this.userDataSyncMachinesService.addCurrentMachine(name, manifest || undefined); - } - this.logService.info(`Sync done. Took ${new Date().getTime() - startTime}ms`); this.updateLastSyncTime(); - } catch (error) { if (error instanceof UserDataSyncError) { - this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${UserDataSyncErrorCode.TooLarge}`, { resource: error.resource }); + this.telemetryService.publicLog2<{ resource?: string }, SyncClassification>(`sync/error/${error.code}`, { resource: error.resource }); } throw error; } finally { @@ -228,9 +206,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ async stop(): Promise { await this.checkEnablement(); + if (this.status === SyncStatus.Idle) { return; } + for (const synchroniser of this.synchronisers) { try { if (synchroniser.status !== SyncStatus.Idle) { @@ -240,6 +220,7 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.logService.error(e); } } + } async acceptConflict(conflict: URI, content: string): Promise { @@ -277,39 +258,47 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.getSynchroniser(resource).getMachineId(syncResourceHandle); } - async isFirstTimeSyncWithMerge(): Promise { + async isFirstTimeSyncingWithAnotherMachine(): Promise { await this.checkEnablement(); + if (!await this.userDataSyncStoreService.manifest()) { return false; } - if (await this.hasPreviouslySynced()) { + + // skip global state synchronizer + const synchronizers = [this.settingsSynchroniser, this.keybindingsSynchroniser, this.snippetsSynchroniser, this.extensionsSynchroniser]; + + let hasLocalData: boolean = false; + for (const synchroniser of synchronizers) { + if (await synchroniser.hasLocalData()) { + hasLocalData = true; + break; + } + } + + if (!hasLocalData) { return false; } - if (!(await this.hasLocalData())) { - return false; - } - for (const synchroniser of [this.settingsSynchroniser, this.keybindingsSynchroniser, this.snippetsSynchroniser, this.extensionsSynchroniser]) { - const preview = await synchroniser.getSyncPreview(); - if (preview.hasLocalChanged || preview.hasRemoteChanged) { + + for (const synchroniser of synchronizers) { + const preview = await synchroniser.generateSyncPreview(); + if (preview && !preview.isLastSyncFromCurrentMachine && (preview.hasLocalChanged || preview.hasRemoteChanged)) { return true; } } + return false; } async reset(): Promise { await this.checkEnablement(); await this.resetRemote(); - await this.resetLocal(true); + await this.resetLocal(); } - async resetLocal(donotUnsetMachine?: boolean): Promise { + async resetLocal(): Promise { await this.checkEnablement(); - this.storageService.remove(SESSION_ID_KEY, StorageScope.GLOBAL); this.storageService.remove(LAST_SYNC_TIME_KEY, StorageScope.GLOBAL); - if (!donotUnsetMachine) { - await this.userDataSyncMachinesService.removeCurrentMachine(); - } for (const synchroniser of this.synchronisers) { try { await synchroniser.resetLocal(); @@ -318,9 +307,10 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ this.logService.error(e); } } + this.logService.info('Did reset the local sync state.'); } - private async hasPreviouslySynced(): Promise { + async hasPreviouslySynced(): Promise { for (const synchroniser of this.synchronisers) { if (await synchroniser.hasPreviouslySynced()) { return true; @@ -329,19 +319,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return false; } - private async hasLocalData(): Promise { - for (const synchroniser of this.synchronisers) { - if (await synchroniser.hasLocalData()) { - return true; - } - } - return false; - } - private async resetRemote(): Promise { await this.checkEnablement(); try { await this.userDataSyncStoreService.clear(); + this.logService.info('Cleared data on server'); } catch (e) { this.logService.error(e); } @@ -397,8 +379,11 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ if (e instanceof UserDataSyncError) { switch (e.code) { case UserDataSyncErrorCode.TooLarge: + throw new UserDataSyncError(e.message, e.code, source); + case UserDataSyncErrorCode.TooManyRequests: case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.Gone: case UserDataSyncErrorCode.UpgradeRequired: case UserDataSyncErrorCode.Incompatible: throw e; @@ -413,20 +398,6 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ .map(s => ({ syncResource: s.resource, conflicts: s.conflicts })); } - private computeDefaultMachineName(machines: IUserDataSyncMachine[]): string { - const namePrefix = `${this.productService.nameLong} (${PlatformToString(platform)})`; - const nameRegEx = new RegExp(`${escapeRegExpCharacters(namePrefix)}\\s#(\\d)`); - - let nameIndex = 0; - for (const machine of machines) { - const matches = nameRegEx.exec(machine.name); - const index = matches ? parseInt(matches[1]) : 0; - nameIndex = index > nameIndex ? index : nameIndex; - } - - return `${namePrefix} #${nameIndex + 1}`; - } - getSynchroniser(source: SyncResource): IUserDataSynchroniser { return this.synchronisers.filter(s => s.resource === source)[0]; } diff --git a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts index a5a32b09b3..3b36c86fa6 100644 --- a/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts +++ b/src/vs/platform/userDataSync/common/userDataSyncStoreService.ts @@ -10,7 +10,6 @@ import { joinPath, relativePath } from 'vs/base/common/resources'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IHeaders, IRequestOptions, IRequestContext } from 'vs/base/parts/request/common/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; import { IProductService } from 'vs/platform/product/common/productService'; import { getServiceMachineId } from 'vs/platform/serviceMachineId/common/serviceMachineId'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -19,6 +18,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; import { isWeb } from 'vs/base/common/platform'; +import { Emitter, Event } from 'vs/base/common/event'; const USER_SESSION_ID_KEY = 'sync.user-session-id'; const MACHINE_SESSION_ID_KEY = 'sync.machine-session-id'; @@ -30,14 +30,20 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn _serviceBrand: any; readonly userDataSyncStore: IUserDataSyncStore | undefined; + 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()); + readonly onTokenFailed: Event = this._onTokenFailed.event; + + private _onTokenSucceed: Emitter = this._register(new Emitter()); + readonly onTokenSucceed: Event = this._onTokenSucceed.event; + constructor( @IProductService productService: IProductService, @IConfigurationService configurationService: IConfigurationService, @IRequestService private readonly requestService: IRequestService, - @IAuthenticationTokenService private readonly authTokenService: IAuthenticationTokenService, @IUserDataSyncLogService private readonly logService: IUserDataSyncLogService, @IEnvironmentService environmentService: IEnvironmentService, @IFileService fileService: IFileService, @@ -62,6 +68,10 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn this.session = new RequestsSession(REQUEST_SESSION_LIMIT, REQUEST_SESSION_INTERVAL, this.requestService); } + setAuthToken(token: string, type: string): void { + this.authToken = { token, type }; + } + async getAllRefs(resource: ServerResource): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); @@ -114,13 +124,13 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn } } - async read(resource: ServerResource, oldValue: IUserData | null): Promise { + async read(resource: ServerResource, oldValue: IUserData | null, headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'resource', resource, 'latest').toString(); - const headers: IHeaders = {}; + headers = { ...headers }; // Disable caching as they are cached by synchronisers headers['Cache-Control'] = 'no-cache'; if (oldValue) { @@ -146,13 +156,14 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn return { ref, content }; } - async write(resource: ServerResource, data: string, ref: string | null): Promise { + async write(resource: ServerResource, data: string, ref: string | null, headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'resource', resource).toString(); - const headers: IHeaders = { 'Content-Type': 'text/plain' }; + headers = { ...headers }; + headers['Content-Type'] = 'text/plain'; if (ref) { headers['If-Match'] = ref; } @@ -170,13 +181,14 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn return newRef; } - async manifest(): Promise { + async manifest(headers: IHeaders = {}): Promise { if (!this.userDataSyncStore) { throw new Error('No settings sync store url configured.'); } const url = joinPath(this.userDataSyncStore.url, 'manifest').toString(); - const headers: IHeaders = { 'Content-Type': 'application/json' }; + headers = { ...headers }; + headers['Content-Type'] = 'application/json'; const context = await this.request({ type: 'GET', url, headers }, CancellationToken.None); if (!isSuccess(context)) { @@ -228,15 +240,14 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn } private async request(options: IRequestOptions, token: CancellationToken): Promise { - const authToken = this.authTokenService.token; - if (!authToken) { + if (!this.authToken) { throw new UserDataSyncStoreError('No Auth Token Available', UserDataSyncErrorCode.Unauthorized); } const commonHeaders = await this.commonHeadersPromise; options.headers = assign(options.headers || {}, commonHeaders, { - 'X-Account-Type': authToken.authenticationProviderId, - 'authorization': `Bearer ${authToken.token}`, + 'X-Account-Type': this.authToken.type, + 'authorization': `Bearer ${this.authToken.token}`, }); // Add session headers @@ -256,10 +267,17 @@ export class UserDataSyncStoreService extends Disposable implements IUserDataSyn } if (context.res.statusCode === 401) { - this.authTokenService.sendTokenFailed(); + this.authToken = undefined; + this._onTokenFailed.fire(); throw new UserDataSyncStoreError(`Request '${options.url?.toString()}' failed because of Unauthorized (401).`, UserDataSyncErrorCode.Unauthorized); } + this._onTokenSucceed.fire(); + + if (context.res.statusCode === 410) { + throw new UserDataSyncStoreError(`${options.type} request '${options.url?.toString()}' failed because the requested resource is not longer available (410).`, UserDataSyncErrorCode.Gone); + } + if (context.res.statusCode === 412) { throw new UserDataSyncStoreError(`${options.type} request '${options.url?.toString()}' failed because of Precondition Failed (412). There is new data exists for this resource. Make the request again with latest data.`, UserDataSyncErrorCode.PreconditionFailed); } diff --git a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts index f92e6cb503..a371dd9d74 100644 --- a/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/platform/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -3,34 +3,36 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; export class UserDataAutoSyncService extends BaseUserDataAutoSyncService { constructor( - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService userDataSyncService: IUserDataSyncService, @IElectronService electronService: IElectronService, @IUserDataSyncLogService logService: IUserDataSyncLogService, - @IAuthenticationTokenService authTokenService: IAuthenticationTokenService, + @IUserDataSyncAccountService authTokenService: IUserDataSyncAccountService, @ITelemetryService telemetryService: ITelemetryService, - @IProductService productService: IProductService, - @IConfigurationService configurationService: IConfigurationService, + @IUserDataSyncMachinesService userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, ) { - super(userDataSyncEnablementService, userDataSyncService, logService, authTokenService, telemetryService, productService, configurationService); + super(userDataSyncStoreService, userDataSyncResourceEnablementService, userDataSyncService, logService, authTokenService, telemetryService, userDataSyncMachinesService, storageService, environmentService); this._register(Event.debounce(Event.any( Event.map(electronService.onWindowFocus, () => 'windowFocus'), Event.map(electronService.onWindowOpen, () => 'windowOpen'), - userDataSyncService.onDidChangeLocal, - ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerAutoSync(sources))); + ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, true))); } } diff --git a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts index b268f02418..effd99fc84 100644 --- a/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/globalStateSync.test.ts @@ -4,13 +4,12 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, IGlobalState } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, IGlobalState, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { GlobalStateSynchroniser } from 'vs/platform/userDataSync/common/globalStateSync'; import { VSBuffer } from 'vs/base/common/buffer'; diff --git a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts index 070d17e27a..0d80a9ac8d 100644 --- a/src/vs/platform/userDataSync/test/common/settingsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/settingsSync.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, UserDataSyncError, UserDataSyncErrorCode } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, UserDataSyncError, UserDataSyncErrorCode, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { SettingsSynchroniser, ISettingsSyncContent } from 'vs/platform/userDataSync/common/settingsSync'; @@ -12,7 +12,6 @@ import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyn import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts index 628435fa8d..61853808e0 100644 --- a/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts +++ b/src/vs/platform/userDataSync/test/common/snippetsSync.test.ts @@ -4,14 +4,13 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, IUserDataSyncService, SyncResource, SyncStatus, Conflict, USER_DATA_SYNC_SCHEME, PREVIEW_DIR_NAME, ISyncData } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; -import { ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { SnippetsSynchroniser } from 'vs/platform/userDataSync/common/snippetsSync'; import { joinPath } from 'vs/base/common/resources'; import { IStringDictionary } from 'vs/base/common/collections'; diff --git a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts index 6f50cc78de..f31171521a 100644 --- a/src/vs/platform/userDataSync/test/common/synchronizer.test.ts +++ b/src/vs/platform/userDataSync/test/common/synchronizer.test.ts @@ -4,17 +4,23 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncStoreService, SyncResource, SyncStatus, IUserDataSyncEnablementService, ISyncPreviewResult } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncStoreService, SyncResource, SyncStatus, IUserDataSyncResourceEnablementService, IRemoteUserData, ISyncData, ISyncPreview } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; -import { AbstractSynchroniser, IRemoteUserData, ISyncData } from 'vs/platform/userDataSync/common/abstractSynchronizer'; +import { AbstractSynchroniser } from 'vs/platform/userDataSync/common/abstractSynchronizer'; import { Barrier } from 'vs/base/common/async'; import { Emitter, Event } from 'vs/base/common/event'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { URI } from 'vs/base/common/uri'; + +interface ITestSyncPreview extends ISyncPreview { + ref?: string; +} class TestSynchroniser extends AbstractSynchroniser { syncBarrier: Barrier = new Barrier(); - syncResult: { status?: SyncStatus, error?: boolean } = {}; + syncResult: { hasConflicts: boolean, hasError: boolean } = { hasConflicts: false, hasError: false }; onDoSyncCall: Emitter = this._register(new Emitter()); readonly resource: SyncResource = SyncResource.Settings; @@ -22,7 +28,7 @@ class TestSynchroniser extends AbstractSynchroniser { private cancelled: boolean = false; - protected async performSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + protected async doSync(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { this.cancelled = false; this.onDoSyncCall.fire(); await this.syncBarrier.wait(); @@ -31,15 +37,37 @@ class TestSynchroniser extends AbstractSynchroniser { return SyncStatus.Idle; } - if (this.syncResult.error) { - throw new Error('failed'); - } - - await this.apply(remoteUserData.ref); - return this.syncResult.status || SyncStatus.Idle; + return super.doSync(remoteUserData, lastSyncUserData); } - protected async performReplace(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { } + protected async generatePullPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData }; + } + + protected async generatePushPreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData }; + } + + protected async generateReplacePreview(syncData: ISyncData, remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { + return { hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData }; + } + + protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null, token: CancellationToken): Promise { + if (this.syncResult.hasError) { + throw new Error('failed'); + } + return { ref: remoteUserData.ref, hasLocalChanged: false, hasRemoteChanged: false, isLastSyncFromCurrentMachine: false, hasConflicts: this.syncResult.hasConflicts, remoteUserData, lastSyncUserData }; + } + + protected async updatePreviewWithConflict(preview: ISyncPreview, conflictResource: URI, conflictContent: string): Promise { + return preview; + } + + protected async applyPreview({ ref }: ITestSyncPreview, forcePush: boolean): Promise { + if (ref) { + await this.apply(ref); + } + } async apply(ref: string): Promise { const remoteUserData = await this.updateRemoteUserData('', ref); @@ -49,6 +77,7 @@ class TestSynchroniser extends AbstractSynchroniser { async stop(): Promise { this.cancelled = true; this.syncBarrier.open(); + super.stop(); } async triggerLocalChange(): Promise { @@ -61,10 +90,6 @@ class TestSynchroniser extends AbstractSynchroniser { this.onDidTriggerLocalChangeCall.fire(); } - protected async generatePreview(remoteUserData: IRemoteUserData, lastSyncUserData: IRemoteUserData | null): Promise { - return { hasLocalChanged: false, hasRemoteChanged: false }; - } - } suite('TestSynchronizer', () => { @@ -114,7 +139,7 @@ suite('TestSynchronizer', () => { test('status is set correctly when sync has conflicts', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { status: SyncStatus.HasConflicts }; + testObject.syncResult = { hasConflicts: true, hasError: false }; testObject.syncBarrier.open(); const actual: SyncStatus[] = []; @@ -127,7 +152,7 @@ suite('TestSynchronizer', () => { test('status is set correctly when sync has errors', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { error: true }; + testObject.syncResult = { hasError: true, hasConflicts: false }; testObject.syncBarrier.open(); const actual: SyncStatus[] = []; @@ -161,7 +186,7 @@ suite('TestSynchronizer', () => { test('sync should not run if disabled', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - client.instantiationService.get(IUserDataSyncEnablementService).setResourceEnablement(testObject.resource, false); + client.instantiationService.get(IUserDataSyncResourceEnablementService).setResourceEnablement(testObject.resource, false); const actual: SyncStatus[] = []; disposableStore.add(testObject.onDidChangeStatus(status => actual.push(status))); @@ -174,7 +199,7 @@ suite('TestSynchronizer', () => { test('sync should not run if there are conflicts', async () => { const testObject: TestSynchroniser = client.instantiationService.createInstance(TestSynchroniser, SyncResource.Settings); - testObject.syncResult = { status: SyncStatus.HasConflicts }; + testObject.syncResult = { hasConflicts: true, hasError: false }; testObject.syncBarrier.open(); await testObject.sync(await client.manifest()); diff --git a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts index 88c2111b5b..ddcaa8f473 100644 --- a/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataAutoSyncService.test.ts @@ -7,10 +7,21 @@ import * as assert from 'assert'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { UserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; -import { IUserDataSyncService, SyncResource, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncResource, UserDataAutoSyncError, UserDataSyncErrorCode, UserDataSyncStoreError } from 'vs/platform/userDataSync/common/userDataSync'; +import { Event } from 'vs/base/common/event'; +import { IFileService } from 'vs/platform/files/common/files'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { joinPath } from 'vs/base/common/resources'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; class TestUserDataAutoSyncService extends UserDataAutoSyncService { protected startAutoSync(): boolean { return false; } + protected getSyncTriggerDelayTime(): number { return 50; } + + sync(): Promise { + return this.triggerSync(['sync'], false); + } } suite('UserDataAutoSyncService', () => { @@ -29,14 +40,16 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with settings change - await testObject.triggerAutoSync([SyncResource.Settings]); + await testObject.triggerSync([SyncResource.Settings], false); - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); }); test('test auto sync with sync resource change triggers sync for every change', async () => { @@ -49,15 +62,17 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with settings change multiple times for (let counter = 0; counter < 2; counter++) { - await testObject.triggerAutoSync([SyncResource.Settings]); + await testObject.triggerSync([SyncResource.Settings], false); } - assert.deepEqual(target.requests, [ + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + assert.deepEqual(actual, [ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} } ]); @@ -73,14 +88,16 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with window focus once - await testObject.triggerAutoSync(['windowFocus']); + await testObject.triggerSync(['windowFocus'], true); - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); }); test('test auto sync with non sync resource change does not trigger continuous syncs', async () => { @@ -93,16 +110,277 @@ suite('UserDataAutoSyncService', () => { await client.instantiationService.get(IUserDataSyncService).sync(); target.reset(); - client.instantiationService.get(IUserDataSyncEnablementService).setEnablement(true); const testObject: UserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); // Trigger auto sync with window focus multiple times for (let counter = 0; counter < 2; counter++) { - await testObject.triggerAutoSync(['windowFocus']); + await testObject.triggerSync(['windowFocus'], true); } - // Make sure only one request is made - assert.deepEqual(target.requests, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + // Filter out machine requests + const actual = target.requests.filter(request => !request.url.startsWith(`${target.url}/v1/resource/machines`)); + + // Make sure only one manifest request is made + assert.deepEqual(actual, [{ type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }]); + }); + + test('test first auto sync requests', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machines + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, + // Settings + { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, + // Keybindings + { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/keybindings`, headers: { 'If-Match': '0' } }, + // Snippets + { type: 'GET', url: `${target.url}/v1/resource/snippets/latest`, headers: {} }, + { type: 'POST', url: `${target.url}/v1/resource/snippets`, 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' } }, + // Extensions + { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machines + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } } + ]); + + }); + + test('test further auto sync requests without changes', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} } + ]); + + }); + + test('test further auto sync requests with changes', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + // Do changes in the client + const fileService = client.instantiationService.get(IFileService); + const environmentService = client.instantiationService.get(IEnvironmentService); + await fileService.writeFile(environmentService.settingsResource, VSBuffer.fromString(JSON.stringify({ 'editor.fontSize': 14 }))); + await fileService.writeFile(environmentService.keybindingsResource, VSBuffer.fromString(JSON.stringify([{ 'command': 'abcd', 'key': 'cmd+c' }]))); + await fileService.writeFile(joinPath(environmentService.snippetsHome, 'html.json'), VSBuffer.fromString(`{}`)); + await fileService.writeFile(environmentService.argvResource, VSBuffer.fromString(JSON.stringify({ 'locale': 'de' }))); + await testObject.sync(); + + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Settings + { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '1' } }, + // Keybindings + { type: 'POST', url: `${target.url}/v1/resource/keybindings`, headers: { 'If-Match': '1' } }, + // Snippets + { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } }, + // Global state + { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '1' } }, + ]); + + }); + + test('test auto sync send execution id header', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject: TestUserDataAutoSyncService = client.instantiationService.createInstance(TestUserDataAutoSyncService); + + // Sync once and reset requests + await testObject.sync(); + target.reset(); + + await testObject.sync(); + + for (const request of target.requestsWithAllHeaders) { + const hasExecutionIdHeader = request.headers && request.headers['X-Execution-Id'] && request.headers['X-Execution-Id'].length > 0; + if (request.url.startsWith(`${target.url}/v1/resource/machines`)) { + assert.ok(!hasExecutionIdHeader, `Should not have execution header: ${request.url}`); + } else { + assert.ok(hasExecutionIdHeader, `Should have execution header: ${request.url}`); + } + } + + }); + + test('test delete on one client throws turned off error on other client while syncing', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the client + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Reset from the first client + await client.instantiationService.get(IUserDataSyncService).reset(); + + // Sync from the test client + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, + ]); + }); + + test('test disabling the machine turns off sync', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Disable current machine + const userDataSyncMachinesService = testClient.instantiationService.get(IUserDataSyncMachinesService); + const machines = await userDataSyncMachinesService.getMachines(); + const currentMachine = machines.find(m => m.isCurrent)!; + await userDataSyncMachinesService.setEnablement(currentMachine.id, false); + + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '2' } }, + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '2' } }, + ]); + }); + + test('test removing the machine adds machine back', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Remove current machine + await testClient.instantiationService.get(IUserDataSyncMachinesService).removeCurrentMachine(); + + target.reset(); + + await testObject.sync(); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '2' } }, + ]); + }); + + test('test creating new session from one client throws session expired error on another client while syncing', async () => { + const target = new UserDataSyncTestServer(); + + // Set up and sync from the client + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + await testObject.sync(); + + // Reset from the first client + await client.instantiationService.get(IUserDataSyncService).reset(); + + // Sync again from the first client to create new session + await client.instantiationService.get(IUserDataSyncService).sync(); + + // Sync from the test client + target.reset(); + + const errorPromise = Event.toPromise(testObject.onError); + await testObject.sync(); + + const e = await errorPromise; + assert.ok(e instanceof UserDataAutoSyncError); + assert.deepEqual((e).code, UserDataSyncErrorCode.SessionExpired); + assert.deepEqual(target.requests, [ + // Manifest + { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, + // Machine + { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, + ]); + }); + + test('test rate limit on server', async () => { + const target = new UserDataSyncTestServer(5); + + // Set up and sync from the test client + const testClient = disposableStore.add(new UserDataSyncClient(target)); + await testClient.setUp(); + const testObject: TestUserDataAutoSyncService = testClient.instantiationService.createInstance(TestUserDataAutoSyncService); + + const errorPromise = Event.toPromise(testObject.onError); + while (target.requests.length < 5) { + await testObject.sync(); + } + + const e = await errorPromise; + assert.ok(e instanceof UserDataSyncStoreError); + assert.deepEqual((e).code, UserDataSyncErrorCode.TooManyRequests); }); diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts index a20dea2248..806a97be08 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncClient.ts @@ -6,7 +6,7 @@ import { IRequestService } from 'vs/platform/request/common/request'; import { IRequestOptions, IRequestContext, IHeaders } from 'vs/base/parts/request/common/request'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource, ServerResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserData, IUserDataManifest, ALL_SYNC_RESOURCES, IUserDataSyncLogService, IUserDataSyncStoreService, IUserDataSyncUtilService, IUserDataSyncResourceEnablementService, IUserDataSyncService, getDefaultIgnoredSettings, IUserDataSyncBackupStoreService, SyncResource, ServerResource } from 'vs/platform/userDataSync/common/userDataSync'; import { bufferToStream, VSBuffer } from 'vs/base/common/buffer'; import { generateUuid } from 'vs/base/common/uuid'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; @@ -25,14 +25,14 @@ import { URI } from 'vs/base/common/uri'; import { joinPath } from 'vs/base/common/resources'; import { IStringDictionary } from 'vs/base/common/collections'; import { FormattingOptions } from 'vs/base/common/jsonFormatter'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; import { IGlobalExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, DidInstallExtensionEvent, DidUninstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement'; import { GlobalExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionEnablementService'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; -import { IAuthenticationTokenService, IUserDataSyncAuthToken } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService, UserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import product from 'vs/platform/product/common/product'; import { IProductService } from 'vs/platform/product/common/productService'; import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService'; @@ -56,7 +56,8 @@ export class UserDataSyncClient extends Disposable { settingsResource: joinPath(userDataDirectory, 'settings.json'), keybindingsResource: joinPath(userDataDirectory, 'keybindings.json'), snippetsHome: joinPath(userDataDirectory, 'snippets'), - argvResource: joinPath(userDataDirectory, 'argv.json') + argvResource: joinPath(userDataDirectory, 'argv.json'), + sync: 'on', }); const logService = new NullLogService(); @@ -82,18 +83,19 @@ export class UserDataSyncClient extends Disposable { this.instantiationService.stub(IConfigurationService, configurationService); this.instantiationService.stub(IRequestService, this.testServer); - this.instantiationService.stub(IAuthenticationTokenService, >{ - onDidChangeToken: new Emitter().event, - token: { authenticationProviderId: 'id', token: 'token' } - }); this.instantiationService.stub(IUserDataSyncLogService, logService); this.instantiationService.stub(ITelemetryService, NullTelemetryService); this.instantiationService.stub(IUserDataSyncStoreService, this.instantiationService.createInstance(UserDataSyncStoreService)); + + const userDataSyncAccountService: IUserDataSyncAccountService = this.instantiationService.createInstance(UserDataSyncAccountService); + await userDataSyncAccountService.updateAccount({ authenticationProviderId: 'authenticationProviderId', token: 'token' }); + this.instantiationService.stub(IUserDataSyncAccountService, userDataSyncAccountService); + this.instantiationService.stub(IUserDataSyncMachinesService, this.instantiationService.createInstance(UserDataSyncMachinesService)); this.instantiationService.stub(IUserDataSyncBackupStoreService, this.instantiationService.createInstance(UserDataSyncBackupStoreService)); this.instantiationService.stub(IUserDataSyncUtilService, new TestUserDataSyncUtilService()); - this.instantiationService.stub(IUserDataSyncEnablementService, this.instantiationService.createInstance(UserDataSyncEnablementService)); + this.instantiationService.stub(IUserDataSyncResourceEnablementService, this.instantiationService.createInstance(UserDataSyncResourceEnablementService)); this.instantiationService.stub(IStorageKeysSyncRegistryService, this.instantiationService.createInstance(StorageKeysSyncRegistryService)); this.instantiationService.stub(IGlobalExtensionEnablementService, this.instantiationService.createInstance(GlobalExtensionEnablementService)); @@ -152,9 +154,14 @@ export class UserDataSyncTestServer implements IRequestService { get responses(): { status: number }[] { return this._responses; } reset(): void { this._requests = []; this._responses = []; this._requestsWithAllHeaders = []; } + constructor(private readonly rateLimit = Number.MAX_SAFE_INTEGER) { } + async resolveProxy(url: string): Promise { return url; } async request(options: IRequestOptions, token: CancellationToken): Promise { + if (this._requests.length === this.rateLimit) { + return this.toResponse(429); + } const headers: IHeaders = {}; if (options.headers) { if (options.headers['If-None-Match']) { diff --git a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts index 930a344c9e..b7f54cfb9d 100644 --- a/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts +++ b/src/vs/platform/userDataSync/test/common/userDataSyncService.test.ts @@ -4,13 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { IUserDataSyncService, UserDataSyncError, UserDataSyncErrorCode, SyncStatus, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, SyncStatus, SyncResource } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataSyncClient, UserDataSyncTestServer } from 'vs/platform/userDataSync/test/common/userDataSyncClient'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { IFileService } from 'vs/platform/files/common/files'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { VSBuffer } from 'vs/base/common/buffer'; import { joinPath } from 'vs/base/common/resources'; +import { CancellationToken } from 'vs/base/common/cancellation'; suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing tests @@ -31,8 +32,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, @@ -47,10 +46,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); @@ -68,8 +63,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, // Keybindings @@ -80,10 +73,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); @@ -103,7 +92,7 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te // Sync (pull) from the test client target.reset(); - await testObject.isFirstTimeSyncWithMerge(); + await testObject.isFirstTimeSyncingWithAnotherMachine(); await testObject.pull(); assert.deepEqual(target.requests, [ @@ -143,7 +132,7 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te // Sync (pull) from the test client target.reset(); - await testObject.isFirstTimeSyncWithMerge(); + await testObject.isFirstTimeSyncingWithAnotherMachine(); await testObject.pull(); assert.deepEqual(target.requests, [ @@ -175,7 +164,7 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te // Sync (merge) from the test client target.reset(); - await testObject.isFirstTimeSyncWithMerge(); + await testObject.isFirstTimeSyncingWithAnotherMachine(); await testObject.sync(); assert.deepEqual(target.requests, [ @@ -187,13 +176,11 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, /* sync */ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, { 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/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } }, ]); }); @@ -219,7 +206,7 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te // Sync (merge) from the test client target.reset(); - await testObject.isFirstTimeSyncWithMerge(); + await testObject.isFirstTimeSyncingWithAnotherMachine(); await testObject.sync(); assert.deepEqual(target.requests, [ @@ -229,7 +216,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te /* first time sync */ { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '1' } }, { type: 'GET', url: `${target.url}/v1/resource/keybindings/latest`, headers: {} }, @@ -238,7 +224,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te { type: 'POST', url: `${target.url}/v1/resource/snippets`, headers: { 'If-Match': '1' } }, { type: 'GET', url: `${target.url}/v1/resource/globalState/latest`, headers: {} }, { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '1' } }, ]); }); @@ -378,8 +363,6 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te assert.deepEqual(target.requests, [ // Manifest { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'GET', url: `${target.url}/v1/resource/machines/latest`, headers: { 'If-None-Match': '1' } }, // Settings { type: 'GET', url: `${target.url}/v1/resource/settings/latest`, headers: {} }, { type: 'POST', url: `${target.url}/v1/resource/settings`, headers: { 'If-Match': '0' } }, @@ -394,83 +377,10 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te { type: 'POST', url: `${target.url}/v1/resource/globalState`, headers: { 'If-Match': '0' } }, // Extensions { type: 'GET', url: `${target.url}/v1/resource/extensions/latest`, headers: {} }, - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - // Machines - { type: 'POST', url: `${target.url}/v1/resource/machines`, headers: { 'If-Match': '0' } }, ]); }); - test('test delete on one client throws turned off error on other client while syncing', async () => { - const target = new UserDataSyncTestServer(); - - // Set up and sync from the client - const client = disposableStore.add(new UserDataSyncClient(target)); - await client.setUp(); - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Set up and sync from the test client - const testClient = disposableStore.add(new UserDataSyncClient(target)); - await testClient.setUp(); - const testObject = testClient.instantiationService.get(IUserDataSyncService); - await testObject.sync(); - - // Reset from the first client - await client.instantiationService.get(IUserDataSyncService).reset(); - - // Sync from the test client - target.reset(); - try { - await testObject.sync(); - } catch (e) { - assert.ok(e instanceof UserDataSyncError); - assert.deepEqual((e).code, UserDataSyncErrorCode.TurnedOff); - assert.deepEqual(target.requests, [ - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - ]); - return; - } - throw assert.fail('Should fail with turned off error'); - }); - - test('test creating new session from one client throws session expired error on another client while syncing', async () => { - const target = new UserDataSyncTestServer(); - - // Set up and sync from the client - const client = disposableStore.add(new UserDataSyncClient(target)); - await client.setUp(); - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Set up and sync from the test client - const testClient = disposableStore.add(new UserDataSyncClient(target)); - await testClient.setUp(); - const testObject = testClient.instantiationService.get(IUserDataSyncService); - await testObject.sync(); - - // Reset from the first client - await client.instantiationService.get(IUserDataSyncService).reset(); - - // Sync again from the first client to create new session - await client.instantiationService.get(IUserDataSyncService).sync(); - - // Sync from the test client - target.reset(); - try { - await testObject.sync(); - } catch (e) { - assert.ok(e instanceof UserDataSyncError); - assert.deepEqual((e).code, UserDataSyncErrorCode.SessionExpired); - assert.deepEqual(target.requests, [ - // Manifest - { type: 'GET', url: `${target.url}/v1/manifest`, headers: {} }, - ]); - return; - } - throw assert.fail('Should fail with turned off error'); - }); - test('test sync status', async () => { const target = new UserDataSyncTestServer(); @@ -583,4 +493,38 @@ suite.skip('UserDataSyncService', () => { // {{SQL CARBON EDIT}} skip failing te assert.deepEqual(testObject.conflicts, []); }); + test('test sync send execution id header', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject = client.instantiationService.get(IUserDataSyncService); + + await testObject.sync(); + + for (const request of target.requestsWithAllHeaders) { + const hasExecutionIdHeader = request.headers && request.headers['X-Execution-Id'] && request.headers['X-Execution-Id'].length > 0; + assert.ok(hasExecutionIdHeader, `Should have execution header: ${request.url}`); + } + + }); + + test('test can run sync taks only once', async () => { + // Setup the client + const target = new UserDataSyncTestServer(); + const client = disposableStore.add(new UserDataSyncClient(target)); + await client.setUp(); + const testObject = client.instantiationService.get(IUserDataSyncService); + + const syncTask = await testObject.createSyncTask(); + await syncTask.run(CancellationToken.None); + + try { + await syncTask.run(CancellationToken.None); + assert.fail('Should fail running the task again'); + } catch (error) { + /* expected */ + } + }); + }); diff --git a/src/vs/platform/webview/common/resourceLoader.ts b/src/vs/platform/webview/common/resourceLoader.ts index 91f2624cf2..bfe7831f09 100644 --- a/src/vs/platform/webview/common/resourceLoader.ts +++ b/src/vs/platform/webview/common/resourceLoader.ts @@ -4,14 +4,21 @@ *--------------------------------------------------------------------------------------------*/ import { VSBuffer, VSBufferReadableStream } from 'vs/base/common/buffer'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { isUNC } from 'vs/base/common/extpath'; import { Schemas } from 'vs/base/common/network'; import { sep } from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; +import { IRequestService } from 'vs/platform/request/common/request'; import { getWebviewContentMimeType } from 'vs/platform/webview/common/mimeTypes'; + +export const webviewPartitionId = 'webview'; + + export namespace WebviewResourceResponse { export enum Type { Success, Failed, AccessDenied } @@ -63,18 +70,38 @@ export async function loadLocalResource( export async function loadLocalResourceStream( requestUri: URI, + options: { + extensionLocation: URI | undefined; + roots: ReadonlyArray; + remoteConnectionData?: IRemoteConnectionData | null; + }, fileService: IFileService, - extensionLocation: URI | undefined, - roots: ReadonlyArray + requestService: IRequestService, ): Promise { - const resourceToLoad = getResourceToLoad(requestUri, extensionLocation, roots); + const resourceToLoad = getResourceToLoad(requestUri, options.extensionLocation, options.roots); if (!resourceToLoad) { return WebviewResourceResponse.AccessDenied; } + const mime = getWebviewContentMimeType(requestUri); // Use the original path for the mime + + if (options.remoteConnectionData) { + // Remote uris must go to the resolved server. + if (resourceToLoad.scheme === Schemas.vscodeRemote || (options.extensionLocation?.scheme === REMOTE_HOST_SCHEME)) { + const uri = URI.parse(`http://${options.remoteConnectionData.host}:${options.remoteConnectionData.port}`).with({ + path: '/vscode-remote-resource', + query: `tkn=${options.remoteConnectionData.connectionToken}&path=${encodeURIComponent(resourceToLoad.path)}`, + }); + + const response = await requestService.request({ url: uri.toString(true) }, CancellationToken.None); + if (response.res.statusCode === 200) { + return new WebviewResourceResponse.StreamSuccess(response.stream, mime); + } + return WebviewResourceResponse.Failed; + } + } try { const contents = await fileService.readFileStream(resourceToLoad); - const mime = getWebviewContentMimeType(requestUri); // Use the original path for the mime return new WebviewResourceResponse.StreamSuccess(contents.value, mime); } catch (err) { console.log(err); @@ -90,20 +117,7 @@ function getResourceToLoad( const normalizedPath = normalizeRequestPath(requestUri); for (const root of roots) { - if (!containsResource(root, normalizedPath)) { - continue; - } - - if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - return URI.from({ - scheme: REMOTE_HOST_SCHEME, - authority: extensionLocation.authority, - path: '/vscode-resource', - query: JSON.stringify({ - requestResourcePath: normalizedPath.path - }) - }); - } else { + if (containsResource(root, normalizedPath)) { return normalizedPath; } } @@ -112,20 +126,20 @@ function getResourceToLoad( } function normalizeRequestPath(requestUri: URI) { - if (requestUri.scheme !== Schemas.vscodeWebviewResource) { + if (requestUri.scheme === Schemas.vscodeWebviewResource) { + // The `vscode-webview-resource` scheme has the following format: + // + // vscode-webview-resource://id/scheme//authority?/path + // + const resourceUri = URI.parse(requestUri.path.replace(/^\/([a-z0-9\-]+)\/{1,2}/i, '$1://')); + + return resourceUri.with({ + query: requestUri.query, + fragment: requestUri.fragment + }); + } else { return requestUri; } - - // The `vscode-webview-resource` scheme has the following format: - // - // vscode-webview-resource://id/scheme//authority?/path - // - const resourceUri = URI.parse(requestUri.path.replace(/^\/([a-z0-9\-]+)\/{1,2}/i, '$1://')); - - return resourceUri.with({ - query: requestUri.query, - fragment: requestUri.fragment - }); } function containsResource(root: URI, resource: URI): boolean { diff --git a/src/vs/platform/webview/common/webviewManagerService.ts b/src/vs/platform/webview/common/webviewManagerService.ts index e289b41ba1..41ca056d5d 100644 --- a/src/vs/platform/webview/common/webviewManagerService.ts +++ b/src/vs/platform/webview/common/webviewManagerService.ts @@ -5,15 +5,17 @@ import { UriComponents } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IWebviewPortMapping } from 'vs/platform/webview/common/webviewPortMapping'; export const IWebviewManagerService = createDecorator('webviewManagerService'); export interface IWebviewManagerService { _serviceBrand: unknown; - registerWebview(id: string, metadata: RegisterWebviewMetadata): Promise; + registerWebview(id: string, webContentsId: number, metadata: RegisterWebviewMetadata): Promise; unregisterWebview(id: string): Promise; - updateLocalResourceRoots(id: string, roots: UriComponents[]): Promise; + updateWebviewMetadata(id: string, metadataDelta: Partial): Promise; setIgnoreMenuShortcuts(webContentsId: number, enabled: boolean): Promise; } @@ -21,4 +23,6 @@ export interface IWebviewManagerService { export interface RegisterWebviewMetadata { readonly extensionLocation: UriComponents | undefined; readonly localResourceRoots: readonly UriComponents[]; + readonly remoteConnectionData: IRemoteConnectionData | null; + readonly portMappings: readonly IWebviewPortMapping[]; } diff --git a/src/vs/workbench/contrib/webview/common/portMapping.ts b/src/vs/platform/webview/common/webviewPortMapping.ts similarity index 60% rename from src/vs/workbench/contrib/webview/common/portMapping.ts rename to src/vs/platform/webview/common/webviewPortMapping.ts index a3c4f12d46..9652f096c1 100644 --- a/src/vs/workbench/contrib/webview/common/portMapping.ts +++ b/src/vs/platform/webview/common/webviewPortMapping.ts @@ -3,36 +3,42 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable } from 'vs/base/common/lifecycle'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import * as modes from 'vs/editor/common/modes'; +import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; -import { ITunnelService, RemoteTunnel, extractLocalHostUriMetaDataForPortMapping } from 'vs/platform/remote/common/tunnel'; +import { extractLocalHostUriMetaDataForPortMapping, ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; -export class WebviewPortMappingManager extends Disposable { +export interface IWebviewPortMapping { + webviewPort: number; + extensionHostPort: number; +} + +/** + * Manages port mappings for a single webview. + */ +export class WebviewPortMappingManager implements IDisposable { private readonly _tunnels = new Map>(); constructor( - private readonly getExtensionLocation: () => URI | undefined, - private readonly mappings: () => ReadonlyArray, + private readonly _getExtensionLocation: () => URI | undefined, + private readonly _getMappings: () => readonly IWebviewPortMapping[], private readonly tunnelService: ITunnelService - ) { - super(); - } + ) { } - public async getRedirect(url: string): Promise { + public async getRedirect(resolveAuthority: IAddress, url: string): Promise { const uri = URI.parse(url); const requestLocalHostInfo = extractLocalHostUriMetaDataForPortMapping(uri); if (!requestLocalHostInfo) { return undefined; } - for (const mapping of this.mappings()) { + for (const mapping of this._getMappings()) { if (mapping.webviewPort === requestLocalHostInfo.port) { - const extensionLocation = this.getExtensionLocation(); + const extensionLocation = this._getExtensionLocation(); if (extensionLocation && extensionLocation.scheme === REMOTE_HOST_SCHEME) { - const tunnel = await this.getOrCreateTunnel(mapping.extensionHostPort); + const tunnel = await this.getOrCreateTunnel(resolveAuthority, mapping.extensionHostPort); if (tunnel) { if (tunnel.tunnelLocalPort === mapping.webviewPort) { return undefined; @@ -55,20 +61,18 @@ export class WebviewPortMappingManager extends Disposable { } dispose() { - super.dispose(); - for (const tunnel of this._tunnels.values()) { tunnel.then(tunnel => tunnel.dispose()); } this._tunnels.clear(); } - private getOrCreateTunnel(remotePort: number): Promise | undefined { + private getOrCreateTunnel(remoteAuthority: IAddress, remotePort: number): Promise | undefined { const existing = this._tunnels.get(remotePort); if (existing) { return existing; } - const tunnel = this.tunnelService.openTunnel(undefined, remotePort); + const tunnel = this.tunnelService.openTunnel(remoteAuthority, undefined, remotePort); if (tunnel) { this._tunnels.set(remotePort, tunnel); } diff --git a/src/vs/platform/webview/electron-main/webviewMainService.ts b/src/vs/platform/webview/electron-main/webviewMainService.ts index 2820b6ece9..44f7724006 100644 --- a/src/vs/platform/webview/electron-main/webviewMainService.ts +++ b/src/vs/platform/webview/electron-main/webviewMainService.ts @@ -4,36 +4,66 @@ *--------------------------------------------------------------------------------------------*/ import { webContents } from 'electron'; -import { IWebviewManagerService, RegisterWebviewMetadata } from 'vs/platform/webview/common/webviewManagerService'; -import { WebviewProtocolProvider } from 'vs/platform/webview/electron-main/webviewProtocolProvider'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; import { IFileService } from 'vs/platform/files/common/files'; -import { UriComponents, URI } from 'vs/base/common/uri'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { IWebviewManagerService, RegisterWebviewMetadata } from 'vs/platform/webview/common/webviewManagerService'; +import { WebviewPortMappingProvider } from 'vs/platform/webview/electron-main/webviewPortMappingProvider'; +import { WebviewProtocolProvider } from 'vs/platform/webview/electron-main/webviewProtocolProvider'; -export class WebviewMainService implements IWebviewManagerService { +export class WebviewMainService extends Disposable implements IWebviewManagerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; - private protocolProvider: WebviewProtocolProvider; + private readonly protocolProvider: WebviewProtocolProvider; + private readonly portMappingProvider: WebviewPortMappingProvider; constructor( @IFileService fileService: IFileService, + @IRequestService requestService: IRequestService, + @ITunnelService tunnelService: ITunnelService, ) { - this.protocolProvider = new WebviewProtocolProvider(fileService); + super(); + this.protocolProvider = this._register(new WebviewProtocolProvider(fileService, requestService)); + this.portMappingProvider = this._register(new WebviewPortMappingProvider(tunnelService)); } - public async registerWebview(id: string, metadata: RegisterWebviewMetadata): Promise { - this.protocolProvider.registerWebview(id, - metadata.extensionLocation ? URI.from(metadata.extensionLocation) : undefined, - metadata.localResourceRoots.map((x: UriComponents) => URI.from(x)) - ); + public async registerWebview(id: string, webContentsId: number, metadata: RegisterWebviewMetadata): Promise { + const extensionLocation = metadata.extensionLocation ? URI.from(metadata.extensionLocation) : undefined; + + this.protocolProvider.registerWebview(id, { + ...metadata, + extensionLocation, + localResourceRoots: metadata.localResourceRoots.map(x => URI.from(x)) + }); + + this.portMappingProvider.registerWebview(id, webContentsId, { + extensionLocation, + mappings: metadata.portMappings, + resolvedAuthority: metadata.remoteConnectionData, + }); } public async unregisterWebview(id: string): Promise { - this.protocolProvider.unreigsterWebview(id); + this.protocolProvider.unregisterWebview(id); + this.portMappingProvider.unregisterWebview(id); } - public async updateLocalResourceRoots(id: string, roots: UriComponents[]): Promise { - this.protocolProvider.updateLocalResourceRoots(id, roots.map((x: UriComponents) => URI.from(x))); + public async updateWebviewMetadata(id: string, metaDataDelta: Partial): Promise { + const extensionLocation = metaDataDelta.extensionLocation ? URI.from(metaDataDelta.extensionLocation) : undefined; + + this.protocolProvider.updateWebviewMetadata(id, { + ...metaDataDelta, + extensionLocation, + localResourceRoots: metaDataDelta.localResourceRoots?.map(x => URI.from(x)), + }); + + this.portMappingProvider.updateWebviewMetadata(id, { + ...metaDataDelta, + extensionLocation, + }); } public async setIgnoreMenuShortcuts(webContentsId: number, enabled: boolean): Promise { diff --git a/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts b/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts new file mode 100644 index 0000000000..358f4be0bd --- /dev/null +++ b/src/vs/platform/webview/electron-main/webviewPortMappingProvider.ts @@ -0,0 +1,87 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { session } from 'electron'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { URI } from 'vs/base/common/uri'; +import { IAddress } from 'vs/platform/remote/common/remoteAgentConnection'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { webviewPartitionId } from 'vs/platform/webview/common/resourceLoader'; +import { IWebviewPortMapping, WebviewPortMappingManager } from 'vs/platform/webview/common/webviewPortMapping'; + +interface PortMappingData { + readonly extensionLocation: URI | undefined; + readonly mappings: readonly IWebviewPortMapping[]; + readonly resolvedAuthority: IAddress | null | undefined; +} + +export class WebviewPortMappingProvider extends Disposable { + + private readonly _webviewData = new Map(); + + private _webContentsIdsToWebviewIds = new Map(); + + constructor( + @ITunnelService private readonly _tunnelService: ITunnelService, + ) { + super(); + + const sess = session.fromPartition(webviewPartitionId); + + sess.webRequest.onBeforeRequest({ + urls: [ + '*://localhost:*/', + '*://127.0.0.1:*/', + '*://0.0.0.0:*/', + ] + }, async (details, callback) => { + const webviewId = details.webContentsId && this._webContentsIdsToWebviewIds.get(details.webContentsId); + if (!webviewId) { + return callback({}); + } + + const entry = this._webviewData.get(webviewId); + if (!entry || !entry.metadata.resolvedAuthority) { + return callback({}); + } + + const redirect = await entry.manager.getRedirect(entry.metadata.resolvedAuthority, details.url); + return callback(redirect ? { redirectURL: redirect } : {}); + }); + } + + public async registerWebview(id: string, webContentsId: number, metadata: PortMappingData): Promise { + const manager = new WebviewPortMappingManager( + () => this._webviewData.get(id)?.metadata.extensionLocation, + () => this._webviewData.get(id)?.metadata.mappings || [], + this._tunnelService); + + this._webviewData.set(id, { webContentsId, metadata, manager }); + this._webContentsIdsToWebviewIds.set(webContentsId, id); + } + + public unregisterWebview(id: string): void { + const existing = this._webviewData.get(id); + if (existing) { + existing.manager.dispose(); + this._webviewData.delete(id); + this._webContentsIdsToWebviewIds.delete(existing.webContentsId); + } + } + + public async updateWebviewMetadata(id: string, metadataDelta: Partial): Promise { + const entry = this._webviewData.get(id); + if (entry) { + this._webviewData.set(id, { + ...entry, + ...metadataDelta, + }); + } + } +} diff --git a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts index fd3a0d567e..3e879d4cca 100644 --- a/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts +++ b/src/vs/platform/webview/electron-main/webviewProtocolProvider.ts @@ -3,38 +3,51 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { protocol } from 'electron'; +import { session } from 'electron'; +import { Readable } from 'stream'; +import { VSBufferReadableStream } from 'vs/base/common/buffer'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { streamToNodeReadable } from 'vs/base/node/stream'; import { IFileService } from 'vs/platform/files/common/files'; -import { loadLocalResourceStream, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { loadLocalResourceStream, webviewPartitionId, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; + +interface WebviewMetadata { + readonly extensionLocation: URI | undefined; + readonly localResourceRoots: readonly URI[]; + readonly remoteConnectionData: IRemoteConnectionData | null; +} export class WebviewProtocolProvider extends Disposable { - private readonly webviewMetadata = new Map(); + private readonly webviewMetadata = new Map(); constructor( @IFileService private readonly fileService: IFileService, + @IRequestService private readonly requestService: IRequestService, ) { super(); - protocol.registerStreamProtocol(Schemas.vscodeWebviewResource, async (request, callback): Promise => { + const sess = session.fromPartition(webviewPartitionId); + + sess.protocol.registerStreamProtocol(Schemas.vscodeWebviewResource, async (request, callback): Promise => { try { const uri = URI.parse(request.url); const id = uri.authority; const metadata = this.webviewMetadata.get(id); if (metadata) { - const result = await loadLocalResourceStream(uri, this.fileService, metadata.extensionLocation, metadata.localResourceRoots); + const result = await loadLocalResourceStream(uri, { + extensionLocation: metadata.extensionLocation, + roots: metadata.localResourceRoots, + remoteConnectionData: metadata.remoteConnectionData, + }, this.fileService, this.requestService); if (result.type === WebviewResourceResponse.Type.Success) { return callback({ statusCode: 200, - data: streamToNodeReadable(result.stream), + data: this.streamToNodeReadable(result.stream), headers: { 'Content-Type': result.mimeType, 'Access-Control-Allow-Origin': '*', @@ -54,23 +67,67 @@ export class WebviewProtocolProvider extends Disposable { return callback({ data: null, statusCode: 404 }); }); - this._register(toDisposable(() => protocol.unregisterProtocol(Schemas.vscodeWebviewResource))); + this._register(toDisposable(() => sess.protocol.unregisterProtocol(Schemas.vscodeWebviewResource))); } - public registerWebview(id: string, extensionLocation: URI | undefined, localResourceRoots: readonly URI[]): void { - this.webviewMetadata.set(id, { extensionLocation, localResourceRoots }); + private streamToNodeReadable(stream: VSBufferReadableStream): Readable { + return new class extends Readable { + private listening = false; + + _read(size?: number): void { + if (!this.listening) { + this.listening = true; + + // Data + stream.on('data', data => { + try { + if (!this.push(data.buffer)) { + stream.pause(); // pause the stream if we should not push anymore + } + } catch (error) { + this.emit(error); + } + }); + + // End + stream.on('end', () => { + try { + this.push(null); // signal EOS + } catch (error) { + this.emit(error); + } + }); + + // Error + stream.on('error', error => this.emit('error', error)); + } + + // ensure the stream is flowing + stream.resume(); + } + + _destroy(error: Error | null, callback: (error: Error | null) => void): void { + stream.destroy(); + + callback(null); + } + }; } - public unreigsterWebview(id: string): void { + public async registerWebview(id: string, metadata: WebviewMetadata): Promise { + this.webviewMetadata.set(id, metadata); + } + + public unregisterWebview(id: string): void { this.webviewMetadata.delete(id); } - public updateLocalResourceRoots(id: string, localResourceRoots: readonly URI[]) { + public async updateWebviewMetadata(id: string, metadataDelta: Partial): Promise { const entry = this.webviewMetadata.get(id); if (entry) { this.webviewMetadata.set(id, { - extensionLocation: entry.extensionLocation, - localResourceRoots: localResourceRoots, + ...entry, + ...metadataDelta, }); } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 70c9386b7c..131a556e07 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -166,6 +166,9 @@ export interface IPathData { // Specifies if the file should be only be opened if it exists openOnlyIfExists?: boolean; + + // Specifies an optional id to override the editor used to edit the resource, e.g. custom editor. + overrideId?: string; } export interface IOpenFileRequest { diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index fd7743bdaa..c38c079edf 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -33,9 +33,6 @@ export const enum WindowMode { export interface ICodeWindow extends IDisposable { - readonly onClose: Event; - readonly onDestroy: Event; - readonly whenClosedOrLoaded: Promise; readonly id: number; @@ -99,7 +96,7 @@ export interface IWindowsCountChangedEvent { export interface IWindowsMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onWindowReady: Event; readonly onWindowsCountChanged: Event; diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 2ae8f5a5e3..687b47d800 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -15,7 +15,7 @@ import { ParsedArgs } from 'vs/platform/environment/node/argv'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IStateService } from 'vs/platform/state/node/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; -import { ipcMain as ipc, screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; +import { screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; import { ILifecycleMainService, UnloadReason, LifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; @@ -30,7 +30,7 @@ import { IWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, hasWorkspaceFi import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; -import { getComparisonKey, isEqual, normalizePath, originalFSPath, removeTrailingPathSeparator } from 'vs/base/common/resources'; +import { normalizePath, originalFSPath, removeTrailingPathSeparator, extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; import { restoreWindowsState, WindowsStateStorageData, getWindowsStateStoreData } from 'vs/platform/windows/electron-main/windowsStateStorage'; import { getWorkspaceIdentifier, IWorkspacesMainService } from 'vs/platform/workspaces/electron-main/workspacesMainService'; @@ -152,7 +152,7 @@ interface IWorkspacePathToOpen { export class WindowsMainService extends Disposable implements IWindowsMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly windowsStateStorageKey = 'windowsState'; @@ -212,19 +212,6 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic private registerListeners(): void { - // React to workbench ready events from windows - ipc.on('vscode:workbenchReady', (event: Event, windowId: number) => { - this.logService.trace('IPC#vscode-workbenchReady'); - - const win = this.getWindowById(windowId); - if (win) { - win.setReady(); - - // Event - this._onWindowReady.fire(win); - } - }); - // React to HC color scheme changes (Windows) if (isWindows) { nativeTheme.on('updated', () => { @@ -365,7 +352,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic else if (!win.isExtensionDevelopmentHost && (!!win.openedWorkspace || !!win.openedFolderUri)) { this.windowsState.openedWindows.forEach(o => { const sameWorkspace = win.openedWorkspace && o.workspace && o.workspace.id === win.openedWorkspace.id; - const sameFolder = win.openedFolderUri && o.folderUri && isEqual(o.folderUri, win.openedFolderUri); + const sameFolder = win.openedFolderUri && o.folderUri && extUriBiasedIgnorePathCase.isEqual(o.folderUri, win.openedFolderUri); if (sameWorkspace || sameFolder) { o.uiState = state.uiState; @@ -673,7 +660,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic } // Handle folders to open (instructed and to restore) - const allFoldersToOpen = arrays.distinct(foldersToOpen, folder => getComparisonKey(folder.folderUri)); // prevent duplicates + const allFoldersToOpen = arrays.distinct(foldersToOpen, folder => extUriBiasedIgnorePathCase.getComparisonKey(folder.folderUri)); // prevent duplicates if (allFoldersToOpen.length > 0) { // Check for existing instances @@ -696,7 +683,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic // Open remaining ones allFoldersToOpen.forEach(folderToOpen => { - if (windowsOnFolderPath.some(win => isEqual(win.openedFolderUri, folderToOpen.folderUri))) { + if (windowsOnFolderPath.some(win => extUriBiasedIgnorePathCase.isEqual(win.openedFolderUri, folderToOpen.folderUri))) { return; // ignore folders that are already open } @@ -1434,24 +1421,25 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic if (options.forceNewTabbedWindow) { const activeWindow = this.getLastActiveWindow(); if (activeWindow) { - activeWindow.addTabbedWindow(window); + activeWindow.addTabbedWindow(createdWindow); } } // Add to our list of windows - WindowsMainService.WINDOWS.push(window); + WindowsMainService.WINDOWS.push(createdWindow); // Indicate number change via event this._onWindowsCountChanged.fire({ oldCount: WindowsMainService.WINDOWS.length - 1, newCount: WindowsMainService.WINDOWS.length }); // Window Events - once(window.onClose)(() => this.onWindowClosed(createdWindow)); - once(window.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire - window.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own - window.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); + once(createdWindow.onReady)(() => this._onWindowReady.fire(createdWindow)); + once(createdWindow.onClose)(() => this.onWindowClosed(createdWindow)); + once(createdWindow.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire + createdWindow.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own + createdWindow.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); // Lifecycle - (this.lifecycleMainService as LifecycleMainService).registerWindow(window); + (this.lifecycleMainService as LifecycleMainService).registerWindow(createdWindow); } // Existing window @@ -1526,7 +1514,7 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic // Known Folder - load from stored settings if (configuration.folderUri) { - const stateForFolder = this.windowsState.openedWindows.filter(o => o.folderUri && isEqual(o.folderUri, configuration.folderUri)).map(o => o.uiState); + const stateForFolder = this.windowsState.openedWindows.filter(o => o.folderUri && extUriBiasedIgnorePathCase.isEqual(o.folderUri, configuration.folderUri)).map(o => o.uiState); if (stateForFolder.length) { return stateForFolder[0]; } diff --git a/src/vs/platform/windows/node/window.ts b/src/vs/platform/windows/node/window.ts index a51a3d3e9e..ab367312b0 100644 --- a/src/vs/platform/windows/node/window.ts +++ b/src/vs/platform/windows/node/window.ts @@ -8,7 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import * as extpath from 'vs/base/common/extpath'; import { IWorkspaceIdentifier, IResolvedWorkspace, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { isEqual, isEqualOrParent } from 'vs/base/common/resources'; +import { extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; import { LogLevel } from 'vs/platform/log/common/log'; import { ExportData } from 'vs/base/common/performance'; import { ParsedArgs } from 'vs/platform/environment/node/argv'; @@ -124,12 +124,12 @@ function findWindowOnFilePath(windows: W[], fileUri: U const resolvedWorkspace = localWorkspaceResolver(workspace); if (resolvedWorkspace) { // workspace could be resolved: It's in the local file system - if (resolvedWorkspace.folders.some(folder => isEqualOrParent(fileUri, folder.uri))) { + if (resolvedWorkspace.folders.some(folder => extUriBiasedIgnorePathCase.isEqualOrParent(fileUri, folder.uri))) { return window; } } else { // use the config path instead - if (isEqualOrParent(fileUri, workspace.configPath)) { + if (extUriBiasedIgnorePathCase.isEqualOrParent(fileUri, workspace.configPath)) { return window; } } @@ -137,7 +137,7 @@ function findWindowOnFilePath(windows: W[], fileUri: U } // Then go with single folder windows that are parent of the provided file path - const singleFolderWindowsOnFilePath = windows.filter(window => window.openedFolderUri && isEqualOrParent(fileUri, window.openedFolderUri)); + const singleFolderWindowsOnFilePath = windows.filter(window => window.openedFolderUri && extUriBiasedIgnorePathCase.isEqualOrParent(fileUri, window.openedFolderUri)); if (singleFolderWindowsOnFilePath.length) { return singleFolderWindowsOnFilePath.sort((a, b) => -(a.openedFolderUri!.path.length - b.openedFolderUri!.path.length))[0]; } @@ -156,7 +156,7 @@ export function findWindowOnWorkspace(windows: W[], wo for (const window of windows) { // match on folder if (isSingleFolderWorkspaceIdentifier(workspace)) { - if (window.openedFolderUri && isEqual(window.openedFolderUri, workspace)) { + if (window.openedFolderUri && extUriBiasedIgnorePathCase.isEqual(window.openedFolderUri, workspace)) { return window; } } @@ -195,12 +195,12 @@ export function findWindowOnWorkspaceOrFolderUri(windo } for (const window of windows) { // check for workspace config path - if (window.openedWorkspace && isEqual(window.openedWorkspace.configPath, uri)) { + if (window.openedWorkspace && extUriBiasedIgnorePathCase.isEqual(window.openedWorkspace.configPath, uri)) { return window; } // check for folder path - if (window.openedFolderUri && isEqual(window.openedFolderUri, uri)) { + if (window.openedFolderUri && extUriBiasedIgnorePathCase.isEqual(window.openedFolderUri, uri)) { return window; } } diff --git a/src/vs/platform/workspace/common/workspace.ts b/src/vs/platform/workspace/common/workspace.ts index 30b96e6c68..cd1562255e 100644 --- a/src/vs/platform/workspace/common/workspace.ts +++ b/src/vs/platform/workspace/common/workspace.ts @@ -14,7 +14,7 @@ import { IWorkspaceFolderProvider } from 'vs/base/common/labels'; export const IWorkspaceContextService = createDecorator('contextService'); export interface IWorkspaceContextService extends IWorkspaceFolderProvider { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * An event which fires on workbench state changes. diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index c88bf25fb0..e0297e509b 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -29,7 +29,7 @@ export const IWorkspacesService = createDecorator('workspace export interface IWorkspacesService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; // Workspaces Management enterWorkspace(path: URI): Promise; diff --git a/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts index 336000b79a..998c014fb5 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesHistoryMainService.ts @@ -14,7 +14,7 @@ import { isWindows, isMacintosh } from 'vs/base/common/platform'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, IRecentlyOpened, isRecentWorkspace, isRecentFolder, IRecent, isRecentFile, IRecentFolder, IRecentWorkspace, IRecentFile, toStoreData, restoreRecentlyOpened, RecentlyOpenedStorageData } from 'vs/platform/workspaces/common/workspaces'; import { IWorkspacesMainService } from 'vs/platform/workspaces/electron-main/workspacesMainService'; import { ThrottledDelayer } from 'vs/base/common/async'; -import { isEqual as areResourcesEqual, dirname, originalFSPath, basename } from 'vs/base/common/resources'; +import { isEqual, dirname, originalFSPath, basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -30,7 +30,7 @@ export const IWorkspacesHistoryMainService = createDecorator; @@ -57,7 +57,7 @@ export class WorkspacesHistoryMainService extends Disposable implements IWorkspa private static readonly recentlyOpenedStorageKey = 'openedPathsList'; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onRecentlyOpenedChange = new Emitter(); readonly onRecentlyOpenedChange: CommonEvent = this._onRecentlyOpenedChange.event; @@ -152,8 +152,8 @@ export class WorkspacesHistoryMainService extends Disposable implements IWorkspa removeRecentlyOpened(toRemove: URI[]): void { const keep = (recent: IRecent) => { const uri = location(recent); - for (const r of toRemove) { - if (areResourcesEqual(r, uri)) { + for (const resource of toRemove) { + if (isEqual(resource, uri)) { return false; } } @@ -411,9 +411,9 @@ function indexOfWorkspace(arr: IRecent[], candidate: IWorkspaceIdentifier): numb } function indexOfFolder(arr: IRecent[], candidate: ISingleFolderWorkspaceIdentifier): number { - return arr.findIndex(folder => isRecentFolder(folder) && areResourcesEqual(folder.folderUri, candidate)); + return arr.findIndex(folder => isRecentFolder(folder) && isEqual(folder.folderUri, candidate)); } function indexOfFile(arr: IRecentFile[], candidate: URI): number { - return arr.findIndex(file => areResourcesEqual(file.fileUri, candidate)); + return arr.findIndex(file => isEqual(file.fileUri, candidate)); } diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 747e12894e..bbb6980f09 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -18,7 +18,7 @@ import { toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { Disposable } from 'vs/base/common/lifecycle'; -import { originalFSPath, joinPath, isEqual, basename } from 'vs/base/common/resources'; +import { originalFSPath, joinPath, basename, extUriBiasedIgnorePathCase } from 'vs/base/common/resources'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ICodeWindow } from 'vs/platform/windows/electron-main/windows'; import { localize } from 'vs/nls'; @@ -38,7 +38,7 @@ export interface IWorkspaceEnteredEvent { export interface IWorkspacesMainService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onUntitledWorkspaceDeleted: Event; readonly onWorkspaceEntered: Event; @@ -65,7 +65,7 @@ export interface IStoredWorkspace { export class WorkspacesMainService extends Disposable implements IWorkspacesMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly untitledWorkspacesHome: URI; // local URI that contains all untitled workspaces @@ -134,7 +134,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain if (storedWorkspace && Array.isArray(storedWorkspace.folders)) { storedWorkspace.folders = storedWorkspace.folders.filter(folder => isStoredWorkspaceFolder(folder)); } else { - throw new Error(`${path.toString()} looks like an invalid workspace file.`); + throw new Error(`${path.toString(true)} looks like an invalid workspace file.`); } return storedWorkspace; @@ -185,8 +185,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain }; } - getWorkspaceIdentifier(configPath: URI): Promise { - return Promise.resolve(getWorkspaceIdentifier(configPath)); + async getWorkspaceIdentifier(configPath: URI): Promise { + return getWorkspaceIdentifier(configPath); } isUntitledWorkspace(workspace: IWorkspaceIdentifier): boolean { @@ -205,9 +205,8 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain this._onUntitledWorkspaceDeleted.fire(workspace); } - deleteUntitledWorkspace(workspace: IWorkspaceIdentifier): Promise { + async deleteUntitledWorkspace(workspace: IWorkspaceIdentifier): Promise { this.deleteUntitledWorkspaceSync(workspace); - return Promise.resolve(); } private doDeleteUntitledWorkspaceSync(workspace: IWorkspaceIdentifier): void { @@ -274,7 +273,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return true; } - if (window.openedWorkspace && isEqual(window.openedWorkspace.configPath, path)) { + if (window.openedWorkspace && extUriBiasedIgnorePathCase.isEqual(window.openedWorkspace.configPath, path)) { return false; // window is already opened on a workspace with that path } diff --git a/src/vs/platform/workspaces/electron-main/workspacesService.ts b/src/vs/platform/workspaces/electron-main/workspacesService.ts index f2c7e570dd..0304a9e52d 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesService.ts @@ -13,7 +13,7 @@ import { IBackupMainService } from 'vs/platform/backup/electron-main/backup'; export class WorkspacesService implements AddFirstParameterToFunctions /* only methods, not events */, number /* window ID */> { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IWorkspacesMainService private readonly workspacesMainService: IWorkspacesMainService, diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index f2ea278146..eab2908958 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -24,7 +24,7 @@ import { IBackupMainService, IWorkspaceBackupInfo } from 'vs/platform/backup/ele import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; export class TestDialogMainService implements IDialogMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; pickFileFolder(options: INativeOpenDialogOptions, window?: Electron.BrowserWindow | undefined): Promise { throw new Error('Method not implemented.'); @@ -57,7 +57,7 @@ export class TestDialogMainService implements IDialogMainService { export class TestBackupMainService implements IBackupMainService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; isHotExitEnabled(): boolean { throw new Error('Method not implemented.'); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index e7690c0b23..a70c6398be 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -1290,7 +1290,7 @@ declare module 'vscode' { * The path segments are normalized in the following ways: * - sequences of path separators (`/` or `\`) are replaced with a single separator * - for `file`-uris on windows, the backslash-character (`\`) is considered a path-separator - * - the `..`-segment denotes the parent segment, the `.` denotes the current segement + * - the `..`-segment denotes the parent segment, the `.` denotes the current segment * - paths have a root which always remains, for instance on windows drive-letters are roots * so that is true: `joinPath(Uri.file('file:///c:/root'), '../../other').fsPath === 'c:/other'` * @@ -2414,6 +2414,11 @@ declare module 'vscode' { */ isTrusted?: boolean; + /** + * Indicates that this markdown string can contain [ThemeIcons](#ThemeIcon), e.g. `$(zap)`. + */ + readonly supportThemeIcons?: boolean; + /** * Creates a new markdown string with the given value. * @@ -4376,7 +4381,7 @@ declare module 'vscode' { } /** - * The call hierarchy provider interface describes the constract between extensions + * The call hierarchy provider interface describes the contract between extensions * and the call hierarchy feature which allows to browse calls and caller of function, * methods, constructor etc. */ @@ -5415,6 +5420,30 @@ declare module 'vscode' { activate(): Thenable; } + /** + * The ExtensionMode is provided on the `ExtensionContext` and indicates the + * mode the specific extension is running in. + */ + export enum ExtensionMode { + /** + * The extension is installed normally (for example, from the marketplace + * or VSIX) in VS Code. + */ + Production = 1, + + /** + * The extension is running from an `--extensionDevelopmentPath` provided + * when launching VS Code. + */ + Development = 2, + + /** + * The extension is running from an `--extensionTestsPath` and + * the extension host is running unit tests. + */ + Test = 3, + } + /** * An extension context is a collection of utilities private to an * extension. @@ -5492,6 +5521,13 @@ declare module 'vscode' { * the parent directory is guaranteed to be existent. */ readonly logPath: string; + + /** + * The mode the extension is running in. This is specific to the current + * extension. One extension may be in `ExtensionMode.Development` while + * other extensions in the host run in `ExtensionMode.Release`. + */ + readonly extensionMode: ExtensionMode; } /** @@ -5922,7 +5958,7 @@ declare module 'vscode' { */ export enum TaskScope { /** - * The task is a global task. Global tasks are currrently not supported. + * The task is a global task. Global tasks are currently not supported. */ Global = 1, @@ -6896,12 +6932,15 @@ declare module 'vscode' { * This is called when a user first opens a resource for a `CustomTextEditorProvider`, or if they reopen an * existing editor using this `CustomTextEditorProvider`. * - * To resolve a custom editor, the provider must fill in its initial html content and hook up all - * the event listeners it is interested it. The provider can also hold onto the `WebviewPanel` to use later, - * for example in a command. See [`WebviewPanel`](#WebviewPanel) for additional details. * * @param document Document for the resource to resolve. - * @param webviewPanel Webview to resolve. + * + * @param webviewPanel The webview panel used to display the editor UI for this resource. + * + * During resolve, the provider must fill in the initial html for the content webview panel and hook up all + * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to + * use later for example in a command. See [`WebviewPanel`](#WebviewPanel) for additional details. + * * @param token A cancellation token that indicates the result is no longer needed. * * @return Thenable indicating that the custom editor has been resolved. @@ -6909,6 +6948,285 @@ declare module 'vscode' { resolveCustomTextEditor(document: TextDocument, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; } + /** + * Represents a custom document used by a [`CustomEditorProvider`](#CustomEditorProvider). + * + * Custom documents are only used within a given `CustomEditorProvider`. The lifecycle of a `CustomDocument` is + * managed by VS Code. When no more references remain to a `CustomDocument`, it is disposed of. + */ + interface CustomDocument { + /** + * The associated uri for this document. + */ + readonly uri: Uri; + + /** + * Dispose of the custom document. + * + * This is invoked by VS Code when there are no more references to a given `CustomDocument` (for example when + * all editors associated with the document have been closed.) + */ + dispose(): void; + } + + /** + * Event triggered by extensions to signal to VS Code that an edit has occurred on an [`CustomDocument`](#CustomDocument). + * + * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). + */ + interface CustomDocumentEditEvent { + + /** + * The document that the edit is for. + */ + readonly document: T; + + /** + * Undo the edit operation. + * + * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your + * extension should restore the document and editor to the state they were in just before this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + undo(): Thenable | void; + + /** + * Redo the edit operation. + * + * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your + * extension should restore the document and editor to the state they were in just after this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + redo(): Thenable | void; + + /** + * Display name describing the edit. + * + * This will be shown to users in the UI for undo/redo operations. + */ + readonly label?: string; + } + + /** + * Event triggered by extensions to signal to VS Code that the content of a [`CustomDocument`](#CustomDocument) + * has changed. + * + * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). + */ + interface CustomDocumentContentChangeEvent { + /** + * The document that the change is for. + */ + readonly document: T; + } + + /** + * A backup for an [`CustomDocument`](#CustomDocument). + */ + interface CustomDocumentBackup { + /** + * Unique identifier for the backup. + * + * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. + */ + readonly id: string; + + /** + * Delete the current backup. + * + * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup + * is made or when the file is saved. + */ + delete(): void; + } + + /** + * Additional information used to implement [`CustomEditableDocument.backup`](#CustomEditableDocument.backup). + */ + interface CustomDocumentBackupContext { + /** + * Suggested file location to write the new backup. + * + * Note that your extension is free to ignore this and use its own strategy for backup. + * + * If the editor is for a resource from the current workspace, `destination` will point to a file inside + * `ExtensionContext.storagePath`. The parent folder of `destination` may not exist, so make sure to created it + * before writing the backup to this location. + */ + readonly destination: Uri; + } + + /** + * Additional information about the opening custom document. + */ + interface CustomDocumentOpenContext { + /** + * The id of the backup to restore the document from or `undefined` if there is no backup. + * + * If this is provided, your extension should restore the editor from the backup instead of reading the file + * from the user's workspace. + */ + readonly backupId?: string; + } + + /** + * Provider for readonly custom editors that use a custom document model. + * + * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). + * + * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple + * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. + * + * @param T Type of the custom document returned by this provider. + */ + export interface CustomReadonlyEditorProvider { + + /** + * Create a new document for a given resource. + * + * `openCustomDocument` is called when the first time an editor for a given resource is opened. The opened + * document is then passed to `resolveCustomEditor` so that the editor can be shown to the user. + * + * Already opened `CustomDocument` are re-used if the user opened additional editors. When all editors for a + * given resource are closed, the `CustomDocument` is disposed of. Opening an editor at this point will + * trigger another call to `openCustomDocument`. + * + * @param uri Uri of the document to open. + * @param openContext Additional information about the opening custom document. + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return The custom document. + */ + openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): Thenable | T; + + /** + * Resolve a custom editor for a given resource. + * + * This is called whenever the user opens a new editor for this `CustomEditorProvider`. + * + * @param document Document for the resource being resolved. + * + * @param webviewPanel The webview panel used to display the editor UI for this resource. + * + * During resolve, the provider must fill in the initial html for the content webview panel and hook up all + * the event listeners on it that it is interested in. The provider can also hold onto the `WebviewPanel` to + * use later for example in a command. See [`WebviewPanel`](#WebviewPanel) for additional details. + * + * @param token A cancellation token that indicates the result is no longer needed. + * + * @return Optional thenable indicating that the custom editor has been resolved. + */ + resolveCustomEditor(document: T, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; + } + + /** + * Provider for editable custom editors that use a custom document model. + * + * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). + * This gives extensions full control over actions such as edit, save, and backup. + * + * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple + * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. + * + * @param T Type of the custom document returned by this provider. + */ + export interface CustomEditorProvider extends CustomReadonlyEditorProvider { + /** + * Signal that an edit has occurred inside a custom editor. + * + * This event must be fired by your extension whenever an edit happens in a custom editor. An edit can be + * anything from changing some text, to cropping an image, to reordering a list. Your extension is free to + * define what an edit is and what data is stored on each edit. + * + * Firing `onDidChange` causes VS Code to mark the editors as being dirty. This is cleared when the user either + * saves or reverts the file. + * + * Editors that support undo/redo must fire a `CustomDocumentEditEvent` whenever an edit happens. This allows + * users to undo and redo the edit using VS Code's standard VS Code keyboard shortcuts. VS Code will also mark + * the editor as no longer being dirty if the user undoes all edits to the last saved state. + * + * Editors that support editing but cannot use VS Code's standard undo/redo mechanism must fire a `CustomDocumentContentChangeEvent`. + * The only way for a user to clear the dirty state of an editor that does not support undo/redo is to either + * `save` or `revert` the file. + * + * An editor should only ever fire `CustomDocumentEditEvent` events, or only ever fire `CustomDocumentContentChangeEvent` events. + */ + readonly onDidChangeCustomDocument: Event> | Event>; + + /** + * Save a custom document. + * + * This method is invoked by VS Code when the user saves a custom editor. This can happen when the user + * triggers save while the custom editor is active, by commands such as `save all`, or by auto save if enabled. + * + * To implement `save`, the implementer must persist the custom editor. This usually means writing the + * file data for the custom document to disk. After `save` completes, any associated editor instances will + * no longer be marked as dirty. + * + * @param document Document to save. + * @param cancellation Token that signals the save is no longer required (for example, if another save was triggered). + * + * @return Thenable signaling that saving has completed. + */ + saveCustomDocument(document: T, cancellation: CancellationToken): Thenable; + + /** + * Save a custom document to a different location. + * + * This method is invoked by VS Code when the user triggers 'save as' on a custom editor. The implementer must + * persist the custom editor to `destination`. + * + * When the user accepts save as, the current editor is be replaced by an non-dirty editor for the newly saved file. + * + * @param document Document to save. + * @param destination Location to save to. + * @param cancellation Token that signals the save is no longer required. + * + * @return Thenable signaling that saving has completed. + */ + saveCustomDocumentAs(document: T, destination: Uri, cancellation: CancellationToken): Thenable; + + /** + * Revert a custom document to its last saved state. + * + * This method is invoked by VS Code when the user triggers `File: Revert File` in a custom editor. (Note that + * this is only used using VS Code's `File: Revert File` command and not on a `git revert` of the file). + * + * To implement `revert`, the implementer must make sure all editor instances (webviews) for `document` + * are displaying the document in the same state is saved in. This usually means reloading the file from the + * workspace. + * + * @param document Document to revert. + * @param cancellation Token that signals the revert is no longer required. + * + * @return Thenable signaling that the change has completed. + */ + revertCustomDocument(document: T, cancellation: CancellationToken): Thenable; + + /** + * Back up a dirty custom document. + * + * Backups are used for hot exit and to prevent data loss. Your `backup` method should persist the resource in + * its current state, i.e. with the edits applied. Most commonly this means saving the resource to disk in + * the `ExtensionContext.storagePath`. When VS Code reloads and your custom editor is opened for a resource, + * your extension should first check to see if any backups exist for the resource. If there is a backup, your + * extension should load the file contents from there instead of from the resource in the workspace. + * + * `backup` is triggered approximately one second after the the user stops editing the document. If the user + * rapidly edits the document, `backup` will not be invoked until the editing stops. + * + * `backup` is not invoked when `auto save` is enabled (since auto save already persists the resource). + * + * @param document Document to backup. + * @param context Information that can be used to backup the document. + * @param cancellation Token that signals the current backup since a new backup is coming in. It is up to your + * extension to decided how to respond to cancellation. If for example your extension is backing up a large file + * in an operation that takes time to complete, your extension may decide to finish the ongoing backup rather + * than cancelling it to ensure that VS Code has some valid backup. + */ + backupCustomDocument(document: T, context: CustomDocumentBackupContext, cancellation: CancellationToken): Thenable; + } + /** * The clipboard provides read and write access to the system's clipboard. */ @@ -7036,7 +7354,7 @@ declare module 'vscode' { * * If the extension is running remotely, this function automatically establishes a port forwarding tunnel * from the local machine to `target` on the remote and returns a local uri to the tunnel. The lifetime of - * the port fowarding tunnel is managed by VS Code and the tunnel can be closed by the user. + * the port forwarding tunnel is managed by VS Code and the tunnel can be closed by the user. * * *Note* that uris passed through `openExternal` are automatically resolved and you should not call `asExternalUri` on them. * @@ -7750,7 +8068,8 @@ declare module 'vscode' { * Register a provider for custom editors for the `viewType` contributed by the `customEditors` extension point. * * When a custom editor is opened, VS Code fires an `onCustomEditor:viewType` activation event. Your extension - * must register a [`CustomTextEditorProvider`](#CustomTextEditorProvider) for `viewType` as part of activation. + * must register a [`CustomTextEditorProvider`](#CustomTextEditorProvider), [`CustomReadonlyEditorProvider`](#CustomReadonlyEditorProvider), + * [`CustomEditorProvider`](#CustomEditorProvider)for `viewType` as part of activation. * * @param viewType Unique identifier for the custom editor provider. This should match the `viewType` from the * `customEditors` contribution point. @@ -7759,7 +8078,28 @@ declare module 'vscode' { * * @return Disposable that unregisters the provider. */ - export function registerCustomEditorProvider(viewType: string, provider: CustomTextEditorProvider, options?: { readonly webviewOptions?: WebviewPanelOptions; }): Disposable; + export function registerCustomEditorProvider(viewType: string, provider: CustomTextEditorProvider | CustomReadonlyEditorProvider | CustomEditorProvider, options?: { + /** + * Content settings for the webview panels created for this custom editor. + */ + readonly webviewOptions?: WebviewPanelOptions; + + /** + * Only applies to `CustomReadonlyEditorProvider | CustomEditorProvider`. + * + * Indicates that the provider allows multiple editor instances to be open at the same time for + * the same resource. + * + * By default, VS Code only allows one editor instance to be open at a time for each resource. If the + * user tries to open a second editor instance for the resource, the first one is instead moved to where + * the second one was to be opened. + * + * When `supportsMultipleEditorsPerDocument` is enabled, users can split and create copies of the custom + * editor. In this case, the custom editor must make sure it can properly synchronize the states of all + * editor instances for a resource so that they are consistent. + */ + readonly supportsMultipleEditorsPerDocument?: boolean; + }): Disposable; /** * The currently active color theme as configured in the settings. The active @@ -8104,8 +8444,9 @@ declare module 'vscode' { interface Pseudoterminal { /** * An event that when fired will write data to the terminal. Unlike - * [Terminal.sendText](#Terminal.sendText) which sends text to the underlying _process_ - * (the pty "slave"), this will write the text to the terminal itself (the pty "master"). + * [Terminal.sendText](#Terminal.sendText) which sends text to the underlying child + * pseudo-device (the child), this will write the text to parent pseudo-device (the + * _terminal_ itself). * * Note writing `\n` will just move the cursor down 1 row, you need to write `\r` as well * to move the cursor to the left-most cell. @@ -9316,7 +9657,7 @@ declare module 'vscode' { * files change on disk, e.g triggered by another application, or when using the * [`workspace.fs`](#FileSystem)-api. * - * *Note 2:* When this event is fired, edits to files thare are being created cannot be applied. + * *Note 2:* When this event is fired, edits to files that are are being created cannot be applied. */ export const onWillCreateFiles: Event; @@ -9385,7 +9726,7 @@ declare module 'vscode' { * is returned. Dots in the section-identifier are interpreted as child-access, * like `{ myExt: { setting: { doIt: true }}}` and `getConfiguration('myExt.setting').get('doIt') === true`. * - * When a scope is provided configuraiton confined to that scope is returned. Scope can be a resource or a language identifier or both. + * When a scope is provided configuration confined to that scope is returned. Scope can be a resource or a language identifier or both. * * @param section A dot-separated identifier. * @param scope A scope for which the configuration is asked for. @@ -10711,7 +11052,7 @@ declare module 'vscode' { * Folder specific variables used in the configuration (e.g. '${workspaceFolder}') are resolved against the given folder. * @param folder The [workspace folder](#WorkspaceFolder) for looking up named configurations and resolving variables or `undefined` for a non-folder setup. * @param nameOrConfiguration Either the name of a debug or compound configuration or a [DebugConfiguration](#DebugConfiguration) object. - * @param parentSessionOrOptions Debug sesison options. When passed a parent [debug session](#DebugSession), assumes options with just this parent session. + * @param parentSessionOrOptions Debug session options. When passed a parent [debug session](#DebugSession), assumes options with just this parent session. * @return A thenable that resolves when debugging could be successfully started. */ export function startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, parentSessionOrOptions?: DebugSession | DebugSessionOptions): Thenable; @@ -10890,7 +11231,7 @@ declare module 'vscode' { /** * Dispose this comment thread. * - * Once disposed, this comment thread will be removed from visible editors and Comment Panel when approriate. + * Once disposed, this comment thread will be removed from visible editors and Comment Panel when appropriate. */ dispose(): void; } diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 17631a4aa4..6dd9e759fb 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -851,6 +851,14 @@ declare module 'vscode' { //#region debug + export interface DebugSessionOptions { + /** + * Controls whether this session should run without debugging, thus ignoring breakpoints. + * When this property is not specified, the value from the parent session (if there is one) is used. + */ + noDebug?: boolean; + } + // deprecated debug API export interface DebugConfigurationProvider { @@ -974,9 +982,9 @@ declare module 'vscode' { namespace window { /** - * An event which fires when the terminal's pty slave pseudo-device is written to. In other - * words, this provides access to the raw data stream from the process running within the - * terminal, including VT sequences. + * An event which fires when the terminal's child pseudo-device is written to (the shell). + * In other words, this provides access to the raw data stream from the process running + * within the terminal, including VT sequences. */ export const onDidWriteTerminalData: Event; } @@ -1090,6 +1098,8 @@ declare module 'vscode' { /** * Accessibility information used when screen reader interacts with this tree item. + * Generally, a TreeItem has no need to set the `role` of the accessibilityInformation; + * however, there are cases where a TreeItem is not displayed in a tree-like way where setting the `role` may make sense. */ accessibilityInformation?: AccessibilityInformation; @@ -1221,310 +1231,6 @@ declare module 'vscode' { //#endregion - //#region Custom editor https://github.com/microsoft/vscode/issues/77131 - - /** - * Represents a custom document used by a [`CustomEditorProvider`](#CustomEditorProvider). - * - * Custom documents are only used within a given `CustomEditorProvider`. The lifecycle of a `CustomDocument` is - * managed by VS Code. When no more references remain to a `CustomDocument`, it is disposed of. - */ - interface CustomDocument { - /** - * The associated uri for this document. - */ - readonly uri: Uri; - - /** - * Dispose of the custom document. - * - * This is invoked by VS Code when there are no more references to a given `CustomDocument` (for example when - * all editors associated with the document have been closed.) - */ - dispose(): void; - } - - /** - * Event triggered by extensions to signal to VS Code that an edit has occurred on an [`CustomDocument`](#CustomDocument). - * - * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). - */ - interface CustomDocumentEditEvent { - - /** - * The document that the edit is for. - */ - readonly document: T; - - /** - * Undo the edit operation. - * - * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your - * extension should restore the document and editor to the state they were in just before this - * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. - */ - undo(): Thenable | void; - - /** - * Redo the edit operation. - * - * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your - * extension should restore the document and editor to the state they were in just after this - * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. - */ - redo(): Thenable | void; - - /** - * Display name describing the edit. - * - * This is shown in the UI to users. - */ - readonly label?: string; - } - - /** - * Event triggered by extensions to signal to VS Code that the content of a [`CustomDocument`](#CustomDocument) - * has changed. - * - * @see [`CustomDocumentProvider.onDidChangeCustomDocument`](#CustomDocumentProvider.onDidChangeCustomDocument). - */ - interface CustomDocumentContentChangeEvent { - /** - * The document that the change is for. - */ - readonly document: T; - } - - /** - * A backup for an [`CustomDocument`](#CustomDocument). - */ - interface CustomDocumentBackup { - /** - * Unique identifier for the backup. - * - * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. - */ - readonly id: string; - - /** - * Delete the current backup. - * - * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup - * is made or when the file is saved. - */ - delete(): void; - } - - /** - * Additional information used to implement [`CustomEditableDocument.backup`](#CustomEditableDocument.backup). - */ - interface CustomDocumentBackupContext { - /** - * Suggested file location to write the new backup. - * - * Note that your extension is free to ignore this and use its own strategy for backup. - * - * For editors for workspace resource, this destination will be in the workspace storage. The path may not - */ - readonly destination: Uri; - } - - /** - * Additional information about the opening custom document. - */ - interface CustomDocumentOpenContext { - /** - * The id of the backup to restore the document from or `undefined` if there is no backup. - * - * If this is provided, your extension should restore the editor from the backup instead of reading the file - * the user's workspace. - */ - readonly backupId?: string; - } - - /** - * Provider for readonly custom editors that use a custom document model. - * - * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. - * - * @param T Type of the custom document returned by this provider. - */ - export interface CustomReadonlyEditorProvider { - - /** - * Create a new document for a given resource. - * - * `openCustomDocument` is called when the first editor for a given resource is opened, and the resolve document - * is passed to `resolveCustomEditor`. The resolved `CustomDocument` is re-used for subsequent editor opens. - * If all editors for a given resource are closed, the `CustomDocument` is disposed of. Opening an editor at - * this point will trigger another call to `openCustomDocument`. - * - * @param uri Uri of the document to open. - * @param openContext Additional information about the opening custom document. - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return The custom document. - */ - openCustomDocument(uri: Uri, openContext: CustomDocumentOpenContext, token: CancellationToken): Thenable | T; - - /** - * Resolve a custom editor for a given resource. - * - * This is called whenever the user opens a new editor for this `CustomEditorProvider`. - * - * To resolve a custom editor, the provider must fill in its initial html content and hook up all - * the event listeners it is interested it. The provider can also hold onto the `WebviewPanel` to use later, - * for example in a command. See [`WebviewPanel`](#WebviewPanel) for additional details. - * - * @param document Document for the resource being resolved. - * @param webviewPanel Webview to resolve. - * @param token A cancellation token that indicates the result is no longer needed. - * - * @return Optional thenable indicating that the custom editor has been resolved. - */ - resolveCustomEditor(document: T, webviewPanel: WebviewPanel, token: CancellationToken): Thenable | void; - } - - /** - * Provider for editiable custom editors that use a custom document model. - * - * Custom editors use [`CustomDocument`](#CustomDocument) as their document model instead of a [`TextDocument`](#TextDocument). - * This gives extensions full control over actions such as edit, save, and backup. - * - * You should use this type of custom editor when dealing with binary files or more complex scenarios. For simple - * text based documents, use [`CustomTextEditorProvider`](#CustomTextEditorProvider) instead. - * - * @param T Type of the custom document returned by this provider. - */ - export interface CustomEditorProvider extends CustomReadonlyEditorProvider { - /** - * Signal that an edit has occurred inside a custom editor. - * - * This event must be fired by your extension whenever an edit happens in a custom editor. An edit can be - * anything from changing some text, to cropping an image, to reordering a list. Your extension is free to - * define what an edit is and what data is stored on each edit. - * - * Firing `onDidChange` causes VS Code to mark the editors as being dirty. This is cleared when the user either - * saves or reverts the file. - * - * Editors that support undo/redo must fire a `CustomDocumentEditEvent` whenever an edit happens. This allows - * users to undo and redo the edit using VS Code's standard VS Code keyboard shortcuts. VS Code will also mark - * the editor as no longer being dirty if the user undoes all edits to the last saved state. - * - * Editors that support editing but cannot use VS Code's standard undo/redo mechanism must fire a `CustomDocumentContentChangeEvent`. - * The only way for a user to clear the dirty state of an editor that does not support undo/redo is to either - * `save` or `revert` the file. - * - * An editor should only ever fire `CustomDocumentEditEvent` events, or only ever fire `CustomDocumentContentChangeEvent` events. - */ - readonly onDidChangeCustomDocument: Event> | Event>; - - /** - * Save a custom document. - * - * This method is invoked by VS Code when the user saves a custom editor. This can happen when the user - * triggers save while the custom editor is active, by commands such as `save all`, or by auto save if enabled. - * - * To implement `save`, the implementer must persist the custom editor. This usually means writing the - * file data for the custom document to disk. After `save` completes, any associated editor instances will - * no longer be marked as dirty. - * - * @param document Document to save. - * @param cancellation Token that signals the save is no longer required (for example, if another save was triggered). - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Save a custom document to a different location. - * - * This method is invoked by VS Code when the user triggers 'save as' on a custom editor. The implementer must - * persist the custom editor to `destination`. - * - * When the user accepts save as, the current editor is be replaced by an non-dirty editor for the newly saved file. - * - * @param document Document to save. - * @param destination Location to save to. - * @param cancellation Token that signals the save is no longer required. - * - * @return Thenable signaling that saving has completed. - */ - saveCustomDocumentAs(document: T, destination: Uri, cancellation: CancellationToken): Thenable; - - /** - * Revert a custom document to its last saved state. - * - * This method is invoked by VS Code when the user triggers `File: Revert File` in a custom editor. (Note that - * this is only used using VS Code's `File: Revert File` command and not on a `git revert` of the file). - * - * To implement `revert`, the implementer must make sure all editor instances (webviews) for `document` - * are displaying the document in the same state is saved in. This usually means reloading the file from the - * workspace. - * - * @param document Document to revert. - * @param cancellation Token that signals the revert is no longer required. - * - * @return Thenable signaling that the change has completed. - */ - revertCustomDocument(document: T, cancellation: CancellationToken): Thenable; - - /** - * Back up a dirty custom document. - * - * Backups are used for hot exit and to prevent data loss. Your `backup` method should persist the resource in - * its current state, i.e. with the edits applied. Most commonly this means saving the resource to disk in - * the `ExtensionContext.storagePath`. When VS Code reloads and your custom editor is opened for a resource, - * your extension should first check to see if any backups exist for the resource. If there is a backup, your - * extension should load the file contents from there instead of from the resource in the workspace. - * - * `backup` is triggered whenever an edit it made. Calls to `backup` are debounced so that if multiple edits are - * made in quick succession, `backup` is only triggered after the last one. `backup` is not invoked when - * `auto save` is enabled (since auto save already persists resource ). - * - * @param document Document to backup. - * @param context Information that can be used to backup the document. - * @param cancellation Token that signals the current backup since a new backup is coming in. It is up to your - * extension to decided how to respond to cancellation. If for example your extension is backing up a large file - * in an operation that takes time to complete, your extension may decide to finish the ongoing backup rather - * than cancelling it to ensure that VS Code has some valid backup. - */ - backupCustomDocument(document: T, context: CustomDocumentBackupContext, cancellation: CancellationToken): Thenable; - } - - namespace window { - /** - * Temporary overload for `registerCustomEditorProvider` that takes a `CustomEditorProvider`. - */ - export function registerCustomEditorProvider2( - viewType: string, - provider: CustomReadonlyEditorProvider | CustomEditorProvider, - options?: { - readonly webviewOptions?: WebviewPanelOptions; - - /** - * Only applies to `CustomReadonlyEditorProvider | CustomEditorProvider`. - * - * Indicates that the provider allows multiple editor instances to be open at the same time for - * the same resource. - * - * If not set, VS Code only allows one editor instance to be open at a time for each resource. If the - * user tries to open a second editor instance for the resource, the first one is instead moved to where - * the second one was to be opened. - * - * When set, users can split and create copies of the custom editor. The custom editor must make sure it - * can properly synchronize the states of all editor instances for a resource so that they are consistent. - */ - readonly supportsMultipleEditorsPerDocument?: boolean; - } - ): Disposable; - } - - // #endregion - //#region Custom editor move https://github.com/microsoft/vscode/issues/86146 // TODO: Also for custom editor @@ -1559,18 +1265,6 @@ declare module 'vscode' { //#endregion - //#region Allow theme icons in hovers: https://github.com/microsoft/vscode/issues/84695 - - export interface MarkdownString { - - /** - * Indicates that this markdown string can contain [ThemeIcons](#ThemeIcon), e.g. `$(zap)`. - */ - readonly supportThemeIcons?: boolean; - } - - //#endregion - //#region @rebornix: Notebook export enum CellKind { @@ -1605,6 +1299,13 @@ declare module 'vscode' { traceback: string[]; } + export interface NotebookCellOutputMetadata { + /** + * Additional attributes of a cell metadata. + */ + custom?: { [key: string]: any }; + } + export interface CellDisplayOutput { outputKind: CellOutputKind.Rich; /** @@ -1625,6 +1326,8 @@ declare module 'vscode' { * } */ data: { [key: string]: any; }; + + readonly metadata?: NotebookCellOutputMetadata; } export type CellOutput = CellStreamOutput | CellErrorOutput | CellDisplayOutput; @@ -1696,8 +1399,6 @@ declare module 'vscode' { readonly uri: Uri; readonly cellKind: CellKind; readonly document: TextDocument; - // API remove `source` or doc it as shorthand for document.getText() - readonly source: string; language: string; outputs: CellOutput[]; metadata: NotebookCellMetadata; @@ -1745,6 +1446,7 @@ declare module 'vscode' { export interface NotebookDocument { readonly uri: Uri; readonly fileName: string; + readonly viewType: string; readonly isDirty: boolean; readonly cells: NotebookCell[]; languages: string[]; @@ -1823,8 +1525,13 @@ declare module 'vscode' { } export interface NotebookOutputSelector { - type: string; - subTypes?: string[]; + mimeTypes?: string[]; + } + + export interface NotebookRenderRequest { + output: CellDisplayOutput; + mimeType: string; + outputId: string; } export interface NotebookOutputRenderer { @@ -1833,13 +1540,15 @@ declare module 'vscode' { * @returns HTML fragment. We can probably return `CellOutput` instead of string ? * */ - render(document: NotebookDocument, output: CellDisplayOutput, mimeType: string): string; - preloads?: Uri[]; + render(document: NotebookDocument, request: NotebookRenderRequest): string; + + readonly preloads?: Uri[]; } export interface NotebookCellsChangeData { readonly start: number; readonly deletedCount: number; + readonly deletedItems: NotebookCell[]; readonly items: NotebookCell[]; } @@ -1895,7 +1604,7 @@ declare module 'vscode' { readonly metadata: NotebookDocumentMetadata; } - interface NotebookDocumentEditEvent { + interface NotebookDocumentContentChangeEvent { /** * The document that the edit is for. @@ -1903,14 +1612,89 @@ declare module 'vscode' { readonly document: NotebookDocument; } + interface NotebookDocumentEditEvent { + + /** + * The document that the edit is for. + */ + readonly document: NotebookDocument; + + /** + * Undo the edit operation. + * + * This is invoked by VS Code when the user undoes this edit. To implement `undo`, your + * extension should restore the document and editor to the state they were in just before this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + undo(): Thenable | void; + + /** + * Redo the edit operation. + * + * This is invoked by VS Code when the user redoes this edit. To implement `redo`, your + * extension should restore the document and editor to the state they were in just after this + * edit was added to VS Code's internal edit stack by `onDidChangeCustomDocument`. + */ + redo(): Thenable | void; + + /** + * Display name describing the edit. + * + * This will be shown to users in the UI for undo/redo operations. + */ + readonly label?: string; + } + + interface NotebookDocumentBackup { + /** + * Unique identifier for the backup. + * + * This id is passed back to your extension in `openCustomDocument` when opening a custom editor from a backup. + */ + readonly id: string; + + /** + * Delete the current backup. + * + * This is called by VS Code when it is clear the current backup is no longer needed, such as when a new backup + * is made or when the file is saved. + */ + delete(): void; + } + + interface NotebookDocumentBackupContext { + readonly destination: Uri; + } + + interface NotebookDocumentOpenContext { + readonly backupId?: string; + } + export interface NotebookContentProvider { - openNotebook(uri: Uri): NotebookData | Promise; + openNotebook(uri: Uri, openContext: NotebookDocumentOpenContext): NotebookData | Promise; + resolveNotebook(document: NotebookDocument, webview: { + /** + * Fired when the output hosting webview posts a message. + */ + readonly onDidReceiveMessage: Event; + /** + * Post a message to the output hosting webview. + * + * Messages are only delivered if the editor is live. + * + * @param message Body of the message. This must be a string or other json serilizable object. + */ + postMessage(message: any): Thenable; + + /** + * Convert a uri for the local file system to one that can be used inside outputs webview. + */ + asWebviewUri(localResource: Uri): Uri; + }): Promise; saveNotebook(document: NotebookDocument, cancellation: CancellationToken): Promise; saveNotebookAs(targetResource: Uri, document: NotebookDocument, cancellation: CancellationToken): Promise; - readonly onDidChangeNotebook: Event; - - // revert?(document: NotebookDocument, cancellation: CancellationToken): Thenable; - // backup?(document: NotebookDocument, cancellation: CancellationToken): Thenable; + readonly onDidChangeNotebook: Event; + backupNotebook(document: NotebookDocument, context: NotebookDocumentBackupContext, cancellation: CancellationToken): Promise; kernel?: NotebookKernel; } @@ -1942,12 +1726,15 @@ declare module 'vscode' { export const onDidOpenNotebookDocument: Event; export const onDidCloseNotebookDocument: Event; + + /** + * All currently known notebook documents. + */ + export const notebookDocuments: ReadonlyArray; + export let visibleNotebookEditors: NotebookEditor[]; export const onDidChangeVisibleNotebookEditors: Event; - // remove activeNotebookDocument, now that there is activeNotebookEditor.document - export let activeNotebookDocument: NotebookDocument | undefined; - export let activeNotebookEditor: NotebookEditor | undefined; export const onDidChangeActiveNotebookEditor: Event; export const onDidChangeNotebookCells: Event; @@ -1965,43 +1752,6 @@ declare module 'vscode' { //#endregion - //#region @connor4312 extension mode: https://github.com/microsoft/vscode/issues/95926 - - /** - * The ExtensionMode is provided on the `ExtensionContext` and indicates the - * mode the specific extension is running in. - */ - export enum ExtensionMode { - /** - * The extension is installed normally (for example, from the marketplace - * or VSIX) in VS Code. - */ - Release = 1, - - /** - * The extension is running from an `--extensionDevelopmentPath` provided - * when launching VS Code. - */ - Development = 2, - - /** - * The extension is running from an `--extensionDevelopmentPath` and - * the extension host is running unit tests. - */ - Test = 3, - } - - export interface ExtensionContext { - /** - * The mode the extension is running in. This is specific to the current - * extension. One extension may be in `ExtensionMode.Development` while - * other extensions in the host run in `ExtensionMode.Release`. - */ - readonly extensionMode: ExtensionMode; - } - - //#endregion - //#region https://github.com/microsoft/vscode/issues/39441 export interface CompletionItem { diff --git a/src/vs/workbench/api/browser/extensionHost.contribution.ts b/src/vs/workbench/api/browser/extensionHost.contribution.ts index acc276d30e..7459bd585f 100644 --- a/src/vs/workbench/api/browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/browser/extensionHost.contribution.ts @@ -41,6 +41,7 @@ import './mainThreadMessageService'; import './mainThreadOutputService'; import './mainThreadProgress'; import './mainThreadQuickOpen'; +import './mainThreadRemoteConnectionData'; import './mainThreadSaveParticipant'; import './mainThreadSCM'; import './mainThreadSearch'; diff --git a/src/vs/workbench/api/browser/mainThreadAuthentication.ts b/src/vs/workbench/api/browser/mainThreadAuthentication.ts index 227cb84ee5..cdaf6a2a70 100644 --- a/src/vs/workbench/api/browser/mainThreadAuthentication.ts +++ b/src/vs/workbench/api/browser/mainThreadAuthentication.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable } from 'vs/base/common/lifecycle'; import * as modes from 'vs/editor/common/modes'; import * as nls from 'vs/nls'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @@ -12,15 +12,13 @@ import { ExtHostAuthenticationShape, ExtHostContext, IExtHostContext, MainContex import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import Severity from 'vs/base/common/severity'; -import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { fromNow } from 'vs/base/common/date'; -const VSO_ALLOWED_EXTENSIONS = ['github.vscode-pull-request-github', 'github.vscode-pull-request-github-insiders', 'vscode.git']; +const VSO_ALLOWED_EXTENSIONS = ['github.vscode-pull-request-github', 'github.vscode-pull-request-github-insiders', 'vscode.git', 'ms-vsonline.vsonline']; interface IAccountUsage { extensionId: string; @@ -71,7 +69,6 @@ function addAccountUsage(storageService: IStorageService, providerId: string, ac } export class MainThreadAuthenticationProvider extends Disposable { - private _sessionMenuItems = new Map(); private _accounts = new Map(); // Map account name to session ids private _sessions = new Map(); // Map account id to name @@ -82,7 +79,9 @@ export class MainThreadAuthenticationProvider extends Disposable { public readonly supportsMultipleAccounts: boolean, private readonly notificationService: INotificationService, private readonly storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, - private readonly storageService: IStorageService + private readonly storageService: IStorageService, + private readonly quickInputService: IQuickInputService, + private readonly dialogService: IDialogService ) { super(); } @@ -95,11 +94,11 @@ export class MainThreadAuthenticationProvider extends Disposable { return !!this._sessions.size; } - private manageTrustedExtensions(quickInputService: IQuickInputService, storageService: IStorageService, accountName: string) { - const quickPick = quickInputService.createQuickPick<{ label: string, description: string, extension: AllowedExtension }>(); + public manageTrustedExtensions(accountName: string) { + const quickPick = this.quickInputService.createQuickPick<{ label: string, description: string, extension: AllowedExtension }>(); quickPick.canSelectMany = true; - const allowedExtensions = readAllowedExtensions(storageService, this.id, accountName); - const usages = readAccountUsages(storageService, this.id, accountName); + const allowedExtensions = readAllowedExtensions(this.storageService, this.id, accountName); + const usages = readAccountUsages(this.storageService, this.id, accountName); const items = allowedExtensions.map(extension => { const usage = usages.find(usage => extension.id === usage.extensionId); return { @@ -118,7 +117,7 @@ export class MainThreadAuthenticationProvider extends Disposable { quickPick.onDidAccept(() => { const updatedAllowedList = quickPick.selectedItems.map(item => item.extension); - storageService.store(`${this.id}-${accountName}`, JSON.stringify(updatedAllowedList), StorageScope.GLOBAL); + this.storageService.store(`${this.id}-${accountName}`, JSON.stringify(updatedAllowedList), StorageScope.GLOBAL); quickPick.dispose(); }); @@ -146,69 +145,23 @@ export class MainThreadAuthenticationProvider extends Disposable { this._accounts.set(session.account.displayName, [session.id]); } - const menuItem = MenuRegistry.appendMenuItem(MenuId.AccountsContext, { - group: '1_accounts', - command: { - id: `configureSessions${session.id}`, - title: `${session.account.displayName} (${this.displayName})` - }, - order: 3 - }); - this.storageKeysSyncRegistryService.registerStorageKey({ key: `${this.id}-${session.account.displayName}`, version: 1 }); - - const manageCommand = CommandsRegistry.registerCommand({ - id: `configureSessions${session.id}`, - handler: (accessor, args) => { - const quickInputService = accessor.get(IQuickInputService); - const storageService = accessor.get(IStorageService); - const dialogService = accessor.get(IDialogService); - - const quickPick = quickInputService.createQuickPick(); - const manage = nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"); - const signOut = nls.localize('signOut', "Sign Out"); - const items = ([{ label: manage }, { label: signOut }]); - - quickPick.items = items; - - quickPick.onDidAccept(e => { - const selected = quickPick.selectedItems[0]; - if (selected.label === signOut) { - this.signOut(dialogService, session); - } - - if (selected.label === manage) { - this.manageTrustedExtensions(quickInputService, storageService, session.account.displayName); - } - - quickPick.dispose(); - }); - - quickPick.onDidHide(_ => { - quickPick.dispose(); - }); - - quickPick.show(); - }, - }); - - this._sessionMenuItems.set(session.account.displayName, [menuItem, manageCommand]); } - async signOut(dialogService: IDialogService, session: modes.AuthenticationSession): Promise { - const accountUsages = readAccountUsages(this.storageService, this.id, session.account.displayName); - const sessionsForAccount = this._accounts.get(session.account.displayName); + async signOut(accountName: string): Promise { + const accountUsages = readAccountUsages(this.storageService, this.id, accountName); + const sessionsForAccount = this._accounts.get(accountName); - const result = await dialogService.confirm({ - title: nls.localize('signOutConfirm', "Sign out of {0}", session.account.displayName), + const result = await this.dialogService.confirm({ + title: nls.localize('signOutConfirm', "Sign out of {0}", accountName), message: accountUsages.length - ? nls.localize('signOutMessagve', "The account {0} has been used by: \n\n{1}\n\n Sign out of these features?", session.account.displayName, accountUsages.map(usage => usage.extensionName).join('\n')) - : nls.localize('signOutMessageSimple', "Sign out of {0}?", session.account.displayName) + ? nls.localize('signOutMessagve', "The account {0} has been used by: \n\n{1}\n\n Sign out of these features?", accountName, accountUsages.map(usage => usage.extensionName).join('\n')) + : nls.localize('signOutMessageSimple', "Sign out of {0}?", accountName) }); if (result.confirmed) { sessionsForAccount?.forEach(sessionId => this.logout(sessionId)); - removeAccountUsage(this.storageService, this.id, session.account.displayName); + removeAccountUsage(this.storageService, this.id, accountName); } } @@ -230,11 +183,6 @@ export class MainThreadAuthenticationProvider extends Disposable { sessionsForAccount.splice(sessionIndex); if (!sessionsForAccount.length) { - const disposeables = this._sessionMenuItems.get(accountName); - if (disposeables) { - disposeables.forEach(disposeable => disposeable.dispose()); - this._sessionMenuItems.delete(accountName); - } this._accounts.delete(accountName); } } @@ -251,12 +199,6 @@ export class MainThreadAuthenticationProvider extends Disposable { await this._proxy.$logout(this.id, sessionId); this.notificationService.info(nls.localize('signedOut', "Successfully signed out.")); } - - dispose(): void { - super.dispose(); - this._sessionMenuItems.forEach(item => item.forEach(d => d.dispose())); - this._sessionMenuItems.clear(); - } } @extHostNamedCustomer(MainContext.MainThreadAuthentication) @@ -294,7 +236,7 @@ export class MainThreadAuthentication extends Disposable implements MainThreadAu } async $registerAuthenticationProvider(id: string, displayName: string, supportsMultipleAccounts: boolean): Promise { - const provider = new MainThreadAuthenticationProvider(this._proxy, id, displayName, supportsMultipleAccounts, this.notificationService, this.storageKeysSyncRegistryService, this.storageService); + const provider = new MainThreadAuthenticationProvider(this._proxy, id, displayName, supportsMultipleAccounts, this.notificationService, this.storageKeysSyncRegistryService, this.storageService, this.quickInputService, this.dialogService); await provider.initialize(); this.authenticationService.registerAuthenticationProvider(id, provider); } diff --git a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts index 2b66450d8f..35d3608dc5 100644 --- a/src/vs/workbench/api/browser/mainThreadCodeInsets.ts +++ b/src/vs/workbench/api/browser/mainThreadCodeInsets.ts @@ -135,7 +135,7 @@ export class MainThreadEditorInsets implements MainThreadEditorInsetsShape { async $postMessage(handle: number, value: any): Promise { const inset = this.getInset(handle); - inset.webview.sendMessage(value); + inset.webview.postMessage(value); return true; } diff --git a/src/vs/workbench/api/browser/mainThreadCommands.ts b/src/vs/workbench/api/browser/mainThreadCommands.ts index 760bad0ead..128238a45b 100644 --- a/src/vs/workbench/api/browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/browser/mainThreadCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ICommandService, CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; -import { IDisposable } from 'vs/base/common/lifecycle'; +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 { revive } from 'vs/base/common/marshalling'; @@ -28,7 +28,7 @@ export class MainThreadCommands implements MainThreadCommandsShape { } dispose() { - this._commandRegistrations.forEach(value => value.dispose()); + dispose(this._commandRegistrations.values()); this._commandRegistrations.clear(); this._generateCommandsDocumentationRegistration.dispose(); diff --git a/src/vs/workbench/api/browser/mainThreadComments.ts b/src/vs/workbench/api/browser/mainThreadComments.ts index 2858a5784a..89e9d78961 100644 --- a/src/vs/workbench/api/browser/mainThreadComments.ts +++ b/src/vs/workbench/api/browser/mainThreadComments.ts @@ -21,6 +21,7 @@ import { COMMENTS_VIEW_ID, COMMENTS_VIEW_TITLE } from 'vs/workbench/contrib/comm import { ViewContainer, IViewContainersRegistry, Extensions as ViewExtensions, ViewContainerLocation, IViewsRegistry, IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; +import { Codicon } from 'vs/base/common/codicons'; export class MainThreadCommentThread implements modes.CommentThread { @@ -458,6 +459,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments ctorDescriptor: new SyncDescriptor(ViewPaneContainer, [COMMENTS_VIEW_ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }]), storageId: COMMENTS_VIEW_TITLE, hideIfEmpty: true, + icon: Codicon.commentDiscussion.classNames, order: 10, }, ViewContainerLocation.Panel); @@ -467,6 +469,7 @@ export class MainThreadComments extends Disposable implements MainThreadComments canToggleVisibility: false, ctorDescriptor: new SyncDescriptor(CommentsPanel), canMoveView: true, + containerIcon: Codicon.commentDiscussion.classNames, focusCommand: { id: 'workbench.action.focusCommentsPanel' } diff --git a/src/vs/workbench/api/browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts index a5d9a748ab..5115ee9a3c 100644 --- a/src/vs/workbench/api/browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -229,7 +229,7 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb const folderUri = folder ? uri.revive(folder) : undefined; const launch = this.debugService.getConfigurationManager().getLaunch(folderUri); const debugOptions: IDebugSessionOptions = { - noDebug: false, + noDebug: options.noDebug, parentSession: this.getSession(options.parentSessionID), repl: options.repl }; diff --git a/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts index 97c5c72055..dbc0d086f5 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { onUnexpectedError } from 'vs/base/common/errors'; -import { IDisposable } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; @@ -35,8 +35,8 @@ export class MainThreadDocumentContentProviders implements MainThreadDocumentCon } dispose(): void { - this._resourceContentProvider.forEach(p => p.dispose()); - this._pendingUpdate.forEach(source => source.dispose()); + dispose(this._resourceContentProvider.values()); + dispose(this._pendingUpdate.values()); } $registerTextContentProvider(handle: number, scheme: string): void { diff --git a/src/vs/workbench/api/browser/mainThreadDocuments.ts b/src/vs/workbench/api/browser/mainThreadDocuments.ts index 3cfc371bb9..7abb72fbeb 100644 --- a/src/vs/workbench/api/browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/browser/mainThreadDocuments.ts @@ -16,7 +16,7 @@ import { ExtHostContext, ExtHostDocumentsShape, IExtHostContext, MainThreadDocum import { ITextEditorModel } from 'vs/workbench/common/editor'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { toLocalResource, isEqualOrParent, extUri } from 'vs/base/common/resources'; +import { toLocalResource, extUri, IExtUri } from 'vs/base/common/resources'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; @@ -26,8 +26,9 @@ export class BoundModelReferenceCollection { private _length = 0; constructor( + private readonly _extUri: IExtUri, private readonly _maxAge: number = 1000 * 60 * 3, - private readonly _maxLength: number = 1024 * 1024 * 80 + private readonly _maxLength: number = 1024 * 1024 * 80, ) { // } @@ -38,7 +39,7 @@ export class BoundModelReferenceCollection { remove(uri: URI): void { for (const entry of [...this._data] /* copy array because dispose will modify it */) { - if (isEqualOrParent(entry.uri, uri)) { + if (this._extUri.isEqualOrParent(entry.uri, uri)) { entry.dispose(); } } @@ -85,7 +86,7 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { private _modelToDisposeMap: { [modelUrl: string]: IDisposable; }; private readonly _proxy: ExtHostDocumentsShape; private readonly _modelIsSynced = new Set(); - private readonly _modelReferenceCollection = new BoundModelReferenceCollection(); + private readonly _modelReferenceCollection: BoundModelReferenceCollection; constructor( documentsAndEditors: MainThreadDocumentsAndEditors, @@ -105,11 +106,12 @@ export class MainThreadDocuments implements MainThreadDocumentsShape { this._environmentService = environmentService; this._uriIdentityService = uriIdentityService; + this._modelReferenceCollection = this._toDispose.add(new BoundModelReferenceCollection(uriIdentityService.extUri)); + this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocuments); this._toDispose.add(documentsAndEditors.onDocumentAdd(models => models.forEach(this._onModelAdded, this))); this._toDispose.add(documentsAndEditors.onDocumentRemove(urls => urls.forEach(this._onModelRemoved, this))); - this._toDispose.add(this._modelReferenceCollection); this._toDispose.add(modelService.onModelModeChanged(this._onModelModeChanged, this)); this._toDispose.add(textFileService.files.onDidSave(e => { diff --git a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts index 10056c6e22..72becbd8ad 100644 --- a/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentsAndEditors.ts @@ -29,38 +29,39 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; namespace delta { export function ofSets(before: Set, after: Set): { removed: T[], added: T[] } { const removed: T[] = []; const added: T[] = []; - before.forEach(element => { + for (let element of before) { if (!after.has(element)) { removed.push(element); } - }); - after.forEach(element => { + } + for (let element of after) { if (!before.has(element)) { added.push(element); } - }); + } return { removed, added }; } export function ofMaps(before: Map, after: Map): { removed: V[], added: V[] } { const removed: V[] = []; const added: V[] = []; - before.forEach((value, index) => { + for (let [index, value] of before) { if (!after.has(index)) { removed.push(value); } - }); - after.forEach((value, index) => { + } + for (let [index, value] of after) { if (!before.has(index)) { added.push(value); } - }); + } return { removed, added }; } } @@ -265,11 +266,11 @@ class MainThreadDocumentAndEditorStateComputer { } if (candidate) { - editors.forEach(snapshot => { + for (const snapshot of editors.values()) { if (candidate === snapshot.editor) { activeEditor = snapshot.id; } - }); + } } } @@ -331,6 +332,7 @@ export class MainThreadDocumentsAndEditors { @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService, @IUriIdentityService uriIdentityService: IUriIdentityService, + @IClipboardService private readonly _clipboardService: IClipboardService, ) { this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostDocumentsAndEditors); @@ -365,7 +367,7 @@ export class MainThreadDocumentsAndEditors { // added editors for (const apiEditor of delta.addedEditors) { const mainThreadEditor = new MainThreadTextEditor(apiEditor.id, apiEditor.editor.getModel(), - apiEditor.editor, { onGainedFocus() { }, onLostFocus() { } }, this._modelService); + apiEditor.editor, { onGainedFocus() { }, onLostFocus() { } }, this._modelService, this._clipboardService); this._textEditors.set(apiEditor.id, mainThreadEditor); addedEditors.push(mainThreadEditor); diff --git a/src/vs/workbench/api/browser/mainThreadEditor.ts b/src/vs/workbench/api/browser/mainThreadEditor.ts index c0b29bc055..c3c4f03ffe 100644 --- a/src/vs/workbench/api/browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/browser/mainThreadEditor.ts @@ -17,6 +17,9 @@ import { IApplyEditsOptions, IEditorPropertiesChangeData, IResolvedTextEditorCon 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 { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; export interface IFocusTracker { onGainedFocus(): void; @@ -159,6 +162,7 @@ export class MainThreadTextEditor { private readonly _id: string; private _model: ITextModel; private readonly _modelService: IModelService; + private readonly _clipboardService: IClipboardService; private readonly _modelListeners = new DisposableStore(); private _codeEditor: ICodeEditor | null; private readonly _focusTracker: IFocusTracker; @@ -172,7 +176,8 @@ export class MainThreadTextEditor { model: ITextModel, codeEditor: ICodeEditor, focusTracker: IFocusTracker, - modelService: IModelService + modelService: IModelService, + clipboardService: IClipboardService, ) { this._id = id; this._model = model; @@ -180,6 +185,7 @@ export class MainThreadTextEditor { this._properties = null; this._focusTracker = focusTracker; this._modelService = modelService; + this._clipboardService = clipboardService; this._onPropertiesChanged = new Emitter(); @@ -454,12 +460,23 @@ export class MainThreadTextEditor { return true; } - insertSnippet(template: string, ranges: readonly IRange[], opts: IUndoStopOptions) { + async insertSnippet(template: string, ranges: readonly IRange[], opts: IUndoStopOptions) { - if (!this._codeEditor) { + if (!this._codeEditor || !this._codeEditor.hasModel()) { return false; } + // check if clipboard is required and only iff read it (async) + let clipboardText: string | undefined; + const needsTemplate = SnippetParser.guessNeedsClipboard(template); + if (needsTemplate) { + const state = new EditorState(this._codeEditor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Position); + clipboardText = await this._clipboardService.readText(); + if (!state.validate(this._codeEditor)) { + return false; + } + } + const snippetController = SnippetController2.get(this._codeEditor); // // cancel previous snippet mode @@ -471,7 +488,11 @@ export class MainThreadTextEditor { this._codeEditor.focus(); // make modifications - snippetController.insert(template, { overwriteBefore: 0, overwriteAfter: 0, undoStopBefore: opts.undoStopBefore, undoStopAfter: opts.undoStopAfter }); + snippetController.insert(template, { + overwriteBefore: 0, overwriteAfter: 0, + undoStopBefore: opts.undoStopBefore, undoStopAfter: opts.undoStopAfter, + clipboardText + }); return true; } diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index a2b6bb7513..ef71fc250b 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -125,7 +125,7 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { // preserve pre 1.38 behaviour to not make group active when preserveFocus: true // but make sure to restore the editor to fix https://github.com/microsoft/vscode/issues/79633 activation: options.preserveFocus ? EditorActivation.RESTORE : undefined, - ignoreOverrides: uri?.fsPath?.toLowerCase().endsWith('ipynb') || uri?.fsPath?.toLowerCase().endsWith('sql') ? false : true // {{SQL CARBON EDIT}} + override: uri?.fsPath?.toLowerCase().endsWith('ipynb') || uri?.fsPath?.toLowerCase().endsWith('sql') ? undefined : false // {{SQL CARBON EDIT}} }; const input: IResourceEditorInput = { @@ -306,7 +306,7 @@ CommandsRegistry.registerCommand('_workbench.openWith', (accessor: ServicesAcces const [resource, id, options, position] = args; const group = editorGroupsService.getGroup(viewColumnToEditorGroup(editorGroupsService, position)) ?? editorGroupsService.activeGroup; - const textOptions = options ? { ...options, ignoreOverrides: true } : { ignoreOverrides: true }; + const textOptions: ITextEditorOptions = options ? { ...options, override: false } : { override: false }; const input = editorService.createEditorInput({ resource }); return openEditorWith(input, id, textOptions, group, editorService, configurationService, quickInputService); diff --git a/src/vs/workbench/api/browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts index 58ff9f79a3..6ed0a49032 100644 --- a/src/vs/workbench/api/browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -25,7 +25,7 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } dispose(): void { - this._fileProvider.forEach(value => value.dispose()); + dispose(this._fileProvider.values()); this._fileProvider.clear(); } diff --git a/src/vs/workbench/api/browser/mainThreadNotebook.ts b/src/vs/workbench/api/browser/mainThreadNotebook.ts index fbd496e2d1..3fb138afb6 100644 --- a/src/vs/workbench/api/browser/mainThreadNotebook.ts +++ b/src/vs/workbench/api/browser/mainThreadNotebook.ts @@ -3,6 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as nls from 'vs/nls'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { MainContext, MainThreadNotebookShape, NotebookExtensionDescription, IExtHostContext, ExtHostNotebookShape, ExtHostContext, INotebookDocumentsAndEditorsDelta, INotebookModelAddedData } from '../common/extHost.protocol'; import { Disposable, IDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; @@ -17,6 +18,8 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IRelativePattern } from 'vs/base/common/glob'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IUndoRedoService, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; export class MainThreadNotebookDocument extends Disposable { private _textModel: NotebookTextModel; @@ -29,11 +32,15 @@ export class MainThreadNotebookDocument extends Disposable { private readonly _proxy: ExtHostNotebookShape, public handle: number, public viewType: string, + public supportBackup: boolean, public uri: URI, - readonly notebookService: INotebookService + @INotebookService readonly notebookService: INotebookService, + @IUndoRedoService readonly undoRedoService: IUndoRedoService + ) { super(); - this._textModel = new NotebookTextModel(handle, viewType, uri); + + this._textModel = new NotebookTextModel(handle, viewType, supportBackup, uri); this._register(this._textModel.onDidModelChangeProxy(e => { this._proxy.$acceptModelChanged(this.uri, e); this._proxy.$acceptEditorPropertiesChanged(uri, { selections: { selections: this._textModel.selections }, metadata: null }); @@ -44,7 +51,7 @@ export class MainThreadNotebookDocument extends Disposable { })); } - async applyEdit(modelVersionId: number, edits: ICellEditOperation[]): Promise { + async applyEdit(modelVersionId: number, edits: ICellEditOperation[], emitToExtHost: boolean): Promise { await this.notebookService.transformEditsOutputs(this.textModel, edits); return this._textModel.$applyEdit(modelVersionId, edits); } @@ -53,6 +60,22 @@ export class MainThreadNotebookDocument extends Disposable { await this.notebookService.transformSpliceOutputs(this.textModel, splices); this._textModel.$spliceNotebookCellOutputs(cellHandle, splices); } + + handleEdit(editId: number, label: string | undefined): void { + this.undoRedoService.pushElement({ + type: UndoRedoElementType.Resource, + resource: this._textModel.uri, + label: label ?? nls.localize('defaultEditLabel', "Edit"), + undo: async () => { + await this._proxy.$undoNotebook(this._textModel.viewType, this._textModel.uri, editId, this._textModel.isDirty); + }, + redo: async () => { + await this._proxy.$redoNotebook(this._textModel.viewType, this._textModel.uri, editId, this._textModel.isDirty); + }, + }); + this._textModel.setDirty(true); + } + dispose() { this._textModel.dispose(); super.dispose(); @@ -60,6 +83,22 @@ export class MainThreadNotebookDocument extends Disposable { } class DocumentAndEditorState { + static ofSets(before: Set, after: Set): { removed: T[], added: T[] } { + const removed: T[] = []; + const added: T[] = []; + before.forEach(element => { + if (!after.has(element)) { + removed.push(element); + } + }); + after.forEach(element => { + if (!before.has(element)) { + added.push(element); + } + }); + return { removed, added }; + } + static ofMaps(before: Map, after: Map): { removed: V[], added: V[] } { const removed: V[] = []; const added: V[] = []; @@ -86,15 +125,16 @@ class DocumentAndEditorState { return { addedDocuments: [], - addedEditors: apiEditors + addedEditors: apiEditors, + visibleEditors: [...after.visibleEditors].map(editor => editor[0]) }; } - // const documentDelta = delta.ofSets(before.documents, after.documents); + const documentDelta = DocumentAndEditorState.ofSets(before.documents, after.documents); const editorDelta = DocumentAndEditorState.ofMaps(before.textEditors, after.textEditors); const addedAPIEditors = editorDelta.added.map(add => ({ id: add.getId(), documentUri: add.uri!, - selections: add.textModel!.selections + selections: add.textModel!.selections || [] })); const removedAPIEditors = editorDelta.removed.map(removed => removed.getId()); @@ -102,17 +142,46 @@ class DocumentAndEditorState { // const oldActiveEditor = before.activeEditor !== after.activeEditor ? before.activeEditor : undefined; const newActiveEditor = before.activeEditor !== after.activeEditor ? after.activeEditor : undefined; + const visibleEditorDelta = DocumentAndEditorState.ofMaps(before.visibleEditors, after.visibleEditors); + return { + addedDocuments: documentDelta.added.map(e => { + return { + viewType: e.viewType, + handle: e.handle, + uri: e.uri, + metadata: e.metadata, + versionId: e.versionId, + cells: e.cells.map(cell => ({ + handle: cell.handle, + uri: cell.uri, + source: cell.textBuffer.getLinesContent(), + language: cell.language, + cellKind: cell.cellKind, + outputs: cell.outputs, + metadata: cell.metadata + })), + // attachedEditor: editorId ? { + // id: editorId, + // selections: document.textModel.selections + // } : undefined + }; + }), + removedDocuments: documentDelta.removed.map(e => e.uri), addedEditors: addedAPIEditors, removedEditors: removedAPIEditors, - newActiveEditor: newActiveEditor + newActiveEditor: newActiveEditor, + visibleEditors: visibleEditorDelta.added.length === 0 && visibleEditorDelta.removed.length === 0 + ? undefined + : [...after.visibleEditors].map(editor => editor[0]) }; } constructor( - readonly documents: Set, + readonly documents: Set, readonly textEditors: Map, readonly activeEditor: string | null | undefined, + readonly visibleEditors: Map ) { // } @@ -132,7 +201,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo @INotebookService private _notebookService: INotebookService, @IConfigurationService private readonly configurationService: IConfigurationService, @IEditorService private readonly editorService: IEditorService, - @IAccessibilityService private readonly accessibilityService: IAccessibilityService + @IAccessibilityService private readonly accessibilityService: IAccessibilityService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); @@ -150,29 +220,77 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo return false; } + private _isDeltaEmpty(delta: INotebookDocumentsAndEditorsDelta) { + if (delta.addedDocuments !== undefined && delta.addedDocuments.length > 0) { + return false; + } + + if (delta.removedDocuments !== undefined && delta.removedDocuments.length > 0) { + return false; + } + + if (delta.addedEditors !== undefined && delta.addedEditors.length > 0) { + return false; + } + + if (delta.removedEditors !== undefined && delta.removedEditors.length > 0) { + return false; + } + + if (delta.visibleEditors !== undefined && delta.visibleEditors.length > 0) { + return false; + } + + if (delta.newActiveEditor !== undefined) { + return false; + } + + return true; + } + + private _emitDelta(delta: INotebookDocumentsAndEditorsDelta) { + if (this._isDeltaEmpty(delta)) { + return; + } + + this._proxy.$acceptDocumentAndEditorsDelta(delta); + } + registerListeners() { this._notebookService.listNotebookEditors().forEach((e) => { this._addNotebookEditor(e); }); this._register(this._notebookService.onDidChangeActiveEditor(e => { - this._proxy.$acceptDocumentAndEditorsDelta({ - newActiveEditor: e - }); + this._updateState(); })); this._register(this._notebookService.onDidChangeVisibleEditors(e => { - this._proxy.$acceptDocumentAndEditorsDelta({ - visibleEditors: e - }); + if (this._notebookProviders.size > 0) { + if (!this._currentState) { + // no current state means we didn't even create editors in ext host yet. + return; + } + + // we can't simply update visibleEditors as we need to check if we should create editors first. + this._updateState(); + } })); this._register(this._notebookService.onNotebookEditorAdd(editor => { this._addNotebookEditor(editor); })); - this._register(this._notebookService.onNotebookEditorRemove(editor => { - this._removeNotebookEditor(editor); + this._register(this._notebookService.onNotebookEditorsRemove(editors => { + this._removeNotebookEditor(editors); + })); + + this._register(this._notebookService.onNotebookDocumentAdd(() => { + this._updateState(); + })); + + this._register(this._notebookService.onNotebookDocumentRemove(() => { + this._updateState(); })); const updateOrder = () => { @@ -201,9 +319,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo } async addNotebookDocument(data: INotebookModelAddedData) { - await this._proxy.$acceptDocumentAndEditorsDelta({ - addedDocuments: [data] - }); + this._updateState(); } private _addNotebookEditor(e: IEditor) { @@ -219,39 +335,58 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo this._updateState(notebookEditor); } - private _removeNotebookEditor(e: IEditor) { - const sub = this._toDisposeOnEditorRemove.get(e.getId()); - if (sub) { - this._toDisposeOnEditorRemove.delete(e.getId()); - sub.dispose(); - this._updateState(); - } + private _removeNotebookEditor(editors: IEditor[]) { + editors.forEach(e => { + const sub = this._toDisposeOnEditorRemove.get(e.getId()); + if (sub) { + this._toDisposeOnEditorRemove.delete(e.getId()); + sub.dispose(); + } + }); + + this._updateState(); } private async _updateState(focusedNotebookEditor?: IEditor) { - const documents = new Set(); - this._notebookService.listNotebookDocuments().forEach(document => { - documents.add(document.uri); - }); - - const editors = new Map(); let activeEditor: string | null = null; - for (const editor of this._notebookService.listNotebookEditors()) { - if (editor.hasModel()) { - editors.set(editor.getId(), editor); - if (editor.hasFocus()) { - activeEditor = editor.getId(); - } - } + const activeEditorPane = this.editorService.activeEditorPane as any | undefined; + if (activeEditorPane?.isNotebookEditor) { + const notebookEditor = (activeEditorPane.getControl() as INotebookEditor); + activeEditor = notebookEditor && notebookEditor.hasModel() ? notebookEditor!.getId() : null; } - if (!activeEditor && focusedNotebookEditor) { + const documentEditorsMap = new Map(); + + const editors = new Map(); + this._notebookService.listNotebookEditors().forEach(editor => { + if (editor.hasModel()) { + editors.set(editor.getId(), editor); + documentEditorsMap.set(editor.textModel!.uri.toString(), editor); + } + }); + + const visibleEditorsMap = new Map(); + this.editorService.visibleEditorPanes.forEach(editor => { + if ((editor as any).isNotebookEditor) { + const nbEditorWidget = (editor as any).getControl() as INotebookEditor; + if (nbEditorWidget && editors.has(nbEditorWidget.getId())) { + visibleEditorsMap.set(nbEditorWidget.getId(), nbEditorWidget); + } + } + }); + + const documents = new Set(); + this._notebookService.listNotebookDocuments().forEach(document => { + documents.add(document); + }); + + if (!activeEditor && focusedNotebookEditor && focusedNotebookEditor.hasModel()) { activeEditor = focusedNotebookEditor.getId(); } // editors always have view model attached, which means there is already a document in exthost. - const newState = new DocumentAndEditorState(documents, editors, activeEditor); + const newState = new DocumentAndEditorState(documents, editors, activeEditor, visibleEditorsMap); const delta = DocumentAndEditorState.compute(this._currentState, newState); // const isEmptyChange = (!delta.addedDocuments || delta.addedDocuments.length === 0) // && (!delta.removedDocuments || delta.removedDocuments.length === 0) @@ -261,7 +396,7 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo // if (!isEmptyChange) { this._currentState = newState; - await this._proxy.$acceptDocumentAndEditorsDelta(delta); + await this._emitDelta(delta); // } } @@ -275,8 +410,8 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo this._notebookService.unregisterNotebookRenderer(id); } - async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, kernel: INotebookKernelInfoDto | undefined): Promise { - let controller = new MainThreadNotebookController(this._proxy, this, viewType, kernel, this._notebookService); + async $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, supportBackup: boolean, kernel: INotebookKernelInfoDto | undefined): Promise { + let controller = new MainThreadNotebookController(this._proxy, this, viewType, supportBackup, kernel, this._notebookService, this._instantiationService); this._notebookProviders.set(viewType, controller); this._notebookService.registerNotebookController(viewType, extension, controller); return; @@ -355,6 +490,16 @@ export class MainThreadNotebooks extends Disposable implements MainThreadNoteboo return false; } + + $onDidEdit(resource: UriComponents, viewType: string, editId: number, label: string | undefined): void { + let controller = this._notebookProviders.get(viewType); + controller?.handleEdit(resource, editId, label); + } + + $onContentChange(resource: UriComponents, viewType: string): void { + let controller = this._notebookProviders.get(viewType); + controller?.handleNotebookChange(resource); + } } export class MainThreadNotebookController implements IMainNotebookController { @@ -365,13 +510,15 @@ export class MainThreadNotebookController implements IMainNotebookController { private readonly _proxy: ExtHostNotebookShape, private _mainThreadNotebook: MainThreadNotebooks, private _viewType: string, + private _supportBackup: boolean, readonly kernel: INotebookKernelInfoDto | undefined, readonly notebookService: INotebookService, + readonly _instantiationService: IInstantiationService ) { } - async createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string): Promise { + async createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string, backupId?: string): Promise { let mainthreadNotebook = this._mapping.get(URI.from(uri).toString()); if (mainthreadNotebook) { @@ -383,15 +530,15 @@ export class MainThreadNotebookController implements IMainNotebookController { mainthreadNotebook.textModel.languages = data.languages; mainthreadNotebook.textModel.metadata = data.metadata; - mainthreadNotebook.textModel.$applyEdit(mainthreadNotebook.textModel.versionId, [ + await mainthreadNotebook.applyEdit(mainthreadNotebook.textModel.versionId, [ { editType: CellEditType.Delete, count: mainthreadNotebook.textModel.cells.length, index: 0 }, { editType: CellEditType.Insert, index: 0, cells: data.cells } - ]); + ], true); } return mainthreadNotebook.textModel; } - let document = new MainThreadNotebookDocument(this._proxy, MainThreadNotebookController.documentHandle++, viewType, uri, this.notebookService); + let document = this._instantiationService.createInstance(MainThreadNotebookDocument, this._proxy, MainThreadNotebookController.documentHandle++, viewType, this._supportBackup, uri); this._mapping.set(document.uri.toString(), document); if (backup) { @@ -399,14 +546,16 @@ export class MainThreadNotebookController implements IMainNotebookController { document.textModel.metadata = backup.metadata; document.textModel.languages = backup.languages; - document.textModel.$applyEdit(document.textModel.versionId, [ + // restored from backup, update the text model without emitting any event to exthost + await document.applyEdit(document.textModel.versionId, [ { editType: CellEditType.Insert, index: 0, cells: backup.cells || [] } - ]); + ], false); + // create document in ext host with cells data await this._mainThreadNotebook.addNotebookDocument({ viewType: document.viewType, handle: document.handle, @@ -432,7 +581,7 @@ export class MainThreadNotebookController implements IMainNotebookController { } // open notebook document - const data = await this._proxy.$resolveNotebookData(viewType, uri); + const data = await this._proxy.$resolveNotebookData(viewType, uri, backupId); if (!data) { return undefined; // {{SQL CARBON EDIT}} } @@ -473,11 +622,15 @@ export class MainThreadNotebookController implements IMainNotebookController { return document.textModel; } + async resolveNotebookEditor(viewType: string, uri: URI, editorId: string) { + await this._proxy.$resolveNotebookEditor(viewType, uri, editorId); + } + async tryApplyEdits(resource: UriComponents, modelVersionId: number, edits: ICellEditOperation[], renderers: number[]): Promise { let mainthreadNotebook = this._mapping.get(URI.from(resource).toString()); if (mainthreadNotebook) { - return await mainthreadNotebook.applyEdit(modelVersionId, edits); + return await mainthreadNotebook.applyEdit(modelVersionId, edits, true); } return false; @@ -503,6 +656,7 @@ export class MainThreadNotebookController implements IMainNotebookController { return; } + // TODO@rebornix, remove cell should use emitDelta as well to ensure document/editor events are sent together await this._proxy.$acceptDocumentAndEditorsDelta({ removedDocuments: [notebook.uri] }); document.dispose(); this._mapping.delete(URI.from(notebook.uri).toString()); @@ -515,6 +669,11 @@ export class MainThreadNotebookController implements IMainNotebookController { document?.textModel.handleUnknownChange(); } + handleEdit(resource: UriComponents, editId: number, label: string | undefined): void { + let document = this._mapping.get(URI.from(resource).toString()); + document?.handleEdit(editId, label); + } + updateLanguages(resource: UriComponents, languages: string[]) { let document = this._mapping.get(URI.from(resource).toString()); document?.textModel.updateLanguages(languages); @@ -540,7 +699,11 @@ export class MainThreadNotebookController implements IMainNotebookController { async saveAs(uri: URI, target: URI, token: CancellationToken): Promise { return this._proxy.$saveNotebookAs(this._viewType, uri, target, token); + } + async backup(uri: URI, token: CancellationToken): Promise { + const backupId = await this._proxy.$backup(this._viewType, uri, token); + return backupId; } } diff --git a/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts b/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts new file mode 100644 index 0000000000..ba279a6be9 --- /dev/null +++ b/src/vs/workbench/api/browser/mainThreadRemoteConnectionData.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. 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 { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; + +@extHostCustomer +export class MainThreadRemoteConnectionData extends Disposable { + + private readonly _proxy: ExtHostExtensionServiceShape; + + constructor( + extHostContext: IExtHostContext, + @IWorkbenchEnvironmentService protected readonly _environmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService + ) { + super(); + this._proxy = extHostContext.getProxy(ExtHostContext.ExtHostExtensionService); + + const remoteAuthority = this._environmentService.configuration.remoteAuthority; + if (remoteAuthority) { + this._register(remoteAuthorityResolverService.onDidChangeConnectionData(() => { + const connectionData = remoteAuthorityResolverService.getConnectionData(remoteAuthority); + if (connectionData) { + this._proxy.$updateRemoteConnectionData(connectionData); + } + })); + } + } +} diff --git a/src/vs/workbench/api/browser/mainThreadSearch.ts b/src/vs/workbench/api/browser/mainThreadSearch.ts index 853ed5c8fa..bd92fff792 100644 --- a/src/vs/workbench/api/browser/mainThreadSearch.ts +++ b/src/vs/workbench/api/browser/mainThreadSearch.ts @@ -5,7 +5,6 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { dispose, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { values } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @@ -139,7 +138,7 @@ class RemoteSearchProvider implements ISearchResultProvider, IDisposable { return Promise.resolve(searchP).then((result: ISearchCompleteStats) => { this._searches.delete(search.id); - return { results: values(search.matches), stats: result.stats, limitHit: result.limitHit }; + return { results: Array.from(search.matches.values()), stats: result.stats, limitHit: result.limitHit }; }, err => { this._searches.delete(search.id); return Promise.reject(err); diff --git a/src/vs/workbench/api/browser/mainThreadStatusBar.ts b/src/vs/workbench/api/browser/mainThreadStatusBar.ts index d705f50a9d..a456c38f0d 100644 --- a/src/vs/workbench/api/browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/browser/mainThreadStatusBar.ts @@ -32,7 +32,7 @@ export class MainThreadStatusBar implements MainThreadStatusBarShape { if (accessibilityInformation) { ariaLabel = accessibilityInformation.label; } else { - ariaLabel = text.indexOf('$(') === -1 ? text : tooltip || text; + ariaLabel = text && text.indexOf('$(') === -1 ? text : tooltip || text; } const entry: IStatusbarEntry = { text, tooltip, command, color, ariaLabel }; diff --git a/src/vs/workbench/api/browser/mainThreadTask.ts b/src/vs/workbench/api/browser/mainThreadTask.ts index 00323c4281..3fce3075c9 100644 --- a/src/vs/workbench/api/browser/mainThreadTask.ts +++ b/src/vs/workbench/api/browser/mainThreadTask.ts @@ -510,41 +510,41 @@ export class MainThreadTask implements MainThreadTaskShape { }); } - public $executeTask(value: TaskHandleDTO | TaskDTO): Promise { - return new Promise((resolve, reject) => { - if (TaskHandleDTO.is(value)) { - const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder)); - if (workspaceFolder) { - this._taskService.getTask(workspaceFolder, value.id, true).then((task: Task | undefined) => { - if (!task) { - reject(new Error('Task not found')); - } else { - this._taskService.run(task).then(undefined, reason => { - // eat the error, it has already been surfaced to the user and we don't care about it here - }); - const result: TaskExecutionDTO = { - id: value.id, - task: TaskDTO.from(task) - }; - resolve(result); - } - }, (_error) => { - reject(new Error('Task not found')); - }); - } else { - reject(new Error('No workspace folder')); + public async $getTaskExecution(value: TaskHandleDTO | TaskDTO): Promise { + if (TaskHandleDTO.is(value)) { + const workspaceFolder = typeof value.workspaceFolder === 'string' ? value.workspaceFolder : this._workspaceContextServer.getWorkspaceFolder(URI.revive(value.workspaceFolder)); + if (workspaceFolder) { + const task = await this._taskService.getTask(workspaceFolder, value.id, true); + if (task) { + return { + id: task._id, + task: TaskDTO.from(task) + }; } + throw new Error('Task not found'); } else { - const task = TaskDTO.to(value, this._workspaceContextServer, true)!; - this._taskService.run(task).then(undefined, reason => { - // eat the error, it has already been surfaced to the user and we don't care about it here - }); - const result: TaskExecutionDTO = { - id: task._id, - task: TaskDTO.from(task) - }; - resolve(result); + throw new Error('No workspace folder'); } + } else { + const task = TaskDTO.to(value, this._workspaceContextServer, true)!; + return { + id: task._id, + task: TaskDTO.from(task) + }; + } + } + + public $executeTask(value: TaskDTO): Promise { + return new Promise((resolve, reject) => { + const task = TaskDTO.to(value, this._workspaceContextServer, true)!; + this._taskService.run(task).then(undefined, reason => { + // eat the error, it has already been surfaced to the user and we don't care about it here + }); + const result: TaskExecutionDTO = { + id: task._id, + task: TaskDTO.from(task) + }; + resolve(result); }); } diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 53f17b3491..d0d7349eb8 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -22,8 +22,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _remoteAuthority: string | null; private readonly _toDispose = new DisposableStore(); - private readonly _terminalProcesses = new Map>(); - private readonly _terminalProcessesReady = new Map void>(); + private readonly _terminalProcessProxies = new Map(); private _dataEventTracker: TerminalDataEventTracker | undefined; private _linkHandler: IDisposable | undefined; @@ -106,7 +105,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape isExtensionTerminal: launchConfig.isExtensionTerminal }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); - this._terminalProcesses.set(terminal.id, new Promise(r => this._terminalProcessesReady.set(terminal.id, r))); return Promise.resolve({ id: terminal.id, name: terminal.title @@ -232,13 +230,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } const proxy = request.proxy; - const ready = this._terminalProcessesReady.get(proxy.terminalId); - if (ready) { - ready(proxy); - this._terminalProcessesReady.delete(proxy.terminalId); - } else { - this._terminalProcesses.set(proxy.terminalId, Promise.resolve(proxy)); - } + this._terminalProcessProxies.set(proxy.terminalId, proxy); const shellLaunchConfigDto: IShellLaunchConfigDto = { name: request.shellLaunchConfig.name, executable: request.shellLaunchConfig.executable, @@ -246,7 +238,16 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape cwd: request.shellLaunchConfig.cwd, env: request.shellLaunchConfig.env }; - this._proxy.$spawnExtHostProcess(proxy.terminalId, shellLaunchConfigDto, request.activeWorkspaceRootUri, request.cols, request.rows, request.isWorkspaceShellAllowed); + + this._proxy.$spawnExtHostProcess( + proxy.terminalId, + shellLaunchConfigDto, + request.activeWorkspaceRootUri, + request.cols, + request.rows, + request.isWorkspaceShellAllowed + ).then(request.callback); + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); proxy.onResize(dimensions => this._proxy.$acceptProcessResize(proxy.terminalId, dimensions.cols, dimensions.rows)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); @@ -257,13 +258,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _onRequestStartExtensionTerminal(request: IStartExtensionTerminalRequest): void { const proxy = request.proxy; - const ready = this._terminalProcessesReady.get(proxy.terminalId); - if (!ready) { - this._terminalProcesses.set(proxy.terminalId, Promise.resolve(proxy)); - } else { - ready(proxy); - this._terminalProcessesReady.delete(proxy.terminalId); - } + this._terminalProcessProxies.set(proxy.terminalId, proxy); // Note that onReisze is not being listened to here as it needs to fire when max dimensions // change, excluding the dimension override @@ -271,7 +266,12 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape columns: request.cols, rows: request.rows } : undefined; - this._proxy.$startExtensionTerminal(proxy.terminalId, initialDimensions); + + this._proxy.$startExtensionTerminal( + proxy.terminalId, + initialDimensions + ).then(request.callback); + proxy.onInput(data => this._proxy.$acceptProcessInput(proxy.terminalId, data)); proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(proxy.terminalId, immediate)); proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(proxy.terminalId)); @@ -280,38 +280,38 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $sendProcessTitle(terminalId: number, title: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitTitle(title)); + this._getTerminalProcess(terminalId).emitTitle(title); } public $sendProcessData(terminalId: number, data: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitData(data)); + this._getTerminalProcess(terminalId).emitData(data); } public $sendProcessReady(terminalId: number, pid: number, cwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitReady(pid, cwd)); + this._getTerminalProcess(terminalId).emitReady(pid, cwd); } public $sendProcessExit(terminalId: number, exitCode: number | undefined): void { - this._getTerminalProcess(terminalId).then(e => e.emitExit(exitCode)); - this._terminalProcesses.delete(terminalId); + this._getTerminalProcess(terminalId).emitExit(exitCode); + this._terminalProcessProxies.delete(terminalId); } public $sendOverrideDimensions(terminalId: number, dimensions: ITerminalDimensions | undefined): void { - this._getTerminalProcess(terminalId).then(e => e.emitOverrideDimensions(dimensions)); + this._getTerminalProcess(terminalId).emitOverrideDimensions(dimensions); } public $sendProcessInitialCwd(terminalId: number, initialCwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitInitialCwd(initialCwd)); + this._getTerminalProcess(terminalId).emitInitialCwd(initialCwd); } public $sendProcessCwd(terminalId: number, cwd: string): void { - this._getTerminalProcess(terminalId).then(e => e.emitCwd(cwd)); + this._getTerminalProcess(terminalId).emitCwd(cwd); } public $sendResolvedLaunchConfig(terminalId: number, shellLaunchConfig: IShellLaunchConfig): void { const instance = this._terminalService.getInstanceFromId(terminalId); if (instance) { - this._getTerminalProcess(terminalId).then(e => e.emitResolvedShellLaunchConfig(shellLaunchConfig)); + this._getTerminalProcess(terminalId).emitResolvedShellLaunchConfig(shellLaunchConfig); } } @@ -324,7 +324,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape sw.stop(); sum += sw.elapsed(); } - this._getTerminalProcess(terminalId).then(e => e.emitLatency(sum / COUNT)); + this._getTerminalProcess(terminalId).emitLatency(sum / COUNT); } private _isPrimaryExtHost(): boolean { @@ -349,8 +349,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } } - private _getTerminalProcess(terminalId: number): Promise { - const terminal = this._terminalProcesses.get(terminalId); + private _getTerminalProcess(terminalId: number): ITerminalProcessExtHostProxy { + const terminal = this._terminalProcessProxies.get(terminalId); if (!terminal) { throw new Error(`Unknown terminal: ${terminalId}`); } diff --git a/src/vs/workbench/api/browser/mainThreadWebview.ts b/src/vs/workbench/api/browser/mainThreadWebview.ts index 7b8126fe31..3e61118bdf 100644 --- a/src/vs/workbench/api/browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/browser/mainThreadWebview.ts @@ -5,7 +5,7 @@ import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { onUnexpectedError } from 'vs/base/common/errors'; +import { onUnexpectedError, isPromiseCanceledError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, DisposableStore, dispose, IDisposable, IReference } from 'vs/base/common/lifecycle'; import { Schemas } from 'vs/base/common/network'; @@ -252,7 +252,7 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma public async $postMessage(handle: extHostProtocol.WebviewPanelHandle, message: any): Promise { const webview = this.getWebviewInput(handle); - webview.webview.sendMessage(message); + webview.webview.postMessage(message); return true; } @@ -280,8 +280,8 @@ export class MainThreadWebviews extends Disposable implements extHostProtocol.Ma if (webviewInput.webview.state) { try { state = JSON.parse(webviewInput.webview.state); - } catch { - // noop + } catch (e) { + console.error('Could not load webview state', e, webviewInput.webview.state); } } @@ -925,7 +925,12 @@ class MainThreadCustomEditorModel extends Disposable implements ICustomEditorMod this._backupId = backupId; } } catch (e) { - // Make sure state has not changed in the meantime + if (isPromiseCanceledError(e)) { + // This is expected + throw e; + } + + // Otherwise it could be a real error. Make sure state has not changed in the meantime. if (this._hotExitState === pendingState) { this._hotExitState = HotExitState.NotAllowed; } diff --git a/src/vs/workbench/api/common/apiCommands.ts b/src/vs/workbench/api/common/apiCommands.ts index 6c2eed648b..c4468df392 100644 --- a/src/vs/workbench/api/common/apiCommands.ts +++ b/src/vs/workbench/api/common/apiCommands.ts @@ -97,12 +97,12 @@ CommandsRegistry.registerCommand({ export class DiffAPICommand { public static readonly ID = 'vscode.diff'; - public static execute(executor: ICommandsExecutor, left: URI, right: URI, label: string, options?: vscode.TextDocumentShowOptions): Promise { + public static execute(executor: ICommandsExecutor, left: URI, right: URI, label: string, options?: typeConverters.TextEditorOpenOptions): Promise { return executor.executeCommand('_workbench.diff', [ left, right, label, undefined, - typeConverters.TextEditorOptions.from(options), + typeConverters.TextEditorOpenOptions.from(options), options ? typeConverters.ViewColumn.from(options.viewColumn) : undefined ]); } @@ -111,7 +111,7 @@ CommandsRegistry.registerCommand(DiffAPICommand.ID, adjustHandler(DiffAPICommand export class OpenAPICommand { public static readonly ID = 'vscode.open'; - public static execute(executor: ICommandsExecutor, resource: URI, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, label?: string): Promise { + public static execute(executor: ICommandsExecutor, resource: URI, columnOrOptions?: vscode.ViewColumn | typeConverters.TextEditorOpenOptions, label?: string): Promise { let options: ITextEditorOptions | undefined; let position: EditorViewColumn | undefined; @@ -119,7 +119,7 @@ export class OpenAPICommand { if (typeof columnOrOptions === 'number') { position = typeConverters.ViewColumn.from(columnOrOptions); } else { - options = typeConverters.TextEditorOptions.from(columnOrOptions); + options = typeConverters.TextEditorOpenOptions.from(columnOrOptions); position = typeConverters.ViewColumn.from(columnOrOptions.viewColumn); } } @@ -136,14 +136,14 @@ CommandsRegistry.registerCommand(OpenAPICommand.ID, adjustHandler(OpenAPICommand export class OpenWithAPICommand { public static readonly ID = 'vscode.openWith'; - public static execute(executor: ICommandsExecutor, resource: URI, viewType: string, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions): Promise { + public static execute(executor: ICommandsExecutor, resource: URI, viewType: string, columnOrOptions?: vscode.ViewColumn | typeConverters.TextEditorOpenOptions): Promise { let options: ITextEditorOptions | undefined; let position: EditorViewColumn | undefined; if (typeof columnOrOptions === 'number') { position = typeConverters.ViewColumn.from(columnOrOptions); } else if (typeof columnOrOptions !== 'undefined') { - options = typeConverters.TextEditorOptions.from(columnOrOptions); + options = typeConverters.TextEditorOpenOptions.from(columnOrOptions); } return executor.executeCommand('_workbench.openWith', [ diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index b77f284849..7585048458 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -93,12 +93,14 @@ const defaultConfigurationExtPoint = ExtensionsRegistry.registerExtensionPoint { diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index e70d1ff8ec..47cb847964 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -135,7 +135,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I const extHostWindow = rpcProtocol.set(ExtHostContext.ExtHostWindow, new ExtHostWindow(rpcProtocol)); const extHostProgress = rpcProtocol.set(ExtHostContext.ExtHostProgress, new ExtHostProgress(rpcProtocol.getProxy(MainContext.MainThreadProgress))); const extHostLabelService = rpcProtocol.set(ExtHostContext.ExtHosLabelService, new ExtHostLabelService(rpcProtocol)); - const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, initData.environment)); + const extHostNotebook = rpcProtocol.set(ExtHostContext.ExtHostNotebook, new ExtHostNotebookController(rpcProtocol, extHostCommands, extHostDocumentsAndEditors, initData.environment, extensionStoragePaths)); const extHostTheming = rpcProtocol.set(ExtHostContext.ExtHostTheming, new ExtHostTheming(rpcProtocol)); const extHostAuthentication = rpcProtocol.set(ExtHostContext.ExtHostAuthentication, new ExtHostAuthentication(rpcProtocol)); const extHostTimeline = rpcProtocol.set(ExtHostContext.ExtHostTimeline, new ExtHostTimeline(rpcProtocol, extHostCommands)); @@ -458,16 +458,12 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I get terminals() { return extHostTerminalService.terminals; }, - showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): Thenable { - let documentPromise: Promise; - if (URI.isUri(documentOrUri)) { - documentPromise = Promise.resolve(workspace.openTextDocument(documentOrUri)); - } else { - documentPromise = Promise.resolve(documentOrUri); - } - return documentPromise.then(document => { - return extHostEditors.showTextDocument(document, columnOrOptions, preserveFocus); - }); + async showTextDocument(documentOrUri: vscode.TextDocument | vscode.Uri, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, preserveFocus?: boolean): Promise { + const document = await (URI.isUri(documentOrUri) + ? Promise.resolve(workspace.openTextDocument(documentOrUri)) + : Promise.resolve(documentOrUri)); + + return extHostEditors.showTextDocument(document, columnOrOptions, preserveFocus); }, createTextEditorDecorationType(options: vscode.DecorationRenderOptions): vscode.TextEditorDecorationType { return extHostEditors.createTextEditorDecorationType(options); @@ -602,11 +598,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I registerWebviewPanelSerializer: (viewType: string, serializer: vscode.WebviewPanelSerializer) => { return extHostWebviews.registerWebviewPanelSerializer(extension, viewType, serializer); }, - registerCustomEditorProvider: (viewType: string, provider: vscode.CustomTextEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions } = {}) => { - return extHostWebviews.registerCustomEditorProvider(extension, viewType, provider, options); - }, - registerCustomEditorProvider2: (viewType: string, provider: vscode.CustomReadonlyEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions, supportsMultipleEditorsPerDocument?: boolean } = {}) => { - checkProposedApiEnabled(extension); + registerCustomEditorProvider: (viewType: string, provider: vscode.CustomTextEditorProvider | vscode.CustomReadonlyEditorProvider, options: { webviewOptions?: vscode.WebviewPanelOptions, supportsMultipleEditorsPerDocument?: boolean } = {}) => { return extHostWebviews.registerCustomEditorProvider(extension, viewType, provider, options); }, registerDecorationProvider(provider: vscode.DecorationProvider) { @@ -946,10 +938,16 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostNotebook.onDidCloseNotebookDocument; }, + get notebookDocuments(): vscode.NotebookDocument[] { + checkProposedApiEnabled(extension); + return extHostNotebook.notebookDocuments; + }, get visibleNotebookEditors() { + checkProposedApiEnabled(extension); return extHostNotebook.visibleNotebookEditors; }, get onDidChangeVisibleNotebookEditors() { + checkProposedApiEnabled(extension); return extHostNotebook.onDidChangeVisibleNotebookEditors; }, registerNotebookContentProvider: (viewType: string, provider: vscode.NotebookContentProvider) => { @@ -964,10 +962,6 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostNotebook.registerNotebookOutputRenderer(type, extension, outputFilter, renderer); }, - get activeNotebookDocument(): vscode.NotebookDocument | undefined { - checkProposedApiEnabled(extension); - return extHostNotebook.activeNotebookDocument; - }, get activeNotebookEditor(): vscode.NotebookEditor | undefined { checkProposedApiEnabled(extension); return extHostNotebook.activeNotebookEditor; diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index e054614824..51c538405c 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -31,7 +31,7 @@ import { 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 { RemoteAuthorityResolverErrorCode, ResolverResult, TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { RemoteAuthorityResolverErrorCode, ResolverResult, TunnelDescription, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import * as statusbar from 'vs/workbench/services/statusbar/common/statusbar'; import { ClassifiedEvent, GDPRClassification, StrictPropertyCheck } from 'vs/platform/telemetry/common/gdprTypings'; import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; @@ -41,7 +41,7 @@ import * as tasks from 'vs/workbench/api/common/shared/tasks'; import { IRevealOptions, ITreeItem } from 'vs/workbench/common/views'; import { IAdapterDescriptor, IConfig, IDebugSessionReplMode } from 'vs/workbench/contrib/debug/common/debug'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; -import { ITerminalDimensions, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalDimensions, IShellLaunchConfig, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId, IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import * as search from 'vs/workbench/services/search/common/search'; @@ -51,7 +51,7 @@ import { TunnelDto } from 'vs/workbench/api/common/extHostTunnelService'; import { TunnelOptions } from 'vs/platform/remote/common/tunnel'; import { Timeline, TimelineChangeEvent, TimelineOptions, TimelineProviderDescriptor, InternalTimelineOptions } from 'vs/workbench/contrib/timeline/common/timeline'; import { revive } from 'vs/base/common/marshalling'; -import { INotebookMimeTypeSelector, IProcessedOutput, INotebookDisplayOrder, NotebookCellMetadata, NotebookDocumentMetadata, ICellEditOperation, NotebookCellsChangedEvent, NotebookDataDto, INotebookKernelInfoDto, IMainCellDto, IOutputRenderRequest, IOutputRenderResponse, IRawOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookMimeTypeSelector, IProcessedOutput, INotebookDisplayOrder, NotebookCellMetadata, NotebookDocumentMetadata, ICellEditOperation, NotebookCellsChangedEvent, NotebookDataDto, INotebookKernelInfoDto, IMainCellDto, IOutputRenderRequest, IOutputRenderResponse } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { CallHierarchyItem } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; import { Dto } from 'vs/base/common/types'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; @@ -103,7 +103,7 @@ export interface IInitData { logsLocation: URI; logFile: URI; autoStart: boolean; - remote: { isRemote: boolean; authority: string | undefined; }; + remote: { isRemote: boolean; authority: string | undefined; connectionData: IRemoteConnectionData | null; }; uiKind: UIKind; } @@ -697,11 +697,11 @@ export type NotebookCellsSplice = [ export type NotebookCellOutputsSplice = [ number /* start */, number /* delete count */, - IRawOutput[] + IProcessedOutput[] ]; export interface MainThreadNotebookShape extends IDisposable { - $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, kernelInfoDto: INotebookKernelInfoDto | undefined): Promise; + $registerNotebookProvider(extension: NotebookExtensionDescription, viewType: string, supportBackup: boolean, kernelInfoDto: INotebookKernelInfoDto | undefined): Promise; $onNotebookChange(viewType: string, resource: UriComponents): Promise; $unregisterNotebookProvider(viewType: string): Promise; $registerNotebookRenderer(extension: NotebookExtensionDescription, type: string, selectors: INotebookMimeTypeSelector, preloads: UriComponents[]): Promise; @@ -714,6 +714,9 @@ export interface MainThreadNotebookShape extends IDisposable { $updateNotebookCellMetadata(viewType: string, resource: UriComponents, handle: number, metadata: NotebookCellMetadata | undefined): Promise; $spliceNotebookCellOutputs(viewType: string, resource: UriComponents, cellHandle: number, splices: NotebookCellOutputsSplice[], renderers: number[]): Promise; $postMessage(handle: number, value: any): Promise; + + $onDidEdit(resource: UriComponents, viewType: string, editId: number, label: string | undefined): void; + $onContentChange(resource: UriComponents, viewType: string): void; } export interface MainThreadUrlsShape extends IDisposable { @@ -778,7 +781,8 @@ export interface MainThreadTaskShape extends IDisposable { $registerTaskProvider(handle: number, type: string): Promise; $unregisterTaskProvider(handle: number): Promise; $fetchTasks(filter?: tasks.TaskFilterDTO): Promise; - $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; + $getTaskExecution(value: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; + $executeTask(task: tasks.TaskDTO): Promise; $terminateTask(id: string): Promise; $registerTaskSystem(scheme: string, info: tasks.TaskSystemInfoDTO): void; $customExecutionComplete(id: string, result?: number): Promise; @@ -855,6 +859,7 @@ export interface IDebugConfiguration { export interface IStartDebuggingOptions { parentSessionID?: DebugSessionUUID; repl?: IDebugSessionReplMode; + noDebug?: boolean; } export interface MainThreadDebugServiceShape extends IDisposable { @@ -1051,6 +1056,7 @@ export interface ExtHostExtensionServiceShape { $activateByEvent(activationEvent: string): Promise; $activate(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; $setRemoteEnvironment(env: { [key: string]: string | null; }): Promise; + $updateRemoteConnectionData(connectionData: IRemoteConnectionData): Promise; $deltaExtensions(toAdd: IExtensionDescription[], toRemove: ExtensionIdentifier[]): Promise; @@ -1393,8 +1399,8 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalTitleChange(id: number, name: string): void; $acceptTerminalDimensions(id: number, cols: number, rows: number): void; $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void; - $spawnExtHostProcess(id: number, shellLaunchConfig: IShellLaunchConfigDto, activeWorkspaceRootUri: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; - $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): void; + $spawnExtHostProcess(id: number, shellLaunchConfig: IShellLaunchConfigDto, activeWorkspaceRootUri: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise; $acceptProcessInput(id: number, data: string): void; $acceptProcessResize(id: number, cols: number, rows: number): void; $acceptProcessShutdown(id: number, immediate: boolean): void; @@ -1583,11 +1589,13 @@ export interface INotebookDocumentsAndEditorsDelta { } export interface ExtHostNotebookShape { - $resolveNotebookData(viewType: string, uri: UriComponents): Promise; + $resolveNotebookData(viewType: string, uri: UriComponents, backupId?: string): Promise; + $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise; $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise; $executeNotebook2(kernelId: string, viewType: string, uri: UriComponents, cellHandle: number | undefined, token: CancellationToken): Promise; $saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise; $saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise; + $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise; $acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void; $renderOutputs(uriComponents: UriComponents, id: string, request: IOutputRenderRequest): Promise | undefined>; $renderOutputs2(uriComponents: UriComponents, id: string, request: IOutputRenderRequest): Promise | undefined>; @@ -1595,6 +1603,9 @@ export interface ExtHostNotebookShape { $acceptModelChanged(uriComponents: UriComponents, event: NotebookCellsChangedEvent): void; $acceptEditorPropertiesChanged(uriComponents: UriComponents, data: INotebookEditorPropertiesChangeData): void; $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta): Promise; + $undoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise; + $redoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise; + } export interface ExtHostStorageShape { diff --git a/src/vs/workbench/api/common/extHostApiDeprecationService.ts b/src/vs/workbench/api/common/extHostApiDeprecationService.ts index e1a230cef8..faaba9a939 100644 --- a/src/vs/workbench/api/common/extHostApiDeprecationService.ts +++ b/src/vs/workbench/api/common/extHostApiDeprecationService.ts @@ -10,7 +10,7 @@ import * as extHostProtocol from 'vs/workbench/api/common/extHost.protocol'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; export interface IExtHostApiDeprecationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; report(apiId: string, extension: IExtensionDescription, migrationSuggestion: string): void; } @@ -19,7 +19,7 @@ export const IExtHostApiDeprecationService = createDecorator(); private readonly _telemetryShape: extHostProtocol.MainThreadTelemetryShape; @@ -63,7 +63,7 @@ export class ExtHostApiDeprecationService implements IExtHostApiDeprecationServi export const NullApiDeprecationService = Object.freeze(new class implements IExtHostApiDeprecationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; public report(_apiId: string, _extension: IExtensionDescription, _warningMessage: string): void { // noop diff --git a/src/vs/workbench/api/common/extHostCodeInsets.ts b/src/vs/workbench/api/common/extHostCodeInsets.ts index a452e93a7c..ac8c402c59 100644 --- a/src/vs/workbench/api/common/extHostCodeInsets.ts +++ b/src/vs/workbench/api/common/extHostCodeInsets.ts @@ -28,11 +28,11 @@ export class ExtHostEditorInsets implements ExtHostEditorInsetsShape { // dispose editor inset whenever the hosting editor goes away this._disposables.add(_editors.onDidChangeVisibleTextEditors(() => { const visibleEditor = _editors.getVisibleTextEditors(); - this._insets.forEach(value => { + for (const value of this._insets.values()) { if (visibleEditor.indexOf(value.editor) < 0) { value.inset.dispose(); // will remove from `this._insets` } - }); + } })); } diff --git a/src/vs/workbench/api/common/extHostCommands.ts b/src/vs/workbench/api/common/extHostCommands.ts index 9bd95ab04c..bbeb106b3c 100644 --- a/src/vs/workbench/api/common/extHostCommands.ts +++ b/src/vs/workbench/api/common/extHostCommands.ts @@ -204,12 +204,12 @@ export class ExtHostCommands implements ExtHostCommandsShape { $getContributedCommandHandlerDescriptions(): Promise<{ [id: string]: string | ICommandHandlerDescription }> { const result: { [id: string]: string | ICommandHandlerDescription } = Object.create(null); - this._commands.forEach((command, id) => { + for (let [id, command] of this._commands) { let { description } = command; if (description) { result[id] = description; } - }); + } return Promise.resolve(result); } } diff --git a/src/vs/workbench/api/common/extHostDebugService.ts b/src/vs/workbench/api/common/extHostDebugService.ts index b66e01f6f8..bac0a8a2c2 100644 --- a/src/vs/workbench/api/common/extHostDebugService.ts +++ b/src/vs/workbench/api/common/extHostDebugService.ts @@ -57,7 +57,7 @@ export interface IExtHostDebugService extends ExtHostDebugServiceShape { asDebugSourceUri(source: vscode.DebugProtocolSource, session?: vscode.DebugSession): vscode.Uri; } -export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDebugServiceShape { +export abstract class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDebugServiceShape { readonly _serviceBrand: undefined; @@ -295,7 +295,8 @@ export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDeb public startDebugging(folder: vscode.WorkspaceFolder | undefined, nameOrConfig: string | vscode.DebugConfiguration, options: vscode.DebugSessionOptions): Promise { return this._debugServiceProxy.$startDebugging(folder ? folder.uri : undefined, nameOrConfig, { parentSessionID: options.parentSession ? options.parentSession.id : undefined, - repl: options.consoleMode === DebugConsoleMode.MergeWithParent ? 'mergeWithParent' : 'separate' + repl: options.consoleMode === DebugConsoleMode.MergeWithParent ? 'mergeWithParent' : 'separate', + noDebug: options.noDebug }); } @@ -372,9 +373,7 @@ export class ExtHostDebugServiceBase implements IExtHostDebugService, ExtHostDeb return Promise.resolve(undefined); } - protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { - return new ExtHostVariableResolverService(folders, editorService, configurationService); - } + protected abstract createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService; public async $substituteVariables(folderUri: UriComponents | undefined, config: IConfig): Promise { if (!this._variableResolver) { @@ -973,7 +972,7 @@ export class ExtHostDebugConsole implements vscode.DebugConsole { export class ExtHostVariableResolverService extends AbstractVariableResolverService { - constructor(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider, env?: IProcessEnvironment) { + constructor(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors | undefined, configurationService: ExtHostConfigProvider, env?: IProcessEnvironment) { super({ getFolderUri: (folderName: string): URI | undefined => { const found = folders.filter(f => f.name === folderName); @@ -992,27 +991,33 @@ export class ExtHostVariableResolverService extends AbstractVariableResolverServ return env ? env['VSCODE_EXEC_PATH'] : undefined; }, getFilePath: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor) { - return path.normalize(activeEditor.document.uri.fsPath); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor) { + return path.normalize(activeEditor.document.uri.fsPath); + } } return undefined; }, getSelectedText: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor && !activeEditor.selection.isEmpty) { - return activeEditor.document.getText(activeEditor.selection); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor && !activeEditor.selection.isEmpty) { + return activeEditor.document.getText(activeEditor.selection); + } } return undefined; }, getLineNumber: (): string | undefined => { - const activeEditor = editorService.activeEditor(); - if (activeEditor) { - return String(activeEditor.selection.end.line + 1); + if (editorService) { + const activeEditor = editorService.activeEditor(); + if (activeEditor) { + return String(activeEditor.selection.end.line + 1); + } } return undefined; } - }, env); + }, env, !editorService); } } @@ -1103,4 +1108,8 @@ export class WorkerExtHostDebugService extends ExtHostDebugServiceBase { ) { super(extHostRpcService, workspaceService, extensionService, editorsService, configurationService, commandService); } + + protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { + return new ExtHostVariableResolverService(folders, editorService, configurationService); + } } diff --git a/src/vs/workbench/api/common/extHostDiagnostics.ts b/src/vs/workbench/api/common/extHostDiagnostics.ts index 3c9f98e01f..b6b934cafe 100644 --- a/src/vs/workbench/api/common/extHostDiagnostics.ts +++ b/src/vs/workbench/api/common/extHostDiagnostics.ts @@ -173,9 +173,9 @@ export class DiagnosticCollection implements vscode.DiagnosticCollection { forEach(callback: (uri: URI, diagnostics: ReadonlyArray, collection: DiagnosticCollection) => any, thisArg?: any): void { this._checkDisposed(); - this._data.forEach((value, uri) => { + for (let uri of this._data.keys()) { callback.apply(thisArg, [uri, this.get(uri), this]); - }); + } } get(uri: URI): ReadonlyArray { @@ -307,7 +307,7 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { } else { const index = new Map(); const res: [vscode.Uri, vscode.Diagnostic[]][] = []; - this._collections.forEach(collection => { + for (const collection of this._collections.values()) { collection.forEach((uri, diagnostics) => { let idx = index.get(uri.toString()); if (typeof idx === 'undefined') { @@ -317,18 +317,18 @@ export class ExtHostDiagnostics implements ExtHostDiagnosticsShape { } res[idx][1] = res[idx][1].concat(...diagnostics); }); - }); + } return res; } } private _getDiagnostics(resource: vscode.Uri): ReadonlyArray { let res: vscode.Diagnostic[] = []; - this._collections.forEach(collection => { + for (let collection of this._collections.values()) { if (collection.has(resource)) { res = res.concat(collection.get(resource)); } - }); + } return res; } diff --git a/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts b/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts index d8d6b7ff1e..f3a98b6f5a 100644 --- a/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts +++ b/src/vs/workbench/api/common/extHostDocumentsAndEditors.ts @@ -14,6 +14,7 @@ import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ExtHostTextEditor } from 'vs/workbench/api/common/extHostTextEditor'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { ILogService } from 'vs/platform/log/common/log'; +import { ResourceMap } from 'vs/base/common/map'; export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsShape { @@ -22,7 +23,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha private _activeEditorId: string | null = null; private readonly _editors = new Map(); - private readonly _documents = new Map(); + private readonly _documents = new ResourceMap(); private readonly _onDidAddDocuments = new Emitter(); private readonly _onDidRemoveDocuments = new Emitter(); @@ -48,9 +49,8 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha if (delta.removedDocuments) { for (const uriComponent of delta.removedDocuments) { const uri = URI.revive(uriComponent); - const id = uri.toString(); - const data = this._documents.get(id); - this._documents.delete(id); + const data = this._documents.get(uri); + this._documents.delete(uri); if (data) { removedDocuments.push(data); } @@ -60,7 +60,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha if (delta.addedDocuments) { for (const data of delta.addedDocuments) { const resource = URI.revive(data.uri); - assert.ok(!this._documents.has(resource.toString()), `document '${resource} already exists!'`); + assert.ok(!this._documents.has(resource), `document '${resource} already exists!'`); const documentData = new ExtHostDocumentData( this._extHostRpc.getProxy(MainContext.MainThreadDocuments), @@ -71,7 +71,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha data.versionId, data.isDirty ); - this._documents.set(resource.toString(), documentData); + this._documents.set(resource, documentData); addedDocuments.push(documentData); } } @@ -89,10 +89,10 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha if (delta.addedEditors) { for (const data of delta.addedEditors) { const resource = URI.revive(data.documentUri); - assert.ok(this._documents.has(resource.toString()), `document '${resource}' does not exist`); + assert.ok(this._documents.has(resource), `document '${resource}' does not exist`); assert.ok(!this._editors.has(data.id), `editor '${data.id}' already exists!`); - const documentData = this._documents.get(resource.toString())!; + const documentData = this._documents.get(resource)!; const editor = new ExtHostTextEditor( data.id, this._extHostRpc.getProxy(MainContext.MainThreadTextEditors), @@ -132,13 +132,11 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha } getDocument(uri: URI): ExtHostDocumentData | undefined { - return this._documents.get(uri.toString()); + return this._documents.get(uri); } allDocuments(): ExtHostDocumentData[] { - const result: ExtHostDocumentData[] = []; - this._documents.forEach(data => result.push(data)); - return result; + return [...this._documents.values()]; } getEditor(id: string): ExtHostTextEditor | undefined { @@ -154,9 +152,7 @@ export class ExtHostDocumentsAndEditors implements ExtHostDocumentsAndEditorsSha } allEditors(): ExtHostTextEditor[] { - const result: ExtHostTextEditor[] = []; - this._editors.forEach(data => result.push(data)); - return result; + return [...this._editors.values()]; } } diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index dc71c421a7..2785b4da54 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -6,8 +6,8 @@ import * as nls from 'vs/nls'; import * as path from 'vs/base/common/path'; import { originalFSPath, joinPath } from 'vs/base/common/resources'; -import { Barrier } from 'vs/base/common/async'; -import { dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; +import { Barrier, timeout } from 'vs/base/common/async'; +import { dispose, toDisposable, DisposableStore, Disposable } from 'vs/base/common/lifecycle'; import { TernarySearchTree } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; import { ILogService } from 'vs/platform/log/common/log'; @@ -16,7 +16,7 @@ import { ExtHostConfiguration, IExtHostConfiguration } from 'vs/workbench/api/co import { ActivatedExtension, EmptyExtension, ExtensionActivationReason, 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 { ExtensionActivationError, checkProposedApiEnabled } from 'vs/workbench/services/extensions/common/extensions'; +import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/common/extensionDescriptionRegistry'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import * as errors from 'vs/base/common/errors'; @@ -26,7 +26,7 @@ import { Schemas } from 'vs/base/common/network'; import { VSBuffer } from 'vs/base/common/buffer'; import { ExtensionMemento } from 'vs/workbench/api/common/extHostMemento'; import { RemoteAuthorityResolverError, ExtensionMode } from 'vs/workbench/api/common/extHostTypes'; -import { ResolvedAuthority, ResolvedOptions, RemoteAuthorityResolverErrorCode } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { ResolvedAuthority, ResolvedOptions, RemoteAuthorityResolverErrorCode, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'; import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; @@ -34,6 +34,7 @@ import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IExtHostTunnelService } from 'vs/workbench/api/common/extHostTunnelService'; import { IExtHostTerminalService } from 'vs/workbench/api/common/extHostTerminalService'; +import { Emitter, Event } from 'vs/base/common/event'; interface ITestRunner { /** Old test runner API, as exported from `vscode/lib/testrunner` */ @@ -48,7 +49,7 @@ interface INewTestRunner { export const IHostUtils = createDecorator('IHostUtils'); export interface IHostUtils { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; exit(code?: number): void; exists(path: string): Promise; realpath(path: string): Promise; @@ -65,12 +66,15 @@ type TelemetryActivationEventFragment = { reasonId: { classification: 'PublicNonPersonalData', purpose: 'FeatureInsight' }; }; -export abstract class AbstractExtHostExtensionService implements ExtHostExtensionServiceShape { +export abstract class AbstractExtHostExtensionService extends Disposable implements ExtHostExtensionServiceShape { readonly _serviceBrand: undefined; private static readonly WORKSPACE_CONTAINS_TIMEOUT = 7000; + private readonly _onDidChangeRemoteConnectionData = this._register(new Emitter()); + public readonly onDidChangeRemoteConnectionData = this._onDidChangeRemoteConnectionData.event; + protected readonly _hostUtils: IHostUtils; protected readonly _initData: IInitData; protected readonly _extHostContext: IExtHostRpcService; @@ -97,6 +101,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio private readonly _resolvers: { [authorityPrefix: string]: vscode.RemoteAuthorityResolver; }; private _started: boolean; + private _remoteConnectionData: IRemoteConnectionData | null; private readonly _disposables: DisposableStore; @@ -112,6 +117,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio @IExtHostTunnelService extHostTunnelService: IExtHostTunnelService, @IExtHostTerminalService extHostTerminalService: IExtHostTerminalService ) { + super(); this._hostUtils = hostUtils; this._extHostContext = extHostContext; this._initData = initData; @@ -164,6 +170,11 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio this._extensionPathIndex = null; this._resolvers = Object.create(null); this._started = false; + this._remoteConnectionData = this._initData.remote.connectionData; + } + + public getRemoteConnectionData(): IRemoteConnectionData | null { + return this._remoteConnectionData; } public async initialize(): Promise { @@ -360,7 +371,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio const workspaceState = new ExtensionMemento(extensionDescription.identifier.value, false, this._storage); const extensionMode = extensionDescription.isUnderDevelopment ? (this._initData.environment.extensionTestsLocationURI ? ExtensionMode.Test : ExtensionMode.Development) - : ExtensionMode.Release; + : ExtensionMode.Production; this._logService.trace(`ExtensionService#loadExtensionContext ${extensionDescription.identifier.value}`); @@ -380,10 +391,7 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio get globalStoragePath() { return that._storagePath.globalValue(extensionDescription); }, asAbsolutePath(relativePath: string) { return path.join(extensionDescription.extensionLocation.fsPath, relativePath); }, get logPath() { return path.join(that._initData.logsLocation.fsPath, extensionDescription.identifier.value); }, - get extensionMode() { - checkProposedApiEnabled(extensionDescription); - return extensionMode; - }, + get extensionMode() { return extensionMode; }, get environmentVariableCollection() { return that._extHostTerminalService.getEnvironmentVariableCollection(extensionDescription); } }); }); @@ -426,15 +434,44 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio // -- eager activation + private _activateOneStartupFinished(desc: IExtensionDescription, activationEvent: string): void { + this._activateById(desc.identifier, { + startup: false, + extensionId: desc.identifier, + activationEvent: activationEvent + }).then(undefined, (err) => { + this._logService.error(err); + }); + } + + private _activateAllStartupFinished(): void { + for (const desc of this._registry.getAllExtensionDescriptions()) { + if (desc.activationEvents) { + for (const activationEvent of desc.activationEvents) { + if (activationEvent === 'onStartupFinished') { + this._activateOneStartupFinished(desc, activationEvent); + } + } + } + } + } + // Handle "eager" activation extensions private _handleEagerExtensions(): Promise { - this._activateByEvent('*', true).then(undefined, (err) => { + const starActivation = this._activateByEvent('*', true).then(undefined, (err) => { this._logService.error(err); }); this._disposables.add(this._extHostWorkspace.onDidChangeWorkspace((e) => this._handleWorkspaceContainsEagerExtensions(e.added))); const folders = this._extHostWorkspace.workspace ? this._extHostWorkspace.workspace.folders : []; - return this._handleWorkspaceContainsEagerExtensions(folders); + const workspaceContainsActivation = this._handleWorkspaceContainsEagerExtensions(folders); + const eagerExtensionsActivation = Promise.all([starActivation, workspaceContainsActivation]).then(() => { }); + + Promise.race([eagerExtensionsActivation, timeout(10000)]).then(() => { + this._activateAllStartupFinished(); + }); + + return eagerExtensionsActivation; } private _handleWorkspaceContainsEagerExtensions(folders: ReadonlyArray): Promise { @@ -764,6 +801,11 @@ export abstract class AbstractExtHostExtensionService implements ExtHostExtensio return buff; } + public async $updateRemoteConnectionData(connectionData: IRemoteConnectionData): Promise { + this._remoteConnectionData = connectionData; + this._onDidChangeRemoteConnectionData.fire(); + } + public abstract async $setRemoteEnvironment(env: { [key: string]: string | null }): Promise; } @@ -798,7 +840,7 @@ function getTelemetryActivationEvent(extensionDescription: IExtensionDescription export const IExtHostExtensionService = createDecorator('IExtHostExtensionService'); export interface IExtHostExtensionService extends AbstractExtHostExtensionService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; initialize(): Promise; isActivated(extensionId: ExtensionIdentifier): boolean; activateByIdWithErrors(extensionId: ExtensionIdentifier, reason: ExtensionActivationReason): Promise; @@ -807,4 +849,7 @@ export interface IExtHostExtensionService extends AbstractExtHostExtensionServic getExtensionRegistry(): Promise; getExtensionPathIndex(): Promise>; registerRemoteAuthorityResolver(authorityPrefix: string, resolver: vscode.RemoteAuthorityResolver): vscode.Disposable; + + onDidChangeRemoteConnectionData: Event; + getRemoteConnectionData(): IRemoteConnectionData | null; } diff --git a/src/vs/workbench/api/common/extHostInitDataService.ts b/src/vs/workbench/api/common/extHostInitDataService.ts index 9142cba298..f7bd330ff3 100644 --- a/src/vs/workbench/api/common/extHostInitDataService.ts +++ b/src/vs/workbench/api/common/extHostInitDataService.ts @@ -9,6 +9,6 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const IExtHostInitDataService = createDecorator('IExtHostInitDataService'); export interface IExtHostInitDataService extends Readonly { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } diff --git a/src/vs/workbench/api/common/extHostNotebook.ts b/src/vs/workbench/api/common/extHostNotebook.ts index 9fde81213a..79e2c945eb 100644 --- a/src/vs/workbench/api/common/extHostNotebook.ts +++ b/src/vs/workbench/api/common/extHostNotebook.ts @@ -13,13 +13,19 @@ import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' import { CellKind, ExtHostNotebookShape, IMainContext, MainContext, MainThreadNotebookShape, NotebookCellOutputsSplice, MainThreadDocumentsShape, INotebookEditorPropertiesChangeData, INotebookDocumentsAndEditorsDelta } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; -import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, INotebookDisplayOrder, INotebookEditData, NotebookCellsChangedEvent, NotebookCellsSplice2, ICellDeleteEdit, notebookDocumentMetadataDefaults, NotebookCellsChangeType, NotebookDataDto, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseOutputInfo, IOutputRenderResponseCellInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellEditType, CellUri, diff, ICellEditOperation, ICellInsertEdit, INotebookDisplayOrder, INotebookEditData, NotebookCellsChangedEvent, NotebookCellsSplice2, ICellDeleteEdit, notebookDocumentMetadataDefaults, NotebookCellsChangeType, NotebookDataDto, IOutputRenderRequest, IOutputRenderResponse, IOutputRenderResponseOutputInfo, IOutputRenderResponseCellInfo, IRawOutput, CellOutputKind, IProcessedOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import * as extHostTypes from 'vs/workbench/api/common/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtHostDocumentData } from 'vs/workbench/api/common/extHostDocumentData'; import { NotImplementedProxy } from 'vs/base/common/types'; import * as typeConverters from 'vs/workbench/api/common/extHostTypeConverters'; import { asWebviewUri, WebviewInitData } from 'vs/workbench/api/common/shared/webview'; +import { IExtensionStoragePaths } from 'vs/workbench/api/common/extHostStoragePaths'; +import { joinPath } from 'vs/base/common/resources'; +import { Schemas } from 'vs/base/common/network'; +import { hash } from 'vs/base/common/hash'; +import { generateUuid } from 'vs/base/common/uuid'; +import { Cache } from './cache'; interface IObservable { proxy: T; @@ -48,15 +54,18 @@ interface INotebookEventEmitter { emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void; } +const addIdToOutput = (output: IRawOutput, id = generateUuid()): IProcessedOutput => output.outputKind === CellOutputKind.Rich + ? ({ ...output, outputId: id }) : output; + export class ExtHostCell extends Disposable implements vscode.NotebookCell { // private originalSource: string[]; private _outputs: any[]; - private _onDidChangeOutputs = new Emitter[]>(); - onDidChangeOutputs: Event[]> = this._onDidChangeOutputs.event; + private _onDidChangeOutputs = new Emitter[]>(); + onDidChangeOutputs: Event[]> = this._onDidChangeOutputs.event; // private _textDocument: vscode.TextDocument | undefined; // private _initalVersion: number = -1; - private _outputMapping = new Set(); + private _outputMapping = new WeakMap(); private _metadata: vscode.NotebookCellMetadata; private _metadataChangeListener: IDisposable; @@ -71,11 +80,6 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { return this._notebook; } - get source() { - // todo@jrieken remove this - return this._documentData.getText(); - } - constructor( private readonly _notebook: ExtHostNotebookDocument, readonly handle: number, @@ -96,6 +100,10 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { ); this._outputs = outputs; + for (const output of this._outputs) { + this._outputMapping.set(output, output.outputId); + delete output.outputId; + } const observableMetadata = getObservable(_metadata || {}); this._metadata = observableMetadata.proxy; @@ -109,22 +117,33 @@ export class ExtHostCell extends Disposable implements vscode.NotebookCell { } set outputs(newOutputs: vscode.CellOutput[]) { - let diffs = diff(this._outputs || [], newOutputs || [], (a) => { + let rawDiffs = diff(this._outputs || [], newOutputs || [], (a) => { return this._outputMapping.has(a); }); - diffs.forEach(diff => { + const transformedDiffs: ISplice[] = rawDiffs.map(diff => { for (let i = diff.start; i < diff.start + diff.deleteCount; i++) { this._outputMapping.delete(this._outputs[i]); } - diff.toInsert.forEach(output => { - this._outputMapping.add(output); - }); + return { + deleteCount: diff.deleteCount, + start: diff.start, + toInsert: diff.toInsert.map((output): IProcessedOutput => { + if (output.outputKind === CellOutputKind.Rich) { + const uuid = generateUuid(); + this._outputMapping.set(output, uuid); + return { ...output, outputId: uuid }; + } + + this._outputMapping.set(output, undefined); + return output; + }) + }; }); this._outputs = newOutputs; - this._onDidChangeOutputs.fire(diffs); + this._onDidChangeOutputs.fire(transformedDiffs); } get metadata() { @@ -228,6 +247,47 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo return this._versionId; } + private _backupCounter = 1; + + private _backup?: vscode.NotebookDocumentBackup; + + + private readonly _edits = new Cache('notebook documents'); + + + addEdit(item: vscode.NotebookDocumentEditEvent): number { + return this._edits.add([item]); + } + + async undo(editId: number, isDirty: boolean): Promise { + await this.getEdit(editId).undo(); + // if (!isDirty) { + // this.disposeBackup(); + // } + } + + async redo(editId: number, isDirty: boolean): Promise { + await this.getEdit(editId).redo(); + // if (!isDirty) { + // this.disposeBackup(); + // } + } + + private getEdit(editId: number): vscode.NotebookDocumentEditEvent { + const edit = this._edits.get(editId, 0); + if (!edit) { + throw new Error('No edit found'); + } + + return edit; + } + + disposeEdits(editIds: number[]): void { + for (const id of editIds) { + this._edits.delete(id); + } + } + private _disposed = false; constructor( @@ -236,7 +296,8 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo private _emitter: INotebookEventEmitter, public viewType: string, public uri: URI, - public renderingHandler: ExtHostNotebookOutputRenderingHandler + public renderingHandler: ExtHostNotebookOutputRenderingHandler, + private readonly _storagePath: URI | undefined ) { super(); @@ -251,6 +312,24 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo this._proxy.$updateNotebookMetadata(this.viewType, this.uri, this._metadata); } + getNewBackupUri(): URI { + if (!this._storagePath) { + throw new Error('Backup requires a valid storage path'); + } + const fileName = hashPath(this.uri) + (this._backupCounter++); + return joinPath(this._storagePath, fileName); + } + + updateBackup(backup: vscode.NotebookDocumentBackup): void { + this._backup?.delete(); + this._backup = backup; + } + + disposeBackup(): void { + this._backup?.delete(); + this._backup = undefined; + } + dispose() { this._disposed = true; super.dispose(); @@ -263,8 +342,10 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo accpetModelChanged(event: NotebookCellsChangedEvent): void { this._versionId = event.versionId; - if (event.kind === NotebookCellsChangeType.ModelChange) { - this.$spliceNotebookCells(event.changes); + if (event.kind === NotebookCellsChangeType.Initialize) { + this.$spliceNotebookCells(event.changes, true); + } if (event.kind === NotebookCellsChangeType.ModelChange) { + this.$spliceNotebookCells(event.changes, false); } else if (event.kind === NotebookCellsChangeType.Move) { this.$moveCell(event.index, event.newIdx); } else if (event.kind === NotebookCellsChangeType.CellClearOutput) { @@ -276,7 +357,7 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo } } - private $spliceNotebookCells(splices: NotebookCellsSplice2[]): void { + private $spliceNotebookCells(splices: NotebookCellsSplice2[], initialization: boolean): void { if (this._disposed) { return; } @@ -312,21 +393,24 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo } - this.cells.splice(splice[0], splice[1], ...newCells); + const deletedItems = this.cells.splice(splice[0], splice[1], ...newCells); const event: vscode.NotebookCellsChangeData = { start: splice[0], deletedCount: splice[1], + deletedItems, items: newCells }; contentChangeEvents.push(event); }); - this._emitter.emitModelChange({ - document: this, - changes: contentChangeEvents - }); + if (!initialization) { + this._emitter.emitModelChange({ + document: this, + changes: contentChangeEvents + }); + } } private $moveCell(index: number, newIdx: number): void { @@ -335,10 +419,12 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo const changes: vscode.NotebookCellsChangeData[] = [{ start: index, deletedCount: 1, + deletedItems: cells, items: [] }, { start: newIdx, deletedCount: 0, + deletedItems: [], items: cells }]; this._emitter.emitModelChange({ @@ -373,7 +459,7 @@ export class ExtHostNotebookDocument extends Disposable implements vscode.Notebo this._emitter.emitCellLanguageChange(event); } - async eventuallyUpdateCellOutputs(cell: ExtHostCell, diffs: ISplice[]) { + async eventuallyUpdateCellOutputs(cell: ExtHostCell, diffs: ISplice[]) { let renderers = new Set(); let outputDtos: NotebookCellOutputsSplice[] = diffs.map(diff => { let outputs = diff.toInsert; @@ -445,8 +531,8 @@ export class NotebookEditorCellEditBuilder implements vscode.NotebookEditorCellE source: sourceArr, language, cellKind: type, - outputs: outputs, - metadata + outputs: outputs.map(o => addIdToOutput(o)), + metadata, }; this._collectedEdits.push({ @@ -467,6 +553,30 @@ export class NotebookEditorCellEditBuilder implements vscode.NotebookEditorCellE } } +class ExtHostWebviewComm extends Disposable { + + onDidReceiveMessage: vscode.Event = this._onDidReceiveMessage.event; + + constructor( + readonly id: string, + public uri: URI, + private _proxy: MainThreadNotebookShape, + private _onDidReceiveMessage: Emitter, + private _webviewInitData: WebviewInitData, + public document: ExtHostNotebookDocument, + ) { + super(); + } + + async postMessage(message: any): Promise { + return this._proxy.$postMessage(this.document.handle, message); + } + + asWebviewUri(localResource: vscode.Uri): vscode.Uri { + return asWebviewUri(this._webviewInitData, this.id, localResource); + } +} + export class ExtHostNotebookEditor extends Disposable implements vscode.NotebookEditor { private _viewColumn: vscode.ViewColumn | undefined; @@ -500,6 +610,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook private _onDidDispose = new Emitter(); readonly onDidDispose: Event = this._onDidDispose.event; + private _onDidReceiveMessage = new Emitter(); onDidReceiveMessage: vscode.Event = this._onDidReceiveMessage.event; constructor( @@ -507,8 +618,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook readonly id: string, public uri: URI, private _proxy: MainThreadNotebookShape, - private _onDidReceiveMessage: Emitter, - private _webviewInitData: WebviewInitData, + private _webComm: ExtHostWebviewComm, public document: ExtHostNotebookDocument, private _documentsAndEditors: ExtHostDocumentsAndEditors ) { @@ -517,7 +627,7 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook for (const documentData of documents) { let data = CellUri.parse(documentData.document.uri); if (data) { - if (this.document.uri.toString() === data.notebook.toString()) { + if (this.document.uri.fsPath === data.notebook.fsPath) { document.attachCellTextDocument(documentData); } } @@ -528,12 +638,16 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook for (const documentData of documents) { let data = CellUri.parse(documentData.document.uri); if (data) { - if (this.document.uri.toString() === data.notebook.toString()) { + if (this.document.uri.fsPath === data.notebook.fsPath) { document.detachCellTextDocument(documentData); } } } })); + + this._register(this._webComm.onDidReceiveMessage(e => { + this._onDidReceiveMessage.fire(e); + })); } edit(callback: (editBuilder: NotebookEditorCellEditBuilder) => void): Thenable { @@ -593,11 +707,11 @@ export class ExtHostNotebookEditor extends Disposable implements vscode.Notebook } async postMessage(message: any): Promise { - return this._proxy.$postMessage(this.document.handle, message); + return this._webComm.postMessage(message); } asWebviewUri(localResource: vscode.Uri): vscode.Uri { - return asWebviewUri(this._webviewInitData, this.id, localResource); + return this._webComm.asWebviewUri(localResource); } dispose() { this._onDidDispose.fire(); @@ -618,16 +732,16 @@ export class ExtHostNotebookOutputRenderer { } matches(mimeType: string): boolean { - if (this.filter.subTypes) { - if (this.filter.subTypes.indexOf(mimeType) >= 0) { + if (this.filter.mimeTypes) { + if (this.filter.mimeTypes.indexOf(mimeType) >= 0) { return true; } } return false; } - render(document: ExtHostNotebookDocument, output: vscode.CellDisplayOutput, mimeType: string): string { - let html = this.renderer.render(document, output, mimeType); + render(document: ExtHostNotebookDocument, output: vscode.CellDisplayOutput, outputId: string, mimeType: string): string { + let html = this.renderer.render(document, { output, outputId, mimeType }); return html; } @@ -644,7 +758,8 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private readonly _notebookKernels = new Map(); private readonly _documents = new Map(); private readonly _unInitializedDocuments = new Map(); - private readonly _editors = new Map; }>(); + private readonly _editors = new Map(); + private readonly _webviewComm = new Map }>(); private readonly _notebookOutputRenderers = new Map(); private readonly _onDidChangeNotebookCells = new Emitter(); readonly onDidChangeNotebookCells = this._onDidChangeNotebookCells.event; @@ -661,18 +776,16 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return this._outputDisplayOrder; } - private _activeNotebookDocument: ExtHostNotebookDocument | undefined; - - get activeNotebookDocument() { - return this._activeNotebookDocument; - } - private _activeNotebookEditor: ExtHostNotebookEditor | undefined; get activeNotebookEditor() { return this._activeNotebookEditor; } + get notebookDocuments() { + return [...this._documents.values()]; + } + private _onDidOpenNotebookDocument = new Emitter(); onDidOpenNotebookDocument: Event = this._onDidOpenNotebookDocument.event; private _onDidCloseNotebookDocument = new Emitter(); @@ -681,7 +794,13 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN private _onDidChangeVisibleNotebookEditors = new Emitter(); onDidChangeVisibleNotebookEditors = this._onDidChangeVisibleNotebookEditors.event; - constructor(mainContext: IMainContext, commands: ExtHostCommands, private _documentsAndEditors: ExtHostDocumentsAndEditors, private readonly _webviewInitData: WebviewInitData) { + constructor( + mainContext: IMainContext, + commands: ExtHostCommands, + private _documentsAndEditors: ExtHostDocumentsAndEditors, + private readonly _webviewInitData: WebviewInitData, + private readonly _extensionStoragePaths?: IExtensionStoragePaths, + ) { this._proxy = mainContext.getProxy(MainContext.MainThreadNotebook); commands.registerArgumentProcessor({ @@ -736,13 +855,14 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const renderer = this._notebookOutputRenderers.get(id)!; const cellsResponse: IOutputRenderResponseCellInfo[] = request.items.map(cellInfo => { - const cell = document.getCell2(cellInfo.key); + const cell = document.getCell2(cellInfo.key)!; const outputResponse: IOutputRenderResponseOutputInfo[] = cellInfo.outputs.map(output => { return { index: output.index, + outputId: output.outputId, mimeType: output.mimeType, handlerId: id, - transformedOutput: renderer.render(document, cell!.outputs[output.index] as vscode.CellDisplayOutput, output.mimeType) + transformedOutput: renderer.render(document, cell.outputs[output.index] as vscode.CellDisplayOutput, output.outputId, output.mimeType) }; }); @@ -774,9 +894,10 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const outputResponse: IOutputRenderResponseOutputInfo[] = cellInfo.outputs.map(output => { return { index: output.index, + outputId: output.outputId, mimeType: output.mimeType, handlerId: id, - transformedOutput: renderer.render(document, output.output! as vscode.CellDisplayOutput, output.mimeType) + transformedOutput: renderer.render(document, output.output! as vscode.CellDisplayOutput, output.outputId, output.mimeType) }; }); @@ -817,10 +938,26 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN this._notebookContentProviders.set(viewType, { extension, provider }); const listener = provider.onDidChangeNotebook - ? provider.onDidChangeNotebook(e => this._proxy.$onNotebookChange(viewType, e.document.uri)) + ? provider.onDidChangeNotebook(e => { + const document = this._documents.get(URI.revive(e.document.uri).toString()); + + if (!document) { + throw new Error(`Notebook document ${e.document.uri.toString()} not found`); + } + + if (isEditEvent(e)) { + const editId = document.addEdit(e); + this._proxy.$onDidEdit(e.document.uri, viewType, editId, e.label); + } else { + this._proxy.$onContentChange(e.document.uri, viewType); + } + }) : Disposable.None; - this._proxy.$registerNotebookProvider({ id: extension.identifier, location: extension.extensionLocation }, viewType, provider.kernel ? { id: viewType, label: provider.kernel.label, extensionLocation: extension.extensionLocation, preloads: provider.kernel.preloads } : undefined); + const supportBackup = !!provider.backupNotebook; + + this._proxy.$registerNotebookProvider({ id: extension.identifier, location: extension.extensionLocation }, viewType, supportBackup, provider.kernel ? { id: viewType, label: provider.kernel.label, extensionLocation: extension.extensionLocation, preloads: provider.kernel.preloads } : undefined); + return new extHostTypes.Disposable(() => { listener.dispose(); this._notebookContentProviders.delete(viewType); @@ -843,11 +980,16 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } - async $resolveNotebookData(viewType: string, uri: UriComponents): Promise { + async $resolveNotebookData(viewType: string, uri: UriComponents, backupId?: string): Promise { const provider = this._notebookContentProviders.get(viewType); const revivedUri = URI.revive(uri); if (provider) { + let storageRoot: URI | undefined; + if (this._extensionStoragePaths) { + storageRoot = URI.file(this._extensionStoragePaths.workspaceValue(provider.extension) ?? this._extensionStoragePaths.globalValue(provider.extension)); + } + let document = this._documents.get(URI.revive(uri).toString()); if (!document) { @@ -862,18 +1004,21 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void { that._onDidChangeCellLanguage.fire(event); } - }, viewType, revivedUri, this); + }, viewType, revivedUri, this, storageRoot); this._unInitializedDocuments.set(revivedUri.toString(), document); } - const rawCells = await provider.provider.openNotebook(URI.revive(uri)); + const rawCells = await provider.provider.openNotebook(URI.revive(uri), { backupId }); const dto = { metadata: { ...notebookDocumentMetadataDefaults, ...rawCells.metadata }, languages: rawCells.languages, - cells: rawCells.cells, + cells: rawCells.cells.map(cell => ({ + ...cell, + outputs: cell.outputs.map(o => addIdToOutput(o)) + })), }; return dto; @@ -882,6 +1027,30 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return undefined; // {{SQL CARBON EDIT}} } + async $resolveNotebookEditor(viewType: string, uri: UriComponents, editorId: string): Promise { + const provider = this._notebookContentProviders.get(viewType); + const revivedUri = URI.revive(uri); + const document = this._documents.get(revivedUri.toString()); + if (!document || !provider) { + return; + } + + if (!provider.provider.resolveNotebook) { + return; + } + + let webComm = this._webviewComm.get(editorId)?.comm; + + if (webComm) { + await provider.provider.resolveNotebook(document, webComm); + } else { + const onDidReceiveMessage = new Emitter(); + webComm = new ExtHostWebviewComm(editorId, revivedUri, this._proxy, onDidReceiveMessage, this._webviewInitData, document); + this._webviewComm.set(editorId, { comm: webComm, onDidReceiveMessage }); + await provider.provider.resolveNotebook(document, webComm); + } + } + async $executeNotebook(viewType: string, uri: UriComponents, cellHandle: number | undefined, useAttachedKernel: boolean, token: CancellationToken): Promise { let document = this._documents.get(URI.revive(uri).toString()); @@ -963,6 +1132,39 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN return false; } + async $undoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + if (!document) { + return; + } + + document.undo(editId, isDirty); + + } + + async $redoNotebook(viewType: string, uri: UriComponents, editId: number, isDirty: boolean): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + if (!document) { + return; + } + + document.redo(editId, isDirty); + } + + + async $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise { + const document = this._documents.get(URI.revive(uri).toString()); + const provider = this._notebookContentProviders.get(viewType); + + if (document && provider && provider.provider.backupNotebook) { + const backup = await provider.provider.backupNotebook(document, { destination: document.getNewBackupUri() }, cancellation); + document.updateBackup(backup); + return backup.id; + } + + return undefined; // {{SQL CARBON EDIT}} strict-null-checks + } + $acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void { this._outputDisplayOrder = displayOrder; } @@ -970,7 +1172,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN // TODO: remove document - editor one on one mapping private _getEditorFromURI(uriComponents: UriComponents) { const uriStr = URI.revive(uriComponents).toString(); - let editor: { editor: ExtHostNotebookEditor, onDidReceiveMessage: Emitter; } | undefined; + let editor: { editor: ExtHostNotebookEditor } | undefined; this._editors.forEach(e => { if (e.editor.uri.toString() === uriStr) { editor = e; @@ -981,10 +1183,10 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } $onDidReceiveMessage(editorId: string, message: any): void { - let editor = this._editors.get(editorId); + let messageEmitter = this._webviewComm.get(editorId)?.onDidReceiveMessage; - if (editor) { - editor.onDidReceiveMessage.fire(message); + if (messageEmitter) { + messageEmitter.fire(message); } } @@ -1023,16 +1225,21 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } private _createExtHostEditor(document: ExtHostNotebookDocument, editorId: string, selections: number[]) { - const onDidReceiveMessage = new Emitter(); const revivedUri = document.uri; + let webComm = this._webviewComm.get(editorId)?.comm; + + if (!webComm) { + const onDidReceiveMessage = new Emitter(); + webComm = new ExtHostWebviewComm(editorId, revivedUri, this._proxy, onDidReceiveMessage, this._webviewInitData, document); + this._webviewComm.set(editorId, { comm: webComm!, onDidReceiveMessage }); + } let editor = new ExtHostNotebookEditor( document.viewType, editorId, revivedUri, this._proxy, - onDidReceiveMessage, - this._webviewInitData, + webComm, document, this._documentsAndEditors ); @@ -1048,7 +1255,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN this._editors.get(editorId)?.editor.dispose(); - this._editors.set(editorId, { editor, onDidReceiveMessage }); + this._editors.set(editorId, { editor }); } async $acceptDocumentAndEditorsDelta(delta: INotebookDocumentsAndEditorsDelta) { @@ -1069,7 +1276,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN [...this._editors.values()].forEach((e) => { if (e.editor.uri.toString() === revivedUriStr) { e.editor.dispose(); - e.onDidReceiveMessage.dispose(); this._editors.delete(e.editor.id); editorChanged = true; } @@ -1082,8 +1288,15 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN const revivedUri = URI.revive(modelData.uri); const revivedUriStr = revivedUri.toString(); const viewType = modelData.viewType; + const entry = this._notebookContentProviders.get(viewType); + let storageRoot: URI | undefined; + if (entry && this._extensionStoragePaths) { + storageRoot = URI.file(this._extensionStoragePaths.workspaceValue(entry.extension) ?? this._extensionStoragePaths.globalValue(entry.extension)); + } + if (!this._documents.has(revivedUriStr)) { const that = this; + let document = this._unInitializedDocuments.get(revivedUriStr) ?? new ExtHostNotebookDocument(this._proxy, this._documentsAndEditors, { emitModelChange(event: vscode.NotebookCellsChangeEvent): void { that._onDidChangeNotebookCells.fire(event); @@ -1094,7 +1307,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN emitCellLanguageChange(event: vscode.NotebookCellLanguageChangeEvent): void { that._onDidChangeCellLanguage.fire(event); } - }, viewType, revivedUri, this); + }, viewType, revivedUri, this, storageRoot); this._unInitializedDocuments.delete(revivedUriStr); if (modelData.metadata) { @@ -1105,7 +1318,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN } document.accpetModelChanged({ - kind: NotebookCellsChangeType.ModelChange, + kind: NotebookCellsChangeType.Initialize, versionId: modelData.versionId, changes: [[ 0, @@ -1145,7 +1358,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN }); } - const removedEditors: { editor: ExtHostNotebookEditor, onDidReceiveMessage: Emitter; }[] = []; + const removedEditors: { editor: ExtHostNotebookEditor }[] = []; if (delta.removedEditors) { delta.removedEditors.forEach(editorid => { @@ -1157,7 +1370,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN if (this.activeNotebookEditor?.id === editor.editor.id) { this._activeNotebookEditor = undefined; - this._activeNotebookDocument = undefined; } removedEditors.push(editor); @@ -1168,12 +1380,11 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN if (editorChanged) { removedEditors.forEach(e => { e.editor.dispose(); - e.onDidReceiveMessage.dispose(); }); } if (delta.visibleEditors) { - this.visibleNotebookEditors = delta.visibleEditors.map(id => this._editors.get(id)?.editor).filter(editor => !!editor) as ExtHostNotebookEditor[]; + this.visibleNotebookEditors = delta.visibleEditors.map(id => this._editors.get(id)!.editor).filter(editor => !!editor) as ExtHostNotebookEditor[]; const visibleEditorsSet = new Set(); this.visibleNotebookEditors.forEach(editor => visibleEditorsSet.add(editor.id)); @@ -1190,19 +1401,32 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN if (delta.newActiveEditor) { this._activeNotebookEditor = this._editors.get(delta.newActiveEditor)?.editor; this._activeNotebookEditor?._acceptActive(true); - this._activeNotebookDocument = this._activeNotebookEditor ? this._documents.get(this._activeNotebookEditor!.uri.toString()) : undefined; + [...this._editors.values()].forEach((e) => { + if (e.editor !== this.activeNotebookEditor) { + e.editor._acceptActive(false); + } + }); } else { + // clear active notebook as current active editor is non-notebook editor this._activeNotebookEditor = undefined; - this._activeNotebookDocument = undefined; + + [...this._editors.values()].forEach((e) => { + e.editor._acceptActive(false); + }); + } this._onDidChangeActiveNotebookEditor.fire(this._activeNotebookEditor); } - - [...this._editors.values()].forEach((e) => { - if (e.editor !== this.activeNotebookEditor) { - e.editor._acceptActive(false); - } - }); } } + +function hashPath(resource: URI): string { + const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString(); + return hash(str) + ''; +} + +function isEditEvent(e: vscode.NotebookDocumentEditEvent | vscode.NotebookDocumentContentChangeEvent): e is vscode.NotebookDocumentEditEvent { + return typeof (e as vscode.NotebookDocumentEditEvent).undo === 'function' + && typeof (e as vscode.NotebookDocumentEditEvent).redo === 'function'; +} diff --git a/src/vs/workbench/api/common/extHostRpcService.ts b/src/vs/workbench/api/common/extHostRpcService.ts index 10e46fd3ef..ec0b601a6d 100644 --- a/src/vs/workbench/api/common/extHostRpcService.ts +++ b/src/vs/workbench/api/common/extHostRpcService.ts @@ -9,7 +9,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const IExtHostRpcService = createDecorator('IExtHostRpcService'); export interface IExtHostRpcService extends IRPCProtocol { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } export class ExtHostRpcService implements IExtHostRpcService { diff --git a/src/vs/workbench/api/common/extHostStoragePaths.ts b/src/vs/workbench/api/common/extHostStoragePaths.ts index 2c7f596ac4..db0cda8f6e 100644 --- a/src/vs/workbench/api/common/extHostStoragePaths.ts +++ b/src/vs/workbench/api/common/extHostStoragePaths.ts @@ -9,7 +9,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const IExtensionStoragePaths = createDecorator('IExtensionStoragePaths'); export interface IExtensionStoragePaths { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; whenReady: Promise; workspaceValue(extension: IExtensionDescription): string | undefined; globalValue(extension: IExtensionDescription): string; diff --git a/src/vs/workbench/api/common/extHostTask.ts b/src/vs/workbench/api/common/extHostTask.ts index d92766c7ad..de82f8dab9 100644 --- a/src/vs/workbench/api/common/extHostTask.ts +++ b/src/vs/workbench/api/common/extHostTask.ts @@ -512,12 +512,10 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { public async $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): Promise { const execution = await this.getTaskExecution(value.id); - if (execution) { - this._onDidTaskProcessStarted.fire({ - execution: execution, - processId: value.processId - }); - } + this._onDidTaskProcessStarted.fire({ + execution: execution, + processId: value.processId + }); } public get onDidEndTaskProcess(): Event { @@ -526,12 +524,10 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { public async $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): Promise { const execution = await this.getTaskExecution(value.id); - if (execution) { - this._onDidTaskProcessEnded.fire({ - execution: execution, - exitCode: value.exitCode - }); - } + this._onDidTaskProcessEnded.fire({ + execution: execution, + exitCode: value.exitCode + }); } protected abstract provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription }; @@ -622,7 +618,7 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { protected async getTaskExecution(execution: tasks.TaskExecutionDTO | string, task?: vscode.Task): Promise { if (typeof execution === 'string') { - const taskExecution = this._taskExecutions.get(execution); + const taskExecution = this._taskExecutionPromises.get(execution); if (!taskExecution) { throw new Error('Unexpected: The specified task is missing an execution'); } @@ -643,9 +639,11 @@ export abstract class ExtHostTaskBase implements ExtHostTaskShape { }); this._taskExecutionPromises.set(execution.id, createdResult); - return createdResult.then(result => { - this._taskExecutions.set(execution.id, result); - return result; + return createdResult.then(executionCreatedResult => { + this._taskExecutions.set(execution.id, executionCreatedResult); + return executionCreatedResult; + }, rejected => { + return Promise.reject(rejected); }); } @@ -708,7 +706,7 @@ export class WorkerExtHostTask extends ExtHostTaskBase { public async executeTask(extension: IExtensionDescription, task: vscode.Task): Promise { const dto = TaskDTO.from(task, extension); if (dto === undefined) { - return Promise.reject(new Error('Task is not valid')); + throw new Error('Task is not valid'); } // If this task is a custom execution, then we need to save it away @@ -720,7 +718,10 @@ export class WorkerExtHostTask extends ExtHostTaskBase { throw new Error('Not implemented'); } - return this._proxy.$executeTask(dto).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const execution = await this.getTaskExecution(await this._proxy.$getTaskExecution(dto), task); + this._proxy.$executeTask(dto).catch(error => { throw new Error(error); }); + return execution; } protected provideTasksInternal(validTypes: { [key: string]: boolean; }, taskIdPromises: Promise[], handler: HandlerData, value: vscode.Task[] | null | undefined): { tasks: tasks.TaskDTO[], extension: IExtensionDescription } { diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 8a66bec58a..e3b4155877 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -9,7 +9,7 @@ import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShap import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { ITerminalChildProcess, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalChildProcess, ITerminalDimensions, EXT_HOST_CREATION_DELAY, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { timeout } from 'vs/base/common/async'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { TerminalDataBufferer } from 'vs/workbench/contrib/terminal/common/terminalDataBuffering'; @@ -17,10 +17,11 @@ import { IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Disposable as VSCodeDisposable, EnvironmentVariableMutatorType } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { localize } from 'vs/nls'; export interface IExtHostTerminalService extends ExtHostTerminalServiceShape { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; activeTerminal: vscode.Terminal | undefined; terminals: vscode.Terminal[]; @@ -243,6 +244,10 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess { constructor(private readonly _pty: vscode.Pseudoterminal) { } + async start(): Promise { + return undefined; + } + shutdown(): void { this._pty.close(); } @@ -332,7 +337,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ public abstract createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal; public abstract getDefaultShell(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string; public abstract getDefaultShellArgs(useAutomationShell: boolean, configProvider: ExtHostConfigProvider): string[] | string; - public abstract $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + public abstract $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; public abstract $getAvailableShells(): Promise; public abstract $getDefaultShellAndArgs(useAutomationShell: boolean): Promise; public abstract $acceptWorkspacePermissionsChanged(isAllowed: boolean): void; @@ -454,20 +459,17 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ } } - public async $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise { + public async $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise { // Make sure the ExtHostTerminal exists so onDidOpenTerminal has fired before we call // Pseudoterminal.start const terminal = await this._getTerminalByIdEventually(id); if (!terminal) { - return; + return { message: localize('launchFail.idMissingOnExtHost', "Could not find the terminal with id {0} on the extension host", id) }; } // Wait for onDidOpenTerminal to fire - let openPromise: Promise; - if (terminal.isOpen) { - openPromise = Promise.resolve(); - } else { - openPromise = new Promise(r => { + if (!terminal.isOpen) { + await new Promise(r => { // Ensure open is called after onDidOpenTerminal const listener = this.onDidOpenTerminal(async e => { if (e === terminal) { @@ -477,7 +479,6 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ }); }); } - await openPromise; if (this._terminalProcesses[id]) { (this._terminalProcesses[id] as ExtHostPseudoterminal).startSendingEvents(initialDimensions); @@ -486,6 +487,7 @@ export abstract class BaseExtHostTerminalService implements IExtHostTerminalServ this._extensionTerminalAwaitingStart[id] = { initialDimensions }; } + return undefined; } protected _setupExtHostProcessListeners(id: number, p: ITerminalChildProcess): IDisposable { @@ -721,7 +723,7 @@ export class WorkerExtHostTerminalService extends BaseExtHostTerminalService { throw new Error('Not implemented'); } - public $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { throw new Error('Not implemented'); } diff --git a/src/vs/workbench/api/common/extHostTextEditors.ts b/src/vs/workbench/api/common/extHostTextEditors.ts index 7b7f0b437d..12377afa59 100644 --- a/src/vs/workbench/api/common/extHostTextEditors.ts +++ b/src/vs/workbench/api/common/extHostTextEditors.ts @@ -54,7 +54,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, columnOrOptions: vscode.ViewColumn | vscode.TextDocumentShowOptions | undefined, preserveFocus?: 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; if (typeof columnOrOptions === 'number') { options = { @@ -74,14 +74,18 @@ export class ExtHostEditors implements ExtHostEditorsShape { }; } - return this._proxy.$tryShowTextDocument(document.uri, options).then(id => { - const editor = id && this._extHostDocumentsAndEditors.getEditor(id); - if (editor) { - return editor; - } else { - throw new Error(`Failed to show text document ${document.uri.toString()}, should show in editor #${id}`); - } - }); + const editorId = await this._proxy.$tryShowTextDocument(document.uri, options); + const editor = editorId && this._extHostDocumentsAndEditors.getEditor(editorId); + if (editor) { + return editor; + } + // we have no editor... having an id means that we had an editor + // on the main side and that it isn't the current editor anymore... + if (editorId) { + throw new Error(`Could NOT open editor for "${document.uri.toString()}" because another editor opened in the meantime.`); + } else { + throw new Error(`Could NOT open editor for "${document.uri.toString()}".`); + } } createTextEditorDecorationType(options: vscode.DecorationRenderOptions): vscode.TextEditorDecorationType { diff --git a/src/vs/workbench/api/common/extHostTimeline.ts b/src/vs/workbench/api/common/extHostTimeline.ts index 4575c4e1e3..8a3e9bd774 100644 --- a/src/vs/workbench/api/common/extHostTimeline.ts +++ b/src/vs/workbench/api/common/extHostTimeline.ts @@ -22,7 +22,7 @@ export interface IExtHostTimeline extends ExtHostTimelineShape { export const IExtHostTimeline = createDecorator('IExtHostTimeline'); export class ExtHostTimeline implements IExtHostTimeline { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _proxy: MainThreadTimelineShape; diff --git a/src/vs/workbench/api/common/extHostTunnelService.ts b/src/vs/workbench/api/common/extHostTunnelService.ts index 2cbdde8ac6..9a8397455e 100644 --- a/src/vs/workbench/api/common/extHostTunnelService.ts +++ b/src/vs/workbench/api/common/extHostTunnelService.ts @@ -41,7 +41,7 @@ export interface IExtHostTunnelService extends ExtHostTunnelServiceShape { export const IExtHostTunnelService = createDecorator('IExtHostTunnelService'); export class ExtHostTunnelService implements IExtHostTunnelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidChangeTunnels: vscode.Event = (new Emitter()).event; private readonly _proxy: MainThreadTunnelServiceShape; diff --git a/src/vs/workbench/api/common/extHostTypeConverters.ts b/src/vs/workbench/api/common/extHostTypeConverters.ts index 0e92e06b17..f7229352ce 100644 --- a/src/vs/workbench/api/common/extHostTypeConverters.ts +++ b/src/vs/workbench/api/common/extHostTypeConverters.ts @@ -1164,15 +1164,20 @@ export namespace FoldingRangeKind { } } -export namespace TextEditorOptions { +export interface TextEditorOpenOptions extends vscode.TextDocumentShowOptions { + background?: boolean; +} - export function from(options?: vscode.TextDocumentShowOptions): ITextEditorOptions | undefined { +export namespace TextEditorOpenOptions { + + export function from(options?: TextEditorOpenOptions): ITextEditorOptions | undefined { if (options) { return { pinned: typeof options.preview === 'boolean' ? !options.preview : undefined, + inactive: options.background, preserveFocus: options.preserveFocus, - selection: typeof options.selection === 'object' ? Range.from(options.selection) : undefined - } as ITextEditorOptions; + selection: typeof options.selection === 'object' ? Range.from(options.selection) : undefined, + }; } return undefined; diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index 9d957ce2b3..bd321600d9 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -2750,7 +2750,7 @@ export enum ExtensionMode { * The extension is installed normally (for example, from the marketplace * or VSIX) in VS Code. */ - Release = 1, + Production = 1, /** * The extension is running from an `--extensionDevelopmentPath` provided diff --git a/src/vs/workbench/api/common/extHostUriTransformerService.ts b/src/vs/workbench/api/common/extHostUriTransformerService.ts index f5a19a9f85..9c16904de8 100644 --- a/src/vs/workbench/api/common/extHostUriTransformerService.ts +++ b/src/vs/workbench/api/common/extHostUriTransformerService.ts @@ -8,13 +8,13 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { URI, UriComponents } from 'vs/base/common/uri'; export interface IURITransformerService extends IURITransformer { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } export const IURITransformerService = createDecorator('IURITransformerService'); export class URITransformerService implements IURITransformerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; transformIncoming: (uri: UriComponents) => UriComponents; transformOutgoing: (uri: UriComponents) => UriComponents; diff --git a/src/vs/workbench/api/common/extHostWebview.ts b/src/vs/workbench/api/common/extHostWebview.ts index 38da06eabe..2f20925591 100644 --- a/src/vs/workbench/api/common/extHostWebview.ts +++ b/src/vs/workbench/api/common/extHostWebview.ts @@ -273,7 +273,7 @@ class CustomDocumentStoreEntry { constructor( public readonly document: vscode.CustomDocument, - private readonly _storagePath: string, + private readonly _storagePath: URI | undefined, ) { } private readonly _edits = new Cache('custom documents'); @@ -305,7 +305,11 @@ class CustomDocumentStoreEntry { } getNewBackupUri(): URI { - return joinPath(URI.file(this._storagePath), hashPath(this.document.uri) + (this._backupCounter++)); + if (!this._storagePath) { + throw new Error('Backup requires a valid storage path'); + } + const fileName = hashPath(this.document.uri) + (this._backupCounter++); + return joinPath(this._storagePath, fileName); } updateBackup(backup: vscode.CustomDocumentBackup): void { @@ -334,7 +338,7 @@ class CustomDocumentStore { return this._documents.get(this.key(viewType, resource)); } - public add(viewType: string, document: vscode.CustomDocument, storagePath: string): CustomDocumentStoreEntry { + public add(viewType: string, document: vscode.CustomDocument, storagePath: URI | undefined): CustomDocumentStoreEntry { const key = this.key(viewType, document.uri); if (this._documents.has(key)) { throw new Error(`Document already exists for viewType:${viewType} resource:${document.uri}`); @@ -592,8 +596,11 @@ export class ExtHostWebviews implements extHostProtocol.ExtHostWebviewsShape { const revivedResource = URI.revive(resource); const document = await entry.provider.openCustomDocument(revivedResource, { backupId }, cancellation); - const storageRoot = this._extensionStoragePaths?.workspaceValue(entry.extension) ?? this._extensionStoragePaths?.globalValue(entry.extension); - this._documents.add(viewType, document, storageRoot!); + let storageRoot: URI | undefined; + if (this.supportEditing(entry.provider) && this._extensionStoragePaths) { + storageRoot = URI.file(this._extensionStoragePaths.workspaceValue(entry.extension) ?? this._extensionStoragePaths.globalValue(entry.extension)); + } + this._documents.add(viewType, document, storageRoot); return { editable: this.supportEditing(entry.provider) }; } diff --git a/src/vs/workbench/api/common/menusExtensionPoint.ts b/src/vs/workbench/api/common/menusExtensionPoint.ts index 5ff107eaf5..1e95493ca7 100644 --- a/src/vs/workbench/api/common/menusExtensionPoint.ts +++ b/src/vs/workbench/api/common/menusExtensionPoint.ts @@ -71,6 +71,7 @@ namespace schema { switch (menuId) { case MenuId.StatusBarWindowIndicatorMenu: case MenuId.MenubarWebNavigationMenu: + case MenuId.NotebookCellTitle: return true; } return false; diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index bcdf6ffcfa..e0c33681d0 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -88,6 +88,7 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { const configProvider = await this._configurationService.getConfigProvider(); const shell = this._terminalService.getDefaultShell(true, configProvider); + let cwdForPrepareCommand: string | undefined; if (needNewTerminal || !this._integratedTerminalInstance) { @@ -97,9 +98,9 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { cwd: args.cwd, name: args.title || nls.localize('debug.terminal.title', "debuggee"), }; - // @ts-ignore - delete args.cwd; this._integratedTerminalInstance = this._terminalService.createTerminalFromOptions(options); + } else { + cwdForPrepareCommand = args.cwd; } const terminal = this._integratedTerminalInstance; @@ -107,7 +108,7 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { terminal.show(); const shellProcessId = await this._integratedTerminalInstance.processId; - const command = prepareCommand(args, shell); + const command = prepareCommand(shell, args.args, cwdForPrepareCommand, args.env); terminal.sendText(command, true); return shellProcessId; @@ -120,7 +121,6 @@ export class ExtHostDebugService extends ExtHostDebugServiceBase { } protected createVariableResolver(folders: vscode.WorkspaceFolder[], editorService: ExtHostDocumentsAndEditors, configurationService: ExtHostConfigProvider): AbstractVariableResolverService { - return new ExtHostVariableResolverService(folders, editorService, configurationService, process.env as env.IProcessEnvironment); + return new ExtHostVariableResolverService(folders, undefined, configurationService, process.env as env.IProcessEnvironment); } - } diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index a53a6ed9be..c31195d968 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -53,7 +53,14 @@ export class ExtHostTask extends ExtHostTaskBase { const tTask = (task as types.Task); // We have a preserved ID. So the task didn't change. if (tTask._id !== undefined) { - return this._proxy.$executeTask(TaskHandleDTO.from(tTask)).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const executionDTO = await this._proxy.$getTaskExecution(TaskHandleDTO.from(tTask)); + if (executionDTO.task === undefined) { + throw new Error('Task from execution DTO is undefined'); + } + const execution = await this.getTaskExecution(executionDTO, task); + this._proxy.$executeTask(executionDTO.task).catch(error => { throw new Error(error); }); + return execution; } else { const dto = TaskDTO.from(task, extension); if (dto === undefined) { @@ -66,8 +73,10 @@ export class ExtHostTask extends ExtHostTaskBase { if (CustomExecutionDTO.is(dto.execution)) { await this.addCustomExecution(dto, task, false); } - - return this._proxy.$executeTask(dto).then(value => this.getTaskExecution(value, task)); + // Always get the task execution first to prevent timing issues when retrieving it later + const execution = await this.getTaskExecution(await this._proxy.$getTaskExecution(dto), task); + this._proxy.$executeTask(dto).catch(error => { throw new Error(error); }); + return execution; } } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 1ab607e76c..a2748a76c6 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -12,7 +12,7 @@ import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/termi import { IShellLaunchConfigDto, IShellDefinitionDto, IShellAndArgsDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration, ExtHostConfigProvider, IExtHostConfiguration } from 'vs/workbench/api/common/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; -import { IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalEnvironment, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { ExtHostWorkspace, IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -129,7 +129,7 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { this._variableResolver = new ExtHostVariableResolverService(workspaceFolders || [], this._extHostDocumentsAndEditors, configProvider, process.env as platform.IProcessEnvironment); } - public async $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public async $spawnExtHostProcess(id: number, shellLaunchConfigDto: IShellLaunchConfigDto, activeWorkspaceRootUriComponents: UriComponents | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { const shellLaunchConfig: IShellLaunchConfig = { name: shellLaunchConfigDto.name, executable: shellLaunchConfigDto.executable, @@ -209,7 +209,15 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { // TODO: Support conpty on remote, it doesn't seem to work for some reason? // TODO: When conpty is enabled, only enable it when accessibilityMode is off const enableConpty = false; //terminalConfig.get('windowsEnableConpty') as boolean; - this._setupExtHostProcessListeners(id, new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService)); + + const terminalProcess = new TerminalProcess(shellLaunchConfig, initialCwd, cols, rows, env, enableConpty, this._logService); + this._setupExtHostProcessListeners(id, terminalProcess); + const error = await terminalProcess.start(); + if (error) { + // TODO: Teardown? + return error; + } + return undefined; } public $getAvailableShells(): Promise { diff --git a/src/vs/workbench/api/node/extHostTunnelService.ts b/src/vs/workbench/api/node/extHostTunnelService.ts index d81b4378d0..d9c0151578 100644 --- a/src/vs/workbench/api/node/extHostTunnelService.ts +++ b/src/vs/workbench/api/node/extHostTunnelService.ts @@ -181,7 +181,7 @@ export class ExtHostTunnelService extends Disposable implements IExtHostTunnelSe connections.filter((connection => socketMap[connection.socket])).forEach(({ socket, ip, port }) => { const command = processMap[socketMap[socket].pid].cmd; - if (!command.match('.*\.vscode\-server\-[a-zA-Z]+\/bin.*') && (command.indexOf('out/vs/server/main.js') === -1)) { + if (!command.match(/.*\.vscode-server-[a-zA-Z]+\/bin.*/) && (command.indexOf('out/vs/server/main.js') === -1)) { ports.push({ host: ip, port, detail: processMap[socketMap[socket].pid].cmd }); } }); diff --git a/src/vs/workbench/api/worker/extHostLogService.ts b/src/vs/workbench/api/worker/extHostLogService.ts index d558cc2bf4..90695fc2c7 100644 --- a/src/vs/workbench/api/worker/extHostLogService.ts +++ b/src/vs/workbench/api/worker/extHostLogService.ts @@ -11,7 +11,7 @@ import { UriComponents } from 'vs/base/common/uri'; export class ExtHostLogService extends AbstractLogService implements ILogService, ExtHostLogServiceShape { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _proxy: MainThreadLogShape; private readonly _logFile: UriComponents; diff --git a/src/vs/workbench/browser/actions/listCommands.ts b/src/vs/workbench/browser/actions/listCommands.ts index 2d43d9cb37..d11b37dd56 100644 --- a/src/vs/workbench/browser/actions/listCommands.ts +++ b/src/vs/workbench/browser/actions/listCommands.ts @@ -11,17 +11,11 @@ import { WorkbenchListFocusContextKey, IListService, WorkbenchListSupportsMultiS import { PagedList } from 'vs/base/browser/ui/list/listPaging'; import { range } from 'vs/base/common/arrays'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; import { ObjectTree } from 'vs/base/browser/ui/tree/objectTree'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; import { DataTree } from 'vs/base/browser/ui/tree/dataTree'; import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; - -function isLegacyTree(widget: ListWidget): widget is ITree { - return widget instanceof Tree; -} function ensureDOMFocus(widget: ListWidget | undefined): void { // it can happen that one of the commands is executed while @@ -37,9 +31,6 @@ function focusDown(accessor: ServicesAccessor, arg2?: number, loop: boolean = fa const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -51,7 +42,7 @@ function focusDown(accessor: ServicesAccessor, arg2?: number, loop: boolean = fa } } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; @@ -64,13 +55,8 @@ function focusDown(accessor: ServicesAccessor, arg2?: number, loop: boolean = fa } } - // Tree - else if (focused) { - const tree = focused; - - tree.focusNext(count, { origin: 'keyboard' }); - tree.reveal(tree.getFocus()); - } + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -85,7 +71,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, arg2) => focusDown(accessor, arg2) }); -function expandMultiSelection(focused: List | PagedList | ITree | ObjectTree | DataTree | AsyncDataTree, previousFocus: unknown): void { +function expandMultiSelection(focused: List | PagedList | ObjectTree | DataTree | AsyncDataTree, previousFocus: unknown): void { // List if (focused instanceof List || focused instanceof PagedList) { @@ -102,7 +88,7 @@ function expandMultiSelection(focused: List | PagedList | ITre } } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; @@ -121,19 +107,6 @@ function expandMultiSelection(focused: List | PagedList | ITre list.setSelection(selection.concat(focus), fakeKeyboardEvent); } } - - // Tree - else if (focused) { - const tree = focused; - - const focus = tree.getFocus(); - const selection = tree.getSelection(); - if (selection && selection.indexOf(focus) >= 0) { - tree.setSelection(selection.filter(s => s !== previousFocus)); - } else { - tree.setSelection(selection.concat(focus)); - } - } } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -144,7 +117,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, arg2) => { const focused = accessor.get(IListService).lastFocusedList; - // List + // List / Tree if (focused instanceof List || focused instanceof PagedList || focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; @@ -155,18 +128,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ // Then adjust selection expandMultiSelection(focused, previousFocus); } - - // Tree - else if (focused) { - const tree = focused; - - // Focus down first - const previousFocus = tree.getFocus(); - focusDown(accessor, arg2); - - // Then adjust selection - expandMultiSelection(focused, previousFocus); - } } }); @@ -174,9 +135,6 @@ function focusUp(accessor: ServicesAccessor, arg2?: number, loop: boolean = fals const focused = accessor.get(IListService).lastFocusedList; const count = typeof arg2 === 'number' ? arg2 : 1; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -188,7 +146,7 @@ function focusUp(accessor: ServicesAccessor, arg2?: number, loop: boolean = fals } } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; @@ -201,13 +159,8 @@ function focusUp(accessor: ServicesAccessor, arg2?: number, loop: boolean = fals } } - // Tree - else if (focused) { - const tree = focused; - - tree.focusPrevious(count, { origin: 'keyboard' }); - tree.reveal(tree.getFocus()); - } + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -230,7 +183,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, arg2) => { const focused = accessor.get(IListService).lastFocusedList; - // List + // List / Tree if (focused instanceof List || focused instanceof PagedList || focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; @@ -241,18 +194,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ // Then adjust selection expandMultiSelection(focused, previousFocus); } - - // Tree - else if (focused) { - const tree = focused; - - // Focus up first - const previousFocus = tree.getFocus(); - focusUp(accessor, arg2); - - // Then adjust selection - expandMultiSelection(focused, previousFocus); - } } }); @@ -289,19 +230,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ tree.reveal(parent); } } - } else { - const tree = focused; - const focus = tree.getFocus(); - - tree.collapse(focus).then(didCollapse => { - if (focus && !didCollapse) { - tree.focusParent({ origin: 'keyboard' }); - - return tree.reveal(tree.getFocus()); - } - - return undefined; - }); } } } @@ -350,9 +278,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ tree.setFocus([parent], fakeKeyboardEvent); tree.reveal(parent); } - } else { - const tree = focused; - tree.focusParent({ origin: 'keyboard' }); } } }); @@ -416,19 +341,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ } } }); - } else { - const tree = focused; - const focus = tree.getFocus(); - - tree.expand(focus).then(didExpand => { - if (focus && !didExpand) { - tree.focusFirstChild({ origin: 'keyboard' }); - - return tree.reveal(tree.getFocus()); - } - - return undefined; - }); } } } @@ -442,9 +354,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor) => { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -453,7 +362,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.reveal(list.getFocus()[0]); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; @@ -462,13 +371,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.reveal(list.getFocus()[0]); } - // Tree - else if (focused) { - const tree = focused; - - tree.focusPreviousPage({ origin: 'keyboard' }); - tree.reveal(tree.getFocus()); - } + // Ensure DOM Focus + ensureDOMFocus(focused); } }); @@ -480,9 +384,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor) => { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -491,7 +392,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.reveal(list.getFocus()[0]); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; @@ -500,13 +401,8 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.reveal(list.getFocus()[0]); } - // Tree - else if (focused) { - const tree = focused; - - tree.focusNextPage({ origin: 'keyboard' }); - tree.reveal(tree.getFocus()); - } + // Ensure DOM Focus + ensureDOMFocus(focused); } }); @@ -529,9 +425,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -540,7 +433,7 @@ function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boo list.reveal(0); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; const fakeKeyboardEvent = new KeyboardEvent('keydown'); @@ -553,13 +446,8 @@ function listFocusFirst(accessor: ServicesAccessor, options?: { fromFocused: boo } } - // Tree - else if (focused) { - const tree = focused; - - tree.focusFirst({ origin: 'keyboard' }, options?.fromFocused ? tree.getFocus() : undefined); - tree.reveal(tree.getFocus()); - } + // Ensure DOM Focus + ensureDOMFocus(focused); } KeybindingsRegistry.registerCommandAndKeybindingRule({ @@ -581,9 +469,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: boolean }): void { const focused = accessor.get(IListService).lastFocusedList; - // Ensure DOM Focus - ensureDOMFocus(focused); - // List if (focused instanceof List || focused instanceof PagedList) { const list = focused; @@ -592,7 +477,7 @@ function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: bool list.reveal(list.length - 1); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; const fakeKeyboardEvent = new KeyboardEvent('keydown'); @@ -605,12 +490,40 @@ function listFocusLast(accessor: ServicesAccessor, options?: { fromFocused: bool } } - // Tree - else if (focused) { - const tree = focused; + // Ensure DOM Focus + ensureDOMFocus(focused); +} - tree.focusLast({ origin: 'keyboard' }, options?.fromFocused ? tree.getFocus() : undefined); - tree.reveal(tree.getFocus()); + +function focusElement(accessor: ServicesAccessor, retainCurrentFocus: boolean): void { + const focused = accessor.get(IListService).lastFocusedList; + const fakeKeyboardEvent = getSelectionKeyboardEvent('keydown', retainCurrentFocus); + // List + if (focused instanceof List || focused instanceof PagedList) { + const list = focused; + list.setSelection(list.getFocus(), fakeKeyboardEvent); + } + + // Trees + else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { + const tree = focused; + const focus = tree.getFocus(); + + if (focus.length > 0) { + let toggleCollapsed = true; + + if (tree.expandOnlyOnTwistieClick === true) { + toggleCollapsed = false; + } else if (typeof tree.expandOnlyOnTwistieClick !== 'boolean' && tree.expandOnlyOnTwistieClick(focus[0])) { + toggleCollapsed = false; + } + + if (toggleCollapsed) { + tree.toggleCollapsed(focus[0]); + } + } + tree.setSelection(focus, fakeKeyboardEvent); + tree.open(fakeKeyboardEvent); } } @@ -624,48 +537,16 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ secondary: [KeyMod.CtrlCmd | KeyCode.DownArrow] }, handler: (accessor) => { - const focused = accessor.get(IListService).lastFocusedList; - const fakeKeyboardEvent = getSelectionKeyboardEvent('keydown', false); + focusElement(accessor, false); + } +}); - // List - if (focused instanceof List || focused instanceof PagedList) { - const list = focused; - list.setSelection(list.getFocus(), fakeKeyboardEvent); - list.open(list.getFocus(), fakeKeyboardEvent); - } - - // ObjectTree - else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { - const list = focused; - const focus = list.getFocus(); - - if (focus.length > 0) { - let toggleCollapsed = true; - - if (list.expandOnlyOnTwistieClick === true) { - toggleCollapsed = false; - } else if (typeof list.expandOnlyOnTwistieClick !== 'boolean' && list.expandOnlyOnTwistieClick(focus[0])) { - toggleCollapsed = false; - } - - if (toggleCollapsed) { - list.toggleCollapsed(focus[0]); - } - } - - list.setSelection(focus, fakeKeyboardEvent); - list.open(focus, fakeKeyboardEvent); - } - - // Tree - else if (focused) { - const tree = focused; - const focus = tree.getFocus(); - - if (focus) { - tree.setSelection([focus], { origin: 'keyboard' }); - } - } +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: 'list.selectAndPreserveFocus', + weight: KeybindingWeight.WorkbenchContrib, + when: WorkbenchListFocusContextKey, + handler: accessor => { + focusElement(accessor, true); } }); @@ -744,7 +625,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor) => { const widget = accessor.get(IListService).lastFocusedList; - if (!widget || isLegacyTree(widget)) { + if (!widget) { return; } @@ -784,13 +665,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ } tree.toggleCollapsed(focus[0]); - } else { - const tree = focused; - const focus = tree.getFocus(); - - if (focus) { - tree.toggleExpansion(focus); - } } } } @@ -812,7 +686,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.setFocus([]); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const list = focused; const fakeKeyboardEvent = new KeyboardEvent('keydown'); @@ -820,14 +694,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ list.setSelection([], fakeKeyboardEvent); list.setFocus([], fakeKeyboardEvent); } - - // Tree - else if (focused) { - const tree = focused; - - tree.clearSelection({ origin: 'keyboard' }); - tree.clearFocus({ origin: 'keyboard' }); - } } }); @@ -842,7 +708,7 @@ CommandsRegistry.registerCommand({ list.toggleKeyboardNavigation(); } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; tree.toggleKeyboardNavigation(); @@ -860,7 +726,7 @@ CommandsRegistry.registerCommand({ // TODO@joao } - // ObjectTree + // Tree else if (focused instanceof ObjectTree || focused instanceof DataTree || focused instanceof AsyncDataTree) { const tree = focused; tree.updateOptions({ filterOnType: !tree.filterOnType }); @@ -876,7 +742,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const focused = accessor.get(IListService).lastFocusedList; - if (!focused || isLegacyTree(focused)) { + if (!focused) { return; } @@ -892,7 +758,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const focused = accessor.get(IListService).lastFocusedList; - if (!focused || isLegacyTree(focused)) { + if (!focused) { return; } @@ -907,7 +773,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const focused = accessor.get(IListService).lastFocusedList; - if (!focused || isLegacyTree(focused)) { + if (!focused) { return; } @@ -922,7 +788,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: accessor => { const focused = accessor.get(IListService).lastFocusedList; - if (!focused || isLegacyTree(focused)) { + if (!focused) { return; } diff --git a/src/vs/workbench/browser/actions/navigationActions.ts b/src/vs/workbench/browser/actions/navigationActions.ts index 5889c7a30d..8983faa69d 100644 --- a/src/vs/workbench/browser/actions/navigationActions.ts +++ b/src/vs/workbench/browser/actions/navigationActions.ts @@ -202,9 +202,9 @@ class NavigateDownAction extends BaseNavigationAction { } function findVisibleNeighbour(layoutService: IWorkbenchLayoutService, part: Parts, next: boolean): Parts { - const neighbour = part === Parts.EDITOR_PART ? (next ? Parts.STATUSBAR_PART : Parts.PANEL_PART) : part === Parts.STATUSBAR_PART ? (next ? Parts.ACTIVITYBAR_PART : Parts.EDITOR_PART) : - part === Parts.ACTIVITYBAR_PART ? (next ? Parts.SIDEBAR_PART : Parts.STATUSBAR_PART) : part === Parts.SIDEBAR_PART ? (next ? Parts.PANEL_PART : Parts.ACTIVITYBAR_PART) : - part === Parts.PANEL_PART ? (next ? Parts.EDITOR_PART : Parts.SIDEBAR_PART) : Parts.EDITOR_PART; + const neighbour = part === Parts.EDITOR_PART ? (next ? Parts.PANEL_PART : Parts.SIDEBAR_PART) : part === Parts.PANEL_PART ? (next ? Parts.STATUSBAR_PART : Parts.EDITOR_PART) : + part === Parts.STATUSBAR_PART ? (next ? Parts.ACTIVITYBAR_PART : Parts.PANEL_PART) : part === Parts.ACTIVITYBAR_PART ? (next ? Parts.SIDEBAR_PART : Parts.STATUSBAR_PART) : + part === Parts.SIDEBAR_PART ? (next ? Parts.EDITOR_PART : Parts.ACTIVITYBAR_PART) : Parts.EDITOR_PART; if (layoutService.isVisible(neighbour) || neighbour === Parts.EDITOR_PART) { return neighbour; } diff --git a/src/vs/workbench/browser/composite.ts b/src/vs/workbench/browser/composite.ts index e4731814f0..9a30051f5d 100644 --- a/src/vs/workbench/browser/composite.ts +++ b/src/vs/workbench/browser/composite.ts @@ -239,6 +239,7 @@ export abstract class CompositeDescriptor { readonly name: string, readonly cssClass?: string, readonly order?: number, + readonly requestedIndex?: number, readonly keybindingId?: string, ) { } diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index f5ab03a871..d1ae7904fc 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -749,3 +749,11 @@ export class CompositeDragAndDropObserver extends Disposable { return this._register(disposableStore); } } + +export function toggleDropEffect(dataTransfer: DataTransfer | null, dropEffect: string, shouldHaveIt: boolean) { + if (!dataTransfer) { + return; + } + + dataTransfer.dropEffect = shouldHaveIt ? dropEffect : 'none'; +} diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index dd0b94050d..5e04d223ec 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -16,7 +16,7 @@ import { PanelPart } from 'vs/workbench/browser/parts/panel/panelPart'; import { PanelRegistry, Extensions as PanelExtensions } from 'vs/workbench/browser/panel'; import { Position, Parts, IWorkbenchLayoutService, positionFromString, positionToString } 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 { IStorageService, StorageScope, WillSaveStateReason, WorkspaceStorageSettings } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; @@ -43,8 +43,10 @@ import { WINDOW_ACTIVE_BORDER, WINDOW_INACTIVE_BORDER } from 'vs/workbench/commo import { LineNumbersType } from 'vs/editor/common/config/editorOptions'; import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; import { URI } from 'vs/base/common/uri'; -import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { IViewDescriptorService, ViewContainerLocation, IViewsService } from 'vs/workbench/common/views'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; +import { mark } from 'vs/base/common/performance'; +import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; export enum Settings { ACTIVITYBAR_VISIBLE = 'workbench.activityBar.visible', @@ -54,7 +56,6 @@ export enum Settings { PANEL_POSITION = 'workbench.panel.defaultLocation', ZEN_MODE_RESTORE = 'zenMode.restore', - WORKSPACE_FIRST_OPEN = 'workbench.workspaceFirstOpen' } enum Storage { @@ -104,7 +105,7 @@ interface SideBarActivityState { export abstract class Layout extends Disposable implements IWorkbenchLayoutService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region Events @@ -131,12 +132,11 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi //#endregion + readonly container: HTMLElement = document.createElement('div'); + private _dimension!: IDimension; get dimension(): IDimension { return this._dimension; } - private _container: HTMLElement = document.createElement('div'); - get container(): HTMLElement { return this._container; } - get offset() { return { top: (() => { @@ -150,7 +150,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi }; } - private parts: Map = new Map(); + private readonly parts = new Map(); private workbenchGrid!: SerializableGrid; @@ -164,6 +164,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private statusBarPartView!: ISerializableView; private environmentService!: IWorkbenchEnvironmentService; + private extensionService!: IExtensionService; private configurationService!: IConfigurationService; private lifecycleService!: ILifecycleService; private storageService!: IStorageService; @@ -174,6 +175,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private titleService!: ITitleService; private viewletService!: IViewletService; private viewDescriptorService!: IViewDescriptorService; + private viewsService!: IViewsService; private contextService!: IWorkspaceContextService; private backupFileService!: IBackupFileService; private notificationService!: INotificationService; @@ -223,6 +225,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi hidden: false }, + views: { + defaults: undefined as (string[] | undefined) + }, + zenMode: { active: false, restore: false, @@ -233,8 +239,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi transitionDisposables: new DisposableStore(), setNotificationsFilter: false, editorWidgetSet: new Set() - }, - + } }; constructor( @@ -254,6 +259,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.storageService = accessor.get(IStorageService); this.backupFileService = accessor.get(IBackupFileService); this.themeService = accessor.get(IThemeService); + this.extensionService = accessor.get(IExtensionService); // Parts this.editorService = accessor.get(IEditorService); @@ -261,6 +267,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi this.panelService = accessor.get(IPanelService); this.viewletService = accessor.get(IViewletService); this.viewDescriptorService = accessor.get(IViewDescriptorService); + this.viewsService = accessor.get(IViewsService); this.titleService = accessor.get(ITitleService); this.notificationService = accessor.get(INotificationService); this.activityBarService = accessor.get(IActivityBarService); @@ -476,6 +483,8 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } private initLayoutState(lifecycleService: ILifecycleService, fileService: IFileService): void { + + // Default Layout this.applyDefaultLayout(this.environmentService, this.storageService); // Fullscreen @@ -551,7 +560,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi // Window border this.updateWindowBorder(true); - } private applyDefaultLayout(environmentService: IWorkbenchEnvironmentService, storageService: IStorageService) { @@ -560,11 +568,20 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return; } - const firstOpen = storageService.getBoolean(Settings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE); + const firstOpen = storageService.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE); if (!firstOpen) { return; } + const { views } = defaultLayout; + if (views?.length) { + this.state.views.defaults = views.map(v => v.id); + + return; + } + + // TODO@eamodio Everything below here is deprecated and will be removed once Codespaces migrates + const { sidebar } = defaultLayout; if (sidebar) { if (sidebar.visible !== undefined) { @@ -777,7 +794,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi private getInitialFilesToOpen(): { filesToOpenOrCreate?: IPath[], filesToDiff?: IPath[] } | undefined { const defaultLayout = this.environmentService.options?.defaultLayout; - if (defaultLayout?.editors?.length && this.storageService.getBoolean(Settings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE)) { + if (defaultLayout?.editors?.length && this.storageService.getBoolean(WorkspaceStorageSettings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE)) { this._openedDefaultEditors = true; return { @@ -787,7 +804,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if ('path' in f && 'scheme' in f) { return { fileUri: URI.file((f as any).path).with({ scheme: (f as any).scheme }) }; } - return { fileUri: URI.revive(f.uri), openOnlyIfExists: f.openOnlyIfExists }; + return { fileUri: URI.revive(f.uri), openOnlyIfExists: f.openOnlyIfExists, overrideId: f.openWith }; }) }; } @@ -803,6 +820,143 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return undefined; } + protected async restoreWorkbenchLayout(): Promise { + const restorePromises: Promise[] = []; + + // Restore editors + restorePromises.push((async () => { + mark('willRestoreEditors'); + + // first ensure the editor part is restored + await this.editorGroupService.whenRestored; + + // then see for editors to open as instructed + let editors: IResourceEditorInputType[]; + if (Array.isArray(this.state.editor.editorsToOpen)) { + editors = this.state.editor.editorsToOpen; + } else { + editors = await this.state.editor.editorsToOpen; + } + + if (editors.length) { + await this.editorService.openEditors(editors); + } + + mark('didRestoreEditors'); + })()); + + // Restore default views + const restoreDefaultViewsPromise = (async () => { + if (this.state.views.defaults?.length) { + mark('willOpenDefaultViews'); + + const defaultViews = [...this.state.views.defaults]; + + let locationsRestored: boolean[] = []; + + const tryOpenView = async (viewId: string, index: number) => { + const location = this.viewDescriptorService.getViewLocationById(viewId); + if (location) { + + // If the view is in the same location that has already been restored, remove it and continue + if (locationsRestored[location]) { + defaultViews.splice(index, 1); + + return; + } + + const view = await this.viewsService.openView(viewId); + if (view) { + locationsRestored[location] = true; + defaultViews.splice(index, 1); + } + } + }; + + let i = -1; + for (const viewId of defaultViews) { + await tryOpenView(viewId, ++i); + } + + // If we still have views left over, wait until all extensions have been registered and try again + if (defaultViews.length) { + await this.extensionService.whenInstalledExtensionsRegistered(); + + let i = -1; + for (const viewId of defaultViews) { + await tryOpenView(viewId, ++i); + } + } + + // If we opened a view in the sidebar, stop any restore there + if (locationsRestored[ViewContainerLocation.Sidebar]) { + this.state.sideBar.viewletToRestore = undefined; + } + + // If we opened a view in the panel, stop any restore there + if (locationsRestored[ViewContainerLocation.Panel]) { + this.state.panel.panelToRestore = undefined; + } + + mark('didOpenDefaultViews'); + } + })(); + restorePromises.push(restoreDefaultViewsPromise); + + // Restore Sidebar + restorePromises.push((async () => { + + // Restoring views could mean that sidebar already + // restored, as such we need to test again + await restoreDefaultViewsPromise; + if (!this.state.sideBar.viewletToRestore) { + return; + } + + mark('willRestoreViewlet'); + + const viewlet = await this.viewletService.openViewlet(this.state.sideBar.viewletToRestore); + if (!viewlet) { + await this.viewletService.openViewlet(this.viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id); // fallback to default viewlet as needed + } + + mark('didRestoreViewlet'); + })()); + + // Restore Panel + restorePromises.push((async () => { + + // Restoring views could mean that panel already + // restored, as such we need to test again + await restoreDefaultViewsPromise; + if (!this.state.panel.panelToRestore) { + return; + } + + mark('willRestorePanel'); + + const panel = await this.panelService.openPanel(this.state.panel.panelToRestore!); + if (!panel) { + await this.panelService.openPanel(Registry.as(PanelExtensions.Panels).getDefaultPanelId()); // fallback to default panel as needed + } + + mark('didRestorePanel'); + })()); + + // Restore Zen Mode + if (this.state.zenMode.restore) { + this.toggleZenMode(false, true); + } + + // Restore Editor Center Mode + if (this.state.editor.restoreCentered) { + this.centerEditorLayout(true, true); + } + + // Await restore to be done + await Promise.all(restorePromises); + } + private updatePanelPosition() { const defaultPanelPosition = this.configurationService.getValue(Settings.PANEL_POSITION); const panelPosition = this.storageService.get(Storage.PANEL_POSITION, StorageScope.WORKSPACE, defaultPanelPosition); @@ -1398,9 +1552,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } // If panel part becomes hidden, also hide the current active panel if any + let focusEditor = false; if (hidden && this.panelService.getActivePanel()) { this.panelService.hideActivePanel(); - this.editorGroupService.activeGroup.focus(); // Pass focus to editor group if panel part is now hidden + focusEditor = true; } // If panel part becomes visible, show last active panel or default panel @@ -1431,6 +1586,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi if (hidden && this.state.editor.hidden) { this.setEditorHidden(false, true); } + + if (focusEditor) { + this.editorGroupService.activeGroup.focus(); // Pass focus to editor group if panel part is now hidden + } } toggleMaximizedPanel(): void { @@ -1450,7 +1609,6 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi } else { this.setEditorHidden(false); this.workbenchGrid.resizeView(this.panelPartView, { width: this.state.panel.position === Position.BOTTOM ? size.width : this.state.panel.lastNonMaximizedWidth, height: this.state.panel.position === Position.BOTTOM ? this.state.panel.lastNonMaximizedHeight : size.height }); - this.editorGroupService.activeGroup.focus(); } } diff --git a/src/vs/workbench/browser/media/style.css b/src/vs/workbench/browser/media/style.css index f23bcd08b4..0fcc4fad1c 100644 --- a/src/vs/workbench/browser/media/style.css +++ b/src/vs/workbench/browser/media/style.css @@ -5,18 +5,19 @@ /* Font Families (with CJK support) */ -.mac { font-family: system-ui, -apple-system, BlinkMacSystemFont, sans-serif; } -.mac:lang(zh-Hans) { font-family: system-ui, -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } -.mac:lang(zh-Hant) { font-family: system-ui, -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } -.mac:lang(ja) { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } -.mac:lang(ko) { font-family: system-ui, -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } +.mac { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } +.mac:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } +.mac:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } +.mac:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } +.mac:lang(ko) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } -.windows { font-family: system-ui, "Segoe WPC", "Segoe UI", sans-serif; } -.windows:lang(zh-Hans) { font-family: system-ui, "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } -.windows:lang(zh-Hant) { font-family: system-ui, "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } -.windows:lang(ja) { font-family: system-ui, "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } -.windows:lang(ko) { font-family: system-ui, "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } +.windows { font-family: "Segoe WPC", "Segoe UI", sans-serif; } +.windows:lang(zh-Hans) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } +.windows:lang(zh-Hant) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } +.windows:lang(ja) { font-family: "Segoe WPC", "Segoe UI", "Yu Gothic UI", "Meiryo UI", sans-serif; } +.windows:lang(ko) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } +/* Linux: add `system-ui` as first font and not `Ubuntu` to allow other distribution pick their standard OS font */ .linux { font-family: system-ui, "Ubuntu", "Droid Sans", sans-serif; } .linux:lang(zh-Hans) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } .linux:lang(zh-Hant) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } diff --git a/src/vs/workbench/browser/panel.ts b/src/vs/workbench/browser/panel.ts index e11a7f5460..cd49d5827e 100644 --- a/src/vs/workbench/browser/panel.ts +++ b/src/vs/workbench/browser/panel.ts @@ -17,12 +17,12 @@ export abstract class Panel extends PaneComposite implements IPanel { } */ export class PanelDescriptor extends CompositeDescriptor { - static create(ctor: { new(...services: Services): Panel }, id: string, name: string, cssClass?: string, order?: number, _commandId?: string): PanelDescriptor { - return new PanelDescriptor(ctor as IConstructorSignature0, id, name, cssClass, order, _commandId); + static create(ctor: { new(...services: Services): Panel }, id: string, name: string, cssClass?: string, order?: number, requestedIndex?: number, _commandId?: string): PanelDescriptor { + return new PanelDescriptor(ctor as IConstructorSignature0, id, name, cssClass, order, requestedIndex, _commandId); } - private constructor(ctor: IConstructorSignature0, id: string, name: string, cssClass?: string, order?: number, _commandId?: string) { - super(ctor, id, name, cssClass, order, _commandId); + private constructor(ctor: IConstructorSignature0, id: string, name: string, cssClass?: string, order?: number, requestedIndex?: number, _commandId?: string) { + super(ctor, id, name, cssClass, order, requestedIndex, _commandId); } } diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts index 5f98e6a880..eee46e923e 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarActions.ts @@ -11,7 +11,7 @@ import { EventType as TouchEventType, GestureEvent } from 'vs/base/browser/touch import { Action, IAction } from 'vs/base/common/actions'; import { KeyCode } from 'vs/base/common/keyCodes'; import { dispose } from 'vs/base/common/lifecycle'; -import { SyncActionDescriptor, IMenuService, MenuId } from 'vs/platform/actions/common/actions'; +import { SyncActionDescriptor, IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -28,8 +28,11 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { createAndFillInActionBarActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { Codicon } from 'vs/base/common/codicons'; -import { ActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionViewItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { isMacintosh } from 'vs/base/common/platform'; +import { ContextSubMenu } from 'vs/base/browser/contextmenu'; +import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; +import { distinct } from 'vs/base/common/arrays'; export class ViewContainerActivityAction extends ActivityAction { @@ -103,6 +106,7 @@ export class AccountsActionViewItem extends ActivityActionViewItem { @IContextMenuService protected contextMenuService: IContextMenuService, @IMenuService protected menuService: IMenuService, @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IAuthenticationService private readonly authenticationService: IAuthenticationService ) { super(action, { draggable: false, colors, icon: true }, themeService); } @@ -132,16 +136,60 @@ export class AccountsActionViewItem extends ActivityActionViewItem { })); } - private showContextMenu(): void { + private async getActions(accountsMenu: IMenu) { + const otherCommands = accountsMenu.getActions(); + const providers = this.authenticationService.getProviderIds(); + const allSessions = providers.map(async id => { + const sessions = await this.authenticationService.getSessions(id); + const uniqueSessions = distinct(sessions, session => session.account.displayName); + return { + providerId: id, + sessions: uniqueSessions + }; + }); + + const result = await Promise.all(allSessions); + let menus: (IAction | ContextSubMenu)[] = []; + result.forEach(sessionInfo => { + const providerDisplayName = this.authenticationService.getDisplayName(sessionInfo.providerId); + sessionInfo.sessions.forEach(session => { + const accountName = session.account.displayName; + const menu = new ContextSubMenu(`${accountName} (${providerDisplayName})`, [ + new Action(`configureSessions${accountName}`, nls.localize('manageTrustedExtensions', "Manage Trusted Extensions"), '', true, _ => { + return this.authenticationService.manageTrustedExtensionsForAccount(sessionInfo.providerId, accountName); + }), + new Action('signOut', nls.localize('signOut', "Sign Out"), '', true, _ => { + return this.authenticationService.signOutOfAccount(sessionInfo.providerId, accountName); + }) + ]); + menus.push(menu); + }); + }); + + if (menus.length) { + menus.push(new Separator()); + } + + otherCommands.forEach(group => { + const actions = group[1]; + menus = menus.concat(actions); + menus.push(new Separator()); + }); + + return menus; + } + + private async showContextMenu(): Promise { const accountsActions: IAction[] = []; const accountsMenu = this.menuService.createMenu(MenuId.AccountsContext, this.contextKeyService); const actionsDisposable = createAndFillInActionBarActions(accountsMenu, undefined, { primary: [], secondary: accountsActions }); const containerPosition = DOM.getDomNodePagePosition(this.container); const location = { x: containerPosition.left + containerPosition.width / 2, y: containerPosition.top }; + const actions = await this.getActions(accountsMenu); this.contextMenuService.showContextMenu({ getAnchor: () => location, - getActions: () => accountsActions, + getActions: () => actions, onHide: () => { accountsMenu.dispose(); dispose(actionsDisposable); diff --git a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts index a5aaef6cf0..a9e902ee5f 100644 --- a/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts +++ b/src/vs/workbench/browser/parts/activitybar/activitybarPart.ts @@ -35,8 +35,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { isWeb } from 'vs/base/common/platform'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { getUserDataSyncStore } from 'vs/platform/userDataSync/common/userDataSync'; -import { IProductService } from 'vs/platform/product/common/productService'; import { Before2D } from 'vs/workbench/browser/dnd'; import { Codicon, iconRegistry } from 'vs/base/common/codicons'; import { Action } from 'vs/base/common/actions'; @@ -69,7 +67,7 @@ interface ICachedViewContainer { export class ActivitybarPart extends Part implements IActivityBarService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly ACTION_HEIGHT = 48; static readonly PINNED_VIEW_CONTAINERS = 'workbench.activity.pinnedViewlets2'; @@ -117,8 +115,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { @IContextKeyService private readonly contextKeyService: IContextKeyService, @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IStorageKeysSyncRegistryService storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, - @IProductService private readonly productService: IProductService + @IStorageKeysSyncRegistryService storageKeysSyncRegistryService: IStorageKeysSyncRegistryService ) { super(Parts.ACTIVITYBAR_PART, { hasTitle: false }, themeService, storageService, layoutService); @@ -161,7 +158,7 @@ export class ActivitybarPart extends Part implements IActivityBarService { actions.push(this.instantiationService.createInstance(ToggleActivityBarVisibilityAction, ToggleActivityBarVisibilityAction.ID, nls.localize('hideActivitBar', "Hide Activity Bar"))); return actions; }, - getContextMenuActionsForComposite: () => [], + getContextMenuActionsForComposite: compositeId => this.getContextMenuActionsForComposite(compositeId), getDefaultCompositeId: () => this.viewDescriptorService.getDefaultViewContainer(this.location)!.id, hidePart: () => this.layoutService.setSideBarHidden(true), dndHandler: new CompositeDragAndDrop(this.viewDescriptorService, ViewContainerLocation.Sidebar, @@ -182,6 +179,31 @@ export class ActivitybarPart extends Part implements IActivityBarService { this.compositeBar.focus(); } + private getContextMenuActionsForComposite(compositeId: string): Action[] { + const viewContainer = this.viewDescriptorService.getViewContainerById(compositeId)!; + + const actions = []; + const defaultLocation = this.viewDescriptorService.getDefaultViewContainerLocation(viewContainer)!; + if (defaultLocation !== this.viewDescriptorService.getViewContainerLocation(viewContainer)) { + actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { + this.viewDescriptorService.moveViewContainerToLocation(viewContainer, defaultLocation); + })); + } else { + const viewContainerModel = this.viewDescriptorService.getViewContainerModel(viewContainer); + if (viewContainerModel.allViewDescriptors.length === 1) { + const viewToReset = viewContainerModel.allViewDescriptors[0]; + const defaultContainer = this.viewDescriptorService.getDefaultContainerById(viewToReset.id)!; + if (defaultContainer !== viewContainer) { + actions.push(new Action('resetLocationAction', nls.localize('resetLocation', "Reset Location"), undefined, true, async () => { + this.viewDescriptorService.moveViewsToContainer([viewToReset], defaultContainer); + })); + } + } + } + + return actions; + } + private registerListeners(): void { // View Container Changes @@ -483,15 +505,13 @@ export class ActivitybarPart extends Part implements IActivityBarService { cssClass: Codicon.settingsGear.classNames }); - if (getUserDataSyncStore(this.productService, this.configurationService)) { - this.accountsActivityAction = new ActivityAction({ - id: 'workbench.actions.accounts', - name: nls.localize('accounts', "Accounts"), - cssClass: Codicon.account.classNames - }); + this.accountsActivityAction = new ActivityAction({ + id: 'workbench.actions.accounts', + name: nls.localize('accounts', "Accounts"), + cssClass: Codicon.account.classNames + }); - this.globalActivityActionBar.push(this.accountsActivityAction); - } + this.globalActivityActionBar.push(this.accountsActivityAction); this.globalActivityActionBar.push(this.globalActivityAction); } diff --git a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css index e290c5145c..07134f2f47 100644 --- a/src/vs/workbench/browser/parts/activitybar/media/activityaction.css +++ b/src/vs/workbench/browser/parts/activitybar/media/activityaction.css @@ -51,7 +51,8 @@ .monaco-workbench .activitybar > .content > .composite-bar > .monaco-action-bar .action-item.top::before, .monaco-workbench .activitybar > .content > .composite-bar > .monaco-action-bar .action-item.bottom::after, -.monaco-workbench .activitybar > .content.dragged-over > .composite-bar > .monaco-action-bar .action-item:last-of-type::after { +.monaco-workbench .activitybar > .content.dragged-over-head > .composite-bar > .monaco-action-bar .action-item:first-of-type::before, +.monaco-workbench .activitybar > .content.dragged-over-tail > .composite-bar > .monaco-action-bar .action-item:last-of-type::after { background-color: var(--insert-border-color); } diff --git a/src/vs/workbench/browser/parts/compositeBar.ts b/src/vs/workbench/browser/parts/compositeBar.ts index 7d12b33004..a340e4e60d 100644 --- a/src/vs/workbench/browser/parts/compositeBar.ts +++ b/src/vs/workbench/browser/parts/compositeBar.ts @@ -22,7 +22,7 @@ import { Emitter } from 'vs/base/common/event'; import { ViewContainerLocation, IViewDescriptorService } from 'vs/workbench/common/views'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IComposite } from 'vs/workbench/common/composite'; -import { CompositeDragAndDropData, CompositeDragAndDropObserver, IDraggedCompositeData, ICompositeDragAndDrop, Before2D } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropData, CompositeDragAndDropObserver, IDraggedCompositeData, ICompositeDragAndDrop, Before2D, toggleDropEffect } from 'vs/workbench/browser/dnd'; export interface ICompositeBarItem { id: string; @@ -102,7 +102,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop { const items = this.getItems(); const before = this.targetContainerLocation === ViewContainerLocation.Panel ? before2d?.horizontallyBefore : before2d?.verticallyBefore; - return items.findIndex(o => o.id === targetId) + (before ? 0 : 1); + return items.filter(o => o.visible).findIndex(o => o.id === targetId) + (before ? 0 : 1); } private canDrop(data: CompositeDragAndDropData, targetCompositeId: string | undefined): boolean { @@ -122,7 +122,8 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop { const draggedViews = this.viewDescriptorService.getViewContainerModel(currentContainer)!.allViewDescriptors; // ... all views must be movable - return !draggedViews.some(v => !v.canMoveView); + // Prevent moving scm explicitly TODO@joaomoreno remove when scm is moveable + return !draggedViews.some(v => !v.canMoveView) && currentContainer.id !== 'workbench.view.scm'; } else { // Dragging an individual view const viewDescriptor = this.viewDescriptorService.getViewDescriptorById(dragData.id); @@ -230,38 +231,69 @@ export class CompositeBar extends Widget implements ICompositeBar { // Contextmenu for composites this._register(addDisposableListener(parent, EventType.CONTEXT_MENU, e => this.showContextMenu(e))); + let insertDropBefore: Before2D | undefined = undefined; // Register a drop target on the whole bar to prevent forbidden feedback this._register(CompositeDragAndDropObserver.INSTANCE.registerTarget(parent, { onDragOver: (e: IDraggedCompositeData) => { // don't add feedback if this is over the composite bar actions or there are no actions - if (!(this.compositeSwitcherBar?.length()) || (e.eventData.target && isAncestor(e.eventData.target as HTMLElement, actionBarDiv))) { - toggleClass(parent, 'dragged-over', false); + const visibleItems = this.getVisibleComposites(); + if (!visibleItems.length || (e.eventData.target && isAncestor(e.eventData.target as HTMLElement, actionBarDiv))) { + insertDropBefore = this.updateFromDragging(parent, false, false); return; } - const pinnedItems = this.getPinnedComposites(); - const validDropTarget = this.options.dndHandler.onDragOver(e.dragAndDropData, pinnedItems[pinnedItems.length - 1].id, e.eventData); - toggleClass(parent, 'dragged-over', validDropTarget); + const insertAtFront = this.insertAtFront(actionBarDiv, e.eventData); + const target = insertAtFront ? visibleItems[0] : visibleItems[visibleItems.length - 1]; + const validDropTarget = this.options.dndHandler.onDragOver(e.dragAndDropData, target.id, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', validDropTarget); + insertDropBefore = this.updateFromDragging(parent, validDropTarget, insertAtFront); }, onDragLeave: (e: IDraggedCompositeData) => { - toggleClass(parent, 'dragged-over', false); + insertDropBefore = this.updateFromDragging(parent, false, false); }, onDragEnd: (e: IDraggedCompositeData) => { - toggleClass(parent, 'dragged-over', false); + insertDropBefore = this.updateFromDragging(parent, false, false); }, onDrop: (e: IDraggedCompositeData) => { - const pinnedItems = this.getPinnedComposites(); - if (pinnedItems.length) { - this.options.dndHandler.drop(e.dragAndDropData, pinnedItems[pinnedItems.length - 1].id, e.eventData, { horizontallyBefore: false, verticallyBefore: false }); + const visibleItems = this.getVisibleComposites(); + if (visibleItems.length) { + const target = this.insertAtFront(actionBarDiv, e.eventData) ? visibleItems[0] : visibleItems[visibleItems.length - 1]; + this.options.dndHandler.drop(e.dragAndDropData, target.id, e.eventData, insertDropBefore); } - toggleClass(parent, 'dragged-over', false); + insertDropBefore = this.updateFromDragging(parent, false, false); } })); return actionBarDiv; } + private insertAtFront(element: HTMLElement, event: DragEvent): boolean { + const rect = element.getBoundingClientRect(); + const posX = event.clientX; + const posY = event.clientY; + + switch (this.options.orientation) { + case ActionsOrientation.HORIZONTAL: + case ActionsOrientation.HORIZONTAL_REVERSE: + return posX < rect.left; + case ActionsOrientation.VERTICAL: + case ActionsOrientation.VERTICAL_REVERSE: + return posY < rect.top; + } + } + + private updateFromDragging(element: HTMLElement, showFeedback: boolean, front: boolean): Before2D | undefined { + toggleClass(element, 'dragged-over-head', showFeedback && front); + toggleClass(element, 'dragged-over-tail', showFeedback && !front); + + if (!showFeedback) { + return undefined; + } + + return { verticallyBefore: front, horizontallyBefore: front }; + } + focus(): void { if (this.compositeSwitcherBar) { this.compositeSwitcherBar.focus(); @@ -284,9 +316,9 @@ export class CompositeBar extends Widget implements ICompositeBar { this.updateCompositeSwitcher(); } - addComposite({ id, name, order }: { id: string; name: string, order?: 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)) { + if (this.model.add(id, name, order, requestedIndex)) { this.computeSizes([this.model.findItem(id)]); this.updateCompositeSwitcher(); } @@ -674,17 +706,9 @@ class CompositeBarModel { this._items = result; } - this.updateItemsOrder(); return hasChanges; } - - private updateItemsOrder(): void { - if (this._items) { - this.items.forEach((item, index) => { if (item.order !== undefined) { item.order = index; } }); - } - } - get visibleItems(): ICompositeBarModelItem[] { return this.items.filter(item => item.visible); } @@ -707,7 +731,7 @@ class CompositeBarModel { }; } - add(id: string, name: string, order: number | undefined): boolean { + add(id: string, name: string, order: number | undefined, requestedIndex: number | undefined): boolean { const item = this.findItem(id); if (item) { let changed = false; @@ -721,11 +745,20 @@ class CompositeBarModel { changed = true; } - this.updateItemsOrder(); return changed; } else { const item = this.createCompositeBarItem(id, name, order, true, true); - if (isUndefinedOrNull(order)) { + if (!isUndefinedOrNull(requestedIndex)) { + let index = 0; + let rIndex = requestedIndex; + while (rIndex > 0 && index < this.items.length) { + if (this.items[index++].visible) { + rIndex--; + } + } + + this.items.splice(index, 0, item); + } else if (isUndefinedOrNull(order)) { this.items.push(item); } else { let index = 0; @@ -735,7 +768,6 @@ class CompositeBarModel { this.items.splice(index, 0, item); } - this.updateItemsOrder(); return true; } } @@ -744,7 +776,6 @@ class CompositeBarModel { for (let index = 0; index < this.items.length; index++) { if (this.items[index].id === id) { this.items.splice(index, 1); - this.updateItemsOrder(); return true; } } @@ -780,8 +811,6 @@ class CompositeBarModel { // Make sure a moved composite gets pinned sourceItem.pinned = true; - this.updateItemsOrder(); - return true; } diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 2d35325281..9c07b50ac4 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -18,7 +18,7 @@ import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IActivity } from 'vs/workbench/common/activity'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Emitter, Event } from 'vs/base/common/event'; -import { CompositeDragAndDropObserver, ICompositeDragAndDrop, Before2D } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropObserver, ICompositeDragAndDrop, Before2D, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { Color } from 'vs/base/common/color'; import { Codicon } from 'vs/base/common/codicons'; @@ -522,6 +522,7 @@ export class CompositeActionViewItem extends ActivityActionViewItem { this._register(CompositeDragAndDropObserver.INSTANCE.registerDraggable(this.container, () => { return { type: 'composite', id: this.activity.id }; }, { onDragOver: e => { const isValidMove = e.dragAndDropData.getData().id !== this.activity.id && this.dndHandler.onDragOver(e.dragAndDropData, this.activity.id, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', isValidMove); insertDropBefore = this.updateFromDragging(container, isValidMove, e.eventData); }, diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 226038a510..f8bac2a9f8 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -16,8 +16,7 @@ import { Event } from 'vs/base/common/event'; import { isEmptyObject } from 'vs/base/common/types'; import { DEFAULT_EDITOR_MIN_DIMENSIONS, DEFAULT_EDITOR_MAX_DIMENSIONS } from 'vs/workbench/browser/parts/editor/editor'; import { MementoObject } from 'vs/workbench/common/memento'; -import { isEqualOrParent, joinPath } from 'vs/base/common/resources'; -import { isLinux } from 'vs/base/common/platform'; +import { joinPath, IExtUri } from 'vs/base/common/resources'; import { indexOfPath } from 'vs/base/common/extpath'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -28,9 +27,17 @@ import { IDisposable } from 'vs/base/common/lifecycle'; * information about the state of the editor data. * * The workbench will keep an editor alive after it has been created and show/hide it based on - * user interaction. The lifecycle of a editor goes in the order create(), setVisible(true|false), - * layout(), setInput(), focus(), dispose(). During use of the workbench, a editor will often receive a - * clearInput, setVisible, layout and focus call, but only one create and dispose call. + * user interaction. The lifecycle of a editor goes in the order: + * + * - `createEditor()` + * - `setEditorVisible()` + * - `layout()` + * - `setInput()` + * - `focus()` + * - `dispose()`: when the editor group the editor is in closes + * + * During use of the workbench, a editor will often receive a `clearInput()`, `setEditorVisible()`, `layout()` and + * `focus()` calls, but only one `create()` and `dispose()` call. * * This class is only intended to be subclassed and not instantiated. */ @@ -38,10 +45,10 @@ export abstract class BaseEditor extends Composite implements IEditorPane { private static readonly EDITOR_MEMENTOS = new Map>(); - readonly minimumWidth = DEFAULT_EDITOR_MIN_DIMENSIONS.width; - readonly maximumWidth = DEFAULT_EDITOR_MAX_DIMENSIONS.width; - readonly minimumHeight = DEFAULT_EDITOR_MIN_DIMENSIONS.height; - readonly maximumHeight = DEFAULT_EDITOR_MAX_DIMENSIONS.height; + get minimumWidth() { return DEFAULT_EDITOR_MIN_DIMENSIONS.width; } + get maximumWidth() { return DEFAULT_EDITOR_MAX_DIMENSIONS.width; } + get minimumHeight() { return DEFAULT_EDITOR_MIN_DIMENSIONS.height; } + get maximumHeight() { return DEFAULT_EDITOR_MAX_DIMENSIONS.height; } readonly onDidSizeConstraintsChange = Event.None; @@ -63,12 +70,24 @@ export abstract class BaseEditor extends Composite implements IEditorPane { super(id, telemetryService, themeService, storageService); } + create(parent: HTMLElement): void { + super.create(parent); + + // Create Editor + this.createEditor(parent); + } + + /** + * Called to create the editor in the parent HTMLElement. + */ + protected abstract createEditor(parent: HTMLElement): void; + /** * Note: Clients should not call this method, the workbench calls this * method. Calling it otherwise may result in unexpected behavior. * * Sets the given input with the options to the editor. The input is guaranteed - * to be different from the previous input that was set using the input.matches() + * to be different from the previous input that was set using the `input.matches()` * method. * * The provided cancellation token should be used to test if the operation @@ -99,18 +118,6 @@ export abstract class BaseEditor extends Composite implements IEditorPane { this._options = options; } - create(parent: HTMLElement): void { - super.create(parent); - - // Create Editor - this.createEditor(parent); - } - - /** - * Called to create the editor in the parent HTMLElement. - */ - protected abstract createEditor(parent: HTMLElement): void; - setVisible(visible: boolean, group?: IEditorGroup): void { super.setVisible(visible); @@ -252,6 +259,10 @@ export class EditorMemento implements IEditorMemento { const resourceViewState = cache.get(resource.toString()); if (resourceViewState) { delete resourceViewState[group.id]; + + if (isEmptyObject(resourceViewState)) { + cache.delete(resource.toString()); + } } } else { cache.delete(resource.toString()); @@ -259,7 +270,7 @@ export class EditorMemento implements IEditorMemento { } } - moveEditorState(source: URI, target: URI): void { + moveEditorState(source: URI, target: URI, comparer: IExtUri): void { const cache = this.doLoad(); // We need a copy of the keys to not iterate over @@ -268,7 +279,7 @@ export class EditorMemento implements IEditorMemento { for (const cacheKey of cacheKeys) { const resource = URI.parse(cacheKey); - if (!isEqualOrParent(resource, source)) { + if (!comparer.isEqualOrParent(resource, source)) { continue; // not matching our resource } @@ -277,7 +288,7 @@ export class EditorMemento implements IEditorMemento { if (source.toString() === resource.toString()) { targetResource = target; // file got moved } else { - const index = indexOfPath(resource.path, source.path, !isLinux); + const index = indexOfPath(resource.path, source.path); targetResource = joinPath(target, resource.path.substr(index + source.path.length + 1)); // parent folder got moved } diff --git a/src/vs/workbench/browser/parts/editor/binaryEditor.ts b/src/vs/workbench/browser/parts/editor/binaryEditor.ts index c0a95d4ed9..9d39bf3b10 100644 --- a/src/vs/workbench/browser/parts/editor/binaryEditor.ts +++ b/src/vs/workbench/browser/parts/editor/binaryEditor.ts @@ -20,6 +20,7 @@ import { dispose, IDisposable, Disposable, DisposableStore } from 'vs/base/commo import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { assertIsDefined, assertAllDefined } from 'vs/base/common/types'; +import { BinarySize } from 'vs/platform/files/common/files'; export interface IOpenCallbacks { openInternal: (input: EditorInput, options: EditorOptions | undefined) => Promise; @@ -169,33 +170,6 @@ export interface IResourceDescriptor { readonly mime: string; } -class BinarySize { - static readonly KB = 1024; - static readonly MB = BinarySize.KB * BinarySize.KB; - static readonly GB = BinarySize.MB * BinarySize.KB; - static readonly TB = BinarySize.GB * BinarySize.KB; - - static formatSize(size: number): string { - if (size < BinarySize.KB) { - return nls.localize('sizeB', "{0}B", size); - } - - if (size < BinarySize.MB) { - return nls.localize('sizeKB', "{0}KB", (size / BinarySize.KB).toFixed(2)); - } - - if (size < BinarySize.GB) { - return nls.localize('sizeMB', "{0}MB", (size / BinarySize.MB).toFixed(2)); - } - - if (size < BinarySize.TB) { - return nls.localize('sizeGB', "{0}GB", (size / BinarySize.GB).toFixed(2)); - } - - return nls.localize('sizeTB', "{0}TB", (size / BinarySize.TB).toFixed(2)); - } -} - interface ResourceViewerContext extends IDisposable { layout?(dimension: Dimension): void; } diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbs.ts b/src/vs/workbench/browser/parts/editor/breadcrumbs.ts index 1364e8cd20..feb9d2a55e 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbs.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbs.ts @@ -19,7 +19,7 @@ export const IBreadcrumbsService = createDecorator('IEditor export interface IBreadcrumbsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; register(group: GroupIdentifier, widget: BreadcrumbsWidget): IDisposable; @@ -29,7 +29,7 @@ export interface IBreadcrumbsService { export class BreadcrumbsService implements IBreadcrumbsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _map = new Map(); diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index b275012604..15da2a226b 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -38,7 +38,7 @@ import { ResourceLabel } from 'vs/workbench/browser/labels'; import { BreadcrumbsConfig, IBreadcrumbsService } from 'vs/workbench/browser/parts/editor/breadcrumbs'; import { BreadcrumbElement, EditorBreadcrumbsModel, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel'; import { BreadcrumbsPicker, createBreadcrumbsPicker } from 'vs/workbench/browser/parts/editor/breadcrumbsPicker'; -import { SideBySideEditorInput, IEditorPartOptions } from 'vs/workbench/common/editor'; +import { IEditorPartOptions, toResource, 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'; @@ -234,12 +234,9 @@ export class BreadcrumbsControl { this._breadcrumbsDisposables.clear(); // honor diff editors and such - let input = this._editorGroup.activeEditor; - if (input instanceof SideBySideEditorInput) { - input = input.master; - } + const uri = toResource(this._editorGroup.activeEditor, { supportSideBySide: SideBySideEditor.MASTER }); - if (!input || !input.resource || !this._fileService.canHandleResource(input.resource!)) { + if (!uri || !this._fileService.canHandleResource(uri)) { // cleanup and return when there is no input or when // we cannot handle this input this._ckBreadcrumbsPossible.set(false); @@ -255,7 +252,6 @@ export class BreadcrumbsControl { this._ckBreadcrumbsVisible.set(true); this._ckBreadcrumbsPossible.set(true); - const uri = input.resource; const editor = this._getActiveCodeEditor(); const model = new EditorBreadcrumbsModel( uri, editor, diff --git a/src/vs/workbench/browser/parts/editor/editor.contribution.ts b/src/vs/workbench/browser/parts/editor/editor.contribution.ts index 8200bdc682..ce93bca933 100644 --- a/src/vs/workbench/browser/parts/editor/editor.contribution.ts +++ b/src/vs/workbench/browser/parts/editor/editor.contribution.ts @@ -48,7 +48,6 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { toLocalResource } from 'vs/base/common/resources'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { withNullAsUndefined } from 'vs/base/common/types'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { EditorAutoSave } from 'vs/workbench/browser/parts/editor/editorAutoSave'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -119,12 +118,12 @@ class UntitledTextEditorInputFactory implements IEditorInputFactory { ) { } canSerialize(editorInput: EditorInput): boolean { - return this.filesConfigurationService.isHotExitEnabled; + return this.filesConfigurationService.isHotExitEnabled && !editorInput.isDisposed(); } serialize(editorInput: EditorInput): string | undefined { - if (!this.filesConfigurationService.isHotExitEnabled) { - return undefined; // never restore untitled unless hot exit is enabled + if (!this.filesConfigurationService.isHotExitEnabled || editorInput.isDisposed()) { + return undefined; } const untitledTextEditorInput = editorInput; @@ -169,9 +168,10 @@ class UntitledTextEditorInputFactory implements IEditorInputFactory { Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(UntitledTextEditorInput.ID, UntitledTextEditorInputFactory); +// Register SideBySide/DiffEditor Input Factory interface ISerializedSideBySideEditorInput { name: string; - description: string; + description: string | undefined; detailsSerialized: string; masterSerialized: string; @@ -180,16 +180,19 @@ interface ISerializedSideBySideEditorInput { masterTypeId: string; } -// Register Side by Side Editor Input Factory -class SideBySideEditorInputFactory implements IEditorInputFactory { +export abstract class AbstractSideBySideEditorInputFactory implements IEditorInputFactory { + + private getInputFactories(detailsId: string, masterId: string): [IEditorInputFactory | undefined, IEditorInputFactory | undefined] { + const registry = Registry.as(EditorInputExtensions.EditorInputFactories); + + return [registry.getEditorInputFactory(detailsId), registry.getEditorInputFactory(masterId)]; + } canSerialize(editorInput: EditorInput): boolean { - const input = editorInput; + const input = editorInput as SideBySideEditorInput | DiffEditorInput; if (input.details && input.master) { - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId()); - const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId()); + const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId()); return !!(detailsInputFactory?.canSerialize(input.details) && masterInputFactory?.canSerialize(input.master)); } @@ -198,26 +201,25 @@ class SideBySideEditorInputFactory implements IEditorInputFactory { } serialize(editorInput: EditorInput): string | undefined { - const input = editorInput; + const input = editorInput as SideBySideEditorInput | DiffEditorInput; if (input.details && input.master) { - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId()); - const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId()); - + const [detailsInputFactory, masterInputFactory] = this.getInputFactories(input.details.getTypeId(), input.master.getTypeId()); if (detailsInputFactory && masterInputFactory) { const detailsSerialized = detailsInputFactory.serialize(input.details); const masterSerialized = masterInputFactory.serialize(input.master); if (detailsSerialized && masterSerialized) { - return JSON.stringify({ + const serializedEditorInput: ISerializedSideBySideEditorInput = { name: input.getName(), description: input.getDescription(), detailsSerialized, masterSerialized, detailsTypeId: input.details.getTypeId(), masterTypeId: input.master.getTypeId() - }); + }; + + return JSON.stringify(serializedEditorInput); } } } @@ -228,24 +230,38 @@ class SideBySideEditorInputFactory implements IEditorInputFactory { deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined { const deserialized: ISerializedSideBySideEditorInput = JSON.parse(serializedEditorInput); - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(deserialized.detailsTypeId); - const masterInputFactory = registry.getEditorInputFactory(deserialized.masterTypeId); - + const [detailsInputFactory, masterInputFactory] = this.getInputFactories(deserialized.detailsTypeId, deserialized.masterTypeId); if (detailsInputFactory && masterInputFactory) { const detailsInput = detailsInputFactory.deserialize(instantiationService, deserialized.detailsSerialized); const masterInput = masterInputFactory.deserialize(instantiationService, deserialized.masterSerialized); if (detailsInput && masterInput) { - return new SideBySideEditorInput(deserialized.name, withNullAsUndefined(deserialized.description), detailsInput, masterInput); + return this.createEditorInput(deserialized.name, deserialized.description, detailsInput, masterInput); } } return undefined; } + + protected abstract createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput; +} + +class SideBySideEditorInputFactory extends AbstractSideBySideEditorInputFactory { + + protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { + return new SideBySideEditorInput(name, description, detailsInput, masterInput); + } +} + +class DiffEditorInputFactory extends AbstractSideBySideEditorInputFactory { + + protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { + return new DiffEditorInput(name, description, detailsInput, masterInput); + } } Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(SideBySideEditorInput.ID, SideBySideEditorInputFactory); +Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory(DiffEditorInput.ID, DiffEditorInputFactory); // Register Editor Contributions registerEditorContribution(OpenWorkspaceButtonContribution.ID, OpenWorkspaceButtonContribution); diff --git a/src/vs/workbench/browser/parts/editor/editor.ts b/src/vs/workbench/browser/parts/editor/editor.ts index 266c4c9638..48b7672d0a 100644 --- a/src/vs/workbench/browser/parts/editor/editor.ts +++ b/src/vs/workbench/browser/parts/editor/editor.ts @@ -9,12 +9,12 @@ import { IEditorGroup, GroupDirection, IAddGroupOptions, IMergeGroupOptions, Gro import { IDisposable } from 'vs/base/common/lifecycle'; import { Dimension } from 'vs/base/browser/dom'; import { Event } from 'vs/base/common/event'; -import { IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; +import { IConfigurationChangeEvent, IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ISerializableView } from 'vs/base/browser/ui/grid/grid'; import { getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorService, IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService'; -import { localize } from 'vs/nls'; export const EDITOR_TITLE_HEIGHT = 35; @@ -33,49 +33,27 @@ export const DEFAULT_EDITOR_PART_OPTIONS: IEditorPartOptions = { titleScrollbarSizing: 'default', focusRecentEditorAfterClose: true, showIcons: true, + hasIcons: true, // 'vs-seti' is our default icon theme enablePreview: true, openPositioning: 'right', openSideBySideDirection: 'right', closeEmptyGroups: true, labelFormat: 'default', - iconTheme: 'vs-seti', splitSizing: 'distribute' }; -export function computeEditorAriaLabel(input: IEditorInput, index: number | undefined, group: IEditorGroup | undefined, groupCount: number): string { - let ariaLabel = input.getAriaLabel(); - if (group && !group.isPinned(input)) { - ariaLabel = localize('preview', "{0}, preview", ariaLabel); - } - - if (group && group.isSticky(index ?? input)) { - ariaLabel = localize('pinned', "{0}, pinned", ariaLabel); - } - - // Apply group information to help identify in - // which group we are (only if more than one group - // is actually opened) - if (group && groupCount > 1) { - ariaLabel = `${ariaLabel}, ${group.ariaLabel}`; - } - - return ariaLabel; -} - export function impactsEditorPartOptions(event: IConfigurationChangeEvent): boolean { return event.affectsConfiguration('workbench.editor') || event.affectsConfiguration('workbench.iconTheme'); } -export function getEditorPartOptions(config: IWorkbenchEditorConfiguration): IEditorPartOptions { - const options = { ...DEFAULT_EDITOR_PART_OPTIONS }; +export function getEditorPartOptions(configurationService: IConfigurationService, themeService: IThemeService): IEditorPartOptions { + const options = { + ...DEFAULT_EDITOR_PART_OPTIONS, + hasIcons: themeService.getFileIconTheme().hasFileIcons + }; - if (!config || !config.workbench) { - return options; - } - - options.iconTheme = config.workbench.iconTheme; - - if (config.workbench.editor) { + const config = configurationService.getValue(); + if (config?.workbench?.editor) { Object.assign(options, config.workbench.editor); } @@ -101,7 +79,7 @@ export interface IEditorOpeningEvent extends IEditorIdentifier { * to return a promise that resolves to `undefined` to prevent the opening * alltogether. */ - prevent(callback: () => undefined | Promise): void; + prevent(callback: () => Promise | undefined): void; } export interface IEditorGroupsAccessor { diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index 2e15712fc9..06a305d437 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -491,27 +491,26 @@ export class CloseLeftEditorsInGroupAction extends Action { constructor( id: string, label: string, - @IEditorService private readonly editorService: IEditorService, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService ) { super(id, label); } async run(context?: IEditorIdentifier): Promise { - const { group, editor } = getTarget(this.editorService, this.editorGroupService, context); + const { group, editor } = this.getTarget(context); if (group && editor) { return group.closeEditors({ direction: CloseDirection.LEFT, except: editor, excludeSticky: true }); } } -} -function getTarget(editorService: IEditorService, editorGroupService: IEditorGroupsService, context?: IEditorIdentifier): { editor: IEditorInput | null, group: IEditorGroup | undefined } { - if (context) { - return { editor: context.editor, group: editorGroupService.getGroup(context.groupId) }; + private getTarget(context?: IEditorIdentifier): { editor: IEditorInput | null, group: IEditorGroup | undefined } { + if (context) { + return { editor: context.editor, group: this.editorGroupService.getGroup(context.groupId) }; + } + + // Fallback to active group + return { group: this.editorGroupService.activeGroup, editor: this.editorGroupService.activeGroup.activeEditor }; } - - // Fallback to active group - return { group: editorGroupService.activeGroup, editor: editorGroupService.activeGroup.activeEditor }; } abstract class BaseCloseAllAction extends Action { diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index 07c0e4b26d..37293071d5 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -650,7 +650,7 @@ function registerCloseEditorCommands() { id: PIN_EDITOR_COMMAND_ID, weight: KeybindingWeight.WorkbenchContrib, when: ContextKeyExpr.and(EditorStickyContext.toNegated(), ContextKeyExpr.has('config.workbench.editor.showTabs')), - primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.Enter), + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.Shift | KeyCode.Enter), handler: async (accessor, resourceOrContext: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { const editorGroupService = accessor.get(IEditorGroupsService); @@ -665,7 +665,7 @@ function registerCloseEditorCommands() { id: UNPIN_EDITOR_COMMAND_ID, weight: KeybindingWeight.WorkbenchContrib, when: ContextKeyExpr.and(EditorStickyContext, ContextKeyExpr.has('config.workbench.editor.showTabs')), - primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.Enter), + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.Shift | KeyCode.Enter), handler: async (accessor, resourceOrContext: URI | IEditorCommandsContext, context?: IEditorCommandsContext) => { const editorGroupService = accessor.get(IEditorGroupsService); diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index 4942e6c61d..d1ee691e00 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -41,18 +41,16 @@ export class EditorControl extends Disposable { private readonly activeEditorPaneDisposables = this._register(new DisposableStore()); private dimension: Dimension | undefined; - private editorOperation: LongRunningOperation; + private readonly editorOperation = this._register(new LongRunningOperation(this.editorProgressService)); constructor( private parent: HTMLElement, private groupView: IEditorGroupView, @IWorkbenchLayoutService private readonly layoutService: IWorkbenchLayoutService, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IEditorProgressService editorProgressService: IEditorProgressService + @IEditorProgressService private readonly editorProgressService: IEditorProgressService ) { super(); - - this.editorOperation = this._register(new LongRunningOperation(editorProgressService)); } async openEditor(editor: EditorInput, options?: EditorOptions): Promise { @@ -224,16 +222,12 @@ export class EditorControl extends Disposable { } setVisible(visible: boolean): void { - if (this._activeEditorPane) { - this._activeEditorPane.setVisible(visible, this.groupView); - } + this._activeEditorPane?.setVisible(visible, this.groupView); } layout(dimension: Dimension): void { this.dimension = dimension; - if (this._activeEditorPane && this.dimension) { - this._activeEditorPane.layout(this.dimension); - } + this._activeEditorPane?.layout(dimension); } } diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index 2b316504fd..4ea7a7d0e7 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -525,17 +525,23 @@ export class EditorGroupView extends Themable implements IEditorGroupView { const editor = event.editor; const editorsToClose = [editor]; - // Include both sides of side by side editors when being closed and not opened multiple times - if (editor instanceof SideBySideEditorInput && !this.accessor.groups.some(groupView => groupView.group.contains(editor))) { + // Include both sides of side by side editors when being closed + if (editor instanceof SideBySideEditorInput) { editorsToClose.push(editor.master, editor.details); } - // Dispose the editor when it is no longer open in any group including diff editors - editorsToClose.forEach(editorToClose => { - if (!this.accessor.groups.some(groupView => groupView.group.contains(editorToClose, true /* include side by side editor master & details */))) { - editorToClose.dispose(); + // For each editor to close, we call dispose() to free up any resources. + // However, certain editors might be shared across multiple editor groups + // (including being visible in side by side / diff editors) and as such we + // only dispose when they are not opened elsewhere. + for (const editor of editorsToClose) { + if (!this.accessor.groups.some(groupView => groupView.group.contains(editor, { + strictEquals: true, // only if this input is not shared across editor groups + supportSideBySide: true // include side by side editor master & details + }))) { + editor.dispose(); } - }); + } /* __GDPR__ "editorClosed" : { @@ -1162,12 +1168,13 @@ export class EditorGroupView extends Themable implements IEditorGroupView { private doMoveOrCopyEditorAcrossGroups(editor: EditorInput, target: IEditorGroupView, moveOptions: IMoveEditorOptions = Object.create(null), keepCopy?: boolean): void { - // When moving an editor, try to preserve as much view state as possible by checking - // for the editor to be a text editor and creating the options accordingly if so + // When moving/copying an editor, try to preserve as much view state as possible + // by checking for the editor to be a text editor and creating the options accordingly + // if so const options = getActiveTextEditorOptions(this, editor, EditorOptions.create({ ...moveOptions, - pinned: true, // always pin moved editor - sticky: this._group.isSticky(editor) // preserve sticky state + pinned: true, // always pin moved editor + sticky: !keepCopy && this._group.isSticky(editor) // preserve sticky state only if editor is moved (https://github.com/microsoft/vscode/issues/99035) })); // A move to another group is an open first... @@ -1509,7 +1516,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } // Forward to title control - this.titleAreaControl.closeEditors(editors); + if (editors.length) { + this.titleAreaControl.closeEditors(editors); + } } //#endregion @@ -1557,7 +1566,9 @@ export class EditorGroupView extends Themable implements IEditorGroupView { } // Forward to title control - this.titleAreaControl.closeEditors(editorsToClose); + if (editorsToClose.length) { + this.titleAreaControl.closeEditors(editorsToClose); + } } //#endregion diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index bea7c1520d..719bb02903 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -6,13 +6,13 @@ import 'vs/workbench/browser/parts/editor/editor.contribution'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Part } from 'vs/workbench/browser/part'; -import { Dimension, isAncestor, toggleClass, addClass, $, EventHelper } from 'vs/base/browser/dom'; +import { Dimension, isAncestor, toggleClass, addClass, $, EventHelper, addDisposableGenericMouseDownListner } from 'vs/base/browser/dom'; import { Event, Emitter, Relay } from 'vs/base/common/event'; import { contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, ICopyEditorOptions, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IView, orthogonal, LayoutPriority, IViewSize, Direction, SerializableGrid, Sizing, ISerializedGrid, Orientation, GridBranchNode, isGridBranchNode, GridNode, createSerializedGrid, Grid } from 'vs/base/browser/ui/grid/grid'; -import { GroupIdentifier, IWorkbenchEditorConfiguration, IEditorPartOptions, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; +import { GroupIdentifier, IEditorPartOptions, IEditorPartOptionsChangeEvent } from 'vs/workbench/common/editor'; import { EDITOR_GROUP_BORDER, EDITOR_PANE_BACKGROUND } from 'vs/workbench/common/theme'; import { distinct, coalesce } from 'vs/base/common/arrays'; import { IEditorGroupsAccessor, IEditorGroupView, getEditorPartOptions, impactsEditorPartOptions, IEditorPartCreationOptions } from 'vs/workbench/browser/parts/editor/editor'; @@ -82,7 +82,7 @@ class GridWidgetView implements IView { export class EditorPart extends Part implements IEditorGroupsService, IEditorGroupsAccessor { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly EDITOR_PART_UI_STATE_STORAGE_KEY = 'editorpart.state'; private static readonly EDITOR_PART_CENTERED_VIEW_STORAGE_KEY = 'editorpart.centeredview'; @@ -123,8 +123,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private readonly workspaceMemento: MementoObject; private readonly globalMemento: MementoObject; - private _partOptions: IEditorPartOptions; - private readonly groupViews = new Map(); private mostRecentActiveGroups: GroupIdentifier[] = []; @@ -149,8 +147,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro this.gridWidgetView = new GridWidgetView(); - this._partOptions = getEditorPartOptions(this.configurationService.getValue()); - this.workspaceMemento = this.getMemento(StorageScope.WORKSPACE); this.globalMemento = this.getMemento(StorageScope.GLOBAL); @@ -161,6 +157,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private registerListeners(): void { this._register(this.configurationService.onDidChangeConfiguration(e => this.onConfigurationUpdated(e))); + this._register(this.themeService.onDidFileIconThemeChange(() => this.handleChangedPartOptions())); } private onConfigurationUpdated(event: IConfigurationChangeEvent): void { @@ -171,7 +168,7 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private handleChangedPartOptions(): void { const oldPartOptions = this._partOptions; - const newPartOptions = getEditorPartOptions(this.configurationService.getValue()); + const newPartOptions = getEditorPartOptions(this.configurationService, this.themeService); this.enforcedPartOptions.forEach(enforcedPartOptions => { Object.assign(newPartOptions, enforcedPartOptions); // check for overrides @@ -186,9 +183,8 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro private enforcedPartOptions: IEditorPartOptions[] = []; - get partOptions(): IEditorPartOptions { - return this._partOptions; - } + private _partOptions = getEditorPartOptions(this.configurationService, this.themeService); + get partOptions(): IEditorPartOptions { return this._partOptions; } enforcePartOptions(options: IEditorPartOptions): IDisposable { this.enforcedPartOptions.push(options); @@ -747,12 +743,13 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro let index = (options && typeof options.index === 'number') ? options.index : targetView.count; sourceView.editors.forEach(editor => { const inactive = !sourceView.isActive(editor) || this._activeGroup !== sourceView; - const copyOptions: ICopyEditorOptions = { index, inactive, preserveFocus: inactive }; + const sticky = sourceView.isSticky(editor); + const editorOptions = { index: !sticky ? index : undefined /* do not set index to preserve sticky flag */, inactive, preserveFocus: inactive }; if (options?.mode === MergeGroupMode.COPY_EDITORS) { - sourceView.copyEditor(editor, targetView, copyOptions); + sourceView.copyEditor(editor, targetView, editorOptions); } else { - sourceView.moveEditor(editor, targetView, copyOptions); + sourceView.moveEditor(editor, targetView, editorOptions); } index++; @@ -830,6 +827,11 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro addClass(overlay, 'drop-block-overlay'); parent.appendChild(overlay); + // Hide the block if a mouse down event occurs #99065 + this._register(addDisposableGenericMouseDownListner(overlay, e => { + toggleClass(overlay, 'visible', false); + })); + this._register(CompositeDragAndDropObserver.INSTANCE.registerTarget(this.element, { onDragStart: e => { toggleClass(overlay, 'visible', true); diff --git a/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css b/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css index ad1969b82c..20462dc553 100644 --- a/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css +++ b/src/vs/workbench/browser/parts/editor/media/tabstitlecontrol.css @@ -62,8 +62,8 @@ padding-left: 10px; } -.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-shrink.has-icon-theme.close-button-right, -.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-shrink.has-icon-theme.close-button-off:not(.sticky) { +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-shrink.has-icon.close-button-right, +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sizing-shrink.has-icon.close-button-off:not(.sticky) { padding-left: 5px; /* reduce padding when we show icons and are in shrinking mode and tab close button is not left (unless sticky) */ } @@ -198,7 +198,7 @@ opacity: 0; /* when tab has the focus this shade breaks the tab border (fixes https://github.com/Microsoft/vscode/issues/57819) */ } -.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sticky:not(.has-icon-theme) .monaco-icon-label { +.monaco-workbench .part.editor > .content .editor-group-container > .title .tabs-container > .tab.sticky:not(.has-icon) .monaco-icon-label { text-align: center; /* ensure that sticky tabs without icon have label centered */ } diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index c6f8b82de6..e5a6596ae4 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/tabstitlecontrol'; import { isMacintosh, isWindows } from 'vs/base/common/platform'; import { shorten } from 'vs/base/common/labels'; -import { toResource, GroupIdentifier, IEditorInput, Verbosity, EditorCommandsContextActionRunner, IEditorPartOptions, SideBySideEditor } from 'vs/workbench/common/editor'; +import { toResource, GroupIdentifier, IEditorInput, Verbosity, EditorCommandsContextActionRunner, IEditorPartOptions, SideBySideEditor, computeEditorAriaLabel } from 'vs/workbench/common/editor'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { EventType as TouchEventType, GestureEvent, Gesture } from 'vs/base/browser/touch'; import { KeyCode } from 'vs/base/common/keyCodes'; @@ -34,7 +34,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { MergeGroupMode, IMergeGroupOptions, GroupsArrangement, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { addClass, addDisposableListener, hasClass, EventType, EventHelper, removeClass, Dimension, scheduleAtNextAnimationFrame, findParentWithClass, clearNode } from 'vs/base/browser/dom'; import { localize } from 'vs/nls'; -import { IEditorGroupsAccessor, IEditorGroupView, EditorServiceImpl, EDITOR_TITLE_HEIGHT, computeEditorAriaLabel } from 'vs/workbench/browser/parts/editor/editor'; +import { IEditorGroupsAccessor, IEditorGroupView, EditorServiceImpl, EDITOR_TITLE_HEIGHT } from 'vs/workbench/browser/parts/editor/editor'; import { CloseOneEditorAction } from 'vs/workbench/browser/parts/editor/editorActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { BreadcrumbsControl } from 'vs/workbench/browser/parts/editor/breadcrumbsControl'; @@ -393,6 +393,9 @@ export class TabsTitleControl extends TitleControl { closeEditors(editors: IEditorInput[]): void { this.handleClosedEditors(); + if (this.group.count === 0) { + this.updateBreadcrumbsControl(); + } } private handleClosedEditors(): void { @@ -430,9 +433,6 @@ export class TabsTitleControl extends TitleControl { this.clearEditorActionsToolbar(); } - - // Update Breadcrumbs - this.updateBreadcrumbsControl(); } moveEditor(editor: IEditorInput, fromIndex: number, targetIndex: number): void { @@ -527,7 +527,7 @@ export class TabsTitleControl extends TitleControl { oldOptions.tabCloseButton !== newOptions.tabCloseButton || oldOptions.tabSizing !== newOptions.tabSizing || oldOptions.showIcons !== newOptions.showIcons || - oldOptions.iconTheme !== newOptions.iconTheme || + oldOptions.hasIcons !== newOptions.hasIcons || oldOptions.highlightModifiedTabs !== newOptions.highlightModifiedTabs ) { this.redraw(); @@ -1045,10 +1045,10 @@ export class TabsTitleControl extends TitleControl { domAction(tabContainer, `sizing-${option}`); }); - if (options.showIcons && !!options.iconTheme) { - addClass(tabContainer, 'has-icon-theme'); + if (options.showIcons && options.hasIcons) { + addClass(tabContainer, 'has-icon'); } else { - removeClass(tabContainer, 'has-icon-theme'); + removeClass(tabContainer, 'has-icon'); } // Sticky Tabs need a position to remain at their location @@ -1074,7 +1074,7 @@ export class TabsTitleControl extends TitleControl { let name: string | undefined; let description: string; if (isTabSticky) { - const isShowingIcons = this.accessor.partOptions.showIcons && !!this.accessor.partOptions.iconTheme; + const isShowingIcons = this.accessor.partOptions.showIcons && this.accessor.partOptions.hasIcons; name = isShowingIcons ? '' : tabLabel.name?.charAt(0).toUpperCase(); description = ''; } else { diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index 8de98e8f6d..f505e0b257 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -9,7 +9,7 @@ import { isFunction, isObject, isArray, assertIsDefined } from 'vs/base/common/t import { IDiffEditor } from 'vs/editor/browser/editorBrowser'; import { IDiffEditorOptions, IEditorOptions as ICodeEditorOptions } from 'vs/editor/common/config/editorOptions'; import { BaseTextEditor, IEditorConfiguration } from 'vs/workbench/browser/parts/editor/textEditor'; -import { TextEditorOptions, EditorInput, EditorOptions, TEXT_DIFF_EDITOR_ID, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, ITextDiffEditorPane, IEditorMemento } from 'vs/workbench/common/editor'; +import { TextEditorOptions, EditorInput, EditorOptions, TEXT_DIFF_EDITOR_ID, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, ITextDiffEditorPane, IEditorInput } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { DiffNavigator } from 'vs/editor/browser/widget/diffNavigator'; import { DiffEditorWidget } from 'vs/editor/browser/widget/diffEditorWidget'; @@ -28,7 +28,6 @@ import { Event } from 'vs/base/common/event'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { EditorMemento } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorActivation, IEditorOptions } from 'vs/platform/editor/common/editor'; /** @@ -55,8 +54,12 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan super(TextDiffEditor.ID, telemetryService, instantiationService, storageService, configurationService, themeService, editorService, editorGroupService); } - protected getEditorMemento(editorGroupService: IEditorGroupsService, key: string, limit: number = 10): IEditorMemento { - return new EditorMemento(this.getId(), key, Object.create(null), limit, editorGroupService); // do not persist in storage as diff editors are never persisted + protected onWillCloseEditorInGroup(editor: IEditorInput): void { + + // React to editors closing to preserve or clear view state. This needs to happen + // in the onWillCloseEditor because at that time the editor has not yet + // been disposed and we can safely persist the view state still as needed. + this.doSaveOrClearTextDiffEditorViewState(editor); } getTitle(): string { @@ -82,8 +85,8 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan // Dispose previous diff navigator this.diffNavigatorDisposables.clear(); - // Remember view settings if input changes - this.saveTextDiffEditorViewState(this.input); + // Update/clear view settings if input changes + this.doSaveOrClearTextDiffEditorViewState(this.input); // Set input and resolve await super.setInput(input, options, token); @@ -240,8 +243,8 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan // Dispose previous diff navigator this.diffNavigatorDisposables.clear(); - // Keep editor view state in settings to restore when coming back - this.saveTextDiffEditorViewState(this.input); + // Update/clear editor view state in settings + this.doSaveOrClearTextDiffEditorViewState(this.input); // Clear Model const diffEditor = this.getControl(); @@ -265,7 +268,15 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan return super.loadTextEditorViewState(resource) as IDiffEditorViewState; // overridden for text diff editor support } - private saveTextDiffEditorViewState(input: EditorInput | undefined): void { + protected saveState(): void { + + // Update/clear editor view State + this.doSaveOrClearTextDiffEditorViewState(this.input); + + super.saveState(); + } + + private doSaveOrClearTextDiffEditorViewState(input: IEditorInput | undefined): void { if (!(input instanceof DiffEditorInput)) { return; // only supported for diff editor inputs } @@ -275,9 +286,9 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan return; // unable to retrieve input resource } - // Clear view state if input is disposed - if (input.isDisposed()) { - super.clearTextEditorViewState([resource]); + // Clear view state if input is disposed or we are configured to not storing any state + if (input.isDisposed() || (!this.shouldRestoreViewState && (!this.group || !this.group.isOpened(input)))) { + super.clearTextEditorViewState([resource], this.group); } // Otherwise save it @@ -286,7 +297,7 @@ export class TextDiffEditor extends BaseTextEditor implements ITextDiffEditorPan // Make sure to clean up when the input gets disposed Event.once(input.onDispose)(() => { - super.clearTextEditorViewState([resource]); + super.clearTextEditorViewState([resource], this.group); }); } } diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index bf853cc97c..fb4af4681b 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -10,7 +10,7 @@ import { Event } from 'vs/base/common/event'; import { isObject, assertIsDefined, withNullAsUndefined, isFunction } from 'vs/base/common/types'; import { Dimension } from 'vs/base/browser/dom'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { EditorInput, EditorOptions, IEditorMemento, ITextEditorPane, TextEditorOptions } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, IEditorMemento, ITextEditorPane, TextEditorOptions, IEditorCloseEvent, IEditorInput, computeEditorAriaLabel } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorViewState, IEditor, ScrollType } from 'vs/editor/common/editorCommon'; import { IStorageService } from 'vs/platform/storage/common/storage'; @@ -23,7 +23,8 @@ import { isCodeEditor, getCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { computeEditorAriaLabel } from 'vs/workbench/browser/parts/editor/editor'; +import { IExtUri } from 'vs/base/common/resources'; +import { MutableDisposable } from 'vs/base/common/lifecycle'; export interface IEditorConfiguration { editor: object; @@ -44,10 +45,19 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa private lastAppliedEditorOptions?: IEditorOptions; private editorMemento: IEditorMemento; + private readonly groupListener = this._register(new MutableDisposable()); + + private _shouldRestoreViewState: boolean | undefined; + protected get shouldRestoreViewState(): boolean | undefined { return this._shouldRestoreViewState; } + + private _instantiationService: IInstantiationService; + protected get instantiationService(): IInstantiationService { return this._instantiationService; } + protected set instantiationService(value: IInstantiationService) { this._instantiationService = value; } + constructor( id: string, @ITelemetryService telemetryService: ITelemetryService, - @IInstantiationService protected readonly instantiationService: IInstantiationService, + @IInstantiationService instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, @ITextResourceConfigurationService protected readonly textResourceConfigurationService: ITextResourceConfigurationService, @IThemeService protected themeService: IThemeService, @@ -55,6 +65,7 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa @IEditorGroupsService protected editorGroupService: IEditorGroupsService ) { super(id, telemetryService, themeService, storageService); + this._instantiationService = instantiationService; this.editorMemento = this.getEditorMemento(editorGroupService, BaseTextEditor.TEXT_EDITOR_VIEW_STATE_PREFERENCE_KEY, 100); @@ -73,9 +84,13 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa this.editorContainer?.setAttribute('aria-label', ariaLabel); this.editorControl?.updateOptions({ ariaLabel }); })); + + this.updateRestoreViewStateConfiguration(); } protected handleConfigurationChangeEvent(configuration?: IEditorConfiguration): void { + this.updateRestoreViewStateConfiguration(); + if (this.isVisible()) { this.updateEditorConfiguration(configuration); } else { @@ -83,6 +98,10 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa } } + private updateRestoreViewStateConfiguration(): void { + this._shouldRestoreViewState = this.textResourceConfigurationService.getValue(undefined, 'workbench.editor.restoreViewState') ?? true /* default */; + } + private consumePendingConfigurationChangeEvent(): void { if (this.hasPendingConfigurationChange) { this.updateEditorConfiguration(); @@ -175,9 +194,23 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa editorControl.onHide(); } + // Listen to close events to trigger `onWillCloseEditorInGroup` + this.groupListener.value = group?.onWillCloseEditor(e => this.onWillCloseEditor(e)); + super.setEditorVisible(visible, group); } + private onWillCloseEditor(e: IEditorCloseEvent): void { + const editor = e.editor; + if (editor === this.input) { + this.onWillCloseEditorInGroup(editor); + } + } + + protected onWillCloseEditorInGroup(editor: IEditorInput): void { + // Subclasses can override + } + focus(): void { // Pass on to Editor @@ -241,8 +274,8 @@ export abstract class BaseTextEditor extends BaseEditor implements ITextEditorPa return this.group ? this.editorMemento.loadEditorState(this.group, resource) : undefined; } - protected moveTextEditorViewState(source: URI, target: URI): void { - return this.editorMemento.moveEditorState(source, target); + protected moveTextEditorViewState(source: URI, target: URI, comparer: IExtUri): void { + return this.editorMemento.moveEditorState(source, target, comparer); } protected clearTextEditorViewState(resources: URI[], group?: IEditorGroup): void { diff --git a/src/vs/workbench/browser/parts/notifications/media/notificationsList.css b/src/vs/workbench/browser/parts/notifications/media/notificationsList.css index 31ce912533..02a3d5e092 100644 --- a/src/vs/workbench/browser/parts/notifications/media/notificationsList.css +++ b/src/vs/workbench/browser/parts/notifications/media/notificationsList.css @@ -121,3 +121,15 @@ height: 2px; bottom: 0; } + +.monaco-workbench.mac:not(.web) .notifications-list-container .monaco-progress-container.infinite .progress-bit { + /** macOS native: reduce animation steps for reduced CPU load (https://github.com/microsoft/vscode/issues/97900) */ + animation-timing-function: steps(100); +} + +@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { + /** macOS native: do not change the animation-timing-function on highDPI screens to reduce stutter */ + .monaco-workbench.mac:not(.web) .notifications-list-container .monaco-progress-container.infinite .progress-bit { + animation-timing-function: linear; + } +} diff --git a/src/vs/workbench/browser/parts/panel/media/panelpart.css b/src/vs/workbench/browser/parts/panel/media/panelpart.css index c4e606b5c6..504ffc8cd8 100644 --- a/src/vs/workbench/browser/parts/panel/media/panelpart.css +++ b/src/vs/workbench/browser/parts/panel/media/panelpart.css @@ -50,6 +50,10 @@ outline-offset: -2px; } +.monaco-workbench .part.panel > .title > .panel-switcher-container > .monaco-action-bar .action-item.clicked:focus .action-label { + border-bottom-color: transparent !important; /* hides border on clicked state */ +} + /** Panel Switcher */ .monaco-workbench .part.panel > .composite.title > .panel-switcher-container.composite-bar > .monaco-action-bar .action-label.codicon-more { @@ -134,7 +138,8 @@ .monaco-workbench .part.panel > .composite.title> .panel-switcher-container > .monaco-action-bar .action-item.left::before, .monaco-workbench .part.panel > .composite.title> .panel-switcher-container > .monaco-action-bar .action-item.right::after, -.monaco-workbench .part.panel > .composite.title.dragged-over > .panel-switcher-container > .monaco-action-bar .action-item:last-of-type::after { +.monaco-workbench .part.panel > .composite.title.dragged-over-head > .panel-switcher-container > .monaco-action-bar .action-item:first-of-type::before, +.monaco-workbench .part.panel > .composite.title.dragged-over-tail > .panel-switcher-container > .monaco-action-bar .action-item:last-of-type::after { opacity: 1; } diff --git a/src/vs/workbench/browser/parts/panel/panelPart.ts b/src/vs/workbench/browser/parts/panel/panelPart.ts index 863716a1b6..609ce7a0e1 100644 --- a/src/vs/workbench/browser/parts/panel/panelPart.ts +++ b/src/vs/workbench/browser/parts/panel/panelPart.ts @@ -38,7 +38,7 @@ import { MenuId } from 'vs/platform/actions/common/actions'; import { ViewMenuActions, ViewContainerMenuActions } from 'vs/workbench/browser/parts/views/viewMenuActions'; import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { Before2D, CompositeDragAndDropObserver, ICompositeDragAndDrop } from 'vs/workbench/browser/dnd'; +import { Before2D, CompositeDragAndDropObserver, ICompositeDragAndDrop, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { IActivity } from 'vs/workbench/common/activity'; interface ICachedPanel { @@ -63,7 +63,7 @@ export class PanelPart extends CompositePart implements IPanelService { static readonly PLACEHOLDER_VIEW_CONTAINERS = 'workbench.panel.placeholderPanels'; private static readonly MIN_COMPOSITE_BAR_WIDTH = 50; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region IView @@ -220,7 +220,8 @@ export class PanelPart extends CompositePart implements IPanelService { const newPanel = { id: panel.id, name: panel.name, - order: cachedPanel?.order === undefined ? panel.order : cachedPanel.order + order: panel.order, + requestedIndex: panel.requestedIndex }; this.compositeBar.addComposite(newPanel); @@ -433,6 +434,8 @@ export class PanelPart extends CompositePart implements IPanelService { this._register(CompositeDragAndDropObserver.INSTANCE.registerTarget(this.emptyPanelMessageElement, { onDragOver: (e) => { EventHelper.stop(e.eventData, true); + const validDropTarget = this.dndHandler.onDragEnter(e.dragAndDropData, undefined, e.eventData); + toggleDropEffect(e.eventData.dataTransfer, 'move', validDropTarget); }, onDragEnter: (e) => { EventHelper.stop(e.eventData, true); @@ -676,17 +679,14 @@ export class PanelPart extends CompositePart implements IPanelService { const cachedPanels = this.getCachedPanels(); for (const cachedPanel of cachedPanels) { - // Add and update existing items - const existingItem = compositeItems.filter(({ id }) => id === cachedPanel.id)[0]; - if (existingItem) { - newCompositeItems.push({ - id: existingItem.id, - name: existingItem.name, - order: existingItem.order, - pinned: cachedPanel.pinned, - visible: existingItem.visible - }); - } + // copy behavior from activity bar + newCompositeItems.push({ + id: cachedPanel.id, + name: cachedPanel.name, + order: cachedPanel.order, + pinned: cachedPanel.pinned, + visible: !!compositeItems.find(({ id }) => id === cachedPanel.id) + }); } for (let index = 0; index < compositeItems.length; index++) { diff --git a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts index a33c7018ef..d171246c48 100644 --- a/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts +++ b/src/vs/workbench/browser/parts/sidebar/sidebarPart.ts @@ -38,7 +38,7 @@ import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/comm export class SidebarPart extends CompositePart implements IViewletService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; static readonly activeViewletSettingsKey = 'workbench.sidebar.activeviewletid'; diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts index 470bb0b9a1..9eebc906c5 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarPart.ts @@ -15,10 +15,10 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { StatusbarAlignment, IStatusbarService, IStatusbarEntry, IStatusbarEntryAccessor } from 'vs/workbench/services/statusbar/common/statusbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Action, IAction, WorkbenchActionExecutedEvent, WorkbenchActionExecutedClassification } from 'vs/base/common/actions'; -import { IThemeService, registerThemingParticipant, IColorTheme, ICssStyleCollector, ThemeColor } from 'vs/platform/theme/common/themeService'; +import { IThemeService, registerThemingParticipant, IColorTheme, ICssStyleCollector, ThemeColor, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; import { STATUS_BAR_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_FOREGROUND, STATUS_BAR_PROMINENT_ITEM_BACKGROUND, STATUS_BAR_PROMINENT_ITEM_HOVER_BACKGROUND, STATUS_BAR_BORDER, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER } from 'vs/workbench/common/theme'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { isThemeColor } from 'vs/editor/common/editorCommon'; import { Color } from 'vs/base/common/color'; import { addClass, EventHelper, createStyleSheet, addDisposableListener, addClasses, removeClass, EventType, hide, show, removeClasses, isAncestor } from 'vs/base/browser/dom'; @@ -373,7 +373,7 @@ class HideStatusbarEntryAction extends Action { export class StatusbarPart extends Part implements IStatusbarService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region IView @@ -738,6 +738,7 @@ class StatusbarEntryItem extends Disposable { // Label Container this.labelContainer = document.createElement('a'); this.labelContainer.tabIndex = -1; // allows screen readers to read title, but still prevents tab focus. + this.labelContainer.setAttribute('role', 'button'); // Label this.label = new CodiconLabel(this.labelContainer); @@ -886,15 +887,34 @@ class StatusbarEntryItem extends Disposable { } registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { - const statusBarItemHoverBackground = theme.getColor(STATUS_BAR_ITEM_HOVER_BACKGROUND); - if (statusBarItemHoverBackground) { - collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:hover { background-color: ${statusBarItemHoverBackground}; }`); - collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:focus { background-color: ${statusBarItemHoverBackground}; }`); + if (theme.type !== HIGH_CONTRAST) { + const statusBarItemHoverBackground = theme.getColor(STATUS_BAR_ITEM_HOVER_BACKGROUND); + if (statusBarItemHoverBackground) { + collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:hover { background-color: ${statusBarItemHoverBackground}; }`); + collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:focus { background-color: ${statusBarItemHoverBackground}; }`); + } + + const statusBarItemActiveBackground = theme.getColor(STATUS_BAR_ITEM_ACTIVE_BACKGROUND); + if (statusBarItemActiveBackground) { + collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:active { background-color: ${statusBarItemActiveBackground}; }`); + } } - const statusBarItemActiveBackground = theme.getColor(STATUS_BAR_ITEM_ACTIVE_BACKGROUND); - if (statusBarItemActiveBackground) { - collector.addRule(`.monaco-workbench .part.statusbar > .items-container > .statusbar-item a:active { background-color: ${statusBarItemActiveBackground}; }`); + const activeContrastBorderColor = theme.getColor(activeContrastBorder); + if (activeContrastBorderColor) { + collector.addRule(` + .monaco-workbench .part.statusbar > .items-container > .statusbar-item a:focus, + .monaco-workbench .part.statusbar > .items-container > .statusbar-item a:active { + outline: 1px solid ${activeContrastBorderColor} !important; + outline-offset: -1px; + } + `); + collector.addRule(` + .monaco-workbench .part.statusbar > .items-container > .statusbar-item a:hover { + outline: 1px dashed ${activeContrastBorderColor}; + outline-offset: -1px; + } + `); } const statusBarProminentItemForeground = theme.getColor(STATUS_BAR_PROMINENT_ITEM_FOREGROUND); diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 7b6203bb3f..6442a54a11 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { IMenuService, MenuId, IMenu, SubmenuItemAction } from 'vs/platform/actions/common/actions'; +import { IMenuService, MenuId, IMenu, SubmenuItemAction, registerAction2, Action2 } from 'vs/platform/actions/common/actions'; import { registerThemingParticipant, IColorTheme, ICssStyleCollector, IThemeService } from 'vs/platform/theme/common/themeService'; import { MenuBarVisibility, getTitleBarStyle, IWindowOpenable, getMenuBarVisibility } from 'vs/platform/windows/common/windows'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -35,6 +35,9 @@ import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/la import { isFullscreen } from 'vs/base/browser/browser'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { BrowserFeatures } from 'vs/base/browser/canIUse'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IsWebContext } from 'vs/platform/contextkey/common/contextkeys'; export abstract class MenubarControl extends Disposable { @@ -313,6 +316,8 @@ export class CustomMenubarControl extends MenubarControl { this.registerListeners(); + this.registerActions(); + registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { const menubarActiveWindowFgColor = theme.getColor(TITLE_BAR_ACTIVE_FOREGROUND); if (menubarActiveWindowFgColor) { @@ -412,6 +417,32 @@ export class CustomMenubarControl extends MenubarControl { this.setupCustomMenubar(firstTime); } + private registerActions(): void { + const that = this; + + if (isWeb) { + this._register(registerAction2(class extends Action2 { + constructor() { + super({ + id: `workbench.actions.menubar.focus`, + title: { value: nls.localize('focusMenu', "Focus Application Menu"), original: 'Focus Application Menu' }, + keybinding: { + primary: KeyCode.F10, + weight: KeybindingWeight.WorkbenchContrib, + when: IsWebContext + } + }); + } + + async run(): Promise { + if (that.menubar) { + that.menubar.toggleFocus(); + } + } + })); + } + } + private getUpdateAction(): IAction | null { const state = this.updateService.state; diff --git a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts index 4e2bd04188..60b73f6047 100644 --- a/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts +++ b/src/vs/workbench/browser/parts/titlebar/titlebarPart.ts @@ -60,7 +60,7 @@ export class TitlebarPart extends Part implements ITitleService { private _onMenubarVisibilityChange = this._register(new Emitter()); readonly onMenubarVisibilityChange = this._onMenubarVisibilityChange.event; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; protected title!: HTMLElement; protected customMenubar: CustomMenubarControl | undefined; diff --git a/src/vs/workbench/browser/parts/views/treeView.ts b/src/vs/workbench/browser/parts/views/treeView.ts index 5128b0e426..d4c0814adb 100644 --- a/src/vs/workbench/browser/parts/views/treeView.ts +++ b/src/vs/workbench/browser/parts/views/treeView.ts @@ -27,7 +27,7 @@ import { URI } from 'vs/base/common/uri'; import { dirname, basename } from 'vs/base/common/resources'; import { LIGHT, FileThemeIcon, FolderThemeIcon, registerThemingParticipant, ThemeIcon, IThemeService } from 'vs/platform/theme/common/themeService'; import { FileKind } from 'vs/platform/files/common/files'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { localize } from 'vs/nls'; import { timeout } from 'vs/base/common/async'; @@ -435,7 +435,7 @@ export class TreeView extends Disposable implements ITreeView { return element.tooltip ? element.tooltip : element.label ? element.label.label : ''; }, getRole(element: ITreeItem): string | undefined { - return element.accessibilityInformation?.role; + return element.accessibilityInformation?.role ?? 'treeitem'; }, getWidgetAriaLabel(): string { return widgetAriaLabel; @@ -476,9 +476,7 @@ export class TreeView extends Disposable implements ITreeView { })); this.tree.setInput(this.root).then(() => this.updateContentAreas()); - const treeNavigator = new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false }); - this._register(treeNavigator); - this._register(treeNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (!e.browserEvent) { return; } diff --git a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts index fbfe8ff71a..d9d6a41103 100644 --- a/src/vs/workbench/browser/parts/views/viewPaneContainer.ts +++ b/src/vs/workbench/browser/parts/views/viewPaneContainer.ts @@ -40,7 +40,7 @@ import { parseLinkedText } from 'vs/base/common/linkedText'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { Button } from 'vs/base/browser/ui/button/button'; import { Link } from 'vs/platform/opener/browser/link'; -import { CompositeDragAndDropObserver, DragAndDropObserver } from 'vs/workbench/browser/dnd'; +import { CompositeDragAndDropObserver, DragAndDropObserver, toggleDropEffect } from 'vs/workbench/browser/dnd'; import { Orientation } from 'vs/base/browser/ui/sash/sash'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { CompositeProgressIndicator } from 'vs/workbench/services/progress/browser/progressIndicator'; @@ -178,7 +178,11 @@ export abstract class ViewPane extends Pane implements IView { private _isVisible: boolean = false; readonly id: string; - title: string; + + private _title: string; + public get title(): string { + return this._title; + } private readonly menuActions: ViewMenuActions; private progressBar!: ProgressBar; @@ -211,7 +215,7 @@ export abstract class ViewPane extends Pane implements IView { super({ ...options, ...{ orientation: viewDescriptorService.getViewLocationById(options.id) === ViewContainerLocation.Panel ? Orientation.HORIZONTAL : Orientation.VERTICAL } }); this.id = options.id; - this.title = options.title; + this._title = options.title; this.showActionsAlways = !!options.showActionsAlways; this.focusedViewContextKey = FocusedViewContext.bindTo(contextKeyService); @@ -370,7 +374,7 @@ export abstract class ViewPane extends Pane implements IView { this.iconContainer.setAttribute('aria-label', calculatedTitle); } - this.title = title; + this._title = title; this._onDidChangeTitleArea.fire(); } @@ -913,13 +917,18 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { const container = this.viewDescriptorService.getViewContainerById(dropData.id)!; const viewsToMove = this.viewDescriptorService.getViewContainerModel(container).allViewDescriptors; - if (!viewsToMove.some(v => !v.canMoveView)) { + if (!viewsToMove.some(v => !v.canMoveView) && viewsToMove.length > 0) { overlay = new ViewPaneDropOverlay(parent, undefined, this.viewDescriptorService.getViewContainerLocation(this.viewContainer)!, this.themeService); } } } }, + onDragOver: (e) => { + if (this.panes.length === 0) { + toggleDropEffect(e.eventData.dataTransfer, 'move', overlay !== undefined); + } + }, onDragLeave: (e) => { overlay?.dispose(); overlay = undefined; @@ -1281,6 +1290,10 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { panesToRemove.push(this.panes[index]); } this.removePanes(panesToRemove); + + for (const pane of panesToRemove) { + pane.setVisible(false); + } } protected toggleViewVisibility(viewId: string): void { @@ -1311,7 +1324,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { } }); - const isPanel = this.viewDescriptorService.getViewLocationById(this.viewContainer.id) === ViewContainerLocation.Panel; + const isPanel = this.viewDescriptorService.getViewContainerLocation(this.viewContainer) === ViewContainerLocation.Panel; const paneStyler = attachStyler(this.themeService, { headerForeground: isPanel ? PANEL_SECTION_HEADER_FOREGROUND : SIDE_BAR_SECTION_HEADER_FOREGROUND, headerBackground: isPanel ? PANEL_SECTION_HEADER_BACKGROUND : SIDE_BAR_SECTION_HEADER_BACKGROUND, @@ -1349,12 +1362,15 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer { const container = this.viewDescriptorService.getViewContainerById(dropData.id)!; const viewsToMove = this.viewDescriptorService.getViewContainerModel(container).allViewDescriptors; - if (!viewsToMove.some(v => !v.canMoveView)) { + if (!viewsToMove.some(v => !v.canMoveView) && viewsToMove.length > 0) { overlay = new ViewPaneDropOverlay(pane.dropTargetElement, this.orientation ?? Orientation.VERTICAL, this.viewDescriptorService.getViewContainerLocation(this.viewContainer)!, this.themeService); } } } }, + onDragOver: (e) => { + toggleDropEffect(e.eventData.dataTransfer, 'move', overlay !== undefined); + }, onDragLeave: (e) => { overlay?.dispose(); overlay = undefined; diff --git a/src/vs/workbench/browser/parts/views/viewsService.ts b/src/vs/workbench/browser/parts/views/viewsService.ts index f30ead6ee2..510dff3e66 100644 --- a/src/vs/workbench/browser/parts/views/viewsService.ts +++ b/src/vs/workbench/browser/parts/views/viewsService.ts @@ -34,7 +34,7 @@ import { IProgressIndicator } from 'vs/platform/progress/common/progress'; export class ViewsService extends Disposable implements IViewsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly viewDisposable: Map; private readonly viewPaneContainers: Map; @@ -445,6 +445,7 @@ export class ViewsService extends Disposable implements IViewsService { viewContainer.name, undefined, viewContainer.order, + viewContainer.requestedIndex, viewContainer.focusCommand?.id, )); } @@ -480,6 +481,7 @@ export class ViewsService extends Disposable implements IViewsService { viewContainer.name, isString(viewContainer.icon) ? viewContainer.icon : undefined, viewContainer.order, + viewContainer.requestedIndex, viewContainer.icon instanceof URI ? viewContainer.icon : undefined )); } diff --git a/src/vs/workbench/browser/style.ts b/src/vs/workbench/browser/style.ts index 3fd5aec7a8..de804791bd 100644 --- a/src/vs/workbench/browser/style.ts +++ b/src/vs/workbench/browser/style.ts @@ -8,7 +8,7 @@ import 'vs/css!./media/style'; import { registerThemingParticipant, IColorTheme, ICssStyleCollector, HIGH_CONTRAST } from 'vs/platform/theme/common/themeService'; import { iconForeground, foreground, selectionBackground, focusBorder, scrollbarShadow, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground, listHighlightForeground, inputPlaceholderForeground } from 'vs/platform/theme/common/colorRegistry'; import { WORKBENCH_BACKGROUND, TITLE_BAR_ACTIVE_BACKGROUND } from 'vs/workbench/common/theme'; -import { isWeb, isIOS } from 'vs/base/common/platform'; +import { isWeb, isIOS, isMacintosh, isWindows } from 'vs/base/common/platform'; import { createMetaElement } from 'vs/base/browser/dom'; import { isSafari, isStandalone } from 'vs/base/browser/browser'; @@ -183,3 +183,13 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = collector.addRule(`body { background-color: ${workbenchBackground}; }`); } }); + +/** + * The best font-family to be used in CSS based on the platform: + * - Windows: Segoe preferred, fallback to sans-serif + * - macOS: standard system font, fallback to sans-serif + * - Linux: standard system font preferred, fallback to Ubuntu fonts + * + * Note: this currently does not adjust for different locales. + */ +export const DEFAULT_FONT_FAMILY = isWindows ? '"Segoe WPC", "Segoe UI", sans-serif' : isMacintosh ? '-apple-system, BlinkMacSystemFont, sans-serif' : 'system-ui, "Ubuntu", "Droid Sans", sans-serif'; diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index 4efd7308f4..b4c112c895 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -73,10 +73,11 @@ export class ViewletDescriptor extends CompositeDescriptor { name: string, cssClass?: string, order?: number, + requestedIndex?: number, iconUrl?: URI ): ViewletDescriptor { - return new ViewletDescriptor(ctor as IConstructorSignature0, id, name, cssClass, order, iconUrl); + return new ViewletDescriptor(ctor as IConstructorSignature0, id, name, cssClass, order, requestedIndex, iconUrl); } private constructor( @@ -85,9 +86,10 @@ export class ViewletDescriptor extends CompositeDescriptor { name: string, cssClass?: string, order?: number, + requestedIndex?: number, readonly iconUrl?: URI ) { - super(ctor, id, name, cssClass, order, id); + super(ctor, id, name, cssClass, order, requestedIndex, id); } } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index bc4f4e3bdc..f511dfed0e 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -38,7 +38,7 @@ import { FileUserDataProvider } from 'vs/workbench/services/userData/common/file import { BACKUPS } from 'vs/platform/environment/common/environment'; import { joinPath } from 'vs/base/common/resources'; import { BrowserStorageService } from 'vs/platform/storage/browser/storageService'; -import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { IStorageService } from 'vs/platform/storage/common/storage'; import { registerWindowDriver } from 'vs/platform/driver/browser/driver'; import { BufferLogService } from 'vs/platform/log/common/bufferLog'; import { FileLogService } from 'vs/platform/log/common/fileLogService'; @@ -51,7 +51,6 @@ import { coalesce } from 'vs/base/common/arrays'; import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider'; import { WebResourceIdentityService, IResourceIdentityService } from 'vs/platform/resource/common/resourceIdentityService'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { Settings } from 'vs/workbench/browser/layout'; class BrowserMain extends Disposable { @@ -65,11 +64,6 @@ class BrowserMain extends Disposable { async open(): Promise { const services = await this.initServices(); - const firstOpen = services.storageService.getBoolean(Settings.WORKSPACE_FIRST_OPEN, StorageScope.WORKSPACE); - if (firstOpen === undefined || firstOpen) { - services.storageService.store(Settings.WORKSPACE_FIRST_OPEN, !(firstOpen ?? false), StorageScope.WORKSPACE); - } - await domContentLoaded(); mark('willStartWorkbench'); @@ -166,10 +160,7 @@ class BrowserMain extends Disposable { serviceCollection.set(IWorkbenchEnvironmentService, environmentService); // Product - const productService = { - _serviceBrand: undefined, - ...product - }; + const productService: IProductService = { _serviceBrand: undefined, ...product, ...this.configuration.productConfiguration }; serviceCollection.set(IProductService, productService); // Remote diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index e482842c0e..325973949d 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -20,9 +20,7 @@ import { getSingletonServiceDescriptors } from 'vs/platform/instantiation/common import { Position, Parts, IWorkbenchLayoutService, positionToString } from 'vs/workbench/services/layout/browser/layoutService'; import { IStorageService, WillSaveStateReason, StorageScope } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { LifecyclePhase, ILifecycleService, WillShutdownEvent, BeforeShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -32,8 +30,6 @@ import { NotificationsAlerts } from 'vs/workbench/browser/parts/notifications/no import { NotificationsStatus } from 'vs/workbench/browser/parts/notifications/notificationsStatus'; import { registerNotificationCommands } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { NotificationsToasts } from 'vs/workbench/browser/parts/notifications/notificationsToasts'; -import { IEditorService, IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { setARIAContainer } from 'vs/base/browser/ui/aria/aria'; import { readFontInfo, restoreFontInfo, serializeFontInfo } from 'vs/editor/browser/config/configuration'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; @@ -44,9 +40,6 @@ import { coalesce } from 'vs/base/common/arrays'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; import { Layout } from 'vs/workbench/browser/layout'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { ILanguageAssociationRegistry, Extensions as LanguageExtensions } from 'sql/workbench/services/languageAssociation/common/languageAssociation'; -import { Extensions as PanelExtensions, PanelRegistry } from 'vs/workbench/browser/panel'; -import { IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; export class Workbench extends Layout { @@ -146,7 +139,8 @@ export class Workbench extends Layout { this.initLayout(accessor); // Registries - this.startRegistries(accessor); + Registry.as(WorkbenchExtensions.Workbench).start(accessor); + Registry.as(EditorExtensions.EditorInputFactories).start(accessor); // Context Keys this._register(instantiationService.createInstance(WorkbenchContextKeysHandler)); @@ -165,7 +159,7 @@ export class Workbench extends Layout { // Restore try { - await this.restoreWorkbench(accessor.get(IEditorService), accessor.get(IEditorGroupsService), accessor.get(IViewDescriptorService), accessor.get(IViewletService), accessor.get(IPanelService), accessor.get(ILogService), lifecycleService); + await this.restoreWorkbench(accessor.get(ILogService), lifecycleService); } catch (error) { onUnexpectedError(error); } @@ -216,12 +210,6 @@ export class Workbench extends Layout { return instantiationService; } - private startRegistries(accessor: ServicesAccessor): void { - Registry.as(WorkbenchExtensions.Workbench).start(accessor); - Registry.as(EditorExtensions.EditorInputFactories).start(accessor); - Registry.as(LanguageExtensions.LanguageAssociations).start(accessor); - } - private registerListeners( lifecycleService: ILifecycleService, storageService: IStorageService, @@ -367,7 +355,7 @@ export class Workbench extends Layout { } private createPart(id: string, role: string, classes: string[]): HTMLElement { - const part = document.createElement('div'); + const part = document.createElement(role === 'status' ? 'footer' : 'div'); // Use footer element for status bar #98376 addClasses(part, 'part', ...classes); part.id = id; part.setAttribute('role', role); @@ -401,81 +389,15 @@ export class Workbench extends Layout { } private async restoreWorkbench( - editorService: IEditorService, - editorGroupService: IEditorGroupsService, - viewDescriptorService: IViewDescriptorService, - viewletService: IViewletService, - panelService: IPanelService, logService: ILogService, lifecycleService: ILifecycleService ): Promise { - const restorePromises: Promise[] = []; - - // Restore editors - restorePromises.push((async () => { - mark('willRestoreEditors'); - - // first ensure the editor part is restored - await editorGroupService.whenRestored; - - // then see for editors to open as instructed - let editors: IResourceEditorInputType[]; - if (Array.isArray(this.state.editor.editorsToOpen)) { - editors = this.state.editor.editorsToOpen; - } else { - editors = await this.state.editor.editorsToOpen; - } - - if (editors.length) { - await editorService.openEditors(editors); - } - - mark('didRestoreEditors'); - })()); - - // Restore Sidebar - if (this.state.sideBar.viewletToRestore) { - restorePromises.push((async () => { - mark('willRestoreViewlet'); - - const viewlet = await viewletService.openViewlet(this.state.sideBar.viewletToRestore); - if (!viewlet) { - await viewletService.openViewlet(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id); // fallback to default viewlet as needed - } - - mark('didRestoreViewlet'); - })()); - } - - // Restore Panel - if (this.state.panel.panelToRestore) { - restorePromises.push((async () => { - mark('willRestorePanel'); - - const panel = await panelService.openPanel(this.state.panel.panelToRestore!); - if (!panel) { - await panelService.openPanel(Registry.as(PanelExtensions.Panels).getDefaultPanelId()); // fallback to default panel as needed - } - - mark('didRestorePanel'); - })()); - } - - // Restore Zen Mode - if (this.state.zenMode.restore) { - this.toggleZenMode(false, true); - } - - // Restore Editor Center Mode - if (this.state.editor.restoreCentered) { - this.centerEditorLayout(true, true); - } // Emit a warning after 10s if restore does not complete const restoreTimeoutHandle = setTimeout(() => logService.warn('Workbench did not finish loading in 10 seconds, that might be a problem that should be reported.'), 10000); try { - await Promise.all(restorePromises); + await super.restoreWorkbenchLayout(); clearTimeout(restoreTimeoutHandle); } catch (error) { diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index db2dd8904c..ad06cc85cd 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -22,6 +22,7 @@ import { IPathData } from 'vs/platform/windows/common/windows'; import { coalesce, firstOrDefault } from 'vs/base/common/arrays'; import { IResourceEditorInputType } from 'vs/workbench/services/editor/common/editorService'; import { IRange } from 'vs/editor/common/core/range'; +import { IExtUri } from 'vs/base/common/resources'; export const DirtyWorkingCopiesContext = new RawContextKey('dirtyWorkingCopies', false); export const ActiveEditorContext = new RawContextKey('activeEditor', null); @@ -163,13 +164,20 @@ export interface IEditorControl extends ICompositeControl { } export interface IFileEditorInputFactory { - createFileEditorInput(resource: URI, encoding: string | undefined, mode: string | undefined, instantiationService: IInstantiationService): IFileEditorInput; + /** + * Creates new new editor input capable of showing files. + */ + createFileEditorInput(resource: URI, label: URI | undefined, encoding: string | undefined, mode: string | undefined, instantiationService: IInstantiationService): IFileEditorInput; + /** + * Check if the provided object is a file editor input. + */ isFileEditorInput(obj: unknown): obj is IFileEditorInput; } interface ICustomEditorInputFactory { createCustomEditorInput(resource: URI, instantiationService: IInstantiationService): Promise; + canResolveBackup(editorInput: IEditorInput, backupResource: URI): boolean; } export interface IEditorInputFactoryRegistry { @@ -187,12 +195,12 @@ export interface IEditorInputFactoryRegistry { /** * Registers the custom editor input factory to use for custom inputs. */ - registerCustomEditorInputFactory(factory: ICustomEditorInputFactory): void; + registerCustomEditorInputFactory(scheme: string, factory: ICustomEditorInputFactory): void; /** * Returns the custom editor input factory to use for custom inputs. */ - getCustomEditorInputFactory(): ICustomEditorInputFactory; + getCustomEditorInputFactory(scheme: string): ICustomEditorInputFactory | undefined; /** * Registers a editor input factory for the given editor input to the registry. An editor input factory @@ -227,7 +235,7 @@ export interface IEditorInputFactory { * Returns a string representation of the provided editor input that contains enough information * to deserialize back to the original editor input from the deserialize() method. */ - serialize(editorInput: EditorInput): string | undefined; + serialize(editorInput: IEditorInput): string | undefined; /** * Returns an editor input from the provided serialized form of the editor input. This form matches @@ -403,7 +411,9 @@ export interface IEditorInput extends IDisposable { getAriaLabel(): string; /** - * Resolves the input. + * Returns a type of `IEditorModel` that represents the resolved input. + * Subclasses should override to provide a meaningful model or return + * `null` if the editor does not require a model. */ resolve(): Promise; @@ -458,14 +468,19 @@ export interface IEditorInput extends IDisposable { revert(group: GroupIdentifier, options?: IRevertOptions): Promise; /** - * Called to determine how to handle a resource that is moved that matches + * Called to determine how to handle a resource that is renamed that matches * the editors resource (or is a child of). * * Implementors are free to not implement this method to signal no intent * to participate. If an editor is returned though, it will replace the * current one with that editor and optional options. */ - move(group: GroupIdentifier, target: URI): IMoveResult | undefined; + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined; + + /** + * Subclasses can set this to false if it does not make sense to split the editor input. + */ + supportsSplitEditor(): boolean; /** * Returns if the other object matches this input. @@ -537,12 +552,6 @@ export abstract class EditorInput extends Disposable implements IEditorInput { return { typeId: this.getTypeId() }; } - /** - * Returns a type of EditorModel that represents the resolved input. Subclasses should - * override to provide a meaningful model. - */ - abstract resolve(): Promise; - isReadonly(): boolean { return true; } @@ -559,6 +568,10 @@ export abstract class EditorInput extends Disposable implements IEditorInput { return false; } + async resolve(): Promise { + return null; + } + async save(group: GroupIdentifier, options?: ISaveOptions): Promise { return this; } @@ -569,13 +582,10 @@ export abstract class EditorInput extends Disposable implements IEditorInput { async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { } - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { return undefined; } - /** - * Subclasses can set this to false if it does not make sense to split the editor input. - */ supportsSplitEditor(): boolean { return true; } @@ -644,12 +654,17 @@ export interface IFileEditorInput extends IEditorInput, IEncodingSupport, IModeS readonly resource: URI; /** - * Sets the preferred encoding to use for this input. + * Sets the preferred label to use for this file input. + */ + setLabel(label: URI): void; + + /** + * Sets the preferred encoding to use for this file input. */ setPreferredEncoding(encoding: string): void; /** - * Sets the preferred language mode to use for this input. + * Sets the preferred language mode to use for this file input. */ setPreferredMode(mode: string): void; @@ -659,7 +674,7 @@ export interface IFileEditorInput extends IEditorInput, IEncodingSupport, IModeS setForceOpenAsBinary(): void; /** - * Figure out if the input has been resolved or not. + * Figure out if the file input has been resolved or not. */ isResolved(): boolean; } @@ -682,6 +697,28 @@ export class SideBySideEditorInput extends EditorInput { this.registerListeners(); } + private registerListeners(): void { + + // When the details or master input gets disposed, dispose this diff editor input + const onceDetailsDisposed = Event.once(this.details.onDispose); + this._register(onceDetailsDisposed(() => { + if (!this.isDisposed()) { + this.dispose(); + } + })); + + const onceMasterDisposed = Event.once(this.master.onDispose); + this._register(onceMasterDisposed(() => { + if (!this.isDisposed()) { + this.dispose(); + } + })); + + // Reemit some events from the master side to the outside + this._register(this.master.onDidChangeDirty(() => this._onDidChangeDirty.fire())); + this._register(this.master.onDidChangeLabel(() => this._onDidChangeLabel.fire())); + } + get resource(): URI | undefined { return undefined; } @@ -744,32 +781,6 @@ export class SideBySideEditorInput extends EditorInput { return Object.assign(descriptor, super.getTelemetryDescriptor()); } - private registerListeners(): void { - - // When the details or master input gets disposed, dispose this diff editor input - const onceDetailsDisposed = Event.once(this.details.onDispose); - this._register(onceDetailsDisposed(() => { - if (!this.isDisposed()) { - this.dispose(); - } - })); - - const onceMasterDisposed = Event.once(this.master.onDispose); - this._register(onceMasterDisposed(() => { - if (!this.isDisposed()) { - this.dispose(); - } - })); - - // Reemit some events from the master side to the outside - this._register(this.master.onDidChangeDirty(() => this._onDidChangeDirty.fire())); - this._register(this.master.onDidChangeLabel(() => this._onDidChangeLabel.fire())); - } - - async resolve(): Promise { - return null; - } - matches(otherInput: unknown): boolean { if (super.matches(otherInput) === true) { return true; @@ -919,9 +930,12 @@ export class EditorOptions implements IEditorOptions { ignoreError: boolean | undefined; /** - * Does not use editor overrides while opening the editor. + * Allows to override the editor that should be used to display the input: + * - `undefined`: let the editor decide for itself + * - `false`: disable overrides + * - `string`: specific override by id */ - ignoreOverrides: boolean | undefined; + override?: false | string; /** * A optional hint to signal in which context the editor opens. @@ -979,8 +993,8 @@ export class EditorOptions implements IEditorOptions { this.index = options.index; } - if (typeof options.ignoreOverrides === 'boolean') { - this.ignoreOverrides = options.ignoreOverrides; + if (typeof options.override === 'string' || options.override === false) { + this.override = options.override; } if (typeof options.context === 'number') { @@ -1012,7 +1026,7 @@ export class TextEditorOptions extends EditorOptions implements ITextEditorOptio selectionRevealType: TextEditorSelectionRevealType | undefined; static from(input?: IBaseResourceEditorInput): TextEditorOptions | undefined { - if (!input || !input.options) { + if (!input?.options) { return undefined; } @@ -1187,7 +1201,7 @@ interface IEditorPartConfiguration { } export interface IEditorPartOptions extends IEditorPartConfiguration { - iconTheme?: string; + hasIcons?: boolean; } export interface IEditorPartOptionsChangeEvent { @@ -1206,10 +1220,10 @@ export interface IResourceOptions { filterByScheme?: string | string[]; } -export function toResource(editor: IEditorInput | undefined): URI | undefined; -export function toResource(editor: IEditorInput | undefined, options: IResourceOptions & { supportSideBySide?: SideBySideEditor.MASTER | SideBySideEditor.DETAILS }): URI | undefined; -export function toResource(editor: IEditorInput | undefined, options: IResourceOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { master?: URI, detail?: URI } | undefined; -export function toResource(editor: IEditorInput | undefined, options?: IResourceOptions): URI | { master?: URI, detail?: URI } | undefined { +export function toResource(editor: IEditorInput | undefined | null): URI | undefined; +export function toResource(editor: IEditorInput | undefined | null, options: IResourceOptions & { supportSideBySide?: SideBySideEditor.MASTER | SideBySideEditor.DETAILS }): URI | undefined; +export function toResource(editor: IEditorInput | undefined | null, options: IResourceOptions & { supportSideBySide: SideBySideEditor.BOTH }): URI | { master?: URI, detail?: URI } | undefined; +export function toResource(editor: IEditorInput | undefined | null, options?: IResourceOptions): URI | { master?: URI, detail?: URI } | undefined { if (!editor) { return undefined; } @@ -1259,13 +1273,13 @@ export interface IEditorMemento { clearEditorState(resource: URI, group?: IEditorGroup): void; clearEditorState(editor: EditorInput, group?: IEditorGroup): void; - moveEditorState(source: URI, target: URI): void; + moveEditorState(source: URI, target: URI, comparer: IExtUri): void; } class EditorInputFactoryRegistry implements IEditorInputFactoryRegistry { private instantiationService: IInstantiationService | undefined; private fileEditorInputFactory: IFileEditorInputFactory | undefined; - private customEditorInputFactory: ICustomEditorInputFactory | undefined; + private customEditorInputFactoryInstances: Map = new Map(); private readonly editorInputFactoryConstructors: Map> = new Map(); private readonly editorInputFactoryInstances: Map = new Map(); @@ -1293,12 +1307,12 @@ class EditorInputFactoryRegistry implements IEditorInputFactoryRegistry { return assertIsDefined(this.fileEditorInputFactory); } - registerCustomEditorInputFactory(factory: ICustomEditorInputFactory): void { - this.customEditorInputFactory = factory; + registerCustomEditorInputFactory(scheme: string, factory: ICustomEditorInputFactory): void { + this.customEditorInputFactoryInstances.set(scheme, factory); } - getCustomEditorInputFactory(): ICustomEditorInputFactory { - return assertIsDefined(this.customEditorInputFactory); + getCustomEditorInputFactory(scheme: string): ICustomEditorInputFactory | undefined { + return this.customEditorInputFactoryInstances.get(scheme); } registerEditorInputFactory(editorInputId: string, ctor: IConstructorSignature0): IDisposable { @@ -1347,8 +1361,12 @@ export async function pathsToEditors(paths: IPathData[] | undefined, fileService startLineNumber: path.lineNumber, startColumn: path.columnNumber || 1 }, - pinned: true - } : { pinned: true }; + pinned: true, + override: path.overrideId + } : { + pinned: true, + override: path.overrideId + }; let input: IResourceEditorInput | IUntitledTextResourceEditorInput; if (!exists) { @@ -1375,3 +1393,23 @@ export const enum EditorsOrder { */ SEQUENTIAL } + +export function computeEditorAriaLabel(input: IEditorInput, index: number | undefined, group: IEditorGroup | undefined, groupCount: number): string { + let ariaLabel = input.getAriaLabel(); + if (group && !group.isPinned(input)) { + ariaLabel = localize('preview', "{0}, preview", ariaLabel); + } + + if (group && group.isSticky(index ?? input)) { + ariaLabel = localize('pinned', "{0}, pinned", ariaLabel); + } + + // Apply group information to help identify in + // which group we are (only if more than one group + // is actually opened) + if (group && groupCount > 1) { + ariaLabel = `${ariaLabel}, ${group.ariaLabel}`; + } + + return ariaLabel; +} diff --git a/src/vs/workbench/common/editor/editorGroup.ts b/src/vs/workbench/common/editor/editorGroup.ts index 6f1af4a6a2..ad9926422d 100644 --- a/src/vs/workbench/common/editor/editorGroup.ts +++ b/src/vs/workbench/common/editor/editorGroup.ts @@ -690,14 +690,14 @@ export class EditorGroup extends Disposable { return [this.editors[index], index]; } - contains(candidate: EditorInput, searchInSideBySideEditors?: boolean): boolean { + contains(candidate: EditorInput, options?: { supportSideBySide?: boolean, strictEquals?: boolean }): boolean { for (const editor of this.editors) { - if (this.matches(editor, candidate)) { + if (this.matches(editor, candidate, options?.strictEquals)) { return true; } - if (searchInSideBySideEditors && editor instanceof SideBySideEditorInput) { - if (this.matches(editor.master, candidate) || this.matches(editor.details, candidate)) { + if (options?.supportSideBySide && editor instanceof SideBySideEditorInput) { + if (this.matches(editor.master, candidate, options?.strictEquals) || this.matches(editor.details, candidate, options?.strictEquals)) { return true; } } @@ -706,11 +706,15 @@ export class EditorGroup extends Disposable { return false; } - private matches(editor: IEditorInput | null, candidate: IEditorInput | null): boolean { + private matches(editor: IEditorInput | null, candidate: IEditorInput | null, strictEquals?: boolean): boolean { if (!editor || !candidate) { return false; } + if (strictEquals) { + return editor === candidate; + } + return editor.matches(candidate); } diff --git a/src/vs/workbench/common/editor/resourceEditorInput.ts b/src/vs/workbench/common/editor/resourceEditorInput.ts index 7ac37b0c7f..ee9cddefa6 100644 --- a/src/vs/workbench/common/editor/resourceEditorInput.ts +++ b/src/vs/workbench/common/editor/resourceEditorInput.ts @@ -28,9 +28,9 @@ export class ResourceEditorInput extends AbstractTextResourceEditorInput impleme private modelReference: Promise> | undefined = undefined; constructor( + resource: URI, private name: string | undefined, private description: string | undefined, - resource: URI, private preferredMode: string | undefined, @ITextModelService private readonly textModelResolverService: ITextModelService, @ITextFileService textFileService: ITextFileService, @@ -40,7 +40,7 @@ export class ResourceEditorInput extends AbstractTextResourceEditorInput impleme @ILabelService labelService: ILabelService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService ) { - super(resource, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); + super(resource, undefined, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); } getTypeId(): string { diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index ccaa0074ba..4a4d801593 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -41,7 +41,7 @@ export class BaseTextEditorModel extends EditorModel implements ITextEditorModel // We need the resource to point to an existing model const model = this.modelService.getModel(textEditorModelHandle); if (!model) { - throw new Error(`Document with resource ${textEditorModelHandle.toString()} does not exist`); + throw new Error(`Document with resource ${textEditorModelHandle.toString(true)} does not exist`); } this.textEditorModelHandle = textEditorModelHandle; diff --git a/src/vs/workbench/common/editor/textResourceEditorInput.ts b/src/vs/workbench/common/editor/textResourceEditorInput.ts index 4433a43fea..8e60c598c3 100644 --- a/src/vs/workbench/common/editor/textResourceEditorInput.ts +++ b/src/vs/workbench/common/editor/textResourceEditorInput.ts @@ -13,7 +13,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { createMemoizer } from 'vs/base/common/decorators'; import { Schemas } from 'vs/base/common/network'; -import { dirname, isEqual } from 'vs/base/common/resources'; +import { dirname, extUri } from 'vs/base/common/resources'; /** * The base class for all editor inputs that open in text editors. @@ -22,8 +22,11 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { private static readonly MEMOIZER = createMemoizer(); + private label: URI; + constructor( public readonly resource: URI, + preferredLabel: URI | undefined, @IEditorService protected readonly editorService: IEditorService, @IEditorGroupsService protected readonly editorGroupService: IEditorGroupsService, @ITextFileService protected readonly textFileService: ITextFileService, @@ -33,6 +36,8 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { ) { super(); + this.label = preferredLabel || resource; + this.registerListeners(); } @@ -45,23 +50,39 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { } private onLabelEvent(scheme: string): void { - if (scheme === this.resource.scheme) { - - // Clear any cached labels from before - AbstractTextResourceEditorInput.MEMOIZER.clear(); - - // Trigger recompute of label - this._onDidChangeLabel.fire(); + if (scheme === this.label.scheme) { + this.updateLabel(); } } + private updateLabel(): void { + + // Clear any cached labels from before + AbstractTextResourceEditorInput.MEMOIZER.clear(); + + // Trigger recompute of label + this._onDidChangeLabel.fire(); + } + + setLabel(label: URI): void { + if (!extUri.isEqual(label, this.label)) { + this.label = label; + + this.updateLabel(); + } + } + + getLabel(): URI { + return this.label; + } + getName(): string { return this.basename; } @AbstractTextResourceEditorInput.MEMOIZER private get basename(): string { - return this.labelService.getUriBasenameLabel(this.resource); + return this.labelService.getUriBasenameLabel(this.label); } getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | undefined { @@ -78,17 +99,17 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { @AbstractTextResourceEditorInput.MEMOIZER private get shortDescription(): string { - return this.labelService.getUriBasenameLabel(dirname(this.resource)); + return this.labelService.getUriBasenameLabel(dirname(this.label)); } @AbstractTextResourceEditorInput.MEMOIZER private get mediumDescription(): string { - return this.labelService.getUriLabel(dirname(this.resource), { relative: true }); + return this.labelService.getUriLabel(dirname(this.label), { relative: true }); } @AbstractTextResourceEditorInput.MEMOIZER private get longDescription(): string { - return this.labelService.getUriLabel(dirname(this.resource)); + return this.labelService.getUriLabel(dirname(this.label)); } @AbstractTextResourceEditorInput.MEMOIZER @@ -98,12 +119,12 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { @AbstractTextResourceEditorInput.MEMOIZER private get mediumTitle(): string { - return this.labelService.getUriLabel(this.resource, { relative: true }); + return this.labelService.getUriLabel(this.label, { relative: true }); } @AbstractTextResourceEditorInput.MEMOIZER private get longTitle(): string { - return this.labelService.getUriLabel(this.resource); + return this.labelService.getUriLabel(this.label); } getTitle(verbosity: Verbosity): string { @@ -164,11 +185,7 @@ export abstract class AbstractTextResourceEditorInput extends EditorInput { return undefined; // save cancelled } - if (!isEqual(target, this.resource)) { - return this.editorService.createEditorInput({ resource: target }); - } - - return this; + return this.editorService.createEditorInput({ resource: target }); } async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index ec11af4178..66454885dd 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -318,13 +318,13 @@ export const PANEL_SECTION_HEADER_BORDER = registerColor('panelSectionHeader.bor dark: contrastBorder, light: contrastBorder, hc: contrastBorder -}, nls.localize('panelSectionHeaderBorder', "Panel section header border color. Panels are shown below the editor area and contain views like output and integrated terminal.")); +}, nls.localize('panelSectionHeaderBorder', "Panel section header border color used when multiple views are stacked vertically in the panel. Panels are shown below the editor area and contain views like output and integrated terminal.")); export const PANEL_SECTION_BORDER = registerColor('panelSection.border', { dark: PANEL_BORDER, light: PANEL_BORDER, hc: PANEL_BORDER -}, nls.localize('panelSectionBorder', "Panel section border color. Panels are shown below the editor area and contain views like output and integrated terminal.")); +}, nls.localize('panelSectionBorder', "Panel section border color used when multiple views are stacked horizontally in the panel. Panels are shown below the editor area and contain views like output and integrated terminal.")); // < --- Status --- > diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index ab8e9998c2..cb74a369c4 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -60,7 +60,9 @@ export interface IViewContainerDescriptor { readonly rejectAddedViews?: boolean; - order?: number; + readonly order?: number; + + requestedIndex?: number; } export interface IViewContainersRegistry { @@ -473,7 +475,7 @@ export interface IView { export const IViewsService = createDecorator('viewsService'); export interface IViewsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; // View Container APIs readonly onDidChangeViewContainerVisibility: Event<{ id: string, visible: boolean, location: ViewContainerLocation }>; @@ -501,7 +503,7 @@ export const IViewDescriptorService = createDecorator('v export interface IViewDescriptorService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; // ViewContainers readonly viewContainers: ReadonlyArray; @@ -515,7 +517,7 @@ export interface IViewDescriptorService { getViewContainerModel(viewContainer: ViewContainer): IViewContainerModel; readonly onDidChangeContainerLocation: Event<{ viewContainer: ViewContainer, from: ViewContainerLocation, to: ViewContainerLocation }>; - moveViewContainerToLocation(viewContainer: ViewContainer, location: ViewContainerLocation, order?: number): void; + moveViewContainerToLocation(viewContainer: ViewContainer, location: ViewContainerLocation, requestedIndex?: number): void; // Views getViewDescriptorById(id: string): IViewDescriptor | null; diff --git a/src/vs/workbench/contrib/backup/common/backupRestorer.ts b/src/vs/workbench/contrib/backup/common/backupRestorer.ts index d88567c882..dd9e7d0912 100644 --- a/src/vs/workbench/contrib/backup/common/backupRestorer.ts +++ b/src/vs/workbench/contrib/backup/common/backupRestorer.ts @@ -73,7 +73,10 @@ export class BackupRestorer implements IWorkbenchContribution { private findEditorByResource(resource: URI): IEditorInput | undefined { for (const editor of this.editorService.editors) { - if (isEqual(editor.resource, resource)) { + const customFactory = Registry.as(EditorExtensions.EditorInputFactories).getCustomEditorInputFactory(resource.scheme); + if (customFactory && customFactory.canResolveBackup(editor, resource)) { + return editor; + } else if (isEqual(editor.resource, resource)) { return editor; } } @@ -99,9 +102,12 @@ export class BackupRestorer implements IWorkbenchContribution { return { resource: toLocalResource(resource, this.environmentService.configuration.remoteAuthority), options, forceUntitled: true }; } - if (resource.scheme === Schemas.vscodeCustomEditor) { - const editor = await Registry.as(EditorExtensions.EditorInputFactories).getCustomEditorInputFactory() - .createCustomEditorInput(resource, this.instantiationService); + // handle custom editors by asking the custom editor input factory + // to create the input. + const customFactory = Registry.as(EditorExtensions.EditorInputFactories).getCustomEditorInputFactory(resource.scheme); + + if (customFactory) { + const editor = await customFactory.createCustomEditorInput(resource, this.instantiationService); return { editor, options }; } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts index b443c203ad..a948aa2b48 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts @@ -28,6 +28,7 @@ import type { ServicesAccessor } from 'vs/platform/instantiation/common/instanti import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import Severity from 'vs/base/common/severity'; +import { Codicon } from 'vs/base/common/codicons'; async function getBulkEditPane(viewsService: IViewsService): Promise { const view = await viewsService.openView(BulkEditPane.ID, true); @@ -354,6 +355,7 @@ const container = Registry.as(ViewContainerExtensions.V ViewPaneContainer, [BulkEditPane.ID, { mergeViewWithContainerWhenSingleView: true, donotShowContainerTitleWhenMergedWithContainer: true }] ), + icon: Codicon.lightbulb.classNames, storageId: BulkEditPane.ID }, ViewContainerLocation.Panel); @@ -362,5 +364,7 @@ Registry.as(ViewContainerExtensions.ViewsRegistry).registerViews name: localize('panel', "Refactor Preview"), when: BulkEditPreviewContribution.ctxEnabled, ctorDescriptor: new SyncDescriptor(BulkEditPane), + containerIcon: Codicon.lightbulb.classNames, + canMoveView: true }], container); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts index b3fb630ff2..321cee7fa1 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPane.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./bulkEdit'; -import { WorkbenchAsyncDataTree, IOpenEvent, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { WorkspaceEdit } from 'vs/editor/common/modes'; import { BulkEditElement, BulkEditDelegate, TextEditElementRenderer, FileElementRenderer, BulkEditDataSource, BulkEditIdentityProvider, FileElement, TextEditElement, BulkEditAccessibilityProvider, CategoryElementRenderer, BulkEditNaviLabelProvider, CategoryElement, BulkEditSorter } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditTree'; import { FuzzyScore } from 'vs/base/common/filters'; @@ -136,15 +136,13 @@ export class BulkEditPane extends ViewPane { expandOnlyOnTwistieClick: true, multipleSelectionSupport: false, keyboardNavigationLabelProvider: new BulkEditNaviLabelProvider(), - sorter: new BulkEditSorter() + sorter: new BulkEditSorter(), + openOnFocus: true } ); this._disposables.add(this._tree.onContextMenu(this._onContextMenu, this)); - - const navigator = new TreeResourceNavigator(this._tree, { openOnFocus: true }); - this._disposables.add(navigator); - this._disposables.add(navigator.onDidOpenResource(e => this._openElementAsEditor(e))); + this._disposables.add(this._tree.onDidOpen(e => this._openElementAsEditor(e))); // message this._message = document.createElement('span'); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts index b172a61559..00756da47d 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditPreview.ts @@ -248,15 +248,15 @@ export class BulkFileOperations { for (let file of this.fileOperations) { if (file.type !== BulkFileOperationType.TextEdit) { let checked = true; - file.originalEdits.forEach(edit => { + for (const edit of file.originalEdits.values()) { if (WorkspaceFileEdit.is(edit)) { checked = checked && this.checked.isChecked(edit); } - }); + } if (!checked) { - file.originalEdits.forEach(edit => { + for (const edit of file.originalEdits.values()) { this.checked.updateChecked(edit, checked); - }); + } } } } @@ -305,8 +305,7 @@ export class BulkFileOperations { const result: IIdentifiedSingleEditOperation[] = []; let ignoreAll = false; - file.originalEdits.forEach(edit => { - + for (const edit of file.originalEdits.values()) { if (WorkspaceTextEdit.is(edit)) { if (this.checked.isChecked(edit)) { result.push(EditOperation.replaceMove(Range.lift(edit.edit.range), edit.edit.text)); @@ -316,7 +315,7 @@ export class BulkFileOperations { // UNCHECKED WorkspaceFileEdit disables all text edits ignoreAll = true; } - }); + } if (ignoreAll) { return []; @@ -332,16 +331,11 @@ export class BulkFileOperations { } getUriOfEdit(edit: WorkspaceFileEdit | WorkspaceTextEdit): URI { - for (let file of this.fileOperations) { - let found = false; - file.originalEdits.forEach(value => { - if (!found && value === edit) { - found = true; + for (const value of file.originalEdits.values()) { + if (value === edit) { + return file.uri; } - }); - if (found) { - return file.uri; } } throw new Error('invalid edit'); diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree.ts index 1f0e9232ba..42dc8ba66b 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditTree.ts @@ -61,22 +61,22 @@ export class FileElement implements ICheckable { } // multiple file edits -> reflect single state - this.edit.originalEdits.forEach(edit => { + for (let edit of this.edit.originalEdits.values()) { if (WorkspaceFileEdit.is(edit)) { checked = checked && model.checked.isChecked(edit); } - }); + } // multiple categories and text change -> read all elements if (this.parent instanceof CategoryElement && this.edit.type === BulkFileOperationType.TextEdit) { for (let category of model.categories) { for (let file of category.fileOperations) { if (file.uri.toString() === this.edit.uri.toString()) { - file.originalEdits.forEach(edit => { + for (const edit of file.originalEdits.values()) { if (WorkspaceFileEdit.is(edit)) { checked = checked && model.checked.isChecked(edit); } - }); + } } } } @@ -87,18 +87,18 @@ export class FileElement implements ICheckable { setChecked(value: boolean): void { let model = this.parent instanceof CategoryElement ? this.parent.parent : this.parent; - this.edit.originalEdits.forEach(edit => { + for (const edit of this.edit.originalEdits.values()) { model.checked.updateChecked(edit, value); - }); + } // multiple categories and file change -> update all elements if (this.parent instanceof CategoryElement && this.edit.type !== BulkFileOperationType.TextEdit) { for (let category of model.categories) { for (let file of category.fileOperations) { if (file.uri.toString() === this.edit.uri.toString()) { - file.originalEdits.forEach(edit => { + for (const edit of file.originalEdits.values()) { model.checked.updateChecked(edit, value); - }); + } } } } @@ -112,11 +112,11 @@ export class FileElement implements ICheckable { for (let category of model.categories) { for (let file of category.fileOperations) { if (file.uri.toString() === this.edit.uri.toString()) { - file.originalEdits.forEach(edit => { + for (const edit of file.originalEdits.values()) { if (WorkspaceFileEdit.is(edit)) { checked = checked && model.checked.isChecked(edit); } - }); + } } } } @@ -154,11 +154,11 @@ export class TextEditElement implements ICheckable { // make sure parent is checked when this element is checked... if (value) { - this.parent.edit.originalEdits.forEach(edit => { + for (const edit of this.parent.edit.originalEdits.values()) { if (WorkspaceFileEdit.is(edit)) { (model).checked.updateChecked(edit, value); } - }); + } } } diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts index 2798bc6e96..7a21baeb40 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -153,7 +153,7 @@ export class AccessibilityProvider implements IListAccessibilityProvider { if (this.getDirection() === CallHierarchyDirection.CallsFrom) { return localize('from', "calls from {0}", element.item.name); } else { - return localize('to', "callers fo {0}", element.item.name); + return localize('to', "callers of {0}", element.item.name); } } } diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget.ts index eb92751f44..54f603c3df 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindReplaceWidget.ts @@ -15,7 +15,7 @@ import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBo import { SimpleButton, findCloseIcon, findNextMatchIcon, findPreviousMatchIcon, findReplaceIcon, findReplaceAllIcon } from 'vs/editor/contrib/find/findWidget'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; +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'; import { IColorTheme, registerThemingParticipant, IThemeService } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedReplaceInput } from 'vs/platform/browser/contextScopedHistoryWidget'; import { ReplaceInput, IReplaceInputStyles } from 'vs/base/browser/ui/findinput/replaceInput'; @@ -267,6 +267,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { public updateTheme(theme: IColorTheme): void { const inputStyles: IFindInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), + inputActiveOptionForeground: theme.getColor(inputActiveOptionBackground), inputActiveOptionBackground: theme.getColor(inputActiveOptionBackground), inputBackground: theme.getColor(inputBackground), inputForeground: theme.getColor(inputForeground), @@ -284,6 +285,7 @@ export abstract class SimpleFindReplaceWidget extends Widget { this._findInput.style(inputStyles); const replaceStyles: IReplaceInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), + inputActiveOptionForeground: theme.getColor(inputActiveOptionForeground), inputActiveOptionBackground: theme.getColor(inputActiveOptionBackground), inputBackground: theme.getColor(inputBackground), inputForeground: theme.getColor(inputForeground), diff --git a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts index de44839c20..3607b5b438 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/find/simpleFindWidget.ts @@ -15,7 +15,7 @@ import { IMessage as InputBoxMessage } from 'vs/base/browser/ui/inputbox/inputBo import { SimpleButton, findPreviousMatchIcon, findNextMatchIcon, findCloseIcon } from 'vs/editor/contrib/find/findWidget'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { editorWidgetBackground, inputActiveOptionBorder, inputActiveOptionBackground, inputBackground, inputBorder, inputForeground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground, inputValidationInfoBackground, inputValidationInfoBorder, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningBorder, inputValidationWarningForeground, widgetShadow, editorWidgetForeground } from 'vs/platform/theme/common/colorRegistry'; +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'; import { IColorTheme, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput } from 'vs/platform/browser/contextScopedHistoryWidget'; @@ -168,6 +168,7 @@ export abstract class SimpleFindWidget extends Widget { public updateTheme(theme: IColorTheme): void { const inputStyles: IFindInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), + inputActiveOptionForeground: theme.getColor(inputActiveOptionForeground), inputActiveOptionBackground: theme.getColor(inputActiveOptionBackground), inputBackground: theme.getColor(inputBackground), inputForeground: theme.getColor(inputForeground), diff --git a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts index e87c6d73ee..cdcbbc027e 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts @@ -34,6 +34,7 @@ import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/ import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEditor/browser/selectionClipboard'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { IThemable } from 'vs/base/common/styler'; +import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; interface SuggestResultsProvider { /** @@ -311,7 +312,7 @@ function getSuggestEnabledInputOptions(ariaLabel?: string): IEditorOptions { roundedSelection: false, renderIndentGuides: false, cursorWidth: 1, - fontFamily: ' system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif', + fontFamily: DEFAULT_FONT_FAMILY, ariaLabel: ariaLabel || '', snippetSuggestions: 'none', diff --git a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts index e15dd4f674..7230e8e2e6 100644 --- a/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-sandbox/sleepResumeRepaintMinimap.ts @@ -6,17 +6,21 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { Disposable } from 'vs/base/common/lifecycle'; -class SleepResumeRepaintMinimap implements IWorkbenchContribution { +class SleepResumeRepaintMinimap extends Disposable implements IWorkbenchContribution { constructor( - @ICodeEditorService codeEditorService: ICodeEditorService + @ICodeEditorService codeEditorService: ICodeEditorService, + @IElectronService electronService: IElectronService ) { - ipcRenderer.on('vscode:osResume', () => { + super(); + + this._register(electronService.onOSResume(() => { codeEditorService.listCodeEditors().forEach(editor => editor.render(true)); - }); + })); } } diff --git a/src/vs/workbench/contrib/comments/browser/commentService.ts b/src/vs/workbench/contrib/comments/browser/commentService.ts index 6fda8f97d0..79f60d1ce3 100644 --- a/src/vs/workbench/contrib/comments/browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/browser/commentService.ts @@ -33,7 +33,7 @@ export interface IWorkspaceCommentThreadsEvent { } export interface ICommentService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidSetResourceCommentInfos: Event; readonly onDidSetAllCommentThreads: Event; readonly onDidUpdateCommentThreads: Event; @@ -60,7 +60,7 @@ export interface ICommentService { } export class CommentService extends Disposable implements ICommentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidSetDataProvider: Emitter = this._register(new Emitter()); readonly onDidSetDataProvider: Event = this._onDidSetDataProvider.event; diff --git a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts index e657bc3921..12457e5fab 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsTreeViewer.ts @@ -17,7 +17,7 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { WorkbenchAsyncDataTree, IListService } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree, IListService, IWorkbenchAsyncDataTreeOptions } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IColorMapping } from 'vs/platform/theme/common/styler'; @@ -150,7 +150,7 @@ export class CommentNodeRenderer implements IListRenderer } } -export interface ICommentsListOptions { +export interface ICommentsListOptions extends IWorkbenchAsyncDataTreeOptions { overrideStyles?: IColorMapping; } diff --git a/src/vs/workbench/contrib/comments/browser/commentsView.ts b/src/vs/workbench/contrib/comments/browser/commentsView.ts index 7031eb7385..cb335a4e42 100644 --- a/src/vs/workbench/contrib/comments/browser/commentsView.ts +++ b/src/vs/workbench/contrib/comments/browser/commentsView.ts @@ -27,8 +27,6 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { TreeResourceNavigator } from 'vs/platform/list/browser/listService'; - export class CommentsPanel extends ViewPane { private treeLabels!: ResourceLabels; @@ -150,10 +148,16 @@ export class CommentsPanel extends ViewPane { private createTree(): void { this.treeLabels = this._register(this.instantiationService.createInstance(ResourceLabels, this)); - this.tree = this._register(this.instantiationService.createInstance(CommentsList, this.treeLabels, this.treeContainer, { overrideStyles: { listBackground: this.getBackgroundColor() } })); + this.tree = this._register(this.instantiationService.createInstance(CommentsList, this.treeLabels, this.treeContainer, { + overrideStyles: { listBackground: this.getBackgroundColor() }, + openOnFocus: true, + accessibilityProvider: { // TODO@rebornix implement a proper accessibility provider + getAriaLabel(element: any): string | null { return null; }, + getWidgetAriaLabel(): string { return 'Comments'; } + } + })); - const commentsNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(commentsNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { this.openFile(e.element, e.editorOptions.pinned, e.editorOptions.preserveFocus, e.sideBySide); })); } diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts b/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts index ecc3b37529..2bab3f5609 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditor.contribution.ts @@ -3,6 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Schemas } from 'vs/base/common/network'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -38,4 +39,4 @@ Registry.as(EditorInputExtensions.EditorInputFactor CustomEditorInputFactory); Registry.as(EditorInputExtensions.EditorInputFactories) - .registerCustomEditorInputFactory(CustomEditorInputFactory); + .registerCustomEditorInputFactory(Schemas.vscodeCustomEditor, CustomEditorInputFactory); diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts index e292255255..847b5f2f6e 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInput.ts @@ -166,7 +166,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { return undefined; } - return this.move(groupId, target)?.editor; + return this.rename(groupId, target)?.editor; } public async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { @@ -196,7 +196,7 @@ export class CustomEditorInput extends LazilyResolvedWebviewEditorInput { return null; } - move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { + rename(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { // See if we can keep using the same custom editor provider const editorInfo = this.customEditorService.getCustomEditor(this.viewType); if (editorInfo?.matches(newResource)) { diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts index 91ce48350f..deadb958c7 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditorInputFactory.ts @@ -57,11 +57,12 @@ export class CustomEditorInputFactory extends WebviewEditorInputFactory { } public serialize(input: CustomEditorInput): string | undefined { + const dirty = input.isDirty(); const data: SerializedCustomEditor = { ...this.toJson(input), editorResource: input.resource.toJSON(), - dirty: input.isDirty(), - backupId: input.backupId, + dirty, + backupId: dirty ? input.backupId : undefined, }; try { @@ -123,4 +124,14 @@ export class CustomEditorInputFactory extends WebviewEditorInputFactory { return editor; }); } + + public static canResolveBackup(editorInput: IEditorInput, backupResource: URI): boolean { + if (editorInput instanceof CustomEditorInput) { + if (editorInput.resource.path === backupResource.path && backupResource.authority === editorInput.viewType) { + return true; + } + } + + return false; + } } diff --git a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts index 705cfe7dc3..19ce08fc18 100644 --- a/src/vs/workbench/contrib/customEditor/browser/customEditors.ts +++ b/src/vs/workbench/contrib/customEditor/browser/customEditors.ts @@ -3,6 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Registry } from 'vs/platform/registry/common/platform'; import { coalesce, distinct } from 'vs/base/common/arrays'; import { Emitter, Event } from 'vs/base/common/event'; import { Lazy } from 'vs/base/common/lazy'; @@ -21,11 +22,10 @@ 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 { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { EditorInput, EditorOptions, GroupIdentifier, IEditorInput, IEditorPane } from 'vs/workbench/common/editor'; +import { EditorInput, EditorOptions, GroupIdentifier, IEditorInput, IEditorPane, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { CONTEXT_CUSTOM_EDITORS, CONTEXT_FOCUSED_CUSTOM_EDITOR_IS_EDITABLE, CustomEditorCapabilities, CustomEditorInfo, CustomEditorInfoCollection, CustomEditorPriority, ICustomEditorService } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { CustomEditorModelManager } from 'vs/workbench/contrib/customEditor/common/customEditorModelManager'; -import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { defaultEditorOverrideEntry } from 'vs/workbench/contrib/files/common/openWith'; import { IWebviewService, webviewHasOwnEditFunctionsContext } from 'vs/workbench/contrib/webview/browser/webview'; import { CustomEditorAssociation, CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; @@ -48,6 +48,8 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ private readonly _onDidChangeViewTypes = new Emitter(); onDidChangeViewTypes: Event = this._onDidChangeViewTypes.event; + private readonly _fileEditorInputFactory = Registry.as(EditorInputExtensions.EditorInputFactories).getFileEditorInputFactory(); + constructor( @IContextKeyService contextKeyService: IContextKeyService, @IFileService fileService: IFileService, @@ -203,7 +205,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ ): Promise { if (viewType === defaultCustomEditor.id) { const fileEditorInput = this.editorService.createEditorInput({ resource, forceFile: true }); - return this.openEditorForResource(resource, fileEditorInput, { ...options, ignoreOverrides: true }, group); + return this.openEditorForResource(resource, fileEditorInput, { ...options, override: false }, group); } if (!this._contributedEditors.get(viewType)) { @@ -322,7 +324,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ const editorsToReplace = new Map(); for (const group of this.editorGroupService.groups) { for (const editor of group.editors) { - if (editor instanceof FileEditorInput + if (this._fileEditorInputFactory.isFileEditorInput(editor) && !(editor instanceof CustomEditorInput) && isEqual(editor.resource, newResource) ) { @@ -391,7 +393,7 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ } const targetGroup = group || this.editorGroupService.activeGroup; - const newEditor = await this.openEditorForResource(resource, editorToUse.editor, { ...options, ignoreOverrides: true }, targetGroup); + const newEditor = await this.openEditorForResource(resource, editorToUse.editor, { ...options, override: false }, targetGroup); if (targetGroup.id !== editorToUse.group.id) { editorToUse.group.closeEditor(editorToUse.editor); } @@ -420,6 +422,9 @@ export class CustomEditorService extends Disposable implements ICustomEditorServ } export class CustomEditorContribution extends Disposable implements IWorkbenchContribution { + + private readonly _fileEditorInputFactory = Registry.as(EditorInputExtensions.EditorInputFactories).getFileEditorInputFactory(); + constructor( @IEditorService private readonly editorService: IEditorService, @ICustomEditorService private readonly customEditorService: ICustomEditorService, @@ -427,8 +432,8 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo super(); this._register(this.editorService.overrideOpenEditor({ - open: (editor, options, group, context, id) => { - return this.onEditorOpening(editor, options, group, id); + open: (editor, options, group) => { + return this.onEditorOpening(editor, options, group); }, getEditorOverrides: (resource: URI, _options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[] => { const currentEditor = group?.editors.find(editor => isEqual(editor.resource, resource)); @@ -441,16 +446,18 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo return [ { ...defaultEditorOverrideEntry, - active: currentEditor instanceof FileEditorInput, + active: this._fileEditorInputFactory.isFileEditorInput(currentEditor), }, - ...customEditors.allEditors.map(entry => { - return { - id: entry.id, - active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id, - label: entry.displayName, - detail: entry.providerDisplayName, - }; - }) + ...customEditors.allEditors + .filter(entry => entry.id !== defaultCustomEditor.id) + .map(entry => { + return { + id: entry.id, + active: currentEditor instanceof CustomEditorInput && currentEditor.viewType === entry.id, + label: entry.displayName, + detail: entry.providerDisplayName, + }; + }) ]; } })); @@ -469,9 +476,9 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo private onEditorOpening( editor: IEditorInput, options: ITextEditorOptions | undefined, - group: IEditorGroup, - id?: string, + group: IEditorGroup ): IOpenEditorOverride | undefined { + const id = typeof options?.override === 'string' ? options.override : undefined; if (editor instanceof CustomEditorInput) { if (editor.group === group.id && (editor.viewType === id || typeof id !== 'string')) { // No need to do anything @@ -496,12 +503,8 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo } if (id) { - if (editor instanceof FileEditorInput && id === defaultCustomEditor.id) { - return undefined; - } - return { - override: this.customEditorService.openWith(resource, id, { ...options, ignoreOverrides: true }, group) + override: this.customEditorService.openWith(resource, id, { ...options, override: false }, group) }; } @@ -533,7 +536,7 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo return { override: this.editorService.openEditor(existingEditorForResource, { ...options, - ignoreOverrides: true, + override: false, activation: options?.preserveFocus ? EditorActivation.RESTORE : undefined, }, group) }; @@ -564,7 +567,7 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo // Open VS Code's standard editor but prompt user to see if they wish to use a custom one instead return { override: (async () => { - const standardEditor = await this.editorService.openEditor(editor, { ...options, ignoreOverrides: true }, group); + const standardEditor = await this.editorService.openEditor(editor, { ...options, override: false }, group); // Give a moment to make sure the editor is showing. // Otherwise the focus shift can cause the prompt to be dismissed right away. await new Promise(resolve => setTimeout(resolve, 20)); @@ -587,7 +590,7 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo options: ITextEditorOptions | undefined, group: IEditorGroup ): IOpenEditorOverride | undefined { - const getCustomEditorOverrideForSubInput = (subInput: IEditorInput, customClasses: string): EditorInput | undefined => { + const getBestAvailableEditorForSubInput = (subInput: IEditorInput): CustomEditorInfo | undefined => { if (subInput instanceof CustomEditorInput) { return undefined; } @@ -596,33 +599,43 @@ export class CustomEditorContribution extends Disposable implements IWorkbenchCo return undefined; } - // Prefer default editors in the diff editor case but ultimatly always take the first editor + // Prefer default editors in the diff editor case but ultimately always take the first editor const allEditors = new CustomEditorInfoCollection([ ...this.customEditorService.getUserConfiguredCustomEditors(resource).allEditors, ...this.customEditorService.getContributedCustomEditors(resource).allEditors.filter(x => x.priority !== CustomEditorPriority.option), ]); - - const bestAvailableEditor = allEditors.bestAvailableEditor; - if (!bestAvailableEditor) { - return undefined; - } - - const input = this.customEditorService.createInput(resource, bestAvailableEditor.id, group.id, { customClasses }); - if (input instanceof EditorInput) { - return input; - } - - return undefined; + return allEditors.bestAvailableEditor; }; - const modifiedOverride = getCustomEditorOverrideForSubInput(editor.modifiedInput, 'modified'); - const originalOverride = getCustomEditorOverrideForSubInput(editor.originalInput, 'original'); + const createEditorForSubInput = (subInput: IEditorInput, editor: CustomEditorInfo | undefined, customClasses: string): EditorInput | undefined => { + if (!editor) { + return undefined; // {{SQL CARBON EDIT}} Strict-null-checks + } + if (!subInput.resource) { + return undefined; // {{SQL CARBON EDIT}} Strict-null-checks + } + const input = this.customEditorService.createInput(subInput.resource, editor.id, group.id, { customClasses }); + return input instanceof EditorInput ? input : undefined; + }; + const modifiedEditorInfo = getBestAvailableEditorForSubInput(editor.modifiedInput); + const originalEditorInfo = getBestAvailableEditorForSubInput(editor.originalInput); + + // If we are only using default editors, no need to override anything + if ( + (!modifiedEditorInfo || modifiedEditorInfo.id === defaultCustomEditor.id) && + (!originalEditorInfo || originalEditorInfo.id === defaultCustomEditor.id) + ) { + return undefined; + } + + const modifiedOverride = createEditorForSubInput(editor.modifiedInput, modifiedEditorInfo, 'modified'); + const originalOverride = createEditorForSubInput(editor.originalInput, originalEditorInfo, 'original'); if (modifiedOverride || originalOverride) { return { override: (async () => { const input = new DiffEditorInput(editor.getName(), editor.getDescription(), originalOverride || editor.originalInput, modifiedOverride || editor.modifiedInput, true); - return this.editorService.openEditor(input, { ...options, ignoreOverrides: true }, group); + return this.editorService.openEditor(input, { ...options, override: false }, group); })(), }; } diff --git a/src/vs/workbench/contrib/customEditor/common/customEditor.ts b/src/vs/workbench/contrib/customEditor/common/customEditor.ts index c30796488f..dd0bcacef3 100644 --- a/src/vs/workbench/contrib/customEditor/common/customEditor.ts +++ b/src/vs/workbench/contrib/customEditor/common/customEditor.ts @@ -7,6 +7,7 @@ import { distinct, mergeSort } from 'vs/base/common/arrays'; import { Event } from 'vs/base/common/event'; import * as glob from 'vs/base/common/glob'; import { IDisposable, IReference } from 'vs/base/common/lifecycle'; +import { Schemas } from 'vs/base/common/network'; import { posix } from 'vs/base/common/path'; import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; @@ -89,6 +90,11 @@ export interface CustomEditorDescriptor { export class CustomEditorInfo implements CustomEditorDescriptor { + private static readonly excludedSchemes = new Set([ + Schemas.extension, + Schemas.webviewPanel, + ]); + public readonly id: string; public readonly displayName: string; public readonly providerDisplayName: string; @@ -108,6 +114,10 @@ export class CustomEditorInfo implements CustomEditorDescriptor { } static selectorMatches(selector: CustomEditorSelector, resource: URI): boolean { + if (CustomEditorInfo.excludedSchemes.has(resource.scheme)) { + return false; + } + if (selector.filenamePattern) { const matchOnPath = selector.filenamePattern.indexOf(posix.sep) >= 0; const target = matchOnPath ? resource.path : basename(resource); diff --git a/src/vs/workbench/contrib/customEditor/common/extensionPoint.ts b/src/vs/workbench/contrib/customEditor/common/extensionPoint.ts index e427cb9686..c9b2bb3572 100644 --- a/src/vs/workbench/contrib/customEditor/common/extensionPoint.ts +++ b/src/vs/workbench/contrib/customEditor/common/extensionPoint.ts @@ -45,7 +45,7 @@ const CustomEditorsContribution: IJSONSchema = { properties: { [Fields.viewType]: { type: 'string', - description: nls.localize('contributes.viewType', 'Unique identifier of the custom editor.'), + markdownDescription: nls.localize('contributes.viewType', 'Identifier for the custom editor. This must be unique across all custom editors, so we recommend including your extension id as part of `viewType`. The `viewType` is used when registering custom editors with `vscode.registerCustomEditorProvider` and in the `onCustomEditor:${id}` [activation event](https://code.visualstudio.com/api/references/activation-events).'), }, [Fields.displayName]: { type: 'string', @@ -71,14 +71,14 @@ const CustomEditorsContribution: IJSONSchema = { }, [Fields.priority]: { type: 'string', - description: nls.localize('contributes.priority', 'Controls when the custom editor is used. May be overridden by users.'), + markdownDeprecationMessage: nls.localize('contributes.priority', 'Controls if the custom editor is enabled automatically when the user opens a file. This may be overridden by users using the `workbench.editorAssociations` setting.'), enum: [ CustomEditorPriority.default, CustomEditorPriority.option, ], markdownEnumDescriptions: [ - nls.localize('contributes.priority.default', 'Editor is automatically used for a resource if no other default custom editors are registered for it.'), - nls.localize('contributes.priority.option', 'Editor is not automatically used but can be selected by a user.'), + nls.localize('contributes.priority.default', 'The editor is automatically used when the user opens a resource, provided that no other default custom editors are registered for that resource.'), + nls.localize('contributes.priority.option', 'The editor is not automatically used when the user opens a resource, but a user can switch to the editor using the `Reopen With` command.'), ], default: 'default' } diff --git a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts index cf591240a0..82c18df089 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointWidget.ts @@ -41,7 +41,7 @@ import { IEditorOptions, EditorOption } from 'vs/editor/common/config/editorOpti const $ = dom.$; const IPrivateBreakpointWidgetService = createDecorator('privateBreakpointWidgetService'); export interface IPrivateBreakpointWidgetService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; close(success: boolean): void; } const DECORATION_KEY = 'breakpointwidgetdecoration'; @@ -75,7 +75,7 @@ function createDecorations(theme: IColorTheme, placeHolder: string): IDecoration } export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWidgetService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private selectContainer!: HTMLElement; private inputContainer!: HTMLElement; @@ -250,7 +250,7 @@ export class BreakpointWidget extends ZoneWidget implements IPrivateBreakpointWi } return { - suggestions: suggestions.map(s => { + suggestions: suggestions.items.map(s => { s.completion.range = Range.fromPositions(position.delta(0, -overwriteBefore), position); return s.completion; }) diff --git a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 7810263202..be879cdb32 100644 --- a/src/vs/workbench/contrib/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -22,7 +22,7 @@ import { IEditorPane } from 'vs/workbench/common/editor'; import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { WorkbenchList, ListResourceNavigator } from 'vs/platform/list/browser/listService'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { attachInputBoxStyler } from 'vs/platform/theme/common/styler'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -110,38 +110,33 @@ export class BreakpointsView extends ViewPane { this._register(this.list.onContextMenu(this.onListContextMenu, this)); - this._register(this.list.onDidOpen(async e => { - let isSingleClick = false; - let isDoubleClick = false; - let isMiddleClick = false; - let openToSide = false; - - const browserEvent = e.browserEvent; - if (browserEvent instanceof MouseEvent) { - isSingleClick = browserEvent.detail === 1; - isDoubleClick = browserEvent.detail === 2; - isMiddleClick = browserEvent.button === 1; - openToSide = (browserEvent.ctrlKey || browserEvent.metaKey || browserEvent.altKey); + this.list.onMouseMiddleClick(async ({ element }) => { + if (element instanceof Breakpoint) { + await this.debugService.removeBreakpoints(element.getId()); + } else if (element instanceof FunctionBreakpoint) { + await this.debugService.removeFunctionBreakpoints(element.getId()); + } else if (element instanceof DataBreakpoint) { + await this.debugService.removeDataBreakpoints(element.getId()); } + }); - const focused = this.list.getFocusedElements(); - const element = focused.length ? focused[0] : undefined; - - if (isMiddleClick) { - if (element instanceof Breakpoint) { - await this.debugService.removeBreakpoints(element.getId()); - } else if (element instanceof FunctionBreakpoint) { - await this.debugService.removeFunctionBreakpoints(element.getId()); - } else if (element instanceof DataBreakpoint) { - await this.debugService.removeDataBreakpoints(element.getId()); - } + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService })); + this._register(resourceNavigator.onDidOpen(async e => { + if (e.element === null) { return; } - if (element instanceof Breakpoint) { - openBreakpointSource(element, openToSide, isSingleClick, this.debugService, this.editorService); + if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) { // middle click + return; } - if (isDoubleClick && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedFunctionBreakpoint()) { + + const element = this.list.element(e.element); + + if (element instanceof Breakpoint) { + openBreakpointSource(element, e.sideBySide, e.editorOptions.preserveFocus || false, this.debugService, this.editorService); + } + if (e.browserEvent instanceof MouseEvent && e.browserEvent.detail === 2 && element instanceof FunctionBreakpoint && element !== this.debugService.getViewModel().getSelectedFunctionBreakpoint()) { + // double click this.debugService.getViewModel().setSelectedFunctionBreakpoint(element); this.onBreakpointsChange(); } @@ -154,6 +149,11 @@ export class BreakpointsView extends ViewPane { this.onBreakpointsChange(); } })); + + const containerModel = this.viewDescriptorService.getViewContainerModel(this.viewDescriptorService.getViewContainerByViewId(this.id)!)!; + this._register(containerModel.onDidChangeAllViewDescriptors(() => { + this.updateSize(); + })); } public focus(): void { @@ -237,9 +237,11 @@ export class BreakpointsView extends ViewPane { } private updateSize(): void { + const containerModel = this.viewDescriptorService.getViewContainerModel(this.viewDescriptorService.getViewContainerByViewId(this.id)!)!; + // Adjust expanded body size this.minimumBodySize = this.orientation === Orientation.VERTICAL ? getExpandedBodySize(this.debugService.getModel(), MAX_VISIBLE_BREAKPOINTS) : 170; - this.maximumBodySize = this.orientation === Orientation.VERTICAL ? getExpandedBodySize(this.debugService.getModel(), Number.POSITIVE_INFINITY) : Number.POSITIVE_INFINITY; + this.maximumBodySize = this.orientation === Orientation.VERTICAL && containerModel.visibleViewDescriptors.length > 1 ? getExpandedBodySize(this.debugService.getModel(), Number.POSITIVE_INFINITY) : Number.POSITIVE_INFINITY; } private onBreakpointsChange(): void { diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index 2e0997379a..445b47c881 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -23,10 +23,10 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { createAndFillInContextMenuActions, createAndFillInActionBarActions, MenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { ITreeRenderer, ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; -import { TreeResourceNavigator, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; +import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; -import { createMatches, FuzzyScore } from 'vs/base/common/filters'; +import { createMatches, FuzzyScore, IMatch } from 'vs/base/common/filters'; import { Event } from 'vs/base/common/event'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -43,6 +43,9 @@ import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { commonSuffixLength } from 'vs/base/common/strings'; import { posix } from 'vs/base/common/path'; +import { ITreeCompressionDelegate } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; +import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; const $ = dom.$; @@ -109,7 +112,7 @@ export class CallStackView extends ViewPane { private ignoreFocusStackFrameEvent = false; private callStackItemType: IContextKey; private dataSource!: CallStackDataSource; - private tree!: WorkbenchAsyncDataTree; + private tree!: WorkbenchCompressibleAsyncDataTree; private menu: IMenu; private parentSessionToExpand = new Set(); private selectionNeedsUpdate = false; @@ -195,7 +198,7 @@ export class CallStackView extends ViewPane { this.dataSource = new CallStackDataSource(this.debugService); const sessionsRenderer = this.instantiationService.createInstance(SessionsRenderer, this.menu); - this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'CallStackView', treeContainer, new CallStackDelegate(), [ + this.tree = >this.instantiationService.createInstance(WorkbenchCompressibleAsyncDataTree, 'CallStackView', treeContainer, new CallStackDelegate(), new CallStackCompressionDelegate(), [ sessionsRenderer, new ThreadsRenderer(this.instantiationService), this.instantiationService.createInstance(StackFramesRenderer), @@ -204,6 +207,7 @@ export class CallStackView extends ViewPane { new ShowMoreRenderer(this.themeService) ], this.dataSource, { accessibilityProvider: new CallStackAccessibilityProvider(), + compressionEnabled: true, identityProvider: { getId: (element: CallStackItem) => { if (typeof element === 'string') { @@ -232,6 +236,13 @@ export class CallStackView extends ViewPane { } return nls.localize('showMoreStackFrames2', "Show More Stack Frames"); + }, + getCompressedNodeKeyboardNavigationLabel: (e: CallStackItem[]) => { + const firstItem = e[0]; + if (isDebugSession(firstItem)) { + return firstItem.getLabel(); + } + return ''; } }, expandOnlyOnTwistieClick: true, @@ -242,9 +253,7 @@ export class CallStackView extends ViewPane { this.tree.setInput(this.debugService.getModel()); - const callstackNavigator = new TreeResourceNavigator(this.tree); - this._register(callstackNavigator); - this._register(callstackNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (this.ignoreSelectionChangedEvent) { return; } @@ -454,7 +463,7 @@ interface IStackFrameTemplateData { actionBar: ActionBar; } -class SessionsRenderer implements ITreeRenderer { +class SessionsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'session'; constructor( @@ -492,13 +501,23 @@ class SessionsRenderer implements ITreeRenderer, _: number, data: ISessionTemplateData): void { - const session = element.element; + this.doRenderElement(element.element, element.element.getLabel(), createMatches(element.filterData), data); + } + + renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: ISessionTemplateData, height: number | undefined): void { + const lastElement = node.element.elements[node.element.elements.length - 1]; + const matches = createMatches(node.filterData); + const label = node.element.elements.map(e => e.getLabel()).join(' '); + this.doRenderElement(lastElement, label, matches, templateData); + } + + private doRenderElement(session: IDebugSession, label: string, matches: IMatch[], data: ISessionTemplateData): void { data.session.title = nls.localize({ key: 'session', comment: ['Session is a noun'] }, "Session"); - data.label.set(session.getLabel(), createMatches(element.filterData)); + data.label.set(label, matches); const thread = session.getAllThreads().find(t => t.stopped); const setActionBar = () => { - const actions = getActions(this.instantiationService, element.element); + const actions = getActions(this.instantiationService, session); const primary: IAction[] = actions; const secondary: IAction[] = []; @@ -533,7 +552,7 @@ class SessionsRenderer implements ITreeRenderer { +class ThreadsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'thread'; constructor(private readonly instantiationService: IInstantiationService) { } @@ -564,15 +583,22 @@ class ThreadsRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: IThreadTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IThreadTemplateData): void { templateData.actionBar.dispose(); } } -class StackFramesRenderer implements ITreeRenderer { +class StackFramesRenderer implements ICompressibleTreeRenderer { static readonly ID = 'stackFrame'; - constructor(@ILabelService private readonly labelService: ILabelService) { } + constructor( + @ILabelService private readonly labelService: ILabelService, + @INotificationService private readonly notificationService: INotificationService + ) { } get templateId(): string { return StackFramesRenderer.ID; @@ -617,19 +643,27 @@ class StackFramesRenderer implements ITreeRenderer { - return stackFrame.restart(); + const action = new Action('debug.callStack.restartFrame', nls.localize('restartFrame', "Restart Frame"), 'codicon-debug-restart-frame', true, async () => { + try { + await stackFrame.restart(); + } catch (e) { + this.notificationService.error(e); + } }); data.actionBar.push(action, { icon: true, label: false }); } } + renderCompressedElements(node: ITreeNode, FuzzyScore>, index: number, templateData: IStackFrameTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IStackFrameTemplateData): void { templateData.actionBar.dispose(); } } -class ErrorsRenderer implements ITreeRenderer { +class ErrorsRenderer implements ICompressibleTreeRenderer { static readonly ID = 'error'; get templateId(): string { @@ -648,12 +682,16 @@ class ErrorsRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: IErrorTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: IErrorTemplateData): void { // noop } } -class LoadMoreRenderer implements ITreeRenderer { +class LoadMoreRenderer implements ICompressibleTreeRenderer { static readonly ID = 'loadMore'; static readonly LABEL = nls.localize('loadMoreStackFrames', "Load More Stack Frames"); @@ -678,12 +716,16 @@ class LoadMoreRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: ILabelTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: ILabelTemplateData): void { templateData.toDispose.dispose(); } } -class ShowMoreRenderer implements ITreeRenderer { +class ShowMoreRenderer implements ICompressibleTreeRenderer { static readonly ID = 'showMore'; constructor(private readonly themeService: IThemeService) { } @@ -713,6 +755,10 @@ class ShowMoreRenderer implements ITreeRenderer, FuzzyScore>, index: number, templateData: ILabelTemplateData, height: number | undefined): void { + throw new Error('Method not implemented.'); + } + disposeTemplate(templateData: ILabelTemplateData): void { templateData.toDispose.dispose(); } @@ -1037,3 +1083,13 @@ class ContinueAction extends Action { return this.commandService.executeCommand(CONTINUE_ID, undefined, getContext(this.thread)); } } + +class CallStackCompressionDelegate implements ITreeCompressionDelegate { + isIncompressible(stat: CallStackItem): boolean { + if (isDebugSession(stat)) { + return false; + } + + return true; + } +} diff --git a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts index 190e776696..a6d43c608e 100644 --- a/src/vs/workbench/contrib/debug/browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/browser/debug.contribution.ts @@ -169,7 +169,8 @@ registerDebugCommandPaletteItem(DISCONNECT_ID, DISCONNECT_LABEL, CONTEXT_IN_DEBU registerDebugCommandPaletteItem(STOP_ID, STOP_LABEL, CONTEXT_IN_DEBUG_MODE, CONTEXT_FOCUSED_SESSION_IS_ATTACH.toNegated()); registerDebugCommandPaletteItem(CONTINUE_ID, CONTINUE_LABEL, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); registerDebugCommandPaletteItem(FOCUS_REPL_ID, nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'debugFocusConsole' }, 'Focus on Debug Console View')); -registerDebugCommandPaletteItem(JUMP_TO_CURSOR_ID, nls.localize('jumpToCursor', "Jump to Cursor"), ContextKeyExpr.and(CONTEXT_JUMP_TO_CURSOR_SUPPORTED)); +registerDebugCommandPaletteItem(JUMP_TO_CURSOR_ID, nls.localize('jumpToCursor', "Jump to Cursor"), CONTEXT_JUMP_TO_CURSOR_SUPPORTED); +registerDebugCommandPaletteItem(JUMP_TO_CURSOR_ID, nls.localize('SetNextStatement', "Set Next Statement"), CONTEXT_JUMP_TO_CURSOR_SUPPORTED); registerDebugCommandPaletteItem(RunToCursorAction.ID, RunToCursorAction.LABEL, ContextKeyExpr.and(CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('stopped'))); registerDebugCommandPaletteItem(TOGGLE_INLINE_BREAKPOINT_ID, nls.localize('inlineBreakpoint', "Inline Breakpoint")); diff --git a/src/vs/workbench/contrib/debug/browser/debugActions.ts b/src/vs/workbench/contrib/debug/browser/debugActions.ts index 2f704e49b7..793f5b9d9a 100644 --- a/src/vs/workbench/contrib/debug/browser/debugActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActions.ts @@ -13,6 +13,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { INotificationService } from 'vs/platform/notification/common/notification'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { deepClone } from 'vs/base/common/objects'; export abstract class AbstractDebugAction extends Action { @@ -129,7 +130,8 @@ export class StartAction extends AbstractDebugAction { async run(): Promise { let { launch, name, config } = this.debugService.getConfigurationManager().selectedConfiguration; - return this.debugService.startDebugging(launch, config || name, { noDebug: this.isNoDebug() }); + const clonedConfig = deepClone(config); + return this.debugService.startDebugging(launch, clonedConfig || name, { noDebug: this.isNoDebug() }); } protected isNoDebug(): boolean { diff --git a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts index 2f769ceeb6..3790ab8dc9 100644 --- a/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugConfigurationManager.ts @@ -46,7 +46,6 @@ jsonRegistry.registerSchema(launchSchemaId, launchSchema); const DEBUG_SELECTED_CONFIG_NAME_KEY = 'debug.selectedconfigname'; const DEBUG_SELECTED_ROOT = 'debug.selectedroot'; -const DEBUG_SELECTED_CONFIG = 'debug.selectedconfig'; export class ConfigurationManager implements IConfigurationManager { private debuggers: Debugger[]; @@ -84,12 +83,10 @@ export class ConfigurationManager implements IConfigurationManager { const previousSelectedRoot = this.storageService.get(DEBUG_SELECTED_ROOT, StorageScope.WORKSPACE); const previousSelectedLaunch = this.launches.find(l => l.uri.toString() === previousSelectedRoot); this.debugConfigurationTypeContext = CONTEXT_DEBUG_CONFIGURATION_TYPE.bindTo(contextKeyService); - const storedConfig = this.storageService.get(DEBUG_SELECTED_CONFIG, StorageScope.WORKSPACE); - const selectedConfig = typeof storedConfig === 'string' ? JSON.parse(storedConfig) : undefined; if (previousSelectedLaunch && previousSelectedLaunch.getConfigurationNames().length) { - this.selectConfiguration(previousSelectedLaunch, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE), selectedConfig); + this.selectConfiguration(previousSelectedLaunch, this.storageService.get(DEBUG_SELECTED_CONFIG_NAME_KEY, StorageScope.WORKSPACE)); } else if (this.launches.length > 0) { - this.selectConfiguration(undefined, selectedConfig ? selectedConfig.name : undefined, selectedConfig); + this.selectConfiguration(undefined); } } @@ -105,25 +102,25 @@ export class ConfigurationManager implements IConfigurationManager { } createDebugAdapter(session: IDebugSession): IDebugAdapter | undefined { - let dap = this.debugAdapterFactories.get(session.configuration.type); - if (dap) { - return dap.createDebugAdapter(session); + let factory = this.debugAdapterFactories.get(session.configuration.type); + if (factory) { + return factory.createDebugAdapter(session); } return undefined; } substituteVariables(debugType: string, folder: IWorkspaceFolder | undefined, config: IConfig): Promise { - let dap = this.debugAdapterFactories.get(debugType); - if (dap) { - return dap.substituteVariables(folder, config); + let factory = this.debugAdapterFactories.get(debugType); + if (factory) { + return factory.substituteVariables(folder, config); } return Promise.resolve(config); } runInTerminal(debugType: string, args: DebugProtocol.RunInTerminalRequestArguments): Promise { - let tl = this.debugAdapterFactories.get(debugType); - if (tl) { - return tl.runInTerminal(args); + let factory = this.debugAdapterFactories.get(debugType); + if (factory) { + return factory.runInTerminal(args); } return Promise.resolve(void 0); } @@ -257,7 +254,7 @@ export class ConfigurationManager implements IConfigurationManager { const debugDynamicExtensionsTypes = extensions.map(e => { const activationEvent = e.activationEvents && e.activationEvents.find(e => e.includes(onDebugDynamicConfigurationsName)); if (activationEvent) { - const type = activationEvent.substr(onDebugDynamicConfigurationsName.length); + const type = activationEvent.substr(onDebugDynamicConfigurationsName.length + 1); return type || (e.contributes && e.contributes.debuggers && e.contributes.debuggers.length ? e.contributes.debuggers[0].type : undefined); } @@ -483,13 +480,12 @@ export class ConfigurationManager implements IConfigurationManager { this.setSelectedLaunchName(names.length ? names[0] : undefined); } - this.selectedConfig = config || (this.selectedLaunch && this.selectedName ? this.selectedLaunch.getConfiguration(this.selectedName) : undefined); - if (this.selectedConfig) { - this.debugConfigurationTypeContext.set(this.selectedConfig.type); - this.storageService.store(DEBUG_SELECTED_CONFIG, JSON.stringify(this.selectedConfig), StorageScope.WORKSPACE); + this.selectedConfig = config; + const configForType = this.selectedConfig || (this.selectedLaunch && this.selectedName ? this.selectedLaunch.getConfiguration(this.selectedName) : undefined); + if (configForType) { + this.debugConfigurationTypeContext.set(configForType.type); } else { this.debugConfigurationTypeContext.reset(); - this.storageService.remove(DEBUG_SELECTED_CONFIG, StorageScope.WORKSPACE); } if (this.selectedLaunch !== previousLaunch || this.selectedName !== previousName) { @@ -720,6 +716,9 @@ class Launch extends AbstractLaunch implements ILaunch { async writeConfiguration(configuration: IConfig): Promise { const fullConfig = objects.deepClone(this.getConfig()!); + if (!fullConfig.configurations) { + fullConfig.configurations = []; + } fullConfig.configurations.push(configuration); await this.configurationService.updateValue('launch', fullConfig, { resource: this.workspace.uri }, ConfigurationTarget.WORKSPACE_FOLDER); } diff --git a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index d8231194a0..a53d44beb1 100644 --- a/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -181,7 +181,7 @@ class SelectionToReplAction extends EditorAction { const text = editor.getModel().getValueInRange(editor.getSelection()); await session.addReplExpression(viewModel.focusedStackFrame!, text); - await viewsService.openView(REPL_VIEW_ID, true); + await viewsService.openView(REPL_VIEW_ID, false); } } @@ -268,10 +268,10 @@ class StepIntoTargetsAction extends EditorAction { const session = debugService.getViewModel().focusedSession; const frame = debugService.getViewModel().focusedStackFrame; - if (session && frame && editor.hasModel()) { + if (session && frame && editor.hasModel() && editor.getModel().uri.toString() === frame.source.uri.toString()) { const targets = await session.stepInTargets(frame.frameId); - const position = editor.getPosition(); - const cursorCoords = editor.getScrolledVisiblePosition(position); + editor.revealLineInCenterIfOutsideViewport(frame.range.startLineNumber); + const cursorCoords = editor.getScrolledVisiblePosition({ lineNumber: frame.range.startLineNumber, column: frame.range.startColumn }); const editorCoords = getDomNodePagePosition(editor.getDomNode()); const x = editorCoords.left + cursorCoords.left; const y = editorCoords.top + cursorCoords.top + cursorCoords.height; diff --git a/src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts b/src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts index 9df7a57d72..33b9191856 100644 --- a/src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts +++ b/src/vs/workbench/contrib/debug/browser/debugQuickAccess.ts @@ -11,7 +11,6 @@ import { IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { matchesFuzzy } from 'vs/base/common/filters'; -import { StartAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { withNullAsUndefined } from 'vs/base/common/types'; import { ADD_CONFIGURATION_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; @@ -65,13 +64,11 @@ export class StartDebugQuickAccessProvider extends PickerQuickAccessProvider { - if (StartAction.isEnabled(this.debugService)) { - this.debugService.getConfigurationManager().selectConfiguration(config.launch, config.name); - try { - await this.debugService.startDebugging(config.launch); - } catch (error) { - this.notificationService.error(error); - } + this.debugService.getConfigurationManager().selectConfiguration(config.launch, config.name); + try { + await this.debugService.startDebugging(config.launch); + } catch (error) { + this.notificationService.error(error); } } }); diff --git a/src/vs/workbench/contrib/debug/browser/debugService.ts b/src/vs/workbench/contrib/debug/browser/debugService.ts index ed95490ab0..7a88a26fd2 100644 --- a/src/vs/workbench/contrib/debug/browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/browser/debugService.ts @@ -21,7 +21,6 @@ import * as debugactions from 'vs/workbench/contrib/debug/browser/debugActions'; import { ConfigurationManager } from 'vs/workbench/contrib/debug/browser/debugConfigurationManager'; import { VIEWLET_ID as EXPLORER_VIEWLET_ID } from 'vs/workbench/contrib/files/common/files'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -33,7 +32,7 @@ import { IAction } from 'vs/base/common/actions'; import { deepClone, equals } from 'vs/base/common/objects'; import { DebugSession } from 'vs/workbench/contrib/debug/browser/debugSession'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, DEBUG_PANEL_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IStackFrame, getStateLabel, IDebugSessionOptions, CONTEXT_DEBUG_UX, REPL_VIEW_ID, CONTEXT_BREAKPOINTS_EXIST, IGlobalConfig } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IStackFrame, getStateLabel, IDebugSessionOptions, CONTEXT_DEBUG_UX, REPL_VIEW_ID, CONTEXT_BREAKPOINTS_EXIST, IGlobalConfig } from 'vs/workbench/contrib/debug/common/debug'; import { getExtensionHostDebugSession } from 'vs/workbench/contrib/debug/common/debugUtils'; import { isErrorWithActions } from 'vs/base/common/errorsWithActions'; import { RunOnceScheduler } from 'vs/base/common/async'; @@ -49,7 +48,7 @@ import { DebugTelemetry } from 'vs/workbench/contrib/debug/common/debugTelemetry import { DebugCompoundRoot } from 'vs/workbench/contrib/debug/common/debugCompoundRoot'; export class DebugService implements IDebugService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeState: Emitter; private readonly _onDidNewSession: Emitter; @@ -76,7 +75,6 @@ export class DebugService implements IDebugService { constructor( @IEditorService private readonly editorService: IEditorService, @IViewletService private readonly viewletService: IViewletService, - @IPanelService private readonly panelService: IPanelService, @IViewsService private readonly viewsService: IViewsService, @INotificationService private readonly notificationService: INotificationService, @IDialogService private readonly dialogService: IDialogService, @@ -374,11 +372,12 @@ export class DebugService implements IDebugService { // a no-folder workspace has no launch.config config = Object.create(null); } - const unresolvedConfig = deepClone(config); - if (options && options.noDebug) { config!.noDebug = true; + } else if (options && typeof options.noDebug === 'undefined' && options.parentSession && options.parentSession.configuration.noDebug) { + config!.noDebug = true; } + const unresolvedConfig = deepClone(config); if (!type) { const guess = await this.configurationManager.guessDebugger(); @@ -597,8 +596,8 @@ export class DebugService implements IDebugService { const dataBreakpoints = this.model.getDataBreakpoints().filter(dbp => !dbp.canPersist); dataBreakpoints.forEach(dbp => this.model.removeDataBreakpoints(dbp.getId())); - if (this.panelService.getLastActivePanelId() === DEBUG_PANEL_ID && this.configurationService.getValue('debug').console.closeOnEnd) { - this.panelService.hideActivePanel(); + if (this.viewsService.isViewVisible(REPL_VIEW_ID) && this.configurationService.getValue('debug').console.closeOnEnd) { + this.viewsService.closeView(REPL_VIEW_ID); } } })); diff --git a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts index aa80160a47..571a574f5f 100644 --- a/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts +++ b/src/vs/workbench/contrib/debug/browser/extensionHostDebugService.ts @@ -104,6 +104,11 @@ class BrowserExtensionHostDebugService extends ExtensionHostDebugChannelClient i environment.set('inspect-brk-extensions', inspectBrkExtensions); } + const inspectExtensions = this.findArgument('inspect-extensions', args); + if (inspectExtensions) { + environment.set('inspect-extensions', inspectExtensions); + } + // Open debug window as new window. Pass ParsedArgs over. return this.workspaceProvider.open(debugWorkspace, { reuse: false, // debugging always requires a new window @@ -127,7 +132,7 @@ registerSingleton(IExtensionHostDebugService, BrowserExtensionHostDebugService); class BrowserDebugHelperService implements IDebugHelperService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined { return undefined; diff --git a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts index 4face4c908..8e36cda158 100644 --- a/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts +++ b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts @@ -28,7 +28,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeNode, ITreeFilter, TreeVisibility, TreeFilterResult, ITreeElement } from 'vs/base/browser/ui/tree/tree'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { TreeResourceNavigator, WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchCompressibleObjectTree } from 'vs/platform/list/browser/listService'; import { dispose } from 'vs/base/common/lifecycle'; import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import { DebugContentProvider } from 'vs/workbench/contrib/debug/common/debugContentProvider'; @@ -491,9 +491,7 @@ export class LoadedScriptsView extends ViewPane { }, 300); this._register(this.changeScheduler); - const loadedScriptsNavigator = new TreeResourceNavigator(this.tree); - this._register(loadedScriptsNavigator); - this._register(loadedScriptsNavigator.onDidOpenResource(e => { + this._register(this.tree.onDidOpen(e => { if (e.element instanceof BaseTreeItem) { const source = e.element.getSource(); if (source && source.available) { diff --git a/src/vs/workbench/contrib/debug/browser/media/debugHover.css b/src/vs/workbench/contrib/debug/browser/media/debugHover.css index 09fd3d15ae..90743ed343 100644 --- a/src/vs/workbench/contrib/debug/browser/media/debugHover.css +++ b/src/vs/workbench/contrib/debug/browser/media/debugHover.css @@ -12,6 +12,7 @@ user-select: text; -webkit-user-select: text; word-break: break-all; + white-space: pre; } .monaco-editor .debug-hover-widget .complex-value { diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index defc4896a6..abcf82f4fd 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -74,7 +74,7 @@ function revealLastElement(tree: WorkbenchAsyncDataTree) { const sessionsToIgnore = new Set(); export class Repl extends ViewPane implements IHistoryNavigationWidget { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly REFRESH_DELAY = 100; // delay in ms to refresh the repl for new elements to show private static readonly URI = uri.parse(`${DEBUG_SCHEME}:replinput`); @@ -606,6 +606,13 @@ export class Repl extends ViewPane implements IHistoryNavigationWidget { await this.clipboardService.writeText(this.getVisibleContent()); return Promise.resolve(); })); + actions.push(new Action('debug.replPaste', localize('paste', "Paste"), undefined, true, async () => { + const clipboardText = await this.clipboardService.readText(); + if (clipboardText) { + this.replInput.setValue(this.replInput.getValue().concat(clipboardText)); + } + })); + actions.push(new Separator()); actions.push(new Action('debug.collapseRepl', localize('collapse', "Collapse All"), undefined, true, () => { this.tree.collapseAll(); this.replInput.focus(); diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index 79881a3754..920fbcaca1 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -8,8 +8,8 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import * as dom from 'vs/base/browser/dom'; import { CollapseAction } from 'vs/workbench/browser/viewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; -import { Variable, Scope, ErrorScope } from 'vs/workbench/contrib/debug/common/debugModel'; +import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IStackFrame } from 'vs/workbench/contrib/debug/common/debug'; +import { Variable, Scope, ErrorScope, StackFrame } from 'vs/workbench/contrib/debug/common/debugModel'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { renderViewTree, renderVariable, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView'; @@ -34,6 +34,7 @@ import { IViewDescriptorService } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { withUndefinedAsNull } from 'vs/base/common/types'; const $ = dom.$; let forgetScopes = true; @@ -44,8 +45,9 @@ export class VariablesView extends ViewPane { private onFocusStackFrameScheduler: RunOnceScheduler; private needsRefresh = false; - private tree!: WorkbenchAsyncDataTree; - private savedViewState: IAsyncDataTreeViewState | undefined; + private tree!: WorkbenchAsyncDataTree; + private savedViewState = new Map(); + private autoExpandedScopes = new Set(); constructor( options: IViewletViewOptions, @@ -68,26 +70,24 @@ export class VariablesView extends ViewPane { const stackFrame = this.debugService.getViewModel().focusedStackFrame; this.needsRefresh = false; - if (stackFrame && this.savedViewState) { - await this.tree.setInput(this.debugService.getViewModel(), this.savedViewState); - this.savedViewState = undefined; - } else { - if (!stackFrame) { - // We have no stackFrame, save tree state before it is cleared - this.savedViewState = this.tree.getViewState(); - } - await this.tree.updateChildren(); - if (stackFrame) { - const scopes = await stackFrame.getScopes(); - // Expand the first scope if it is not expensive and if there is no expansion state (all are collapsed) - if (scopes.every(s => this.tree.getNode(s).collapsed) && scopes.length > 0) { - const toExpand = scopes.find(s => !s.expensive); - if (toExpand) { - this.tree.expand(toExpand); - } - } - } + const input = this.tree.getInput(); + if (input) { + this.savedViewState.set(input.getId(), this.tree.getViewState()); + } + if (!stackFrame) { + await this.tree.setInput(null); + return; + } + const viewState = this.savedViewState.get(stackFrame.getId()); + await this.tree.setInput(stackFrame, viewState); + + // Automatically expand the first scope if it is not expensive and if all scopes are collapsed + const scopes = await stackFrame.getScopes(); + const toExpand = scopes.find(s => !s.expensive); + if (toExpand && (scopes.every(s => this.tree.isCollapsed(s)) || !this.autoExpandedScopes.has(toExpand.getId()))) { + this.autoExpandedScopes.add(toExpand.getId()); + await this.tree.expand(toExpand); } }, 400); } @@ -99,7 +99,7 @@ export class VariablesView extends ViewPane { dom.addClass(container, 'debug-variables'); const treeContainer = renderViewTree(container); - this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(), + this.tree = >this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(), [this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer(), new ScopeErrorRenderer()], new VariablesDataSource(), { accessibilityProvider: new VariablesAccessibilityProvider(), @@ -110,12 +110,10 @@ export class VariablesView extends ViewPane { } }); - this.tree.setInput(this.debugService.getViewModel()); + this.tree.setInput(withUndefinedAsNull(this.debugService.getViewModel().focusedStackFrame)); CONTEXT_VARIABLES_FOCUSED.bindTo(this.tree.contextKeyService); - this.tree.updateChildren(); - this._register(this.debugService.getViewModel().onDidFocusStackFrame(sf => { if (!this.isBodyVisible()) { this.needsRefresh = true; @@ -143,11 +141,24 @@ export class VariablesView extends ViewPane { this.onFocusStackFrameScheduler.schedule(); } })); + let horizontalScrolling: boolean | undefined; this._register(this.debugService.getViewModel().onDidSelectExpression(e => { if (e instanceof Variable) { + horizontalScrolling = this.tree.options.horizontalScrolling; + if (horizontalScrolling) { + this.tree.updateOptions({ horizontalScrolling: false }); + } + this.tree.rerender(e); + } else if (!e && horizontalScrolling !== undefined) { + this.tree.updateOptions({ horizontalScrolling: horizontalScrolling }); + horizontalScrolling = undefined; } })); + this._register(this.debugService.onDidEndSession(() => { + this.savedViewState.clear(); + this.autoExpandedScopes.clear(); + })); } getActions(): IAction[] { @@ -213,24 +224,26 @@ export class VariablesView extends ViewPane { } } -function isViewModel(obj: any): obj is IViewModel { - return typeof obj.getSelectedExpression === 'function'; +function isStackFrame(obj: any): obj is IStackFrame { + return obj instanceof StackFrame; } -export class VariablesDataSource implements IAsyncDataSource { +export class VariablesDataSource implements IAsyncDataSource { - hasChildren(element: IViewModel | IExpression | IScope): boolean { - if (isViewModel(element)) { + hasChildren(element: IStackFrame | null | IExpression | IScope): boolean { + if (!element) { + return false; + } + if (isStackFrame(element)) { return true; } return element.hasChildren; } - getChildren(element: IViewModel | IExpression | IScope): Promise<(IExpression | IScope)[]> { - if (isViewModel(element)) { - const stackFrame = element.focusedStackFrame; - return stackFrame ? stackFrame.getScopes() : Promise.resolve([]); + getChildren(element: IStackFrame | IExpression | IScope): Promise<(IExpression | IScope)[]> { + if (isStackFrame(element)) { + return element.getScopes(); } return element.getChildren(); diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index 8bc26910f6..7be6dc7e55 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -134,9 +134,18 @@ export class WatchExpressionsView extends ViewPane { this.onWatchExpressionsUpdatedScheduler.schedule(); } })); + let horizontalScrolling: boolean | undefined; this._register(this.debugService.getViewModel().onDidSelectExpression(e => { if (e instanceof Expression && e.name) { + horizontalScrolling = this.tree.options.horizontalScrolling; + if (horizontalScrolling) { + this.tree.updateOptions({ horizontalScrolling: false }); + } + this.tree.rerender(e); + } else if (!e && horizontalScrolling !== undefined) { + this.tree.updateOptions({ horizontalScrolling: horizontalScrolling }); + horizontalScrolling = undefined; } })); } diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 4a8de35a4c..4a8793bed0 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -731,7 +731,7 @@ export interface ILaunch { export const IDebugService = createDecorator(DEBUG_SERVICE_ID); export interface IDebugService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Gets the current debug state. @@ -909,7 +909,7 @@ export const DEBUG_HELPER_SERVICE_ID = 'debugHelperService'; export const IDebugHelperService = createDecorator(DEBUG_HELPER_SERVICE_ID); export interface IDebugHelperService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createTelemetryService(configurationService: IConfigurationService, args: string[]): TelemetryService | undefined; } diff --git a/src/vs/workbench/contrib/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts index b95ce2296e..c494ff9428 100644 --- a/src/vs/workbench/contrib/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -298,7 +298,7 @@ export class StackFrame implements IStackFrame { ) { } getId(): string { - return `stackframe:${this.thread.getId()}:${this.frameId}:${this.index}`; + return `stackframe:${this.thread.getId()}:${this.index}:${this.source.name}`; } getScopes(): Promise { diff --git a/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts b/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts index cb119a6755..6f1e1d4a8f 100644 --- a/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts +++ b/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts @@ -120,14 +120,14 @@ declare module DebugProtocol { /** Event message for 'stopped' event type. The event indicates that the execution of the debuggee has stopped due to some condition. - This can be caused by a break point previously set, a stepping action has completed, by executing a debugger statement etc. + This can be caused by a break point previously set, a stepping request has completed, by executing a debugger statement etc. */ export interface StoppedEvent extends Event { // event: 'stopped'; body: { /** The reason for the event. For backward compatibility this string is shown in the UI if the 'description' attribute is missing (but it must not be translated). - Values: 'step', 'breakpoint', 'exception', 'pause', 'entry', 'goto', 'function breakpoint', 'data breakpoint', etc. + Values: 'step', 'breakpoint', 'exception', 'pause', 'entry', 'goto', 'function breakpoint', 'data breakpoint', 'instruction breakpoint', etc. */ reason: string; /** The full reason for the event, e.g. 'Paused on exception'. This string is shown in the UI as is and must be translated. */ @@ -765,6 +765,31 @@ declare module DebugProtocol { }; } + /** SetInstructionBreakpoints request; value of command field is 'setInstructionBreakpoints'. + Replaces all existing instruction breakpoints. Typically, instruction breakpoints would be set from a diassembly window. + To clear all instruction breakpoints, specify an empty array. + When an instruction breakpoint is hit, a 'stopped' event (with reason 'instruction breakpoint') is generated. + Clients should only call this request if the capability 'supportsInstructionBreakpoints' is true. + */ + export interface SetInstructionBreakpointsRequest extends Request { + // command: 'setInstructionBreakpoints'; + arguments: SetInstructionBreakpointsArguments; + } + + /** Arguments for 'setInstructionBreakpoints' request */ + export interface SetInstructionBreakpointsArguments { + /** The instruction references of the breakpoints */ + breakpoints: InstructionBreakpoint[]; + } + + /** Response to 'setInstructionBreakpoints' request */ + export interface SetInstructionBreakpointsResponse extends Response { + body: { + /** Information about the breakpoints. The array elements correspond to the elements of the 'breakpoints' array. */ + breakpoints: Breakpoint[]; + }; + } + /** Continue request; value of command field is 'continue'. The request starts the debuggee to run again. */ @@ -804,6 +829,8 @@ declare module DebugProtocol { export interface NextArguments { /** Execute 'next' for this thread. */ threadId: number; + /** Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed. */ + granularity?: SteppingGranularity; } /** Response to 'next' request. This is just an acknowledgement, so no body field is required. */ @@ -829,6 +856,8 @@ declare module DebugProtocol { threadId: number; /** Optional id of the target to step into. */ targetId?: number; + /** Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed. */ + granularity?: SteppingGranularity; } /** Response to 'stepIn' request. This is just an acknowledgement, so no body field is required. */ @@ -848,6 +877,8 @@ declare module DebugProtocol { export interface StepOutArguments { /** Execute 'stepOut' for this thread. */ threadId: number; + /** Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed. */ + granularity?: SteppingGranularity; } /** Response to 'stepOut' request. This is just an acknowledgement, so no body field is required. */ @@ -868,6 +899,8 @@ declare module DebugProtocol { export interface StepBackArguments { /** Execute 'stepBack' for this thread. */ threadId: number; + /** Optional granularity to step. If no granularity is specified, a granularity of 'statement' is assumed. */ + granularity?: SteppingGranularity; } /** Response to 'stepBack' request. This is just an acknowledgement, so no body field is required. */ @@ -1560,6 +1593,10 @@ declare module DebugProtocol { supportsBreakpointLocationsRequest?: boolean; /** The debug adapter supports the 'clipboard' context value in the 'evaluate' request. */ supportsClipboardContext?: boolean; + /** The debug adapter supports stepping granularities (argument 'granularity') for the stepping requests. */ + supportsSteppingGranularity?: boolean; + /** The debug adapter supports adding breakpoints based on instruction references. */ + supportsInstructionBreakpoints?: boolean; } /** An ExceptionBreakpointsFilter is shown in the UI as an option for configuring how exceptions are dealt with. */ @@ -1896,7 +1933,28 @@ declare module DebugProtocol { hitCondition?: string; } - /** Information about a Breakpoint created in setBreakpoints or setFunctionBreakpoints. */ + /** Properties of a breakpoint passed to the setInstructionBreakpoints request */ + export interface InstructionBreakpoint { + /** The instruction reference of the breakpoint. + This should be a memory or instruction pointer reference from an EvaluateResponse, Variable, StackFrame, GotoTarget, or Breakpoint. + */ + instructionReference: string; + /** An optional offset from the instruction reference. + This can be negative. + */ + offset?: number; + /** An optional expression for conditional breakpoints. + It is only honored by a debug adapter if the capability 'supportsConditionalBreakpoints' is true. + */ + condition?: string; + /** An optional expression that controls how many hits of the breakpoint are ignored. + The backend is expected to interpret the expression as needed. + The attribute is only honored by a debug adapter if the capability 'supportsHitConditionalBreakpoints' is true. + */ + hitCondition?: string; + } + + /** Information about a Breakpoint created in setBreakpoints, setFunctionBreakpoints, setInstructionBreakpoints, or setDataBreakpoints. */ export interface Breakpoint { /** An optional identifier for the breakpoint. It is needed if breakpoint events are used to update or remove breakpoints. */ id?: number; @@ -1918,8 +1976,23 @@ declare module DebugProtocol { If no end line is given, then the end column is assumed to be in the start line. */ endColumn?: number; + /** An optional memory reference to where the breakpoint is set. */ + instructionReference?: string; + /** An optional offset from the instruction reference. + This can be negative. + */ + offset?: number; } + /** The granularity of one 'step' in the stepping requests 'next', 'stepIn', 'stepOut', and 'stepBack'. + 'statement': The step should allow the program to run until the current statement has finished executing. + The meaning of a statement is determined by the adapter and it may be considered equivalent to a line. + For example 'for(int i = 0; i < 10; i++) could be considered to have 3 statements 'int i = 0', 'i < 10', and 'i++'. + 'line': The step should allow the program to run until the current source line has executed. + 'instruction': The step should allow one instruction to execute (e.g. one x86 instruction). + */ + export type SteppingGranularity = 'statement' | 'line' | 'instruction'; + /** A StepInTarget can be used in the 'stepIn' request and determines into which single target the stepIn request should step. */ export interface StepInTarget { /** Unique identifier for a stepIn target. */ diff --git a/src/vs/workbench/contrib/debug/common/debugger.ts b/src/vs/workbench/contrib/debug/common/debugger.ts index 72f57101bb..dd09512222 100644 --- a/src/vs/workbench/contrib/debug/common/debugger.ts +++ b/src/vs/workbench/contrib/debug/common/debugger.ts @@ -58,19 +58,21 @@ export class Debugger implements IDebugger { if (isObject(source)) { Object.keys(source).forEach(key => { - if (isObject(destination[key]) && isObject(source[key])) { - mixin(destination[key], source[key], overwrite, level + 1); - } else { - if (key in destination) { - if (overwrite) { - if (level === 0 && key === 'type') { - // don't merge the 'type' property - } else { - destination[key] = source[key]; - } - } + if (key !== '__proto__') { + if (isObject(destination[key]) && isObject(source[key])) { + mixin(destination[key], source[key], overwrite, level + 1); } else { - destination[key] = source[key]; + if (key in destination) { + if (overwrite) { + if (level === 0 && key === 'type') { + // don't merge the 'type' property + } else { + destination[key] = source[key]; + } + } + } else { + destination[key] = source[key]; + } } } }); diff --git a/src/vs/workbench/contrib/debug/node/debugHelperService.ts b/src/vs/workbench/contrib/debug/node/debugHelperService.ts index 260c6d8051..62b7b6dc78 100644 --- a/src/vs/workbench/contrib/debug/node/debugHelperService.ts +++ b/src/vs/workbench/contrib/debug/node/debugHelperService.ts @@ -14,7 +14,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { cleanRemoteAuthority } from 'vs/platform/telemetry/common/telemetryUtils'; export class NodeDebugHelperService implements IDebugHelperService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, diff --git a/src/vs/workbench/contrib/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts index 0d24de4d1a..0684ddbba1 100644 --- a/src/vs/workbench/contrib/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as cp from 'child_process'; -import * as env from 'vs/base/common/platform'; +import * as platform from 'vs/base/common/platform'; import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; @@ -14,11 +14,11 @@ let externalTerminalService: IExternalTerminalService | undefined = undefined; export function runInExternalTerminal(args: DebugProtocol.RunInTerminalRequestArguments, configProvider: ExtHostConfigProvider): Promise { if (!externalTerminalService) { - if (env.isWindows) { + if (platform.isWindows) { externalTerminalService = new WindowsExternalTerminalService(undefined); - } else if (env.isMacintosh) { + } else if (platform.isMacintosh) { externalTerminalService = new MacExternalTerminalService(undefined); - } else if (env.isLinux) { + } else if (platform.isLinux) { externalTerminalService = new LinuxExternalTerminalService(undefined); } else { throw new Error('external terminals not supported on this platform'); @@ -49,7 +49,7 @@ function spawnAsPromised(command: string, args: string[]): Promise { export function hasChildProcesses(processId: number | undefined): Promise { if (processId) { // if shell has at least one child process, assume that shell is busy - if (env.isWindows) { + if (platform.isWindows) { return spawnAsPromised('wmic', ['process', 'get', 'ParentProcessId']).then(stdout => { const pids = stdout.split('\r\n'); return pids.some(p => parseInt(p) === processId); @@ -75,7 +75,8 @@ export function hasChildProcesses(processId: number | undefined): Promise= 0) { shellType = ShellType.bash; - } else if (env.isWindows) { + } else if (platform.isWindows) { shellType = ShellType.cmd; // pick a good default for Windows } else { shellType = ShellType.bash; // pick a good default for anything else @@ -109,12 +110,12 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return `'${s}'`; }; - if (args.cwd) { - command += `cd '${args.cwd}'; `; + if (cwd) { + command += `cd '${cwd}'; `; } - if (args.env) { - for (let key in args.env) { - const value = args.env[key]; + if (env) { + for (let key in env) { + const value = env[key]; if (value === null) { command += `Remove-Item env:${key}; `; } else { @@ -122,10 +123,10 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } } } - if (args.args && args.args.length > 0) { - const cmd = quote(args.args.shift()!); + if (args.length > 0) { + const cmd = quote(args.shift()!); command += (cmd[0] === '\'') ? `& ${cmd} ` : `${cmd} `; - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } } @@ -138,13 +139,13 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return (s.indexOf(' ') >= 0 || s.indexOf('"') >= 0 || s.length === 0) ? `"${s}"` : s; }; - if (args.cwd) { - command += `cd ${quote(args.cwd)} && `; + if (cwd) { + command += `cd ${quote(cwd)} && `; } - if (args.env) { + if (env) { command += 'cmd /C "'; - for (let key in args.env) { - let value = args.env[key]; + for (let key in env) { + let value = env[key]; if (value === null) { command += `set "${key}=" && `; } else { @@ -153,10 +154,10 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } } } - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } - if (args.env) { + if (env) { command += '"'; } break; @@ -172,13 +173,13 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments return /[^\w@%\/+=,.:^-]/.test(s) ? `'${s.replace(/'/g, '\'\\\'\'')}'` : s; }; - if (args.cwd) { - command += `cd ${quote(args.cwd)} ; `; + if (cwd) { + command += `cd ${quote(cwd)} ; `; } - if (args.env) { + if (env) { command += 'env'; - for (let key in args.env) { - const value = args.env[key]; + for (let key in env) { + const value = env[key]; if (value === null) { command += ` -u ${hardQuote(key)}`; } else { @@ -187,7 +188,7 @@ export function prepareCommand(args: DebugProtocol.RunInTerminalRequestArguments } command += ' '; } - for (let a of args.args) { + for (let a of args) { command += `${quote(a)} `; } break; diff --git a/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts b/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts index cad2439cd2..d3b88cffaa 100644 --- a/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts @@ -8,6 +8,7 @@ import { ViewModel } from 'vs/workbench/contrib/debug/common/debugViewModel'; import { StackFrame, Expression, Thread } from 'vs/workbench/contrib/debug/common/debugModel'; import { MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; suite('Debug - View Model', () => { let model: ViewModel; @@ -21,7 +22,12 @@ suite('Debug - View Model', () => { assert.equal(model.focusedThread, null); const session = new MockSession(); const thread = new Thread(session, 'myThread', 1); - const frame = new StackFrame(thread, 1, undefined!, 'app.js', 'normal', { startColumn: 1, startLineNumber: 1, endColumn: 1, endLineNumber: 1 }, 0); + const source = new Source({ + name: 'internalModule.js', + sourceReference: 11, + presentationHint: 'deemphasize' + }, 'aDebugSessionId'); + const frame = new StackFrame(thread, 1, source, 'app.js', 'normal', { startColumn: 1, startLineNumber: 1, endColumn: 1, endLineNumber: 1 }, 0); model.setFocus(frame, thread, session, false); assert.equal(model.focusedStackFrame!.getId(), frame.getId()); diff --git a/src/vs/workbench/contrib/experiments/common/experimentService.ts b/src/vs/workbench/contrib/experiments/common/experimentService.ts index 7bb9a720e2..21ce76542f 100644 --- a/src/vs/workbench/contrib/experiments/common/experimentService.ts +++ b/src/vs/workbench/contrib/experiments/common/experimentService.ts @@ -70,7 +70,7 @@ export interface IExperiment { } export interface IExperimentService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getExperimentById(id: string): Promise; getExperimentsByType(type: ExperimentActionType): Promise; getCuratedExtensionsList(curatedExtensionsKey: string): Promise; @@ -163,7 +163,7 @@ export const getCurrentActivationRecord = (previous?: IActivationEventRecord, da }; export class ExperimentService extends Disposable implements IExperimentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _experiments: IExperiment[] = []; private _loadExperimentsPromise: Promise; private _curatedMapping = Object.create(null); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts index 2a4018b4a4..eb466fdc99 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionEditor.ts @@ -639,7 +639,7 @@ export class ExtensionEditor extends BaseEditor { if (!link) { return; } - // Whitelist supported schemes for links + // Only allow links with specific schemes if (matchesScheme(link, Schemas.http) || matchesScheme(link, Schemas.https) || matchesScheme(link, Schemas.mailto) || (matchesScheme(link, Schemas.command) && URI.parse(link).path === ShowCurrentReleaseNotesActionId) ) { diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts index 1b1e527509..ed6ef17a15 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationsService.ts @@ -38,7 +38,7 @@ const ignoredRecommendationsStorageKey = 'extensionsAssistant/ignored_recommenda export class ExtensionRecommendationsService extends Disposable implements IExtensionRecommendationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; // Recommendations private readonly fileBasedRecommendations: FileBasedRecommendations; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 77ca4a35be..9456b5dafc 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -947,7 +947,7 @@ export class EnableGloballyAction extends ExtensionAction { this.enabled = false; if (this.extension && this.extension.local) { this.enabled = this.extension.state === ExtensionState.Installed - && this.extension.enablementState === EnablementState.DisabledGlobally + && this.extensionEnablementService.isDisabledGlobally(this.extension.local) && this.extensionEnablementService.canChangeEnablement(this.extension.local); } } @@ -2216,7 +2216,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio return this.jsonEditingService.write(workspaceConfigurationFile, [{ - key: 'extensions', + path: ['extensions'], value: { recommendations: shouldRecommend ? insertInto : removeFrom, unwantedRecommendations: shouldRecommend ? removeFrom : insertInto @@ -2245,7 +2245,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio removeFrom = removeFrom.filter(x => x.toLowerCase() !== extensionIdLowerCase); removeFromPromise = this.jsonEditingService.write(extensionsFileResource, [{ - key: shouldRecommend ? 'unwantedRecommendations' : 'recommendations', + path: shouldRecommend ? ['unwantedRecommendations'] : ['recommendations'], value: removeFrom }], true); @@ -2254,7 +2254,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio return removeFromPromise.then(() => this.jsonEditingService.write(extensionsFileResource, [{ - key: shouldRecommend ? 'recommendations' : 'unwantedRecommendations', + path: shouldRecommend ? ['recommendations'] : ['unwantedRecommendations'], value: insertInto }], true) @@ -2281,7 +2281,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio .then(content => { const workspaceRecommendations = json.parse(content.value.toString())['extensions']; if (!workspaceRecommendations || !workspaceRecommendations.recommendations) { - return this.jsonEditingService.write(workspaceConfigurationFile, [{ key: 'extensions', value: { recommendations: [] } }], true) + return this.jsonEditingService.write(workspaceConfigurationFile, [{ path: ['extensions'], value: { recommendations: [] } }], true) .then(() => this.fileService.readFile(workspaceConfigurationFile)); } return content; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 5d4e0f88e0..b9d235c01a 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -21,6 +21,9 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; +import { registerThemingParticipant, IColorTheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; +import { foreground, listActiveSelectionForeground, listActiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionBackground, listFocusForeground, listFocusBackground, listHoverForeground, listHoverBackground } from 'vs/platform/theme/common/colorRegistry'; +import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; export interface IExtensionsViewState { onFocus: Event; @@ -122,10 +125,10 @@ export class Renderer implements IPagedRenderer { const extensionContainers: ExtensionContainers = this.instantiationService.createInstance(ExtensionContainers, [...actions, ...widgets, extensionTooltipAction]); actionbar.push(actions, actionOptions); - const disposables = combinedDisposable(...actions, ...widgets, actionbar, extensionContainers, extensionTooltipAction); + const disposable = combinedDisposable(...actions, ...widgets, actionbar, extensionContainers, extensionTooltipAction); return { - root, element, icon, name, /*installCount, ratings, */author, description, disposables: [disposables], actionbar, + root, element, icon, name, /*installCount, ratings, */author, description, disposables: [disposable], actionbar, extensionDisposables: [], set extension(extension: IExtension) { extensionContainers.extension = extension; @@ -158,15 +161,15 @@ export class Renderer implements IPagedRenderer { data.extensionDisposables = dispose(data.extensionDisposables); + let isDisabled: boolean = false; const updateEnablement = async () => { const runningExtensions = await this.extensionService.getExtensions(); + isDisabled = false; if (extension.local && !isLanguagePackExtension(extension.local.manifest)) { const runningExtension = runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, extension.identifier))[0]; - const isSameExtensionRunning = runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); - toggleClass(data.root, 'disabled', !isSameExtensionRunning); - } else { - removeClass(data.root, 'disabled'); + isDisabled = !(runningExtension && extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation)); } + toggleClass(data.root, 'disabled', isDisabled); }; updateEnablement(); this.extensionService.onDidChangeExtensions(() => updateEnablement(), this, data.extensionDisposables); @@ -212,3 +215,49 @@ export class Renderer implements IPagedRenderer { data.disposables = dispose(data.disposables); } } + +registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) => { + const foregroundColor = theme.getColor(foreground); + if (foregroundColor) { + const authorForeground = foregroundColor.transparent(.9).makeOpaque(WORKBENCH_BACKGROUND(theme)); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row:not(.disabled) .author { color: ${authorForeground}; }`); + const disabledExtensionForeground = foregroundColor.transparent(.5).makeOpaque(WORKBENCH_BACKGROUND(theme)); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row.disabled { color: ${disabledExtensionForeground}; }`); + } + + const listActiveSelectionForegroundColor = theme.getColor(listActiveSelectionForeground); + const listActiveSelectionBackgroundColor = theme.getColor(listActiveSelectionBackground); + if (listActiveSelectionForegroundColor && listActiveSelectionBackgroundColor) { + const authorForeground = listActiveSelectionForegroundColor.transparent(.9).makeOpaque(listActiveSelectionBackgroundColor); + collector.addRule(`.extensions-list .monaco-list:focus .monaco-list-row:not(.disabled).selected .author { color: ${authorForeground}; }`); + const disabledExtensionForeground = listActiveSelectionForegroundColor.transparent(.5).makeOpaque(listActiveSelectionBackgroundColor); + collector.addRule(`.extensions-list .monaco-list:focus .monaco-list-row.disabled.selected { color: ${disabledExtensionForeground}; }`); + } + + const listInactiveSelectionForegroundColor = theme.getColor(listInactiveSelectionForeground); + const listInactiveSelectionBackgroundColor = theme.getColor(listInactiveSelectionBackground); + if (listInactiveSelectionForegroundColor && listInactiveSelectionBackgroundColor) { + const authorForeground = listInactiveSelectionForegroundColor.transparent(.9).makeOpaque(listInactiveSelectionBackgroundColor); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row:not(.disabled).selected .author { color: ${authorForeground}; }`); + const disabledExtensionForeground = listInactiveSelectionForegroundColor.transparent(.5).makeOpaque(listInactiveSelectionBackgroundColor); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row.disabled.selected { color: ${disabledExtensionForeground}; }`); + } + + const listFocusForegroundColor = theme.getColor(listFocusForeground); + const listFocusBackgroundColor = theme.getColor(listFocusBackground); + if (listFocusForegroundColor && listFocusBackgroundColor) { + const authorForeground = listFocusForegroundColor.transparent(.9).makeOpaque(listFocusBackgroundColor); + collector.addRule(`.extensions-list .monaco-list:focus .monaco-list-row:not(.disabled).focused .author { color: ${authorForeground}; }`); + const disabledExtensionForeground = listFocusForegroundColor.transparent(.5).makeOpaque(listFocusBackgroundColor); + collector.addRule(`.extensions-list .monaco-list:focus .monaco-list-row.disabled.focused { color: ${disabledExtensionForeground}; }`); + } + + const listHoverForegroundColor = theme.getColor(listHoverForeground); + const listHoverBackgroundColor = theme.getColor(listHoverBackground); + if (listHoverForegroundColor && listHoverBackgroundColor) { + const authorForeground = listHoverForegroundColor.transparent(.9).makeOpaque(listHoverBackgroundColor); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row:hover:not(.disabled):not(.selected):.not(.focused) .author { color: ${authorForeground}; }`); + const disabledExtensionForeground = listHoverForegroundColor.transparent(.5).makeOpaque(listHoverBackgroundColor); + collector.addRule(`.extensions-list .monaco-list .monaco-list-row.disabled:hover:not(.selected):.not(.focused) { color: ${disabledExtensionForeground}; }`); + } +}); diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index 2c5500a908..cb38aa9ec2 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -469,7 +469,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE for (let index = 0; index < e.dataTransfer.files.length; index++) { const path = e.dataTransfer.files.item(index)!.path; if (path.indexOf('.vsix') !== -1) { - vsixPaths.push(URI.parse(path)); + vsixPaths.push(URI.file(path)); } } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts index 7821ab652b..9774189012 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViews.ts @@ -23,7 +23,6 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -100,7 +99,6 @@ export class ExtensionsListView extends ViewPane { @IThemeService themeService: IThemeService, @IExtensionService private readonly extensionService: IExtensionService, @IExtensionsWorkbenchService protected extensionsWorkbenchService: IExtensionsWorkbenchService, - @IEditorService private readonly editorService: IEditorService, @IExtensionRecommendationsService protected tipsService: IExtensionRecommendationsService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @@ -157,16 +155,11 @@ export class ExtensionsListView extends ViewPane { this._register(this.list); this._register(extensionsViewState); - const resourceNavigator = this._register(new ListResourceNavigator(this.list, { openOnFocus: false, openOnSelection: true, openOnSingleClick: true })); - this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpenResource, e => e.element !== null), (last, event) => event, 75, true)(options => { + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { openOnSingleClick: true })); + this._register(Event.debounce(Event.filter(resourceNavigator.onDidOpen, e => e.element !== null), (_, event) => event, 75, true)(options => { this.openExtension(this.list!.model.get(options.element!), { sideByside: options.sideBySide, ...options.editorOptions }); })); - this._register(Event.chain(this.list.onPin) - .map(e => e.elements[0]) - .filter(e => !!e) - .on(this.pin, this)); - this.bodyTemplate = { extensionsList, messageBox, @@ -323,33 +316,29 @@ export class ExtensionsListView extends ViewPane { result = result .filter(e => e.type === ExtensionType.System && (e.name.toLowerCase().indexOf(value) > -1 || e.displayName.toLowerCase().indexOf(value) > -1)); + const isThemeExtension = (e: IExtension): boolean => { + return (Array.isArray(e.local?.manifest?.contributes?.themes) && e.local!.manifest!.contributes!.themes.length > 0) + || (Array.isArray(e.local?.manifest?.contributes?.iconThemes) && e.local!.manifest!.contributes!.iconThemes.length > 0); + }; if (showThemesOnly) { - const themesExtensions = result.filter(e => { - return e.local - && e.local.manifest - && e.local.manifest.contributes - && Array.isArray(e.local.manifest.contributes.themes) - && e.local.manifest.contributes.themes.length; - }); + const themesExtensions = result.filter(isThemeExtension); return this.getPagedModel(this.sortExtensions(themesExtensions, options)); } + + const isLangaugeBasicExtension = (e: IExtension): boolean => { + return FORCE_FEATURE_EXTENSIONS.indexOf(e.identifier.id) === -1 + && (Array.isArray(e.local?.manifest?.contributes?.grammars) && e.local!.manifest!.contributes!.grammars.length > 0); + }; if (showBasicsOnly) { - const basics = result.filter(e => { - return e.local && e.local.manifest - && e.local.manifest.contributes - && Array.isArray(e.local.manifest.contributes.grammars) - && e.local.manifest.contributes.grammars.length - && FORCE_FEATURE_EXTENSIONS.indexOf(e.local.identifier.id) === -1; - }); + const basics = result.filter(isLangaugeBasicExtension); return this.getPagedModel(this.sortExtensions(basics, options)); } if (showFeaturesOnly) { const others = result.filter(e => { return e.local && e.local.manifest - && e.local.manifest.contributes - && (!Array.isArray(e.local.manifest.contributes.grammars) || FORCE_FEATURE_EXTENSIONS.indexOf(e.local.identifier.id) !== -1) - && !Array.isArray(e.local.manifest.contributes.themes); + && !isThemeExtension(e) + && !isLangaugeBasicExtension(e); }); return this.getPagedModel(this.sortExtensions(others, options)); } @@ -850,14 +839,6 @@ export class ExtensionsListView extends ViewPane { this.extensionsWorkbenchService.open(extension, options).then(undefined, err => this.onError(err)); } - private pin(): void { - const activeEditorPane = this.editorService.activeEditorPane; - if (activeEditorPane) { - activeEditorPane.group.pinEditor(activeEditorPane.input); - activeEditorPane.focus(); - } - } - private onError(err: any): void { if (isPromiseCanceledError(err)) { return; @@ -975,7 +956,6 @@ export class ServerExtensionsView extends ExtensionsListView { @IViewDescriptorService viewDescriptorService: IViewDescriptorService, @IInstantiationService instantiationService: IInstantiationService, @IExtensionService extensionService: IExtensionService, - @IEditorService editorService: IEditorService, @IExtensionRecommendationsService tipsService: IExtensionRecommendationsService, @ITelemetryService telemetryService: ITelemetryService, @IConfigurationService configurationService: IConfigurationService, @@ -991,7 +971,7 @@ export class ServerExtensionsView extends ExtensionsListView { @IPreferencesService preferencesService: IPreferencesService, ) { options.server = server; - super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, editorService, tipsService, telemetryService, configurationService, contextService, experimentService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService, preferencesService); + super(options, notificationService, keybindingService, contextMenuService, instantiationService, themeService, extensionService, extensionsWorkbenchService, tipsService, telemetryService, configurationService, contextService, experimentService, extensionManagementServerService, productService, contextKeyService, viewDescriptorService, menuService, openerService, preferencesService); this._register(onDidChangeTitle(title => this.updateTitle(title))); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts index b2a113aef0..43ae672d0b 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts @@ -18,7 +18,7 @@ import { InstallExtensionEvent, DidInstallExtensionEvent, DidUninstallExtensionEvent, IExtensionIdentifier, InstallOperation, DefaultIconPath } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchExtensionEnablementService, EnablementState, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, getMaliciousExtensionsSet, groupByExtension, ExtensionIdentifierWithVersion } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; +import { getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData, areSameExtensions, getMaliciousExtensionsSet, groupByExtension, ExtensionIdentifierWithVersion, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @@ -359,7 +359,16 @@ class Extensions extends Disposable { } async queryInstalled(): Promise { - const installed = await this.server.extensionManagementService.getInstalled(); + const all = await this.server.extensionManagementService.getInstalled(); + + // dedup user and system extensions by giving priority to user extensions. + const installed = groupByExtension(all, r => r.identifier).reduce((result, extensions) => { + const extension = extensions.length === 1 ? extensions[0] + : extensions.find(e => e.type === ExtensionType.User) || extensions.find(e => e.type === ExtensionType.System); + result.push(extension!); + return result; + }, []); + const byId = index(this.installed, e => e.local ? e.local.identifier.id : e.identifier.id); this.installed = installed.map(local => { const extension = byId[local.identifier.id] || this.instantiationService.createInstance(Extension, this.stateProvider, this.server, local, undefined); @@ -495,7 +504,7 @@ class Extensions extends Disposable { export class ExtensionsWorkbenchService extends Disposable implements IExtensionsWorkbenchService, IURLHandler { private static readonly SyncPeriod = 1000 * 60 * 60 * 12; // 12 hours - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly localExtensions: Extensions | null = null; private readonly remoteExtensions: Extensions | null = null; @@ -563,8 +572,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension } get local(): IExtension[] { - const result = [...this.installed]; - const byId = groupByExtension(result, r => r.identifier); + const byId = groupByExtension(this.installed, r => r.identifier); return byId.reduce((result, extensions) => { result.push(this.getPrimaryExtension(extensions)); return result; }, []); } @@ -807,19 +815,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension install(extension: URI | IExtension): Promise { let extensionPolicy = this.configurationService.getValue(ExtensionsPolicyKey); // {{SQL CARBON EDIT}} add line if (extension instanceof URI) { - return this.installWithProgress(async () => { - // {{SQL CARBON EDIT}} - Wrap async call in try/catch. - // This is the error handler when installing local VSIX file. - // Prompt the user about the error detail. - try { - const { identifier } = await this.extensionService.install(extension); - return this.local.filter(local => areSameExtensions(local.identifier, identifier))[0]; - } catch (error) { - this.notificationService.error(error); - return Promise.reject(error); - } - // {{SQL CARBON EDIT}} - End - }); + return this.installWithProgress(() => this.installFromVSIX(extension)); } if (extension.isMalicious) { @@ -850,8 +846,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return Promise.reject(new Error('Extension Not Allowed')); } } - await this.downloadOrBrowse(extension); - return this.local.filter(local => areSameExtensions(local.identifier, gallery.identifier))[0]; + return this.downloadOrBrowse(extension); }, gallery.displayName); } @@ -900,11 +895,11 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return Promise.reject(new Error(nls.localize('incompatible', "Unable to install extension '{0}' as it is not compatible with Azure Data Studio '{1}'.", extension.gallery!.identifier.id, version))); // {{SQL CARBON EDIT}} Change vscode to ads } return this.installWithProgress(async () => { - await this.installFromGallery(extension, gallery); + const installed = await this.installFromGallery(extension, gallery); if (extension.latestVersion !== version) { this.ignoreAutoUpdate(new ExtensionIdentifierWithVersion(gallery.identifier, version)); } - return this.local.filter(local => areSameExtensions(local.identifier, gallery.identifier))[0]; + return installed; } , gallery.displayName); }); @@ -965,7 +960,19 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension }, () => installTask()); } - private async installFromGallery(extension: IExtension, gallery: IGalleryExtension): Promise { + private async installFromVSIX(vsix: URI): Promise { + const manifest = await this.extensionService.getManifest(vsix); + const existingExtension = this.local.find(local => areSameExtensions(local.identifier, { id: getGalleryExtensionId(manifest.publisher, manifest.name) })); + const { identifier } = await this.extensionService.install(vsix); + + if (existingExtension && existingExtension.latestVersion !== manifest.version) { + this.ignoreAutoUpdate(new ExtensionIdentifierWithVersion(identifier, manifest.version)); + } + + return this.local.filter(local => areSameExtensions(local.identifier, identifier))[0]; + } + + private async installFromGallery(extension: IExtension, gallery: IGalleryExtension): Promise { this.installing.push(extension); this._onChange.fire(extension); try { @@ -974,6 +981,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension 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); this._onChange.fire(this.local.filter(e => areSameExtensions(e.identifier, extension.identifier))[0]); diff --git a/src/vs/workbench/contrib/extensions/browser/media/extension.css b/src/vs/workbench/contrib/extensions/browser/media/extension.css index 60b8ca0c51..8462a661c5 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extension.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extension.css @@ -154,7 +154,6 @@ .extension-list-item > .details > .footer > .author { flex: 1; font-size: 90%; - opacity: 0.9; font-weight: 600; } diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css index ff2dfa7e22..074b9582d5 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionActions.css @@ -59,7 +59,6 @@ .monaco-action-bar .action-item.disabled .action-label.extension-action { opacity: 1; - pointer-events: none; } .monaco-action-bar .action-item.disabled .action-label.extension-action.text { diff --git a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css index 8eabd76049..7248051518 100644 --- a/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css +++ b/src/vs/workbench/contrib/extensions/browser/media/extensionsViewlet.css @@ -103,25 +103,14 @@ display: none; } -.extensions-viewlet > .extensions .selected .extension-list-item > .details > .footer > .author, -.extensions-viewlet > .extensions .selected.focused .extension-list-item > .details > .footer > .author { - opacity: 1; -} - .extensions-viewlet.narrow > .extensions .extension-list-item > .details > .footer > .monaco-action-bar > .actions-container .extension-action { max-width: 100px; } -.monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .bookmark, -.monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .bookmark, .monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .icon-container > .icon, .monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .icon-container > .icon, -.monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .header-container, -.monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .header-container, -.monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .description, -.monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .description, -.monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .footer > .author, -.monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .footer > .author { +.monaco-workbench.vs .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .header-container .codicon, +.monaco-workbench.vs-dark .extensions-viewlet > .extensions .monaco-list-row.disabled > .extension-list-item > .details > .header-container .codicon { opacity: 0.5; } diff --git a/src/vs/workbench/contrib/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts index cb9675a974..3dea79fc60 100644 --- a/src/vs/workbench/contrib/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -72,7 +72,7 @@ export const SERVICE_ID = 'extensionsWorkbenchService'; export const IExtensionsWorkbenchService = createDecorator(SERVICE_ID); export interface IExtensionsWorkbenchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onChange: Event; local: IExtension[]; installed: IExtension[]; diff --git a/src/vs/workbench/contrib/extensions/common/extensionsInput.ts b/src/vs/workbench/contrib/extensions/common/extensionsInput.ts index 42b50901aa..ae0b58c28f 100644 --- a/src/vs/workbench/contrib/extensions/common/extensionsInput.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionsInput.ts @@ -3,25 +3,26 @@ * Licensed under the Source EULA. 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 { EditorInput } from 'vs/workbench/common/editor'; import { IExtension } from 'vs/workbench/contrib/extensions/common/extensions'; -import { URI } from 'vs/base/common/uri'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; export class ExtensionsInput extends EditorInput { static readonly ID = 'workbench.extensions.input2'; - get extension(): IExtension { return this._extension; } get resource() { return URI.from({ - scheme: 'extension', + scheme: Schemas.extension, path: this.extension.identifier.id }); } constructor( - private readonly _extension: IExtension + public readonly extension: IExtension ) { super(); } @@ -34,26 +35,15 @@ export class ExtensionsInput extends EditorInput { return localize('extensionsInputName', "Extension: {0}", this.extension.displayName); } - matches(other: unknown): boolean { - if (super.matches(other) === true) { - return true; - } - - if (!(other instanceof ExtensionsInput)) { - return false; - } - - const otherExtensionInput = other as ExtensionsInput; - - // TODO@joao is this correct? - return this.extension === otherExtensionInput.extension; - } - - resolve(): Promise { - return Promise.resolve(null); - } - supportsSplitEditor(): boolean { return false; } + + matches(other: unknown): boolean { + if (super.matches(other)) { + return true; + } + + return other instanceof ExtensionsInput && areSameExtensions(this.extension.identifier, other.extension.identifier); + } } diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts index eb305cdac4..c4a869dfef 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts @@ -15,7 +15,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { randomPort } from 'vs/base/node/ports'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { RuntimeExtensionsInput } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ExtensionHostProfiler } from 'vs/workbench/services/extensions/electron-browser/extensionHostProfiler'; @@ -23,7 +23,7 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; export class ExtensionHostProfileService extends Disposable implements IExtensionHostProfileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeState: Emitter = this._register(new Emitter()); public readonly onDidChangeState: Event = this._onDidChangeState.event; @@ -49,6 +49,7 @@ export class ExtensionHostProfileService extends Disposable implements IExtensio @IElectronService private readonly _electronService: IElectronService, @IDialogService private readonly _dialogService: IDialogService, @IStatusbarService private readonly _statusbarService: IStatusbarService, + @IProductService private readonly _productService: IProductService ) { super(); this._profile = null; @@ -57,7 +58,7 @@ export class ExtensionHostProfileService extends Disposable implements IExtensio CommandsRegistry.registerCommand('workbench.action.extensionHostProfilder.stop', () => { this.stopProfiling(); - this._editorService.openEditor(this._instantiationService.createInstance(RuntimeExtensionsInput), { revealIfOpened: true }); + this._editorService.openEditor(RuntimeExtensionsInput.instance, { revealIfOpened: true }); }); } @@ -118,7 +119,7 @@ export class ExtensionHostProfileService extends Disposable implements IExtensio return this._dialogService.confirm({ type: 'info', message: nls.localize('restart1', "Profile Extensions"), - detail: nls.localize('restart2', "In order to profile extensions a restart is required. Do you want to restart '{0}' now?", product.nameLong), + detail: nls.localize('restart2', "In order to profile extensions a restart is required. Do you want to restart '{0}' now?", this._productService.nameLong), primaryButton: nls.localize('restart3', "Restart"), secondaryButton: nls.localize('cancel', "Cancel") }).then(res => { diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index bf57b17a3b..e9a60d4ed8 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -50,7 +50,7 @@ class RuntimeExtensionsInputFactory implements IEditorInputFactory { return ''; } deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput { - return new RuntimeExtensionsInput(); + return RuntimeExtensionsInput.instance; } } diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts index 46053f662c..cd11659343 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts @@ -186,7 +186,7 @@ export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchCont ), [{ label: localize('show', 'Show Extensions'), - run: () => this._editorService.openEditor(new RuntimeExtensionsInput()) + run: () => this._editorService.openEditor(RuntimeExtensionsInput.instance) }, action ], diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions.ts index 6454389291..faad4d4b56 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsSlowActions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as os from 'os'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { Action } from 'vs/base/common/actions'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; @@ -118,7 +118,8 @@ class ReportExtensionSlowAction extends Action { readonly repoInfo: RepoInfo, readonly profile: IExtensionHostProfile, @IDialogService private readonly _dialogService: IDialogService, - @IOpenerService private readonly _openerService: IOpenerService + @IOpenerService private readonly _openerService: IOpenerService, + @IProductService private readonly _productService: IProductService ) { super('report.slow', localize('cmd.report', "Report Issue")); } @@ -139,7 +140,7 @@ class ReportExtensionSlowAction extends Action { - Extension Name: \`${this.extension.name}\` - Extension Version: \`${this.extension.version}\` - OS Version: \`${osVersion}\` -- VSCode version: \`${product.version}\`\n\n${message}`); +- VSCode version: \`${this._productService.version}\`\n\n${message}`); const url = `${this.repoInfo.base}/${this.repoInfo.owner}/${this.repoInfo.repo}/issues/new/?body=${body}&title=${title}`; this._openerService.open(URI.parse(url)); diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index ae7aef7697..2f1c296754 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -6,7 +6,7 @@ import 'vs/css!./media/runtimeExtensionsEditor'; import * as nls from 'vs/nls'; import * as os from 'os'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { Action, IAction } from 'vs/base/common/actions'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -62,7 +62,7 @@ export enum ProfileSessionState { } export interface IExtensionHostProfileService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidChangeState: Event; readonly onDidChangeLastProfile: Event; @@ -127,7 +127,8 @@ export class RuntimeExtensionsEditor extends BaseEditor { @ILabelService private readonly _labelService: ILabelService, @IWorkbenchEnvironmentService private readonly _environmentService: IWorkbenchEnvironmentService, @IOpenerService private readonly _openerService: IOpenerService, - @IClipboardService private readonly _clipboardService: IClipboardService + @IClipboardService private readonly _clipboardService: IClipboardService, + @IProductService private readonly _productService: IProductService ) { super(RuntimeExtensionsEditor.ID, telemetryService, themeService, storageService); @@ -339,7 +340,7 @@ export class RuntimeExtensionsEditor extends BaseEditor { data.actionbar.push(this._instantiationService.createInstance(SlowExtensionAction, element.description, element.unresponsiveProfile), { icon: true, label: true }); } if (isNonEmptyArray(element.status.runtimeErrors)) { - data.actionbar.push(new ReportExtensionIssueAction(element, this._openerService, this._clipboardService), { icon: true, label: true }); + data.actionbar.push(new ReportExtensionIssueAction(element, this._openerService, this._clipboardService, this._productService), { icon: true, label: true }); } let title: string; @@ -372,6 +373,8 @@ export class RuntimeExtensionsEditor extends BaseEditor { '{0} will be a glob pattern' ] }, "Activated by {1} because searching for {0} took too long", glob, activationId); + } else if (activationEvent === 'onStartupFinished') { + title = nls.localize('startupFinishedActivation', "Activated by {0} after start-up finished", activationId); } else if (/^onLanguage:/.test(activationEvent)) { let language = activationEvent.substr('onLanguage:'.length); title = nls.localize('languageActivation', "Activated by {1} because you opened a {0} file", language, activationId); @@ -451,7 +454,7 @@ export class RuntimeExtensionsEditor extends BaseEditor { const actions: IAction[] = []; - actions.push(new ReportExtensionIssueAction(e.element, this._openerService, this._clipboardService)); + actions.push(new ReportExtensionIssueAction(e.element, this._openerService, this._clipboardService, this._productService)); actions.push(new Separator()); if (e.element.marketplaceInfo) { @@ -492,14 +495,13 @@ export class ShowRuntimeExtensionsAction extends Action { constructor( id: string, label: string, - @IEditorService private readonly _editorService: IEditorService, - @IInstantiationService private readonly _instantiationService: IInstantiationService + @IEditorService private readonly _editorService: IEditorService ) { super(id, label); } public async run(e?: any): Promise { - await this._editorService.openEditor(this._instantiationService.createInstance(RuntimeExtensionsInput), { revealIfOpened: true }); + await this._editorService.openEditor(RuntimeExtensionsInput.instance, { revealIfOpened: true }); } } @@ -518,7 +520,8 @@ export class ReportExtensionIssueAction extends Action { unresponsiveProfile?: IExtensionHostProfile }, @IOpenerService private readonly openerService: IOpenerService, - @IClipboardService private readonly clipboardService: IClipboardService + @IClipboardService private readonly clipboardService: IClipboardService, + @IProductService private readonly productService: IProductService ) { super(ReportExtensionIssueAction._id, ReportExtensionIssueAction._label, 'extension-action report-issue'); this.enabled = extension.marketplaceInfo @@ -542,7 +545,7 @@ export class ReportExtensionIssueAction extends Action { if (!!baseUrl) { baseUrl = `${baseUrl.indexOf('.git') !== -1 ? baseUrl.substr(0, baseUrl.length - 4) : baseUrl}/issues/new/`; } else { - baseUrl = product.reportIssueUrl!; + baseUrl = this.productService.reportIssueUrl!; } let reason = 'Bug'; @@ -557,7 +560,7 @@ export class ReportExtensionIssueAction extends Action { - Extension Name: \`${extension.description.name}\` - Extension Version: \`${extension.description.version}\` - OS Version: \`${osVersion}\` -- VSCode version: \`${product.version}\`\n\n${message}` +- VSCode version: \`${this.productService.version}\`\n\n${message}` ); return `${baseUrl}${queryStringPrefix}body=${body}&title=${encodeURIComponent(title)}`; @@ -574,6 +577,7 @@ export class DebugExtensionHostAction extends Action { @IElectronService private readonly _electronService: IElectronService, @IDialogService private readonly _dialogService: IDialogService, @IExtensionService private readonly _extensionService: IExtensionService, + @IProductService private readonly productService: IProductService ) { super(DebugExtensionHostAction.ID, DebugExtensionHostAction.LABEL, DebugExtensionHostAction.CSS_CLASS); } @@ -585,7 +589,7 @@ export class DebugExtensionHostAction extends Action { const res = await this._dialogService.confirm({ type: 'info', message: nls.localize('restart1', "Profile Extensions"), - detail: nls.localize('restart2', "In order to profile extensions a restart is required. Do you want to restart '{0}' now?", product.nameLong), + detail: nls.localize('restart2', "In order to profile extensions a restart is required. Do you want to restart '{0}' now?", this.productService.nameLong), primaryButton: nls.localize('restart3', "Restart"), secondaryButton: nls.localize('cancel', "Cancel") }); diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput.ts index aac8a7778f..6b009b09c2 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput.ts @@ -11,6 +11,15 @@ export class RuntimeExtensionsInput extends EditorInput { static readonly ID = 'workbench.runtimeExtensions.input'; + static _instance: RuntimeExtensionsInput; + static get instance() { + if (!RuntimeExtensionsInput._instance || RuntimeExtensionsInput._instance.isDisposed()) { + RuntimeExtensionsInput._instance = new RuntimeExtensionsInput(); + } + + return RuntimeExtensionsInput._instance; + } + readonly resource = URI.from({ scheme: 'runtime-extensions', path: 'default' @@ -24,18 +33,11 @@ export class RuntimeExtensionsInput extends EditorInput { return nls.localize('extensionsInputName', "Running Extensions"); } - matches(other: unknown): boolean { - if (!(other instanceof RuntimeExtensionsInput)) { - return false; - } - return true; - } - - resolve(): Promise { - return Promise.resolve(null); - } - supportsSplitEditor(): boolean { return false; } + + matches(other: unknown): boolean { + return other instanceof RuntimeExtensionsInput; + } } 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 07e8d33b1e..da724253b3 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 @@ -99,11 +99,11 @@ async function setupTest() { instantiationService.stub(IRemoteAgentService, RemoteAgentService); instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { - private _localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; + #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; constructor() { super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService)); } - get localExtensionManagementServer(): IExtensionManagementServer { return this._localExtensionManagementServer; } + get localExtensionManagementServer(): IExtensionManagementServer { return this.#localExtensionManagementServer; } set localExtensionManagementServer(server: IExtensionManagementServer) { } }()); @@ -727,7 +727,7 @@ suite('ExtensionsActions', () => { .then(extensions => { const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); testObject.extension = extensions[0]; - assert.ok(!testObject.enabled); + assert.ok(testObject.enabled); }); }); }); 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 48664d6209..9b8d02abc0 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 @@ -99,11 +99,11 @@ suite('ExtensionsListView Tests', () => { instantiationService.stub(IMenuService, new TestMenuService()); instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService { - private _localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; + #localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', authority: 'vscode-local' }; constructor() { super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService)); } - get localExtensionManagementServer(): IExtensionManagementServer { return this._localExtensionManagementServer; } + get localExtensionManagementServer(): IExtensionManagementServer { return this.#localExtensionManagementServer; } set localExtensionManagementServer(server: IExtensionManagementServer) { } }()); diff --git a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts index 01221e8254..b0e8add71b 100644 --- a/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts +++ b/src/vs/workbench/contrib/externalTerminal/browser/externalTerminal.contribution.ts @@ -5,16 +5,11 @@ import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import * as paths from 'vs/base/common/path'; import { URI } from 'vs/base/common/uri'; import { IExternalTerminalConfiguration, IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; -import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; -import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { MenuId, MenuRegistry, IMenuItem } from 'vs/platform/actions/common/actions'; import { ITerminalService as IIntegratedTerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IFileService } from 'vs/platform/files/common/files'; import { IListService } from 'vs/platform/list/browser/listService'; import { getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; @@ -25,9 +20,13 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { optional } from 'vs/platform/instantiation/common/instantiation'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; -import { isWeb } from 'vs/base/common/platform'; -import { IPathService } from 'vs/workbench/services/path/common/pathService'; - +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { isWeb, isWindows } from 'vs/base/common/platform'; +import { dirname, basename } from 'vs/base/common/path'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { Registry } from 'vs/platform/registry/common/platform'; const OPEN_IN_TERMINAL_COMMAND_ID = 'openInTerminal'; CommandsRegistry.registerCommand({ @@ -62,7 +61,7 @@ CommandsRegistry.registerCommand({ authority: resource.authority, fragment: resource.fragment, query: resource.query, - path: paths.dirname(resource.path) + path: dirname(resource.path) }); }).forEach(cwd => { if (opened[cwd.path]) { @@ -70,13 +69,13 @@ CommandsRegistry.registerCommand({ } opened[cwd.path] = true; const instance = integratedTerminalService.createTerminal({ cwd }); - if (instance && (resources.length === 1 || !resource || cwd.path === resource.path || cwd.path === paths.dirname(resource.path))) { + if (instance && (resources.length === 1 || !resource || cwd.path === resource.path || cwd.path === dirname(resource.path))) { integratedTerminalService.setActiveInstance(instance); integratedTerminalService.showPanel(true); } }); } else { - distinct(targets.map(({ stat }) => stat!.isDirectory ? stat!.resource.fsPath : paths.dirname(stat!.resource.fsPath))).forEach(cwd => { + distinct(targets.map(({ stat }) => stat!.isDirectory ? stat!.resource.fsPath : dirname(stat!.resource.fsPath))).forEach(cwd => { terminalService!.openTerminal(cwd); }); } @@ -84,67 +83,56 @@ CommandsRegistry.registerCommand({ } }); -if (!isWeb) { - const OPEN_NATIVE_CONSOLE_COMMAND_ID = 'workbench.action.terminal.openNativeConsole'; - KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: OPEN_NATIVE_CONSOLE_COMMAND_ID, - primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C, - when: KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED, - weight: KeybindingWeight.WorkbenchContrib, - handler: async (accessor) => { - const historyService = accessor.get(IHistoryService); - // Open external terminal in local workspaces - const terminalService = accessor.get(IExternalTerminalService); - const root = historyService.getLastActiveWorkspaceRoot(Schemas.file); - if (root) { - terminalService.openTerminal(root.fsPath); - } else { - // Opens current file's folder, if no folder is open in editor - const activeFile = historyService.getLastActiveFile(Schemas.file); - if (activeFile) { - terminalService.openTerminal(paths.dirname(activeFile.fsPath)); - } else { - const pathService = accessor.get(IPathService); - const userHome = await pathService.userHome; - terminalService.openTerminal(userHome.fsPath); - } +export class ExternalTerminalContribution extends Disposable implements IWorkbenchContribution { + private _openInTerminalMenuItem: IMenuItem; + + constructor( + @IConfigurationService private readonly _configurationService: IConfigurationService + ) { + super(); + + this._openInTerminalMenuItem = { + group: 'navigation', + order: 30, + command: { + id: OPEN_IN_TERMINAL_COMMAND_ID, + title: nls.localize('scopedConsoleAction', "Open in Terminal") + }, + when: ContextKeyExpr.or(ResourceContextKey.Scheme.isEqualTo(Schemas.file), ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote)) + }; + MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, this._openInTerminalMenuItem); + MenuRegistry.appendMenuItem(MenuId.ExplorerContext, this._openInTerminalMenuItem); + + this._configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('terminal.explorerKind') || e.affectsConfiguration('terminal.external')) { + this._refreshOpenInTerminalMenuItemTitle(); + } + }); + this._refreshOpenInTerminalMenuItemTitle(); + } + + private _refreshOpenInTerminalMenuItemTitle(): void { + if (isWeb) { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.integrated', "Open in Integrated Terminal"); + return; + } + + const config = this._configurationService.getValue().terminal; + if (config.explorerKind === 'integrated') { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.integrated', "Open in Integrated Terminal"); + return; + } + + if (isWindows && config.external.windowsExec) { + const file = basename(config.external.windowsExec); + if (file === 'wt' || file === 'wt.exe') { + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.wt', "Open in Windows Terminal"); + return; } } - }); - MenuRegistry.appendMenuItem(MenuId.CommandPalette, { - command: { - id: OPEN_NATIVE_CONSOLE_COMMAND_ID, - title: { value: nls.localize('globalConsoleAction', "Open New External Terminal"), original: 'Open New External Terminal' } - } - }); + this._openInTerminalMenuItem.command.title = nls.localize('scopedConsoleAction.external', "Open in External Terminal"); + } } -const openConsoleCommand = { - id: OPEN_IN_TERMINAL_COMMAND_ID, - title: nls.localize('scopedConsoleAction', "Open in Terminal") -}; -MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file) -}); -MenuRegistry.appendMenuItem(MenuId.OpenEditorsContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) -}); -MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.file) -}); -MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { - group: 'navigation', - order: 30, - command: openConsoleCommand, - when: ResourceContextKey.Scheme.isEqualTo(Schemas.vscodeRemote) -}); +Registry.as(WorkbenchExtensions.Workbench).registerWorkbenchContribution(ExternalTerminalContribution, LifecyclePhase.Restored); diff --git a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts index 7428a4187b..50332c6bfd 100644 --- a/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts +++ b/src/vs/workbench/contrib/externalTerminal/common/externalTerminal.ts @@ -14,7 +14,7 @@ export interface IExternalTerminalSettings { } export interface IExternalTerminalService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; openTerminal(path: string): void; runInTerminal(title: string, cwd: string, args: string[], env: { [key: string]: string | null; }, settings: IExternalTerminalSettings): Promise; } @@ -24,4 +24,4 @@ export interface IExternalTerminalConfiguration { explorerKind: 'integrated' | 'external', external: IExternalTerminalSettings; }; -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts new file mode 100644 index 0000000000..8012660dd9 --- /dev/null +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution.ts @@ -0,0 +1,106 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import * as paths from 'vs/base/common/path'; +import { IExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; +import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; +import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; +import { KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { Schemas } from 'vs/base/common/network'; +import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { WindowsExternalTerminalService, MacExternalTerminalService, LinuxExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { isWindows, isMacintosh, isLinux } from 'vs/base/common/platform'; +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; + +const OPEN_NATIVE_CONSOLE_COMMAND_ID = 'workbench.action.terminal.openNativeConsole'; +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: OPEN_NATIVE_CONSOLE_COMMAND_ID, + primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_C, + when: KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED, + weight: KeybindingWeight.WorkbenchContrib, + handler: async (accessor) => { + const historyService = accessor.get(IHistoryService); + // Open external terminal in local workspaces + const terminalService = accessor.get(IExternalTerminalService); + const root = historyService.getLastActiveWorkspaceRoot(Schemas.file); + if (root) { + terminalService.openTerminal(root.fsPath); + } else { + // Opens current file's folder, if no folder is open in editor + const activeFile = historyService.getLastActiveFile(Schemas.file); + if (activeFile) { + terminalService.openTerminal(paths.dirname(activeFile.fsPath)); + } else { + const pathService = accessor.get(IPathService); + const userHome = await pathService.userHome; + terminalService.openTerminal(userHome.fsPath); + } + } + } +}); + +MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + command: { + id: OPEN_NATIVE_CONSOLE_COMMAND_ID, + title: { value: nls.localize('globalConsoleAction', "Open New External Terminal"), original: 'Open New External Terminal' } + } +}); + +if (isWindows) { + registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); +} else if (isMacintosh) { + registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); +} else if (isLinux) { + registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); +} + +LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { + let configurationRegistry = Registry.as(Extensions.Configuration); + configurationRegistry.registerConfiguration({ + id: 'externalTerminal', + order: 100, + title: nls.localize('terminalConfigurationTitle', "External Terminal"), + type: 'object', + properties: { + 'terminal.explorerKind': { + type: 'string', + enum: [ + 'integrated', + 'external' + ], + enumDescriptions: [ + 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."), + default: 'integrated' + }, + 'terminal.external.windowsExec': { + type: 'string', + description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), + default: WindowsExternalTerminalService.getDefaultTerminalWindows(), + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.osxExec': { + type: 'string', + description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), + default: DEFAULT_TERMINAL_OSX, + scope: ConfigurationScope.APPLICATION + }, + 'terminal.external.linuxExec': { + type: 'string', + description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), + default: defaultTerminalLinux, + scope: ConfigurationScope.APPLICATION + } + } + }); +}); diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts new file mode 100644 index 0000000000..460b04b332 --- /dev/null +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminal.ts @@ -0,0 +1,6 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts index 241c9ae283..f6dfa9e9b7 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.test.ts @@ -4,7 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { deepEqual, equal } from 'assert'; -import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { WindowsExternalTerminalService, LinuxExternalTerminalService, MacExternalTerminalService } from 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; suite('ExternalTerminalService', () => { let mockOnExit: Function; diff --git a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts index 8bb1229ced..cd752e6d89 100644 --- a/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts +++ b/src/vs/workbench/contrib/externalTerminal/node/externalTerminalService.ts @@ -13,14 +13,10 @@ import { assign } from 'vs/base/common/objects'; import { IExternalTerminalService, IExternalTerminalConfiguration, IExternalTerminalSettings } from 'vs/workbench/contrib/externalTerminal/common/externalTerminal'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { getPathFromAmdModule } from 'vs/base/common/amd'; -import { IConfigurationRegistry, Extensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Registry } from 'vs/platform/registry/common/platform'; import { optional } from 'vs/platform/instantiation/common/instantiation'; - +import { DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/externalTerminal/node/externalTerminal'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); -export const DEFAULT_TERMINAL_OSX = 'Terminal.app'; export class WindowsExternalTerminalService implements IExternalTerminalService { public _serviceBrand: undefined; @@ -358,54 +354,3 @@ function quote(args: string[]): string { } return r; } - -if (env.isWindows) { - registerSingleton(IExternalTerminalService, WindowsExternalTerminalService, true); -} else if (env.isMacintosh) { - registerSingleton(IExternalTerminalService, MacExternalTerminalService, true); -} else if (env.isLinux) { - registerSingleton(IExternalTerminalService, LinuxExternalTerminalService, true); -} - -LinuxExternalTerminalService.getDefaultTerminalLinuxReady().then(defaultTerminalLinux => { - let configurationRegistry = Registry.as(Extensions.Configuration); - configurationRegistry.registerConfiguration({ - id: 'externalTerminal', - order: 100, - title: nls.localize('terminalConfigurationTitle', "External Terminal"), - type: 'object', - properties: { - 'terminal.explorerKind': { - type: 'string', - enum: [ - 'integrated', - 'external' - ], - enumDescriptions: [ - 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."), - default: 'integrated' - }, - 'terminal.external.windowsExec': { - type: 'string', - description: nls.localize('terminal.external.windowsExec', "Customizes which terminal to run on Windows."), - default: WindowsExternalTerminalService.getDefaultTerminalWindows(), - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.osxExec': { - type: 'string', - description: nls.localize('terminal.external.osxExec', "Customizes which terminal application to run on macOS."), - default: DEFAULT_TERMINAL_OSX, - scope: ConfigurationScope.APPLICATION - }, - 'terminal.external.linuxExec': { - type: 'string', - description: nls.localize('terminal.external.linuxExec', "Customizes which terminal to run on Linux."), - default: defaultTerminalLinux, - scope: ConfigurationScope.APPLICATION - } - } - }); -}); diff --git a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts index 814d1e6d44..747ace1095 100644 --- a/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts @@ -11,8 +11,8 @@ import { basename } from 'vs/base/common/resources'; import { Action } from 'vs/base/common/actions'; import { VIEWLET_ID, TEXT_FILE_EDITOR_ID, IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService, TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; -import { BaseTextEditor, IEditorConfiguration } from 'vs/workbench/browser/parts/editor/textEditor'; -import { EditorOptions, TextEditorOptions, IEditorCloseEvent } from 'vs/workbench/common/editor'; +import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; +import { EditorOptions, TextEditorOptions, IEditorInput } from 'vs/workbench/common/editor'; import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; @@ -25,13 +25,11 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; -import { MutableDisposable } from 'vs/base/common/lifecycle'; import { EditorActivation, IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; /** * An implementation of editor for file system resources. @@ -40,9 +38,6 @@ export class TextFileEditor extends BaseTextEditor { static readonly ID = TEXT_FILE_EDITOR_ID; - private restoreViewState: boolean | undefined; - private readonly groupListener = this._register(new MutableDisposable()); - constructor( @ITelemetryService telemetryService: ITelemetryService, @IFileService private readonly fileService: IFileService, @@ -56,12 +51,10 @@ export class TextFileEditor extends BaseTextEditor { @IEditorGroupsService editorGroupService: IEditorGroupsService, @ITextFileService private readonly textFileService: ITextFileService, @IExplorerService private readonly explorerService: IExplorerService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { super(TextFileEditor.ID, telemetryService, instantiationService, storageService, textResourceConfigurationService, themeService, editorService, editorGroupService); - this.updateRestoreViewStateConfiguration(); - // Clear view state for deleted files this._register(this.fileService.onDidFilesChange(e => this.onDidFilesChange(e))); @@ -78,18 +71,16 @@ export class TextFileEditor extends BaseTextEditor { private onDidRunOperation(e: FileOperationEvent): void { if (e.operation === FileOperation.MOVE && e.target) { - this.moveTextEditorViewState(e.resource, e.target.resource); + this.moveTextEditorViewState(e.resource, e.target.resource, this.uriIdentityService.extUri); } } - protected handleConfigurationChangeEvent(configuration?: IEditorConfiguration): void { - super.handleConfigurationChangeEvent(configuration); + protected onWillCloseEditorInGroup(editor: IEditorInput): void { - this.updateRestoreViewStateConfiguration(); - } - - private updateRestoreViewStateConfiguration(): void { - this.restoreViewState = this.configurationService.getValue('workbench.editor.restoreViewState') ?? true /* default */; + // React to editors closing to preserve or clear view state. This needs to happen + // in the onWillCloseEditor because at that time the editor has not yet + // been disposed and we can safely persist the view state still as needed. + this.doSaveOrClearTextEditorViewState(editor); } getTitle(): string { @@ -100,30 +91,6 @@ export class TextFileEditor extends BaseTextEditor { return this._input as FileEditorInput; } - setEditorVisible(visible: boolean, group: IEditorGroup | undefined): void { - super.setEditorVisible(visible, group); - - // React to editors closing to preserve or clear view state. This needs to happen - // in the onWillCloseEditor because at that time the editor has not yet - // been disposed and we can safely persist the view state still as needed. - this.groupListener.value = ((group as IEditorGroupView).onWillCloseEditor(e => this.onWillCloseEditorInGroup(e))); - } - - private onWillCloseEditorInGroup(e: IEditorCloseEvent): void { - const editor = e.editor; - if (!(editor instanceof FileEditorInput)) { - return; // only handle files - } - - // If the editor is currently active we can always save or clear the view state. - // If the editor is not active, we can only clear the view state because it needs - // an active editor with the file opened, so we check for the restoreViewState flag - // being set. - if (editor === this.input || !this.restoreViewState) { - this.doSaveOrClearTextEditorViewState(editor); - } - } - async setInput(input: FileEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { // Update/clear view settings if input changes @@ -268,14 +235,14 @@ export class TextFileEditor extends BaseTextEditor { super.saveState(); } - private doSaveOrClearTextEditorViewState(input: FileEditorInput | undefined): void { - if (!input) { + private doSaveOrClearTextEditorViewState(input: IEditorInput | undefined): void { + if (!(input instanceof FileEditorInput)) { return; // ensure we have an input to handle view state for } // If the user configured to not restore view state, we clear the view // state unless the editor is still opened in the group. - if (!this.restoreViewState && (!this.group || !this.group.isOpened(input))) { + if (!this.shouldRestoreViewState && (!this.group || !this.group.isOpened(input))) { this.clearTextEditorViewState([input.resource], this.group); } diff --git a/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts b/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts index a4f352ad8b..d1ae686825 100644 --- a/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler.ts @@ -17,7 +17,7 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { ResourceMap } from 'vs/base/common/map'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; -import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { TextFileContentProvider } from 'vs/workbench/contrib/files/common/files'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { SAVE_FILE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL } from 'vs/workbench/contrib/files/browser/fileCommands'; @@ -43,14 +43,15 @@ const conflictEditorHelp = nls.localize('userGuide', "Use the actions in the edi // A handler for text file save error happening with conflict resolution actions export class TextFileSaveErrorHandler extends Disposable implements ISaveErrorHandler, IWorkbenchContribution { - private messages: ResourceMap; - private conflictResolutionContext: IContextKey; - private activeConflictResolutionResource?: URI; + + private readonly messages = new ResourceMap(); + private readonly conflictResolutionContext = new RawContextKey(CONFLICT_RESOLUTION_CONTEXT, false).bindTo(this.contextKeyService); + private activeConflictResolutionResource: URI | undefined = undefined; constructor( @INotificationService private readonly notificationService: INotificationService, @ITextFileService private readonly textFileService: ITextFileService, - @IContextKeyService contextKeyService: IContextKeyService, + @IContextKeyService private contextKeyService: IContextKeyService, @IEditorService private readonly editorService: IEditorService, @ITextModelService textModelService: ITextModelService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -62,9 +63,6 @@ export class TextFileSaveErrorHandler extends Disposable implements ISaveErrorHa // opt-in to syncing storageKeysSyncRegistryService.registerStorageKey({ key: LEARN_MORE_DIRTY_WRITE_IGNORE_KEY, version: 1 }); - this.messages = new ResourceMap(); - this.conflictResolutionContext = new RawContextKey(CONFLICT_RESOLUTION_CONTEXT, false).bindTo(contextKeyService); - const provider = this._register(instantiationService.createInstance(TextFileContentProvider)); this._register(textModelService.registerTextModelContentProvider(CONFLICT_RESOLUTION_SCHEME, provider)); diff --git a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts index b5b7a72605..3dfa7d72c6 100644 --- a/src/vs/workbench/contrib/files/browser/explorerViewlet.ts +++ b/src/vs/workbench/contrib/files/browser/explorerViewlet.ts @@ -114,6 +114,7 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor when: OpenEditorsVisibleContext, canToggleVisibility: true, canMoveView: true, + collapsed: true, focusCommand: { id: 'workbench.files.action.focusOpenEditorsView', keybindings: { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_E) } @@ -219,7 +220,6 @@ export class ExplorerViewPaneContainer extends ViewPaneContainer { } catch (error) { return null; // ignore } finally { - const openEditorsView = this.getOpenEditorsView(); if (openEditorsView) { openEditorsView.setStructuralRefreshDelay(0); } diff --git a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts index 5e5d763943..170fa3373f 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.contribution.ts @@ -5,12 +5,12 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler, DOWNLOAD_COMMAND_ID, openFilePreserveFocusHandler, DOWNLOAD_LABEL, ShowOpenedFileInNewWindow, ReopenResourcesAction, ToggleEditorTypeCommand as ToggleEditorTypeAction, GlobalNewUntitledPlainFileAction } from 'vs/workbench/contrib/files/browser/fileActions'; +import { ToggleAutoSaveAction, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler, DOWNLOAD_COMMAND_ID, openFilePreserveFocusHandler, DOWNLOAD_LABEL, ShowOpenedFileInNewWindow, ReopenResourcesAction, ToggleEditorTypeCommand as ToggleEditorTypeAction } from 'vs/workbench/contrib/files/browser/fileActions'; import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/contrib/files/browser/editors/textFileSaveErrorHandler'; import { SyncActionDescriptor, MenuId, MenuRegistry, ILocalizedString } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; -import { openWindowCommand, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, newWindowCommand, ReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; +import { openWindowCommand, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL, newWindowCommand, ReadonlyEditorContext, OPEN_WITH_EXPLORER_COMMAND_ID, NEW_UNTITLED_FILE_COMMAND_ID, NEW_UNTITLED_FILE_LABEL, NEW_UNTITLED_PLAIN_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr, ContextKeyExpression } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -42,10 +42,8 @@ registry.registerWorkbenchAction(SyncActionDescriptor.from(FocusFilesExplorer), registry.registerWorkbenchAction(SyncActionDescriptor.from(ShowActiveFileInExplorer), 'File: Reveal Active File in Side Bar', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(CollapseExplorerView), 'File: Collapse Folders in Explorer', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(RefreshExplorerView), 'File: Refresh Explorer', category.value); -registry.registerWorkbenchAction(SyncActionDescriptor.from(GlobalNewUntitledFileAction, { primary: KeyMod.CtrlCmd | KeyCode.KEY_N }), 'File: New Untitled File', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(CompareWithClipboardAction, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_C) }), 'File: Compare Active File with Clipboard', category.value); registry.registerWorkbenchAction(SyncActionDescriptor.from(ToggleAutoSaveAction), 'File: Toggle Auto Save', category.value); -registry.registerWorkbenchAction(SyncActionDescriptor.from(GlobalNewUntitledPlainFileAction), 'File: New Plain Text File', category.value); // {{SQL CARBON EDIT}} -- Add 'New File' command for plain untitled files registry.registerWorkbenchAction(SyncActionDescriptor.from(ShowOpenedFileInNewWindow, { primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyCode.KEY_O) }), 'File: Open Active File in New Window', category.value); const workspacesCategory = nls.localize('workspaces', "Workspaces"); @@ -241,6 +239,8 @@ appendToCommandPalette(CLOSE_EDITOR_COMMAND_ID, { value: nls.localize('closeEdit appendToCommandPalette(NEW_FILE_COMMAND_ID, { value: NEW_FILE_LABEL, original: 'New File' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); appendToCommandPalette(NEW_FOLDER_COMMAND_ID, { value: NEW_FOLDER_LABEL, original: 'New Folder' }, category, WorkspaceFolderCountContext.notEqualsTo('0')); appendToCommandPalette(DOWNLOAD_COMMAND_ID, { value: DOWNLOAD_LABEL, original: 'Download' }, category, ContextKeyExpr.and(ResourceContextKey.Scheme.notEqualsTo(Schemas.file))); +appendToCommandPalette(NEW_UNTITLED_FILE_COMMAND_ID, { value: NEW_UNTITLED_FILE_LABEL, original: 'New Query' }, category); +appendToCommandPalette(NEW_UNTITLED_PLAIN_FILE_COMMAND_ID, { value: NEW_UNTITLED_PLAIN_FILE_COMMAND_ID, original: 'New File' }, category); // Menu registration - open editors @@ -583,8 +583,8 @@ MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { // Empty Editor Group Context Menu // {{SQL CARBON EDIT}} - Use "New Query" instead of "New File" -MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: GlobalNewUntitledFileAction.ID, title: nls.localize('newFile', "New Query") }, group: '1_file', order: 10 }); -MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: GlobalNewUntitledPlainFileAction.ID, title: nls.localize('newPlainFile', "New File") }, group: '1_file', order: 15 }); +MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: NEW_UNTITLED_FILE_COMMAND_ID, title: nls.localize('newFile', "New Query") }, group: '1_file', order: 10 }); +MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: NEW_UNTITLED_PLAIN_FILE_COMMAND_ID, title: nls.localize('newPlainFile', "New File") }, group: '1_file', order: 15 }); MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: 'workbench.action.quickOpen', title: nls.localize('openFile', "Open File...") }, group: '1_file', order: 20 }); // File menu @@ -593,8 +593,8 @@ MenuRegistry.appendMenuItem(MenuId.EmptyEditorGroupContext, { command: { id: 'wo MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '1_new', command: { - id: GlobalNewUntitledFileAction.ID, - title: nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "&&New Query") + id: NEW_UNTITLED_FILE_COMMAND_ID, + title: nls.localize({ key: 'miNewFile', comment: ['&& denotes a mnemonic'] }, "New &&Query") }, order: 1 }); @@ -603,7 +603,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarFileMenu, { group: '1_new', command: { - id: GlobalNewUntitledPlainFileAction.ID, + id: NEW_UNTITLED_PLAIN_FILE_COMMAND_ID, title: nls.localize({ key: 'miNewPlainFile', comment: ['&& denotes a mnemonic'] }, "New &&File") }, order: 1.1 diff --git a/src/vs/workbench/contrib/files/browser/fileActions.ts b/src/vs/workbench/contrib/files/browser/fileActions.ts index 9da2cbb7b5..e6f04f52ff 100644 --- a/src/vs/workbench/contrib/files/browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/browser/fileActions.ts @@ -47,8 +47,7 @@ import { IWorkingCopyService, IWorkingCopy } from 'vs/workbench/services/working import { sequence, timeout } from 'vs/base/common/async'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { once } from 'vs/base/common/functional'; -import { IEditorOptions } from 'vs/platform/editor/common/editor'; -import { IEditorGroup, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; import { Codicon } from 'vs/base/common/codicons'; import { IViewsService } from 'vs/workbench/common/views'; import { openEditorWith, getAllAvailableEditors } from 'vs/workbench/contrib/files/common/openWith'; @@ -122,45 +121,6 @@ export class NewFolderAction extends Action { } } -/* Create new file from anywhere: Open untitled */ -// {{SQL CARBON EDIT}} -export class GlobalNewUntitledPlainFileAction extends Action { - // {{SQL CARBON EDIT}} - Use different command name to reserve original name for SQL files - public static readonly ID = 'workbench.action.files.newUntitledPlainFile'; - public static readonly LABEL = nls.localize('newPlainTextFile', "New Plain Text File"); - - constructor( - id: string, - label: string, - @IEditorService private readonly editorService: IEditorService - ) { - super(id, label); - } - - public run(): Promise { - // {{SQL CARBON EDIT}} - set as plain text - return this.editorService.openEditor({ options: { pinned: true }, mode: 'txt' }); // untitled are always pinned - } -} - -/* Create new file from anywhere: Open untitled */ -export class GlobalNewUntitledFileAction extends Action { - static readonly ID = 'workbench.action.files.newUntitledFile'; - static readonly LABEL = nls.localize('newUntitledFile', "New Untitled File"); - - constructor( - id: string, - label: string, - @IEditorService private readonly editorService: IEditorService - ) { - super(id, label); - } - - async run(): Promise { - await this.editorService.openEditor({ options: { pinned: true } }); // untitled are always pinned - } -} - async function deleteFiles(workingCopyFileService: IWorkingCopyFileService, dialogService: IDialogService, configurationService: IConfigurationService, elements: ExplorerItem[], useTrash: boolean, skipConfirm = false): Promise { let primaryButton: string; if (useTrash) { @@ -486,6 +446,7 @@ export class GlobalCompareResourcesAction extends Action { @IQuickInputService private readonly quickInputService: IQuickInputService, @IEditorService private readonly editorService: IEditorService, @INotificationService private readonly notificationService: INotificationService, + @ITextModelService private readonly textModelService: ITextModelService ) { super(id, label); } @@ -493,29 +454,35 @@ export class GlobalCompareResourcesAction extends Action { async run(): Promise { const activeInput = this.editorService.activeEditor; const activeResource = activeInput ? activeInput.resource : undefined; - if (activeResource) { + if (activeResource && this.textModelService.canHandleResource(activeResource)) { // Compare with next editor that opens const toDispose = this.editorService.overrideOpenEditor({ - getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { - return []; - }, open: editor => { + // Only once! toDispose.dispose(); // Open editor as diff const resource = editor.resource; - if (resource) { + if (resource && this.textModelService.canHandleResource(resource)) { return { override: this.editorService.openEditor({ leftResource: activeResource, - rightResource: resource + rightResource: resource, + options: { override: false } }) }; } - return undefined; + // Otherwise stay on current resource + this.notificationService.info(nls.localize('fileToCompareNoFile', "Please select a file to compare with.")); + return { + override: this.editorService.openEditor({ + resource: activeResource, + options: { override: false } + }) + }; } }); @@ -597,7 +564,7 @@ export class ToggleEditorTypeCommand extends Action { return; } - await firstNonActiveOverride[0].open(input, options, group, OpenEditorContext.NEW_EDITOR, firstNonActiveOverride[1].id)?.override; + await firstNonActiveOverride[0].open(input, { ...options, override: firstNonActiveOverride[1].id }, group, OpenEditorContext.NEW_EDITOR)?.override; } } diff --git a/src/vs/workbench/contrib/files/browser/fileCommands.ts b/src/vs/workbench/contrib/files/browser/fileCommands.ts index b7349b8e39..c78af344ce 100644 --- a/src/vs/workbench/contrib/files/browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/browser/fileCommands.ts @@ -43,6 +43,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { openEditorWith } from 'vs/workbench/contrib/files/common/openWith'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; // Commands @@ -84,6 +85,9 @@ export const PREVIOUS_COMPRESSED_FOLDER = 'previousCompressedFolder'; export const NEXT_COMPRESSED_FOLDER = 'nextCompressedFolder'; export const FIRST_COMPRESSED_FOLDER = 'firstCompressedFolder'; export const LAST_COMPRESSED_FOLDER = 'lastCompressedFolder'; +export const NEW_UNTITLED_FILE_COMMAND_ID = 'workbench.action.files.newUntitledFile'; +export const NEW_UNTITLED_PLAIN_FILE_COMMAND_ID = 'workbench.action.files.newUntitledPlainFile'; +export const NEW_UNTITLED_FILE_LABEL = nls.localize('newUntitledFile', "New Untitled File"); export const openWindowCommand = (accessor: ServicesAccessor, toOpen: IWindowOpenable[], options?: IOpenWindowOptions) => { if (Array.isArray(toOpen)) { @@ -509,10 +513,10 @@ CommandsRegistry.registerCommand({ handler: (accessor, resource: URI | object) => { const workspaceEditingService = accessor.get(IWorkspaceEditingService); const contextService = accessor.get(IWorkspaceContextService); + const uriIdentityService = accessor.get(IUriIdentityService); const workspace = contextService.getWorkspace(); - const resources = getMultiSelectedResources(resource, accessor.get(IListService), accessor.get(IEditorService), accessor.get(IExplorerService)).filter(r => - // Need to verify resources are workspaces since multi selection can trigger this command on some non workspace resources - workspace.folders.some(f => isEqual(f.uri, r)) + const resources = getMultiSelectedResources(resource, accessor.get(IListService), accessor.get(IEditorService), accessor.get(IExplorerService)).filter(resource => + workspace.folders.some(folder => uriIdentityService.extUri.isEqual(folder.uri, resource)) // Need to verify resources are workspaces since multi selection can trigger this command on some non workspace resources ); return workspaceEditingService.removeFolders(resources); @@ -596,3 +600,62 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ view.lastCompressedStat(); } }); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + weight: KeybindingWeight.WorkbenchContrib, + when: null, + primary: KeyMod.CtrlCmd | KeyCode.KEY_N, + id: NEW_UNTITLED_FILE_COMMAND_ID, + description: { + description: NEW_UNTITLED_FILE_LABEL, + args: [ + { + name: 'viewType', description: 'The editor view type', schema: { + 'type': 'object', + 'required': ['viewType'], + 'properties': { + 'viewType': { + 'type': 'string' + } + } + } + } + ] + }, + handler: async (accessor, args?: { viewType: string }) => { + const editorService = accessor.get(IEditorService); + + if (args) { + const editorGroupsService = accessor.get(IEditorGroupsService); + const configurationService = accessor.get(IConfigurationService); + const quickInputService = accessor.get(IQuickInputService); + + const textInput = editorService.createEditorInput({ options: { pinned: true } }); + const group = editorGroupsService.activeGroup; + await openEditorWith(textInput, args.viewType, { pinned: true }, group, editorService, configurationService, quickInputService); + } else { + await editorService.openEditor({ options: { pinned: true } }); // untitled are always pinned + } + } +}); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + weight: KeybindingWeight.WorkbenchContrib, + when: null, + id: NEW_UNTITLED_PLAIN_FILE_COMMAND_ID, + handler: async (accessor, viewType?: string) => { + const editorService = accessor.get(IEditorService); + + if (viewType) { + const editorGroupsService = accessor.get(IEditorGroupsService); + const configurationService = accessor.get(IConfigurationService); + const quickInputService = accessor.get(IQuickInputService); + + const textInput = editorService.createEditorInput({ options: { pinned: true } }); + const group = editorGroupsService.activeGroup; + await openEditorWith(textInput, viewType, { pinned: true }, group, editorService, configurationService, quickInputService); + } else { + await editorService.openEditor({ options: { pinned: true } }); // untitled are always pinned + } + } +}); diff --git a/src/vs/workbench/contrib/files/browser/files.contribution.ts b/src/vs/workbench/contrib/files/browser/files.contribution.ts index 118e1e8937..a6009b10cc 100644 --- a/src/vs/workbench/contrib/files/browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/browser/files.contribution.ts @@ -39,6 +39,7 @@ import { Schemas } from 'vs/base/common/network'; import { WorkspaceWatcher } from 'vs/workbench/contrib/files/common/workspaceWatcher'; import { editorConfigurationBaseNode } from 'vs/editor/common/config/commonEditorConfig'; import { DirtyFilesIndicator } from 'vs/workbench/contrib/files/common/dirtyFilesIndicator'; +import { extUri } from 'vs/base/common/resources'; // Viewlet Action export class OpenExplorerViewletAction extends ShowViewletAction { @@ -101,8 +102,8 @@ Registry.as(EditorExtensions.Editors).registerEditor( // Register default file input factory Registry.as(EditorInputExtensions.EditorInputFactories).registerFileEditorInputFactory({ - createFileEditorInput: (resource, encoding, mode, instantiationService): IFileEditorInput => { - return instantiationService.createInstance(FileEditorInput, resource, encoding, mode); + createFileEditorInput: (resource, label, encoding, mode, instantiationService): IFileEditorInput => { + return instantiationService.createInstance(FileEditorInput, resource, label, encoding, mode); }, isFileEditorInput: (obj): obj is IFileEditorInput => { @@ -112,6 +113,7 @@ Registry.as(EditorInputExtensions.EditorInputFactor interface ISerializedFileEditorInput { resourceJSON: UriComponents; + labelJSON?: UriComponents; encoding?: string; modeId?: string; } @@ -126,8 +128,10 @@ class FileEditorInputFactory implements IEditorInputFactory { serialize(editorInput: EditorInput): string { const fileEditorInput = editorInput; const resource = fileEditorInput.resource; + const label = fileEditorInput.getLabel(); const serializedFileEditorInput: ISerializedFileEditorInput = { resourceJSON: resource.toJSON(), + labelJSON: extUri.isEqual(resource, label) ? undefined : label, // only storing label if it differs from the resource encoding: fileEditorInput.getEncoding(), modeId: fileEditorInput.getPreferredMode() // only using the preferred user associated mode here if available to not store redundant data }; @@ -139,10 +143,16 @@ class FileEditorInputFactory implements IEditorInputFactory { return instantiationService.invokeFunction(accessor => { const serializedFileEditorInput: ISerializedFileEditorInput = JSON.parse(serializedEditorInput); const resource = URI.revive(serializedFileEditorInput.resourceJSON); + const label = URI.revive(serializedFileEditorInput.labelJSON); const encoding = serializedFileEditorInput.encoding; const mode = serializedFileEditorInput.modeId; - return accessor.get(IEditorService).createEditorInput({ resource, encoding, mode, forceFile: true }) as FileEditorInput; + const fileEditorInput = accessor.get(IEditorService).createEditorInput({ resource, encoding, mode, forceFile: true }) as FileEditorInput; + if (label) { + fileEditorInput.setLabel(label); + } + + return fileEditorInput; }); } } @@ -228,6 +238,9 @@ configurationRegistry.registerConfiguration({ [FILES_ASSOCIATIONS_CONFIG]: { 'type': 'object', 'markdownDescription': nls.localize('associations', "Configure file associations to languages (e.g. `\"*.extension\": \"html\"`). These have precedence over the default associations of the languages installed."), + 'additionalProperties': { + 'type': 'string' + } }, 'files.encoding': { 'type': 'string', diff --git a/src/vs/workbench/contrib/files/browser/media/explorerviewlet.css b/src/vs/workbench/contrib/files/browser/media/explorerviewlet.css index 0a0d9e09c1..89d964e5b8 100644 --- a/src/vs/workbench/contrib/files/browser/media/explorerviewlet.css +++ b/src/vs/workbench/contrib/files/browser/media/explorerviewlet.css @@ -55,6 +55,7 @@ align-items: center; } +.pane.horizontal:not(.expanded) .pane-header .dirty-count.monaco-count-badge, .pane-header .dirty-count.monaco-count-badge.hidden { display: none; } diff --git a/src/vs/workbench/contrib/files/browser/views/explorerView.ts b/src/vs/workbench/contrib/files/browser/views/explorerView.ts index 760dd52b21..6bbf977527 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerView.ts @@ -24,7 +24,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ResourceContextKey } from 'vs/workbench/common/resources'; import { IDecorationsService } from 'vs/workbench/services/decorations/browser/decorations'; -import { TreeResourceNavigator, WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchCompressibleAsyncDataTree } from 'vs/platform/list/browser/listService'; import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IViewPaneOptions, ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer'; @@ -37,14 +37,11 @@ import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions' import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ExplorerItem, NewExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; -import { onUnexpectedError } from 'vs/base/common/errors'; import { ResourceLabels } from 'vs/workbench/browser/labels'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IAsyncDataTreeViewState } from 'vs/base/browser/ui/tree/asyncDataTree'; import { FuzzyScore } from 'vs/base/common/filters'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; -import { values } from 'vs/base/common/map'; -import { first } from 'vs/base/common/arrays'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; @@ -143,6 +140,8 @@ export class ExplorerView extends ViewPane { private compressedFocusFirstContext: IContextKey; private compressedFocusLastContext: IContextKey; + private horizontalScrolling: boolean | undefined; + // Refresh is needed on the initial explorer open private shouldRefresh = true; private dragHandler!: DelayedDragHandler; @@ -312,8 +311,19 @@ export class ExplorerView extends ViewPane { async setEditable(stat: ExplorerItem, isEditing: boolean): Promise { if (isEditing) { + this.horizontalScrolling = this.tree.options.horizontalScrolling; + + if (this.horizontalScrolling) { + this.tree.updateOptions({ horizontalScrolling: false }); + } + await this.tree.expand(stat.parent!); } else { + if (this.horizontalScrolling !== undefined) { + this.tree.updateOptions({ horizontalScrolling: this.horizontalScrolling }); + } + + this.horizontalScrolling = undefined; DOM.removeClass(this.treeContainer, 'highlight'); } @@ -411,22 +421,23 @@ export class ExplorerView extends ViewPane { // Update resource context based on focused element this._register(this.tree.onDidChangeFocus(e => this.onFocusChanged(e.elements))); this.onFocusChanged([]); - const explorerNavigator = new TreeResourceNavigator(this.tree); - this._register(explorerNavigator); // Open when selecting via keyboard - this._register(explorerNavigator.onDidOpenResource(async e => { - const selection = this.tree.getSelection(); + this._register(this.tree.onDidOpen(async e => { + const element = e.element; + if (!element) { + return; + } // Do not react if the user is expanding selection via keyboard. // Check if the item was previously also selected, if yes the user is simply expanding / collapsing current selection #66589. const shiftDown = e.browserEvent instanceof KeyboardEvent && e.browserEvent.shiftKey; - if (selection.length === 1 && !shiftDown) { - if (selection[0].isDirectory || this.explorerService.isEditable(undefined)) { + if (!shiftDown) { + if (element.isDirectory || this.explorerService.isEditable(undefined)) { // Do not react if user is clicking on explorer items while some are being edited #70276 // Do not react if clicking on directories return; } this.telemetryService.publicLog2('workbenchActionExecuted', { id: 'workbench.files.openFile', from: 'explorer' }); - await this.editorService.openEditor({ resource: selection[0].resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); + await this.editorService.openEditor({ resource: element.resource, options: { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned } }, e.sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } })); @@ -606,11 +617,19 @@ export class ExplorerView extends ViewPane { if (Array.isArray(input)) { if (!viewState || previousInput instanceof ExplorerItem) { // There is no view state for this workspace, expand all roots. Or we transitioned from a folder workspace. - input.forEach(item => this.tree.expand(item).then(undefined, onUnexpectedError)); + input.forEach(async item => { + try { + await this.tree.expand(item); + } catch (e) { } + }); } if (Array.isArray(previousInput) && previousInput.length < input.length) { // Roots added to the explorer -> expand them. - input.slice(previousInput.length).forEach(item => this.tree.expand(item).then(undefined, onUnexpectedError)); + input.slice(previousInput.length).forEach(async item => { + try { + await this.tree.expand(item); + } catch (e) { } + }); } } if (initialInputSetup) { @@ -663,7 +682,14 @@ export class ExplorerView extends ViewPane { } catch (e) { return this.selectResource(resource, reveal, retry + 1); } - item = first(values(item.children), i => this.uriIdentityService.extUri.isEqualOrParent(resource, i.resource)); + + for (let child of item.children.values()) { + if (this.uriIdentityService.extUri.isEqualOrParent(resource, child.resource)) { + item = child; + break; + } + item = undefined; + } } if (item) { diff --git a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts index f81b002626..26993c7414 100644 --- a/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/browser/views/explorerViewer.ts @@ -9,7 +9,7 @@ import * as glob from 'vs/base/common/glob'; import { IListVirtualDelegate, ListDragOverEffect } from 'vs/base/browser/ui/list/list'; import { IProgressService, ProgressLocation, IProgressStep, IProgress } from 'vs/platform/progress/common/progress'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { IFileService, FileKind, FileOperationError, FileOperationResult, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { IFileService, FileKind, FileOperationError, FileOperationResult, FileSystemProviderCapabilities, BinarySize } from 'vs/platform/files/common/files'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IDisposable, Disposable, dispose, toDisposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -734,6 +734,14 @@ interface IWebkitDataTransferItemEntryReader { readEntries(resolve: (file: IWebkitDataTransferItemEntry[]) => void, reject: () => void): void } +interface IUploadOperation { + filesTotal: number; + filesUploaded: number; + + startTime: number; + bytesUploaded: number; +} + export class FileDragAndDrop implements ITreeDragAndDrop { private static readonly CONFIRM_DND_SETTING_KEY = 'explorer.confirmDragAndDrop'; @@ -974,6 +982,7 @@ export class FileDragAndDrop implements ITreeDragAndDrop { const results: { isFile: boolean, resource: URI }[] = []; const cts = new CancellationTokenSource(); + const operation: IUploadOperation = { filesTotal: entries.length, filesUploaded: 0, startTime: Date.now(), bytesUploaded: 0 }; // Start upload and report progress globally const uploadPromise = this.progressService.withProgress({ @@ -983,7 +992,19 @@ export class FileDragAndDrop implements ITreeDragAndDrop { title: localize('uploadingFiles', "Uploading") }, async progress => { for (let entry of entries) { - const result = await this.doUploadWebFileEntry(entry, target.resource, target, progress, cts.token); + + // Confirm overwrite as needed + if (target && entry.name && target.getChild(entry.name)) { + const { confirmed } = await this.dialogService.confirm(getFileOverwriteConfirm(entry.name)); + if (!confirmed) { + continue; + } + + await this.workingCopyFileService.delete(joinPath(target.resource, entry.name), { recursive: true }); + } + + // Upload entry + const result = await this.doUploadWebFileEntry(entry, target.resource, target, progress, operation, cts.token); if (result) { results.push(result); } @@ -1002,29 +1023,37 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } } - private async doUploadWebFileEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, token: CancellationToken): Promise<{ isFile: boolean, resource: URI } | undefined> { + private async doUploadWebFileEntry(entry: IWebkitDataTransferItemEntry, parentResource: URI, target: ExplorerItem | undefined, progress: IProgress, operation: IUploadOperation, token: CancellationToken): Promise<{ isFile: boolean, resource: URI } | undefined> { if (token.isCancellationRequested || !entry.name || (!entry.isFile && !entry.isDirectory)) { return undefined; } - const resource = joinPath(parentResource, entry.name); - - // Confirm overwrite as needed - if (target && target.getChild(entry.name)) { - const { confirmed } = await this.dialogService.confirm(getFileOverwriteConfirm(resource.path)); - if (!confirmed) { - return undefined; - } - } - - if (token.isCancellationRequested) { - return undefined; - } - // Report progress - progress.report({ message: entry.name }); + let fileBytesUploaded = 0; + const reportProgress = (fileSize: number, bytesUploaded: number): void => { + fileBytesUploaded += bytesUploaded; + operation.bytesUploaded += bytesUploaded; + + const bytesUploadedPerSecond = operation.bytesUploaded / ((Date.now() - operation.startTime) / 1000); + + let message: string; + if (operation.filesTotal === 1 && entry.name) { + message = entry.name; + } else { + message = localize('uploadProgress', "{0} of {1} files ({2}/s)", operation.filesUploaded, operation.filesTotal, BinarySize.formatSize(bytesUploadedPerSecond)); + } + + if (fileSize > BinarySize.MB) { + message = localize('uploadProgressDetail', "{0} ({1} of {2}, {3}/s)", message, BinarySize.formatSize(fileBytesUploaded), BinarySize.formatSize(fileSize), BinarySize.formatSize(bytesUploadedPerSecond)); + } + + progress.report({ message }); + }; + operation.filesUploaded++; + reportProgress(0, 0); // Handle file upload + const resource = joinPath(parentResource, entry.name); if (entry.isFile) { const file = await new Promise((resolve, reject) => entry.file(resolve, reject)); @@ -1034,12 +1063,12 @@ export class FileDragAndDrop implements ITreeDragAndDrop { // Chrome/Edge/Firefox support stream method if (typeof file.stream === 'function') { - await this.doUploadWebFileEntryBuffered(resource, file); + await this.doUploadWebFileEntryBuffered(resource, file, reportProgress, token); } // Fallback to unbuffered upload for other browsers else { - await this.doUploadWebFileEntryUnbuffered(resource, file); + await this.doUploadWebFileEntryUnbuffered(resource, file, reportProgress); } return { isFile: true, resource }; @@ -1056,50 +1085,88 @@ export class FileDragAndDrop implements ITreeDragAndDrop { } // Recursive upload files in this directory - const folderTarget = target && target.getChild(entry.name) || undefined; const dirReader = entry.createReader(); - const childEntries = await new Promise((resolve, reject) => { - dirReader.readEntries(resolve, reject); - }); + const childEntries: IWebkitDataTransferItemEntry[] = []; + let done = false; + do { + const childEntriesChunk = await new Promise((resolve, reject) => dirReader.readEntries(resolve, reject)); + if (childEntriesChunk.length > 0) { + childEntries.push(...childEntriesChunk); + } else { + done = true; // an empty array is a signal that all entries have been read + } + } while (!done); + // Update operation total based on new counts + operation.filesTotal += childEntries.length; + + // Upload all entries as files to target + const folderTarget = target && target.getChild(entry.name) || undefined; for (let childEntry of childEntries) { - await this.doUploadWebFileEntry(childEntry, resource, folderTarget, progress, token); + await this.doUploadWebFileEntry(childEntry, resource, folderTarget, progress, operation, token); } return { isFile: false, resource }; } } - private async doUploadWebFileEntryBuffered(resource: URI, file: File): Promise { - const writeableStream = newWriteableBufferStream(); + private async doUploadWebFileEntryBuffered(resource: URI, file: File, progressReporter: (fileSize: number, bytesUploaded: number) => void, token: CancellationToken): Promise { + const writeableStream = newWriteableBufferStream({ + // Set a highWaterMark to prevent the stream + // for file upload to produce large buffers + // in-memory + highWaterMark: 10 + }); + const writeFilePromise = this.fileService.writeFile(resource, writeableStream); // Read the file in chunks using File.stream() web APIs - (async () => { - try { - const reader: ReadableStreamDefaultReader = file.stream().getReader(); + try { + const reader: ReadableStreamDefaultReader = file.stream().getReader(); - let res = await reader.read(); - while (!res.done) { - writeableStream.write(VSBuffer.wrap(res.value)); - - res = await reader.read(); + let res = await reader.read(); + while (!res.done) { + if (token.isCancellationRequested) { + return undefined; } - writeableStream.end(res.value instanceof Uint8Array ? VSBuffer.wrap(res.value) : undefined); - } catch (error) { - writeableStream.end(error); - } - })(); - await this.fileService.writeFile(resource, writeableStream); + // Write buffer into stream but make sure to wait + // in case the highWaterMark is reached + const buffer = VSBuffer.wrap(res.value); + await writeableStream.write(buffer); + + if (token.isCancellationRequested) { + return undefined; + } + + // Report progress + progressReporter(file.size, buffer.byteLength); + + res = await reader.read(); + } + writeableStream.end(res.value instanceof Uint8Array ? VSBuffer.wrap(res.value) : undefined); + } catch (error) { + writeableStream.end(error); + } + + if (token.isCancellationRequested) { + return undefined; + } + + // Wait for file being written to target + await writeFilePromise; } - private doUploadWebFileEntryUnbuffered(resource: URI, file: File): Promise { + private doUploadWebFileEntryUnbuffered(resource: URI, file: File, progressReporter: (fileSize: number, bytesUploaded: number) => void): Promise { return new Promise((resolve, reject) => { const reader = new FileReader(); reader.onload = async event => { try { if (event.target?.result instanceof ArrayBuffer) { - await this.fileService.writeFile(resource, VSBuffer.wrap(new Uint8Array(event.target.result))); + const buffer = VSBuffer.wrap(new Uint8Array(event.target.result)); + await this.fileService.writeFile(resource, buffer); + + // Report progress + progressReporter(file.size, buffer.byteLength); } else { throw new Error('Could not read from dropped file.'); } diff --git a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts index 518bee68b5..ca8e284a6e 100644 --- a/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/browser/views/openEditorsView.ts @@ -22,7 +22,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { WorkbenchList } from 'vs/platform/list/browser/listService'; +import { WorkbenchList, ListResourceNavigator } from 'vs/platform/list/browser/listService'; import { IListVirtualDelegate, IListRenderer, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction } from 'vs/base/browser/ui/list/list'; import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -269,29 +269,21 @@ export class OpenEditorsView extends ViewPane { e.element.group.closeEditor(e.element.editor, { preserveFocus: true }); } })); - this._register(this.list.onDidOpen(e => { - const browserEvent = e.browserEvent; - - let openToSide = false; - let isSingleClick = false; - let isDoubleClick = false; - let isMiddleClick = false; - if (browserEvent instanceof MouseEvent) { - isSingleClick = browserEvent.detail === 1; - isDoubleClick = browserEvent.detail === 2; - isMiddleClick = browserEvent.button === 1; - openToSide = this.list.useAltAsMultipleSelectionModifier ? (browserEvent.ctrlKey || browserEvent.metaKey) : browserEvent.altKey; + const resourceNavigator = this._register(new ListResourceNavigator(this.list, { configurationService: this.configurationService })); + this._register(resourceNavigator.onDidOpen(e => { + if (!e.element) { + return; } - const focused = this.list.getFocusedElements(); - const element = focused.length ? focused[0] : undefined; + const element = this.list.element(e.element); + if (element instanceof OpenEditor) { - if (isMiddleClick) { - return; // already handled above: closes the editor + if (e.browserEvent instanceof MouseEvent && e.browserEvent.button === 1) { + return; // middle click already handled above: closes the editor } - this.openEditor(element, { preserveFocus: isSingleClick, pinned: isDoubleClick, sideBySide: openToSide }); - } else if (element) { + this.openEditor(element, { preserveFocus: e.editorOptions.preserveFocus, pinned: e.editorOptions.pinned, sideBySide: e.sideBySide }); + } else { this.editorGroupService.activateGroup(element); } })); @@ -303,6 +295,11 @@ export class OpenEditorsView extends ViewPane { this.listRefreshScheduler.schedule(0); } })); + + const containerModel = this.viewDescriptorService.getViewContainerModel(this.viewDescriptorService.getViewContainerByViewId(this.id)!)!; + this._register(containerModel.onDidChangeAllViewDescriptors(() => { + this.updateSize(); + })); } getActions(): IAction[] { @@ -362,7 +359,7 @@ export class OpenEditorsView extends ViewPane { return -1; } - 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' }); @@ -446,6 +443,11 @@ export class OpenEditorsView extends ViewPane { } private getMaxExpandedBodySize(): number { + const containerModel = this.viewDescriptorService.getViewContainerModel(this.viewDescriptorService.getViewContainerByViewId(this.id)!)!; + if (containerModel.visibleViewDescriptors.length <= 1) { + return Number.POSITIVE_INFINITY; + } + return this.elementCount * OpenEditorsDelegate.ITEM_HEIGHT; } diff --git a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts index b65fea13a2..7fff2db949 100644 --- a/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts @@ -18,7 +18,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; -import { isEqual } from 'vs/base/common/resources'; +import { extUri } from 'vs/base/common/resources'; import { Event } from 'vs/base/common/event'; import { IEditorViewState } from 'vs/editor/common/editorCommon'; @@ -41,10 +41,11 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements private model: ITextFileEditorModel | undefined = undefined; private cachedTextFileModelReference: IReference | undefined = undefined; - private modelListeners: DisposableStore = this._register(new DisposableStore()); + private readonly modelListeners: DisposableStore = this._register(new DisposableStore()); constructor( resource: URI, + preferredLabel: URI | undefined, preferredEncoding: string | undefined, preferredMode: string | undefined, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -56,7 +57,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements @IEditorService editorService: IEditorService, @IEditorGroupsService editorGroupService: IEditorGroupsService ) { - super(resource, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); + super(resource, preferredLabel, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); this.model = this.textFileService.files.get(resource); @@ -85,7 +86,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements // Once the text file model is created, we keep it inside // the input to be able to implement some methods properly - if (isEqual(model.resource, this.resource)) { + if (extUri.isEqual(model.resource, this.resource)) { this.model = model; this.registerModelListeners(model); @@ -113,6 +114,37 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements })); } + getTypeId(): string { + return FILE_EDITOR_INPUT_ID; + } + + getName(): string { + return this.decorateLabel(super.getName()); + } + + getTitle(verbosity: Verbosity): string { + return this.decorateLabel(super.getTitle(verbosity)); + } + + private decorateLabel(label: string): string { + const orphaned = this.model?.hasState(TextFileEditorModelState.ORPHAN); + const readonly = this.isReadonly(); + + if (orphaned && readonly) { + return localize('orphanedReadonlyFile', "{0} (deleted, read-only)", label); + } + + if (orphaned) { + return localize('orphanedFile', "{0} (deleted)", label); + } + + if (readonly) { + return localize('readonlyFile', "{0} (read-only)", label); + } + + return label; + } + getEncoding(): string | undefined { if (this.model) { return this.model.getEncoding(); @@ -163,37 +195,6 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements this.forceOpenAs = ForceOpenAs.Binary; } - getTypeId(): string { - return FILE_EDITOR_INPUT_ID; - } - - getName(): string { - return this.decorateLabel(super.getName()); - } - - getTitle(verbosity: Verbosity): string { - return this.decorateLabel(super.getTitle(verbosity)); - } - - private decorateLabel(label: string): string { - const orphaned = this.model?.hasState(TextFileEditorModelState.ORPHAN); - const readonly = this.isReadonly(); - - if (orphaned && readonly) { - return localize('orphanedReadonlyFile', "{0} (deleted, read-only)", label); - } - - if (orphaned) { - return localize('orphanedFile', "{0} (deleted)", label); - } - - if (readonly) { - return localize('readonlyFile', "{0} (read-only)", label); - } - - return label; - } - isDirty(): boolean { return !!(this.model?.isDirty()); } @@ -235,9 +236,10 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements } private async doResolveAsText(): Promise { - - // Resolve as text try { + + // Resolve resource via text file service and only allow + // to open binary files if we are instructed so await this.textFileService.files.resolve(this.resource, { mode: this.preferredMode, encoding: this.preferredEncoding, @@ -254,7 +256,16 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements this.cachedTextFileModelReference = await this.textModelResolverService.createModelReference(this.resource) as IReference; } - return this.cachedTextFileModelReference.object; + const model = this.cachedTextFileModelReference.object; + + // It is possible that this input was disposed before the model + // finished resolving. As such, we need to make sure to dispose + // the model reference to not leak it. + if (this.isDisposed()) { + this.disposeModelReference(); + } + + return model; } catch (error) { // In case of an error that indicates that the file is binary or too large, just return with the binary editor model @@ -278,7 +289,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements return !!this.model; } - move(group: GroupIdentifier, target: URI): IMoveResult { + rename(group: GroupIdentifier, target: URI): IMoveResult { return { editor: { resource: target, @@ -292,7 +303,7 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements private getViewStateFor(group: GroupIdentifier): IEditorViewState | undefined { for (const editorPane of this.editorService.visibleEditorPanes) { - if (editorPane.group.id === group && isEqual(editorPane.input.resource, this.resource)) { + if (editorPane.group.id === group && extUri.isEqual(editorPane.input.resource, this.resource)) { if (isTextEditorPane(editorPane)) { return editorPane.getViewState(); } @@ -320,9 +331,13 @@ export class FileEditorInput extends AbstractTextResourceEditorInput implements this.model = undefined; // Model reference - dispose(this.cachedTextFileModelReference); - this.cachedTextFileModelReference = undefined; + this.disposeModelReference(); super.dispose(); } + + private disposeModelReference(): void { + dispose(this.cachedTextFileModelReference); + this.cachedTextFileModelReference = undefined; + } } diff --git a/src/vs/workbench/contrib/files/common/explorerService.ts b/src/vs/workbench/contrib/files/common/explorerService.ts index 18f763fed6..0ea2d5a8a2 100644 --- a/src/vs/workbench/contrib/files/common/explorerService.ts +++ b/src/vs/workbench/contrib/files/common/explorerService.ts @@ -28,7 +28,7 @@ function getFileEventsExcludes(configurationService: IConfigurationService, root } export class ExplorerService implements IExplorerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; 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 @@ -362,7 +362,7 @@ export class ExplorerService implements IExplorerService { } private filterToViewRelevantEvents(e: FileChangesEvent): FileChangesEvent { - return new FileChangesEvent(e.changes.filter(change => { + return e.filter(change => { if (change.type === FileChangeType.UPDATED && this._sortOrder !== SortOrder.Modified) { return false; // we only are about updated if we sort by modified time } @@ -376,7 +376,7 @@ export class ExplorerService implements IExplorerService { } return true; - })); + }); } private async onConfigurationUpdated(configuration: IFilesConfiguration, event?: IConfigurationChangeEvent): Promise { diff --git a/src/vs/workbench/contrib/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts index f4526ff3af..94576a0d11 100644 --- a/src/vs/workbench/contrib/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -39,7 +39,7 @@ export const VIEW_ID = 'workbench.explorer.fileView'; export const DEFAULT_EDITOR_ID = 'default'; export interface IExplorerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly roots: ExplorerItem[]; readonly sortOrder: SortOrder; diff --git a/src/vs/workbench/contrib/files/common/openWith.ts b/src/vs/workbench/contrib/files/common/openWith.ts index dfe649de63..dadb901de8 100644 --- a/src/vs/workbench/contrib/files/common/openWith.ts +++ b/src/vs/workbench/contrib/files/common/openWith.ts @@ -45,7 +45,7 @@ export async function openEditorWith( const overrideToUse = typeof id === 'string' && allEditorOverrides.find(([_, entry]) => entry.id === id); if (overrideToUse) { - return overrideToUse[0].open(input, options, group, OpenEditorContext.NEW_EDITOR, id)?.override; + return overrideToUse[0].open(input, { ...options, override: id }, group, OpenEditorContext.NEW_EDITOR)?.override; } // Prompt @@ -108,7 +108,7 @@ export async function openEditorWith( picker.show(); }); - return pickedItem?.handler.open(input!, options, group, OpenEditorContext.NEW_EDITOR, pickedItem.id)?.override; + return pickedItem?.handler.open(input, { ...options, override: pickedItem.id }, group, OpenEditorContext.NEW_EDITOR)?.override; } export const defaultEditorOverrideEntry = Object.freeze({ @@ -136,7 +136,7 @@ export function getAllAvailableEditors( } const fileEditorInput = editorService.createEditorInput({ resource: input.resource, forceFile: true }); - const textOptions = options ? { ...options, ignoreOverrides: true } : { ignoreOverrides: true }; + const textOptions: IEditorOptions | ITextEditorOptions = options ? { ...options, override: false } : { override: false }; return { override: editorService.openEditor(fileEditorInput, textOptions, group) }; } }, diff --git a/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts b/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts index 8ad433527d..715e5f7d21 100644 --- a/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/electron-sandbox/textFileEditor.ts @@ -23,7 +23,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; /** * An implementation of editor for file system resources. @@ -45,9 +45,9 @@ export class NativeTextFileEditor extends TextFileEditor { @IElectronService private readonly electronService: IElectronService, @IPreferencesService private readonly preferencesService: IPreferencesService, @IExplorerService explorerService: IExplorerService, - @IConfigurationService configurationService: IConfigurationService + @IUriIdentityService uriIdentityService: IUriIdentityService ) { - super(telemetryService, fileService, viewletService, instantiationService, contextService, storageService, textResourceConfigurationService, editorService, themeService, editorGroupService, textFileService, explorerService, configurationService); + super(telemetryService, fileService, viewletService, instantiationService, contextService, storageService, textResourceConfigurationService, editorService, themeService, editorGroupService, textFileService, explorerService, uriIdentityService); } protected handleSetInputError(error: Error, input: FileEditorInput, options: EditorOptions | undefined): void { 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 f2ac8323b7..e004d53846 100644 --- a/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { toResource } from 'vs/base/test/common/utils'; import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; -import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestEditorService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EncodingMode, Verbosity } from 'vs/workbench/common/editor'; import { TextFileOperationError, TextFileOperationResult } from 'vs/workbench/services/textfile/common/textfiles'; @@ -17,20 +17,30 @@ import { timeout } from 'vs/base/common/async'; import { ModesRegistry, PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { DisposableStore } from 'vs/base/common/lifecycle'; import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; +import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; suite('Files - FileEditorInput', () => { let instantiationService: IInstantiationService; let accessor: TestServiceAccessor; setup(() => { - instantiationService = workbenchInstantiationService(); + instantiationService = workbenchInstantiationService({ + editorService: () => { + return new class extends TestEditorService { + createEditorInput(input: IResourceEditorInput) { + return instantiationService.createInstance(FileEditorInput, input.resource, undefined, undefined, undefined); + } + }; + } + }); + accessor = instantiationService.createInstance(TestServiceAccessor); }); test.skip('Basics', async function () { // {{SQL CARBON EDIT}} skip test - let input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined); - const otherInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, 'foo/bar/otherfile.js'), undefined, undefined); - const otherInputSame = instantiationService.createInstance(FileEditorInput, toResource.call(this, 'foo/bar/file.js'), undefined, undefined); + let input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined, undefined); + const otherInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, 'foo/bar/otherfile.js'), undefined, undefined, undefined); + const otherInputSame = instantiationService.createInstance(FileEditorInput, toResource.call(this, 'foo/bar/file.js'), undefined, undefined, undefined); assert(input.matches(input)); assert(input.matches(otherInputSame)); @@ -45,10 +55,10 @@ suite('Files - FileEditorInput', () => { assert.strictEqual(toResource.call(this, '/foo/bar/file.js').fsPath, input.resource.fsPath); assert(input.resource instanceof URI); - input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar.html'), undefined, undefined); + input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar.html'), undefined, undefined, undefined); - const inputToResolve: FileEditorInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined); - const sameOtherInput: FileEditorInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined); + const inputToResolve: FileEditorInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined, undefined); + const sameOtherInput: FileEditorInput = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined, undefined); let resolved = await inputToResolve.resolve(); assert.ok(inputToResolve.isResolved()); @@ -82,13 +92,30 @@ suite('Files - FileEditorInput', () => { } }); + test('label', function () { + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), toResource.call(this, '/foo/bar/UPDATEFILE.js'), undefined, undefined); + + let didChangeLabel = false; + const listener = input.onDidChangeLabel(e => { + didChangeLabel = true; + }); + + assert.equal(input.getName(), 'UPDATEFILE.js'); + + input.setLabel(toResource.call(this, '/FOO/BAR/updateFILE.js')); + assert.equal(input.getName(), 'updateFILE.js'); + assert.equal(didChangeLabel, true); + + listener.dispose(); + }); + test('preferred mode', async function () { const mode = 'file-input-test'; ModesRegistry.registerLanguage({ id: mode, }); - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, mode); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined, mode); assert.equal(input.getPreferredMode(), mode); const model = await input.resolve() as TextFileEditorModel; @@ -98,7 +125,7 @@ suite('Files - FileEditorInput', () => { assert.equal(input.getPreferredMode(), 'text'); assert.equal(model.textEditorModel!.getModeId(), PLAINTEXT_MODE_ID); - const input2 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined); + const input2 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/file.js'), undefined, undefined, undefined); input2.setPreferredMode(mode); const model2 = await input2.resolve() as TextFileEditorModel; @@ -106,10 +133,10 @@ suite('Files - FileEditorInput', () => { }); test('matches', function () { - const input1 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); - const input2 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); - const input3 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/other.js'), undefined, undefined); - const input2Upper = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/UPDATEFILE.js'), undefined, undefined); + const input1 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); + const input2 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); + const input3 = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/other.js'), undefined, undefined, undefined); + const input2Upper = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/UPDATEFILE.js'), undefined, undefined, undefined); assert.strictEqual(input1.matches(null), false); assert.strictEqual(input1.matches(input1), true); @@ -120,7 +147,7 @@ suite('Files - FileEditorInput', () => { }); test('getEncoding/setEncoding', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); input.setEncoding('utf16', EncodingMode.Encode); assert.equal(input.getEncoding(), 'utf16'); @@ -131,7 +158,7 @@ suite('Files - FileEditorInput', () => { }); test('save', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); const resolved = await input.resolve() as TextFileEditorModel; resolved.textEditorModel!.setValue('changed'); @@ -143,7 +170,7 @@ suite('Files - FileEditorInput', () => { }); test('revert', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); const resolved = await input.resolve() as TextFileEditorModel; resolved.textEditorModel!.setValue('changed'); @@ -159,7 +186,7 @@ suite('Files - FileEditorInput', () => { }); test('resolve handles binary files', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); accessor.textFileService.setResolveTextContentErrorOnce(new TextFileOperationError('error', TextFileOperationResult.FILE_IS_BINARY)); @@ -169,7 +196,7 @@ suite('Files - FileEditorInput', () => { }); test('resolve handles too large files', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); accessor.textFileService.setResolveTextContentErrorOnce(new FileOperationError('error', FileOperationResult.FILE_TOO_LARGE)); @@ -179,7 +206,7 @@ suite('Files - FileEditorInput', () => { }); test('attaches to model when created and reports dirty', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); let listenerCount = 0; const listener = input.onDidChangeDirty(() => { @@ -199,7 +226,7 @@ suite('Files - FileEditorInput', () => { }); test('force open text/binary', async function () { - const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined); + const input = instantiationService.createInstance(FileEditorInput, toResource.call(this, '/foo/bar/updatefile.js'), undefined, undefined, undefined); input.setForceOpenAsBinary(); let resolved = await input.resolve(); diff --git a/src/vs/workbench/contrib/files/test/browser/textFileEditor.test.ts b/src/vs/workbench/contrib/files/test/browser/textFileEditor.test.ts index 05e91c6443..370996a79d 100644 --- a/src/vs/workbench/contrib/files/test/browser/textFileEditor.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/textFileEditor.test.ts @@ -6,7 +6,7 @@ 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, TestFilesConfigurationService } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestFilesConfigurationService, TestTextResourceConfigurationService } from 'vs/workbench/test/browser/workbenchTestServices'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; @@ -26,6 +26,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; +import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; suite('Files - TextFileEditor', () => { @@ -54,6 +55,8 @@ suite('Files - TextFileEditor', () => { configurationService.setUserConfiguration('workbench', { editor: { restoreViewState } }); instantiationService.stub(IConfigurationService, configurationService); + instantiationService.stub(ITextResourceConfigurationService, new TestTextResourceConfigurationService(configurationService)); + instantiationService.stub(IFilesConfigurationService, new TestFilesConfigurationService( instantiationService.createInstance(MockContextKeyService), configurationService diff --git a/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts b/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts index 5dab62b224..83d7928ce1 100644 --- a/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/textFileEditorTracker.test.ts @@ -25,7 +25,7 @@ import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; -import { isEqual } from 'vs/base/common/resources'; +import { isEqual, extUri } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -99,7 +99,7 @@ suite('Files - TextFileEditorTracker', () => { await model.save(); // change event (watcher) - accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }])); + accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource, type: FileChangeType.UPDATED }], extUri)); await timeout(0); // due to event updating model async diff --git a/src/vs/workbench/contrib/hover/browser/hover.contribution.ts b/src/vs/workbench/contrib/hover/browser/hover.contribution.ts new file mode 100644 index 0000000000..82a3db9a4c --- /dev/null +++ b/src/vs/workbench/contrib/hover/browser/hover.contribution.ts @@ -0,0 +1,43 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/hover'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { HoverService } from 'vs/workbench/contrib/hover/browser/hoverService'; +import { IHoverService } from 'vs/workbench/contrib/hover/browser/hover'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorHoverBackground, editorHoverBorder, textLinkForeground, editorHoverForeground, editorHoverStatusBarBackground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; + +registerSingleton(IHoverService, HoverService, true); + +registerThemingParticipant((theme, collector) => { + const hoverBackground = theme.getColor(editorHoverBackground); + if (hoverBackground) { + collector.addRule(`.monaco-workbench .workbench-hover { background-color: ${hoverBackground}; }`); + } + const hoverBorder = theme.getColor(editorHoverBorder); + if (hoverBorder) { + collector.addRule(`.monaco-workbench .workbench-hover { border: 1px solid ${hoverBorder}; }`); + collector.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); + collector.addRule(`.monaco-workbench .workbench-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); + } + const link = theme.getColor(textLinkForeground); + if (link) { + collector.addRule(`.monaco-workbench .workbench-hover a { color: ${link}; }`); + } + const hoverForeground = theme.getColor(editorHoverForeground); + if (hoverForeground) { + collector.addRule(`.monaco-workbench .workbench-hover { color: ${hoverForeground}; }`); + } + const actionsBackground = theme.getColor(editorHoverStatusBarBackground); + if (actionsBackground) { + collector.addRule(`.monaco-workbench .workbench-hover .hover-row .actions { background-color: ${actionsBackground}; }`); + } + const codeBackground = theme.getColor(textCodeBlockBackground); + if (codeBackground) { + collector.addRule(`.monaco-workbench .workbench-hover code { background-color: ${codeBackground}; }`); + } +}); diff --git a/src/vs/workbench/contrib/hover/browser/hover.ts b/src/vs/workbench/contrib/hover/browser/hover.ts new file mode 100644 index 0000000000..2fff2317dd --- /dev/null +++ b/src/vs/workbench/contrib/hover/browser/hover.ts @@ -0,0 +1,105 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { IMarkdownString } from 'vs/base/common/htmlContent'; + +export const IHoverService = createDecorator('hoverService'); + +/** + * Enables the convenient display of rich markdown-based hovers in the workbench. + */ +export interface IHoverService { + readonly _serviceBrand: undefined; + + /** + * Shows a hover. + * @param options A set of options defining the characteristics of the hover. + * @param focus Whether to focus the hover (useful for keyboard accessibility). + * + * **Example:** A simple usage with a single element target. + * + * ```typescript + * showHover({ + * text: new MarkdownString('Hello world'), + * target: someElement + * }); + * ``` + */ + showHover(options: IHoverOptions, focus?: boolean): void; + + /** + * Hides the hover if it was visible. + */ + hideHover(): void; +} + +export interface IHoverOptions { + /** + * The text to display in the primary section of the hover. + */ + text: IMarkdownString; + + /** + * The target for the hover. This determines the position of the hover and it will only be + * hidden when the mouse leaves both the hover and the target. A HTMLElement can be used for + * simple cases and a IHoverTarget for more complex cases where multiple elements and/or a + * dispose method is required. + */ + target: IHoverTarget | HTMLElement; + + /** + * A set of actions for the hover's "status bar". + */ + actions?: IHoverAction[]; + + /** + * An optional array of classes to add to the hover element. + */ + additionalClasses?: string[]; + + /** + * An optional link handler for markdown links, if this is not provided the IOpenerService will + * be used to open the links using its default options. + */ + linkHandler?(url: string): void; +} + +export interface IHoverAction { + /** + * The label to use in the hover's status bar. + */ + label: string; + + /** + * The command ID of the action, this is used to resolve the keybinding to display after the + * action label. + */ + commandId: string; + + /** + * An optional class of an icon that will be displayed before the label. + */ + iconClass?: string; + + /** + * The callback to run the action. + * @param target The action element that was activated. + */ + run(target: HTMLElement): void; +} + +/** + * A target for a hover. + */ +export interface IHoverTarget extends IDisposable { + /** + * A set of target elements used to position the hover. If multiple elements are used the hover + * will try to not overlap any target element. An example use case for this is show a hover for + * wrapped text. + */ + readonly targetElements: readonly HTMLElement[]; +} diff --git a/src/vs/workbench/contrib/hover/browser/hoverService.ts b/src/vs/workbench/contrib/hover/browser/hoverService.ts new file mode 100644 index 0000000000..f25c9b56ce --- /dev/null +++ b/src/vs/workbench/contrib/hover/browser/hoverService.ts @@ -0,0 +1,55 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IHoverService, IHoverOptions } from 'vs/workbench/contrib/hover/browser/hover'; +import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { HoverWidget } from 'vs/workbench/contrib/hover/browser/hoverWidget'; +import { IContextViewProvider, IDelegate } from 'vs/base/browser/ui/contextview/contextview'; + +export class HoverService implements IHoverService { + declare readonly _serviceBrand: undefined; + + private _currentHoverOptions: IHoverOptions | undefined; + + constructor( + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IContextViewService private readonly _contextViewService: IContextViewService + ) { + } + + showHover(options: IHoverOptions, focus?: boolean): void { + if (this._currentHoverOptions === options) { + return; + } + this._currentHoverOptions = options; + + const hover = this._instantiationService.createInstance(HoverWidget, options); + const provider = this._contextViewService as IContextViewProvider; + const contextViewDelegate: IDelegate = { + render: container => { + hover.render(container); + hover.onDispose(() => this._currentHoverOptions = undefined); + if (focus) { + hover.focus(); + } + return hover; + }, + anchorPosition: hover.anchor, + getAnchor: () => ({ x: hover.x, y: hover.y }), + layout: () => hover.layout() + }; + provider.showContextView(contextViewDelegate); + hover.onRequestLayout(() => provider.layout()); + } + + hideHover(): void { + if (!this._currentHoverOptions) { + return; + } + this._currentHoverOptions = undefined; + this._contextViewService.hideContextView(); + } +} diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts b/src/vs/workbench/contrib/hover/browser/hoverWidget.ts similarity index 51% rename from src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts rename to src/vs/workbench/contrib/hover/browser/hoverWidget.ts index 977696135d..e14f0a6ce7 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/hoverWidget.ts +++ b/src/vs/workbench/contrib/hover/browser/hoverWidget.ts @@ -4,19 +4,18 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore } from 'vs/base/common/lifecycle'; -import { IMarkdownString } from 'vs/base/common/htmlContent'; import { renderMarkdown } from 'vs/base/browser/markdownRenderer'; import { Event, Emitter } from 'vs/base/common/event'; -import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { editorHoverHighlight, editorHoverBackground, editorHoverBorder, textLinkForeground, editorHoverForeground, editorHoverStatusBarBackground, textCodeBlockBackground } from 'vs/platform/theme/common/colorRegistry'; import * as dom from 'vs/base/browser/dom'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IHoverTarget, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; +import { IHoverTarget, IHoverOptions } from 'vs/workbench/contrib/hover/browser/hover'; import { KeyCode } from 'vs/base/common/keyCodes'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { HoverWidget as BaseHoverWidget, renderHoverAction } from 'vs/base/browser/ui/hover/hoverWidget'; 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'; const $ = dom.$; @@ -25,28 +24,44 @@ export class HoverWidget extends Widget { private readonly _mouseTracker: CompositeMouseTracker; private readonly _hover: BaseHoverWidget; + private readonly _target: IHoverTarget; + private readonly _linkHandler: (url: string) => any; private _isDisposed: boolean = false; + private _anchor: AnchorPosition = AnchorPosition.ABOVE; + private _x: number = 0; + private _y: number = 0; get isDisposed(): boolean { return this._isDisposed; } get domNode(): HTMLElement { return this._hover.containerDomNode; } - private readonly _onDispose = new Emitter(); + private readonly _onDispose = this._register(new Emitter()); get onDispose(): Event { return this._onDispose.event; } + private readonly _onRequestLayout = this._register(new Emitter()); + get onRequestLayout(): Event { return this._onRequestLayout.event; } + + get anchor(): AnchorPosition { return this._anchor; } + get x(): number { return this._x; } + get y(): number { return this._y; } constructor( - private _container: HTMLElement, - private _target: IHoverTarget, - private _text: IMarkdownString, - private _linkHandler: (url: string) => void, - private _actions: { label: string, iconClass?: string, run: (target: HTMLElement) => void, commandId: string }[] | undefined, + options: IHoverOptions, @IKeybindingService private readonly _keybindingService: IKeybindingService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IOpenerService private readonly _openerService: IOpenerService ) { super(); + this._linkHandler = options.linkHandler || this._openerService.open; + + this._target = 'targetElements' in options.target ? options.target : new ElementHoverTarget(options.target); + this._hover = this._register(new BaseHoverWidget()); - this._hover.containerDomNode.classList.add('terminal-hover-widget', 'fadeIn', 'xterm-hover'); + + this._hover.containerDomNode.classList.add('workbench-hover', 'fadeIn'); + if (options.additionalClasses) { + this._hover.containerDomNode.classList.add(...options.additionalClasses); + } // Don't allow mousedown out of the widget, otherwise preventDefault will call and text will // not be selected. @@ -61,7 +76,7 @@ export class HoverWidget extends Widget { const rowElement = $('div.hover-row.markdown-hover'); const contentsElement = $('div.hover-contents'); - const markdownElement = renderMarkdown(this._text, { + const markdownElement = renderMarkdown(options.text, { actionHandler: { callback: (content) => this._linkHandler(content), disposeables: this._messageListeners @@ -72,75 +87,70 @@ export class HoverWidget extends Widget { }, codeBlockRenderCallback: () => { contentsElement.classList.add('code-hover-contents'); - this.layout(); + // This changes the dimensions of the hover so trigger a layout + this._onRequestLayout.fire(); } }); contentsElement.appendChild(markdownElement); rowElement.appendChild(contentsElement); this._hover.contentsDomNode.appendChild(rowElement); - if (this._actions && this._actions.length > 0) { + if (options.actions && options.actions.length > 0) { const statusBarElement = $('div.hover-row.status-bar'); const actionsElement = $('div.actions'); - this._actions.forEach(action => { + options.actions.forEach(action => { const keybinding = this._keybindingService.lookupKeybinding(action.commandId); const keybindingLabel = keybinding ? keybinding.getLabel() : null; - renderHoverAction(actionsElement, action, keybindingLabel); + renderHoverAction(actionsElement, { + label: action.label, + commandId: action.commandId, + run: e => { + action.run(e); + this.dispose(); + }, + iconClass: action.iconClass + }, keybindingLabel); }); statusBarElement.appendChild(actionsElement); this._hover.containerDomNode.appendChild(statusBarElement); } - this._mouseTracker = new CompositeMouseTracker([this._hover.containerDomNode, ..._target.targetElements]); + this._mouseTracker = new CompositeMouseTracker([this._hover.containerDomNode, ...this._target.targetElements]); this._register(this._mouseTracker.onMouseOut(() => this.dispose())); this._register(this._mouseTracker); + } - this._container.appendChild(this._hover.containerDomNode); + public render(container?: HTMLElement): void { + if (this._hover.containerDomNode.parentElement !== container) { + container?.appendChild(this._hover.containerDomNode); + } this.layout(); } - public layout(): void { - const anchor = this._target.anchor; - + public layout() { this._hover.containerDomNode.classList.remove('right-aligned'); this._hover.contentsDomNode.style.maxHeight = ''; - if (anchor.horizontalAnchorSide === HorizontalAnchorSide.Left) { - if (anchor.x + this._hover.containerDomNode.clientWidth > document.documentElement.clientWidth) { - // Shift the hover to the left when part of it would get cut off - const width = Math.round(this._hover.containerDomNode.clientWidth); - this._hover.containerDomNode.style.width = `${width - 1}px`; - this._hover.containerDomNode.style.maxWidth = ''; - const left = document.documentElement.clientWidth - width - 1; - this._hover.containerDomNode.style.left = `${left}px`; - // Right align if the right edge is closer to the anchor than the left edge - if (left + width / 2 < anchor.x) { - this._hover.containerDomNode.classList.add('right-aligned'); - } - } else { - this._hover.containerDomNode.style.width = ''; - this._hover.containerDomNode.style.maxWidth = `${document.documentElement.clientWidth - anchor.x - 1}px`; - this._hover.containerDomNode.style.left = `${anchor.x}px`; - } + + // Get horizontal alignment and position + const targetBounds = this._target.targetElements.map(e => e.getBoundingClientRect()); + const targetLeft = Math.min(...targetBounds.map(e => e.left)); + if (targetLeft + this._hover.containerDomNode.clientWidth >= document.documentElement.clientWidth) { + this._x = document.documentElement.clientWidth; + this._hover.containerDomNode.classList.add('right-aligned'); } else { - this._hover.containerDomNode.style.right = `${anchor.x}px`; + this._x = targetLeft; } - // Use fallback y value if there is not enough vertical space - if (anchor.verticalAnchorSide === VerticalAnchorSide.Bottom) { - if (anchor.y + this._hover.containerDomNode.clientHeight > document.documentElement.clientHeight) { - this._hover.containerDomNode.style.top = `${anchor.fallbackY}px`; - this._hover.contentsDomNode.style.maxHeight = `${document.documentElement.clientHeight - anchor.fallbackY}px`; - } else { - this._hover.containerDomNode.style.bottom = `${anchor.y}px`; - this._hover.containerDomNode.style.maxHeight = ''; - } + + // Get vertical alignment and position + const targetTop = Math.min(...targetBounds.map(e => e.top)); + if (targetTop - this._hover.containerDomNode.clientHeight < 0) { + this._anchor = AnchorPosition.BELOW; + this._y = Math.max(...targetBounds.map(e => e.bottom)) - 2; } else { - if (anchor.y + this._hover.containerDomNode.clientHeight > document.documentElement.clientHeight) { - this._hover.containerDomNode.style.bottom = `${anchor.fallbackY}px`; - } else { - this._hover.containerDomNode.style.top = `${anchor.y}px`; - } + this._y = targetTop; } + this._hover.onContentsChanged(); } @@ -210,37 +220,15 @@ class CompositeMouseTracker extends Widget { } } +class ElementHoverTarget implements IHoverTarget { + readonly targetElements: readonly HTMLElement[]; -registerThemingParticipant((theme, collector) => { - const editorHoverHighlightColor = theme.getColor(editorHoverHighlight); - if (editorHoverHighlightColor) { - collector.addRule(`.integrated-terminal .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); + constructor( + private _element: HTMLElement + ) { + this.targetElements = [this._element]; } - const hoverBackground = theme.getColor(editorHoverBackground); - if (hoverBackground) { - collector.addRule(`.integrated-terminal .monaco-hover { background-color: ${hoverBackground}; }`); + + dispose(): void { } - const hoverBorder = theme.getColor(editorHoverBorder); - if (hoverBorder) { - collector.addRule(`.integrated-terminal .monaco-hover { border: 1px solid ${hoverBorder}; }`); - collector.addRule(`.integrated-terminal .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.integrated-terminal .monaco-hover hr { border-top: 1px solid ${hoverBorder.transparent(0.5)}; }`); - collector.addRule(`.integrated-terminal .monaco-hover hr { border-bottom: 0px solid ${hoverBorder.transparent(0.5)}; }`); - } - const link = theme.getColor(textLinkForeground); - if (link) { - collector.addRule(`.integrated-terminal .monaco-hover a { color: ${link}; }`); - } - const hoverForeground = theme.getColor(editorHoverForeground); - if (hoverForeground) { - collector.addRule(`.integrated-terminal .monaco-hover { color: ${hoverForeground}; }`); - } - const actionsBackground = theme.getColor(editorHoverStatusBarBackground); - if (actionsBackground) { - collector.addRule(`.integrated-terminal .monaco-hover .hover-row .actions { background-color: ${actionsBackground}; }`); - } - const codeBackground = theme.getColor(textCodeBlockBackground); - if (codeBackground) { - collector.addRule(`.integrated-terminal .monaco-hover code { background-color: ${codeBackground}; }`); - } -}); +} diff --git a/src/vs/workbench/contrib/hover/browser/media/hover.css b/src/vs/workbench/contrib/hover/browser/media/hover.css new file mode 100644 index 0000000000..da56678178 --- /dev/null +++ b/src/vs/workbench/contrib/hover/browser/media/hover.css @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-workbench .workbench-hover { + position: relative; + font-size: 14px; + line-height: 19px; + animation: fadein 100ms linear; + /* Must be higher than sash's z-index and terminal canvases */ + z-index: 40; + overflow: hidden; + max-width: 700px; +} + +.monaco-workbench .workbench-hover a { + color: #3794ff; +} + +.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions { + flex-direction: row-reverse; +} + +.monaco-workbench .workbench-hover.right-aligned .hover-row.status-bar .actions .action-container { + margin-right: 0; + margin-left: 16px; +} diff --git a/src/vs/workbench/contrib/issue/browser/issueService.ts b/src/vs/workbench/contrib/issue/browser/issueService.ts index a8b0e402ef..071f662a15 100644 --- a/src/vs/workbench/contrib/issue/browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/browser/issueService.ts @@ -18,12 +18,12 @@ export interface IIssueReporterOptions { } export interface IWebIssueService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; openReporter(options?: IIssueReporterOptions): Promise; } export class WebIssueService implements IWebIssueService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, diff --git a/src/vs/workbench/contrib/issue/electron-browser/issue.ts b/src/vs/workbench/contrib/issue/electron-browser/issue.ts index 41c3e3621a..90168a6eb1 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issue.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issue.ts @@ -9,7 +9,7 @@ import { IssueReporterData } from 'vs/platform/issue/common/issue'; export const IWorkbenchIssueService = createDecorator('workbenchIssueService'); export interface IWorkbenchIssueService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; openReporter(dataOverrides?: Partial): Promise; openProcessExplorer(): Promise; } diff --git a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts index 1fac8010a6..4413622299 100644 --- a/src/vs/workbench/contrib/issue/electron-browser/issueService.ts +++ b/src/vs/workbench/contrib/issue/electron-browser/issueService.ts @@ -18,7 +18,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro import { ExtensionType } from 'vs/platform/extensions/common/extensions'; export class WorkbenchIssueService implements IWorkbenchIssueService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IIssueService private readonly issueService: IIssueService, diff --git a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts index 881a81c838..9f42d698e9 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizations.contribution.ts @@ -68,7 +68,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo [{ label: updateAndRestart ? localize('yes', "Yes") : localize('restart now', "Restart Now"), run: () => { - const updatePromise = updateAndRestart ? this.jsonEditingService.write(this.environmentService.argvResource, [{ key: 'locale', value: locale }], true) : Promise.resolve(undefined); + const updatePromise = updateAndRestart ? this.jsonEditingService.write(this.environmentService.argvResource, [{ path: ['locale'], value: locale }], true) : Promise.resolve(undefined); updatePromise.then(() => this.hostService.restart(), e => this.notificationService.error(e)); } }], diff --git a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts index fb0e5ee9f2..e80187887f 100644 --- a/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts +++ b/src/vs/workbench/contrib/localizations/browser/localizationsActions.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { Action } from 'vs/base/common/actions'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ILocalizationsService, LanguageType } from 'vs/platform/localizations/common/localizations'; +import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; import { IHostService } from 'vs/workbench/services/host/browser/host'; @@ -37,8 +37,7 @@ export class ConfigureLocaleAction extends Action { } private async getLanguageOptions(): Promise { - // Contributed languages are those installed via extension packs, so does not include English - const availableLanguages = ['en', ...await this.localizationService.getLanguageIds(LanguageType.Contributed)]; + const availableLanguages = await this.localizationService.getLanguageIds(); availableLanguages.sort(); return availableLanguages @@ -69,7 +68,7 @@ export class ConfigureLocaleAction extends Action { } if (selectedLanguage) { - await this.jsonEditingService.write(this.environmentService.argvResource, [{ key: 'locale', value: selectedLanguage.label }], true); + await this.jsonEditingService.write(this.environmentService.argvResource, [{ path: ['locale'], value: selectedLanguage.label }], true); const restart = await this.dialogService.confirm({ type: 'info', message: localize('relaunchDisplayLanguageMessage', "A restart is required for the change in display language to take effect."), diff --git a/src/vs/workbench/contrib/markers/browser/markers.ts b/src/vs/workbench/contrib/markers/browser/markers.ts index 176798d2cb..df3e09994f 100644 --- a/src/vs/workbench/contrib/markers/browser/markers.ts +++ b/src/vs/workbench/contrib/markers/browser/markers.ts @@ -19,12 +19,12 @@ import { ResourceMap } from 'vs/base/common/map'; export const IMarkersWorkbenchService = createDecorator('markersWorkbenchService'); export interface IMarkersWorkbenchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly markersModel: MarkersModel; } export class MarkersWorkbenchService extends Disposable implements IMarkersWorkbenchService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly markersModel: MarkersModel; diff --git a/src/vs/workbench/contrib/markers/browser/markersModel.ts b/src/vs/workbench/contrib/markers/browser/markersModel.ts index 18ca8b05da..08106f1d71 100644 --- a/src/vs/workbench/contrib/markers/browser/markersModel.ts +++ b/src/vs/workbench/contrib/markers/browser/markersModel.ts @@ -31,10 +31,6 @@ function compareResourceMarkers(a: ResourceMarkers, b: ResourceMarkers): number return res; } -function compareMarkers(a: Marker, b: Marker): number { - return MarkerSeverity.compare(a.marker.severity, b.marker.severity) - || Range.compareRangesUsingStarts(a.marker, b.marker); -} export class ResourceMarkers { @@ -42,7 +38,8 @@ export class ResourceMarkers { readonly name: string; - private markersMap = new ResourceMap(); + private _markersMap = new ResourceMap(); + private _cachedMarkers: Marker[] | undefined; private _total: number = 0; constructor(readonly id: string, readonly resource: URI) { @@ -51,32 +48,43 @@ export class ResourceMarkers { } get markers(): readonly Marker[] { - return flatten([...this.markersMap.values()]); + if (!this._cachedMarkers) { + this._cachedMarkers = mergeSort(flatten([...this._markersMap.values()]), ResourceMarkers._compareMarkers); + } + return this._cachedMarkers; } has(uri: URI) { - return this.markersMap.has(uri); + return this._markersMap.has(uri); } set(uri: URI, marker: Marker[]) { this.delete(uri); if (isNonEmptyArray(marker)) { - this.markersMap.set(uri, marker); + this._markersMap.set(uri, marker); this._total += marker.length; + this._cachedMarkers = undefined; } } delete(uri: URI) { - let array = this.markersMap.get(uri); + let array = this._markersMap.get(uri); if (array) { this._total -= array.length; - this.markersMap.delete(uri); + this._cachedMarkers = undefined; + this._markersMap.delete(uri); } } get total() { return this._total; } + + private static _compareMarkers(a: Marker, b: Marker): number { + return MarkerSeverity.compare(a.marker.severity, b.marker.severity) + || extUri.compare(a.resource, b.resource) + || Range.compareRangesUsingStarts(a.marker, b.marker); + } } export class Marker { @@ -169,12 +177,12 @@ export class MarkersModel { change.updated.add(resourceMarkers); } const markersCountByKey = new Map(); - const markers = mergeSort(rawMarkers.map((rawMarker) => { + const markers = rawMarkers.map((rawMarker) => { const key = IMarkerData.makeKey(rawMarker); const index = markersCountByKey.get(key) || 0; markersCountByKey.set(key, index + 1); - const markerId = this.id(resourceMarkers!.id, key, index); + const markerId = this.id(resourceMarkers!.id, key, index, rawMarker.resource.toString()); let relatedInformation: RelatedInformation[] | undefined = undefined; if (rawMarker.relatedInformation) { @@ -182,7 +190,7 @@ export class MarkersModel { } return new Marker(markerId, rawMarker, relatedInformation); - }), compareMarkers); + }); this._total -= resourceMarkers.total; resourceMarkers.set(resource, markers); diff --git a/src/vs/workbench/contrib/markers/browser/markersView.ts b/src/vs/workbench/contrib/markers/browser/markersView.ts index d08a03347e..1df344420f 100644 --- a/src/vs/workbench/contrib/markers/browser/markersView.ts +++ b/src/vs/workbench/contrib/markers/browser/markersView.ts @@ -26,7 +26,7 @@ import { IContextKey, IContextKeyService, ContextKeyEqualsExpr, ContextKeyExpr } import { Iterable } from 'vs/base/common/iterator'; import { ITreeElement, ITreeNode, ITreeContextMenuEvent, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { Relay, Event, Emitter } from 'vs/base/common/event'; -import { WorkbenchObjectTree, TreeResourceNavigator, IListService, IWorkbenchObjectTreeOptions } from 'vs/platform/list/browser/listService'; +import { WorkbenchObjectTree, IListService, IWorkbenchObjectTreeOptions } from 'vs/platform/list/browser/listService'; import { FilterOptions } from 'vs/workbench/contrib/markers/browser/markersFilterOptions'; import { IExpression } from 'vs/base/common/glob'; import { deepClone } from 'vs/base/common/objects'; @@ -198,7 +198,8 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { if (this.hasNoProblems() && this.messageBoxContainer) { this.messageBoxContainer.focus(); } else if (this.tree) { - this.tree.getHTMLElement().focus(); + this.tree.domFocus(); + this.setTreeSelection(); } } @@ -295,6 +296,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { private refreshPanel(markerOrChange?: Marker | MarkerChangesEvent): void { if (this.isVisible() && this.tree) { + const hasSelection = this.tree.getSelection().length > 0; this.cachedFilterStats = undefined; if (markerOrChange) { @@ -321,6 +323,20 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { this.tree.toggleVisibility(total === 0 || filtered === 0); this.renderMessage(); this._onDidChangeFilterStats.fire(this.getFilterStats()); + + if (hasSelection) { + this.setTreeSelection(); + } + } + } + + private setTreeSelection(): void { + if (this.tree && this.tree.getSelection().length === 0) { + const firstMarker = this.markersWorkbenchService.markersModel.resourceMarkers[0].markers[0]; + if (firstMarker) { + this.tree.setFocus([firstMarker]); + this.tree.setSelection([firstMarker]); + } } } @@ -424,7 +440,8 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { expandOnlyOnTwistieClick: (e: TreeElement) => e instanceof Marker && e.relatedInformation.length > 0, overrideStyles: { listBackground: this.getBackgroundColor() - } + }, + openOnFocus: true }, )); @@ -437,8 +454,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { relatedInformationFocusContextKey.set(focus.elements.some(e => e instanceof RelatedInformation)); })); - const markersNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true })); - this._register(Event.debounce(markersNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { + 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 }) => { @@ -675,7 +691,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { if (typeof autoReveal === 'boolean' && autoReveal) { let currentActiveResource = this.getResourceForCurrentActiveResource(); if (currentActiveResource) { - if (!this.tree.isCollapsed(currentActiveResource) && this.hasSelectedMarkerFor(currentActiveResource)) { + if (this.tree.hasElement(currentActiveResource) && !this.tree.isCollapsed(currentActiveResource) && this.hasSelectedMarkerFor(currentActiveResource)) { this.tree.reveal(this.tree.getSelection()[0], this.lastSelectedRelativeTop); if (focus) { this.tree.setFocus(this.tree.getSelection()); diff --git a/src/vs/workbench/contrib/markers/browser/markersViewActions.ts b/src/vs/workbench/contrib/markers/browser/markersViewActions.ts index 05cabdefe1..ec7e39d552 100644 --- a/src/vs/workbench/contrib/markers/browser/markersViewActions.ts +++ b/src/vs/workbench/contrib/markers/browser/markersViewActions.ts @@ -16,7 +16,7 @@ import { IThemeService, registerThemingParticipant, ICssStyleCollector, IColorTh import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { toDisposable, Disposable } from 'vs/base/common/lifecycle'; import { BaseActionViewItem, ActionViewItem, ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { badgeBackground, badgeForeground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground } from 'vs/platform/theme/common/colorRegistry'; +import { badgeBackground, badgeForeground, contrastBorder, inputActiveOptionBorder, inputActiveOptionBackground, inputActiveOptionForeground } from 'vs/platform/theme/common/colorRegistry'; import { localize } from 'vs/nls'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ContextScopedHistoryInputBox } from 'vs/platform/browser/contextScopedHistoryWidget'; @@ -514,6 +514,10 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = if (inputActiveOptionBorderColor) { collector.addRule(`.markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-label.markers-filters.checked { border-color: ${inputActiveOptionBorderColor}; }`); } + const inputActiveOptionForegroundColor = theme.getColor(inputActiveOptionForeground); + if (inputActiveOptionForegroundColor) { + collector.addRule(`.markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-label.markers-filters.checked { color: ${inputActiveOptionForegroundColor}; }`); + } const inputActiveOptionBackgroundColor = theme.getColor(inputActiveOptionBackground); if (inputActiveOptionBackgroundColor) { collector.addRule(`.markers-panel-action-filter > .markers-panel-filter-controls > .monaco-action-bar .action-label.markers-filters.checked { background-color: ${inputActiveOptionBackgroundColor}; }`); diff --git a/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts b/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts index add850c001..9ef161b61e 100644 --- a/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts +++ b/src/vs/workbench/contrib/markers/test/browser/markersModel.test.ts @@ -163,6 +163,29 @@ suite('MarkersModel Test', () => { assert.equal(model.total, 2); }); + test('Problems are no sorted correctly #99135', function () { + const model = new TestMarkersModel([]); + assert.equal(model.total, 0); + + const document = URI.parse('foo://test/path/file'); + const frag1 = URI.parse('foo://test/path/file#1'); + const frag2 = URI.parse('foo://test/path/file#2'); + + model.setResourceMarkers([[frag1, [ + { ...aMarker(), resource: frag1 }, + { ...aMarker(undefined, MarkerSeverity.Warning), resource: frag1 }, + ]]]); + + model.setResourceMarkers([[frag2, [ + { ...aMarker(), resource: frag2 } + ]]]); + + assert.equal(model.total, 3); + const markers = model.getResourceMarkers(document)?.markers; + assert.deepEqual(markers?.map(m => m.marker.severity), [MarkerSeverity.Error, MarkerSeverity.Error, MarkerSeverity.Warning]); + assert.deepEqual(markers?.map(m => m.marker.resource.toString()), [frag1.toString(), frag2.toString(), frag1.toString()]); + }); + function compareResource(a: ResourceMarkers, b: string): boolean { return a.resource.toString() === URI.file(b).toString(); } diff --git a/src/vs/workbench/contrib/notebook/browser/constants.ts b/src/vs/workbench/contrib/notebook/browser/constants.ts index bf6f35b9f9..398b772de9 100644 --- a/src/vs/workbench/contrib/notebook/browser/constants.ts +++ b/src/vs/workbench/contrib/notebook/browser/constants.ts @@ -5,14 +5,14 @@ // Scrollable Element -export const SCROLLABLE_ELEMENT_PADDING_TOP = 16; +export const SCROLLABLE_ELEMENT_PADDING_TOP = 20; // Cell sizing related export const CELL_MARGIN = 20; export const CELL_RUN_GUTTER = 32; export const EDITOR_TOOLBAR_HEIGHT = 0; -export const BOTTOM_CELL_TOOLBAR_HEIGHT = 36; +export const BOTTOM_CELL_TOOLBAR_HEIGHT = 32; export const CELL_STATUSBAR_HEIGHT = 22; // Top margin of editor diff --git a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts index 8a94c86536..27bd40f546 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/coreActions.ts @@ -18,7 +18,7 @@ import { InputFocusedContext, InputFocusedContextKey } from 'vs/platform/context import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; -import { BaseCellRenderTemplate, CellEditState, ICellViewModel, INotebookEditor, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_RUNNABLE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_RUNNABLE, NOTEBOOK_IS_ACTIVE_EDITOR } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { BaseCellRenderTemplate, CellEditState, ICellViewModel, INotebookEditor, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_TYPE, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_RUNNABLE, NOTEBOOK_IS_ACTIVE_EDITOR, NOTEBOOK_CELL_HAS_OUTPUTS, CellFocusMode, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, NotebookCellRunState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -30,8 +30,8 @@ const NOTEBOOK_FOCUS_TOP = 'notebook.focusTop'; const NOTEBOOK_FOCUS_BOTTOM = 'notebook.focusBottom'; const NOTEBOOK_REDO = 'notebook.redo'; const NOTEBOOK_UNDO = 'notebook.undo'; -const NOTEBOOK_CURSOR_UP = 'notebook.cursorUp'; -const NOTEBOOK_CURSOR_DOWN = 'notebook.cursorDown'; +const NOTEBOOK_FOCUS_PREVIOUS_EDITOR = 'notebook.focusPreviousEditor'; +const NOTEBOOK_FOCUS_NEXT_EDITOR = 'notebook.focusNextEditor'; const CLEAR_ALL_CELLS_OUTPUTS_COMMAND_ID = 'notebook.clearAllCellsOutputs'; const RENDER_ALL_MARKDOWN_CELLS = 'notebook.renderAllMarkdownCells'; @@ -45,7 +45,6 @@ const CHANGE_CELL_TO_MARKDOWN_COMMAND_ID = 'notebook.cell.changeToMarkdown'; const EDIT_CELL_COMMAND_ID = 'notebook.cell.edit'; const QUIT_EDIT_CELL_COMMAND_ID = 'notebook.cell.quitEdit'; -const SAVE_CELL_COMMAND_ID = 'notebook.cell.save'; const DELETE_CELL_COMMAND_ID = 'notebook.cell.delete'; const MOVE_CELL_UP_COMMAND_ID = 'notebook.cell.moveUp'; @@ -73,6 +72,8 @@ const FOCUS_OUT_OUTPUT_COMMAND_ID = 'notebook.cell.focusOutOutput'; export const NOTEBOOK_ACTIONS_CATEGORY = localize('notebookActions.category', "Notebook"); +export const CELL_TITLE_GROUP_ID = 'inline'; + const EDITOR_WIDGET_ACTION_WEIGHT = KeybindingWeight.EditorContrib; // smaller than Suggest Widget, etc const enum CellToolbarOrder { @@ -84,6 +85,31 @@ const enum CellToolbarOrder { } abstract class NotebookAction extends Action2 { + constructor(desc: IAction2Options) { + if (desc.f1 !== false) { + desc.f1 = false; + const f1Menu = { + id: MenuId.CommandPalette, + when: NOTEBOOK_IS_ACTIVE_EDITOR + }; + + if (!desc.menu) { + desc.menu = []; + } else if (!Array.isArray(desc.menu)) { + desc.menu = [desc.menu]; + } + + desc.menu = [ + ...desc.menu, + f1Menu + ]; + } + + desc.category = NOTEBOOK_ACTIONS_CATEGORY; + + super(desc); + } + async run(accessor: ServicesAccessor, context?: INotebookCellActionContext): Promise { if (!this.isCellActionContext(context)) { context = this.getActiveCellContext(accessor); @@ -125,7 +151,6 @@ registerAction2(class extends NotebookAction { constructor() { super({ id: EXECUTE_CELL_COMMAND_ID, - category: NOTEBOOK_ACTIONS_CATEGORY, title: localize('notebookActions.execute', "Execute Cell"), keybinding: { when: NOTEBOOK_EDITOR_FOCUSED, @@ -135,9 +160,7 @@ registerAction2(class extends NotebookAction { }, weight: EDITOR_WIDGET_ACTION_WEIGHT }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, icon: { id: 'codicon/play' }, - f1: true }); } @@ -151,10 +174,7 @@ registerAction2(class extends NotebookAction { super({ id: CANCEL_CELL_COMMAND_ID, title: localize('notebookActions.cancel', "Stop Cell Execution"), - category: NOTEBOOK_ACTIONS_CATEGORY, icon: { id: 'codicon/primitive-square' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -205,35 +225,36 @@ registerAction2(class extends NotebookAction { super({ id: EXECUTE_CELL_SELECT_BELOW, title: localize('notebookActions.executeAndSelectBelow', "Execute Notebook Cell and Select Below"), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: NOTEBOOK_EDITOR_FOCUSED, primary: KeyMod.Shift | KeyCode.Enter, weight: EDITOR_WIDGET_ACTION_WEIGHT }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - await runCell(context); - const idx = context.notebookEditor.viewModel?.getCellIndex(context.cell); if (typeof idx !== 'number') { return; } + const newFocusMode = context.cell.focusMode === CellFocusMode.Editor ? 'editor' : 'container'; + + const executionP = runCell(context); + // Try to select below, fall back on inserting const nextCell = context.notebookEditor.viewModel?.viewCells[idx + 1]; if (nextCell) { - await context.notebookEditor.focusNotebookCell(nextCell, context.cell.editState === CellEditState.Editing ? 'editor' : 'container'); + context.notebookEditor.focusNotebookCell(nextCell, newFocusMode); } else { const newCell = context.notebookEditor.insertNotebookCell(context.cell, CellKind.Code, 'below'); if (newCell) { - await context.notebookEditor.focusNotebookCell(newCell, 'editor'); + context.notebookEditor.focusNotebookCell(newCell, newFocusMode); } } + + return executionP; } }); @@ -242,23 +263,24 @@ registerAction2(class extends NotebookAction { super({ id: EXECUTE_CELL_INSERT_BELOW, title: localize('notebookActions.executeAndInsertBelow', "Execute Notebook Cell and Insert Below"), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: NOTEBOOK_EDITOR_FOCUSED, primary: KeyMod.Alt | KeyCode.Enter, weight: EDITOR_WIDGET_ACTION_WEIGHT }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - await runCell(context); + const newFocusMode = context.cell.focusMode === CellFocusMode.Editor ? 'editor' : 'container'; + + const executionP = runCell(context); const newCell = context.notebookEditor.insertNotebookCell(context.cell, CellKind.Code, 'below'); if (newCell) { - await context.notebookEditor.focusNotebookCell(newCell, 'editor'); + context.notebookEditor.focusNotebookCell(newCell, newFocusMode); } + + return executionP; } }); @@ -267,9 +289,6 @@ registerAction2(class extends NotebookAction { super({ id: RENDER_ALL_MARKDOWN_CELLS, title: localize('notebookActions.renderMarkdown', "Render All Markdown Cells"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -283,9 +302,6 @@ registerAction2(class extends NotebookAction { super({ id: EXECUTE_NOTEBOOK_COMMAND_ID, title: localize('notebookActions.executeNotebook', "Execute Notebook"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -308,9 +324,6 @@ registerAction2(class extends NotebookAction { super({ id: CANCEL_NOTEBOOK_COMMAND_ID, title: localize('notebookActions.cancelNotebook', "Cancel Notebook Execution"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -319,35 +332,10 @@ registerAction2(class extends NotebookAction { } }); -registerAction2(class extends NotebookAction { - constructor() { - super({ - id: QUIT_EDIT_CELL_COMMAND_ID, - title: localize('notebookActions.quitEditing', "Quit Notebook Cell Editing"), - category: NOTEBOOK_ACTIONS_CATEGORY, - keybinding: { - when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext), - primary: KeyCode.Escape, - weight: EDITOR_WIDGET_ACTION_WEIGHT - 5 - }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - }); - } - - async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - if (context.cell.cellKind === CellKind.Markdown) { - context.cell.editState = CellEditState.Preview; - } - - await context.notebookEditor.focusNotebookCell(context.cell, 'container'); - } -}); - MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: EXECUTE_NOTEBOOK_COMMAND_ID, title: localize('notebookActions.menu.executeNotebook', "Execute Notebook (Run all cells)"), - category: NOTEBOOK_ACTIONS_CATEGORY, icon: { id: 'codicon/run-all' } }, order: -1, @@ -359,7 +347,6 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: CANCEL_NOTEBOOK_COMMAND_ID, title: localize('notebookActions.menu.cancelNotebook', "Stop Notebook Execution"), - category: NOTEBOOK_ACTIONS_CATEGORY, icon: { id: 'codicon/primitive-square' } }, order: -1, @@ -367,19 +354,6 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK) }); - -MenuRegistry.appendMenuItem(MenuId.EditorTitle, { - command: { - id: EXECUTE_CELL_COMMAND_ID, - title: localize('notebookActions.menu.execute', "Execute Notebook Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - icon: { id: 'codicon/run' } - }, - order: 0, - group: 'navigation', - when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_CELL_RUNNABLE) -}); - registerAction2(class extends NotebookAction { constructor() { super({ @@ -390,9 +364,7 @@ registerAction2(class extends NotebookAction { primary: KeyCode.KEY_Y, weight: KeybindingWeight.WorkbenchContrib }, - category: NOTEBOOK_ACTIONS_CATEGORY, precondition: ContextKeyExpr.and(NOTEBOOK_IS_ACTIVE_EDITOR), - f1: true }); } @@ -411,9 +383,6 @@ registerAction2(class extends NotebookAction { primary: KeyCode.KEY_M, weight: KeybindingWeight.WorkbenchContrib }, - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -498,105 +467,76 @@ registerAction2(class extends InsertCellCommand { { id: INSERT_CODE_CELL_ABOVE_COMMAND_ID, title: localize('notebookActions.insertCodeCellAbove', "Insert Code Cell Above"), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.Enter, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }, CellKind.Code, 'above'); } }); -export class InsertCodeCellAction extends MenuItemAction { - constructor( - @IContextKeyService contextKeyService: IContextKeyService, - @ICommandService commandService: ICommandService - ) { - super( - { - id: INSERT_CODE_CELL_BELOW_COMMAND_ID, - title: localize('notebookActions.insertCodeCellBelow', "Insert Code Cell Below") - }, - undefined, - { shouldForwardArgs: true }, - contextKeyService, - commandService); - } -} - registerAction2(class extends InsertCellCommand { constructor() { super( { id: INSERT_CODE_CELL_BELOW_COMMAND_ID, title: localize('notebookActions.insertCodeCellBelow', "Insert Code Cell Below"), - category: NOTEBOOK_ACTIONS_CATEGORY, - icon: { id: 'codicon/add' }, keybinding: { primary: KeyMod.CtrlCmd | KeyCode.Enter, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, }, CellKind.Code, 'below'); } }); +MenuRegistry.appendMenuItem(MenuId.NotebookCellBetween, { + command: { + id: INSERT_CODE_CELL_BELOW_COMMAND_ID, + title: localize('notebookActions.menu.insertCode', "$(add) Code") + }, + order: 0, + group: 'inline' +}); + registerAction2(class extends InsertCellCommand { constructor() { super( { id: INSERT_MARKDOWN_CELL_ABOVE_COMMAND_ID, title: localize('notebookActions.insertMarkdownCellAbove', "Insert Markdown Cell Above"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }, CellKind.Markdown, 'above'); } }); -export class InsertMarkdownCellAction extends MenuItemAction { - constructor( - @IContextKeyService contextKeyService: IContextKeyService, - @ICommandService commandService: ICommandService - ) { - super( - { - id: INSERT_MARKDOWN_CELL_BELOW_COMMAND_ID, - title: localize('notebookActions.insertMarkdownCellBelow', "Insert Markdown Cell Below") - }, - undefined, - { shouldForwardArgs: true }, - contextKeyService, - commandService); - } -} - registerAction2(class extends InsertCellCommand { constructor() { super( { id: INSERT_MARKDOWN_CELL_BELOW_COMMAND_ID, title: localize('notebookActions.insertMarkdownCellBelow', "Insert Markdown Cell Below"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }, CellKind.Markdown, 'below'); } }); +MenuRegistry.appendMenuItem(MenuId.NotebookCellBetween, { + command: { + id: INSERT_MARKDOWN_CELL_BELOW_COMMAND_ID, + title: localize('notebookActions.menu.insertMarkdown', "$(add) Markdown") + }, + order: 1, + group: 'inline' +}); + registerAction2(class extends NotebookAction { constructor() { super( @@ -614,14 +554,15 @@ registerAction2(class extends NotebookAction { NOTEBOOK_CELL_TYPE.isEqualTo('markdown'), NOTEBOOK_CELL_MARKDOWN_EDIT_MODE.toNegated(), NOTEBOOK_CELL_EDITABLE), - order: CellToolbarOrder.EditCell + order: CellToolbarOrder.EditCell, + group: CELL_TITLE_GROUP_ID }, icon: { id: 'codicon/pencil' } }); } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { - context.notebookEditor.editNotebookCell(context.cell); + context.notebookEditor.focusNotebookCell(context.cell, 'editor'); } }); @@ -629,22 +570,36 @@ registerAction2(class extends NotebookAction { constructor() { super( { - id: SAVE_CELL_COMMAND_ID, - title: localize('notebookActions.saveCell', "Save Cell"), + id: QUIT_EDIT_CELL_COMMAND_ID, + title: localize('notebookActions.quitEdit', "Stop Editing Cell"), menu: { id: MenuId.NotebookCellTitle, when: ContextKeyExpr.and( NOTEBOOK_CELL_TYPE.isEqualTo('markdown'), NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_EDITABLE), - order: CellToolbarOrder.SaveCell + order: CellToolbarOrder.SaveCell, + group: CELL_TITLE_GROUP_ID + }, + icon: { id: 'codicon/check' }, + keybinding: { + when: ContextKeyExpr.and( + NOTEBOOK_EDITOR_FOCUSED, + InputFocusedContext, + EditorContextKeys.hoverVisible.toNegated(), + EditorContextKeys.hasNonEmptySelection.toNegated()), + primary: KeyCode.Escape, + weight: EDITOR_WIDGET_ACTION_WEIGHT - 5 }, - icon: { id: 'codicon/check' } }); } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext) { - return context.notebookEditor.saveNotebookCell(context.cell); + if (context.cell.cellKind === CellKind.Markdown) { + context.cell.editState = CellEditState.Preview; + } + + return context.notebookEditor.focusNotebookCell(context.cell, 'container'); } }); @@ -654,11 +609,11 @@ registerAction2(class extends NotebookAction { { id: DELETE_CELL_COMMAND_ID, title: localize('notebookActions.deleteCell', "Delete Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, menu: { id: MenuId.NotebookCellTitle, order: CellToolbarOrder.DeleteCell, - when: NOTEBOOK_EDITOR_EDITABLE + when: NOTEBOOK_EDITOR_EDITABLE, + group: CELL_TITLE_GROUP_ID }, keybinding: { primary: KeyCode.Delete, @@ -669,8 +624,6 @@ registerAction2(class extends NotebookAction { weight: KeybindingWeight.WorkbenchContrib }, icon: { id: 'codicon/trash' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -720,10 +673,7 @@ registerAction2(class extends NotebookAction { { id: MOVE_CELL_UP_COMMAND_ID, title: localize('notebookActions.moveCellUp', "Move Cell Up"), - category: NOTEBOOK_ACTIONS_CATEGORY, icon: { id: 'codicon/arrow-up' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { primary: KeyMod.Alt | KeyCode.UpArrow, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), @@ -743,10 +693,7 @@ registerAction2(class extends NotebookAction { { id: MOVE_CELL_DOWN_COMMAND_ID, title: localize('notebookActions.moveCellDown', "Move Cell Down"), - category: NOTEBOOK_ACTIONS_CATEGORY, icon: { id: 'codicon/arrow-down' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { primary: KeyMod.Alt | KeyCode.DownArrow, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), @@ -766,9 +713,6 @@ registerAction2(class extends NotebookAction { { id: COPY_CELL_COMMAND_ID, title: localize('notebookActions.copy', "Copy Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.KEY_C, @@ -791,9 +735,6 @@ registerAction2(class extends NotebookAction { { id: CUT_CELL_COMMAND_ID, title: localize('notebookActions.cut', "Cut Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.KEY_X, @@ -823,9 +764,6 @@ registerAction2(class extends NotebookAction { { id: PASTE_CELL_ABOVE_COMMAND_ID, title: localize('notebookActions.pasteAbove', "Paste Cell Above"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_V, @@ -858,9 +796,6 @@ registerAction2(class extends NotebookAction { { id: PASTE_CELL_COMMAND_ID, title: localize('notebookActions.paste', "Paste Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.KEY_V, @@ -894,9 +829,6 @@ registerAction2(class extends NotebookAction { { id: COPY_CELL_UP_COMMAND_ID, title: localize('notebookActions.copyCellUp', "Copy Cell Up"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { primary: KeyMod.Alt | KeyMod.Shift | KeyCode.UpArrow, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), @@ -916,9 +848,6 @@ registerAction2(class extends NotebookAction { { id: COPY_CELL_DOWN_COMMAND_ID, title: localize('notebookActions.copyCellDown', "Copy Cell Down"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true, keybinding: { primary: KeyMod.Alt | KeyMod.Shift | KeyCode.DownArrow, when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, InputFocusedContext.toNegated()), @@ -935,14 +864,26 @@ registerAction2(class extends NotebookAction { registerAction2(class extends NotebookAction { constructor() { super({ - id: NOTEBOOK_CURSOR_DOWN, - title: localize('cursorMoveDown', 'Cursor Move Down'), - category: NOTEBOOK_ACTIONS_CATEGORY, - keybinding: { - when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.has(InputFocusedContextKey), EditorContextKeys.editorTextFocus, NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('top'), NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('none')), - primary: KeyCode.DownArrow, - weight: EDITOR_WIDGET_ACTION_WEIGHT - } + id: NOTEBOOK_FOCUS_NEXT_EDITOR, + title: localize('cursorMoveDown', 'Focus Next Cell Editor'), + keybinding: [ + { + when: ContextKeyExpr.and( + NOTEBOOK_EDITOR_FOCUSED, + ContextKeyExpr.has(InputFocusedContextKey), + EditorContextKeys.editorTextFocus, + NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('top'), + NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('none')), + primary: KeyCode.DownArrow, + weight: EDITOR_WIDGET_ACTION_WEIGHT + }, + { + when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_OUTPUT_FOCUSED), + primary: KeyMod.CtrlCmd | KeyCode.DownArrow, + mac: { primary: KeyMod.WinCtrl | KeyMod.CtrlCmd | KeyCode.DownArrow, }, + weight: KeybindingWeight.WorkbenchContrib + } + ] }); } @@ -968,11 +909,15 @@ registerAction2(class extends NotebookAction { registerAction2(class extends NotebookAction { constructor() { super({ - id: NOTEBOOK_CURSOR_UP, - title: localize('cursorMoveUp', 'Cursor Move Up'), - category: NOTEBOOK_ACTIONS_CATEGORY, + id: NOTEBOOK_FOCUS_PREVIOUS_EDITOR, + title: localize('cursorMoveUp', 'Focus Previous Cell Editor'), keybinding: { - when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.has(InputFocusedContextKey), EditorContextKeys.editorTextFocus, NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('bottom'), NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('none')), + when: ContextKeyExpr.and( + NOTEBOOK_EDITOR_FOCUSED, + ContextKeyExpr.has(InputFocusedContextKey), + EditorContextKeys.editorTextFocus, + NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('bottom'), + NOTEBOOK_EDITOR_CURSOR_BOUNDARY.notEqualsTo('none')), primary: KeyCode.UpArrow, weight: EDITOR_WIDGET_ACTION_WEIGHT }, @@ -1008,22 +953,19 @@ registerAction2(class extends NotebookAction { super({ id: FOCUS_IN_OUTPUT_COMMAND_ID, title: localize('focusOutput', 'Focus In Active Cell Output'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { - when: NOTEBOOK_EDITOR_FOCUSED, + when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_CELL_HAS_OUTPUTS), primary: KeyMod.CtrlCmd | KeyCode.DownArrow, mac: { primary: KeyMod.WinCtrl | KeyMod.CtrlCmd | KeyCode.DownArrow, }, weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } async runWithContext(accessor: ServicesAccessor, context: INotebookCellActionContext): Promise { const editor = context.notebookEditor; const activeCell = context.cell; - await editor.focusNotebookCell(activeCell, 'output'); + editor.focusNotebookCell(activeCell, 'output'); } }); @@ -1032,15 +974,12 @@ registerAction2(class extends NotebookAction { super({ id: FOCUS_OUT_OUTPUT_COMMAND_ID, title: localize('focusOutputOut', 'Focus Out Active Cell Output'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: NOTEBOOK_EDITOR_FOCUSED, primary: KeyMod.CtrlCmd | KeyCode.UpArrow, mac: { primary: KeyMod.WinCtrl | KeyMod.CtrlCmd | KeyCode.UpArrow, }, weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1057,7 +996,6 @@ registerAction2(class extends NotebookAction { super({ id: NOTEBOOK_UNDO, title: localize('undo', 'Undo'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.KEY_Z, @@ -1082,7 +1020,6 @@ registerAction2(class extends NotebookAction { super({ id: NOTEBOOK_REDO, title: localize('redo', 'Redo'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_Z, @@ -1101,15 +1038,12 @@ registerAction2(class extends NotebookAction { super({ id: NOTEBOOK_FOCUS_TOP, title: localize('focusFirstCell', 'Focus First Cell'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.Home, mac: { primary: KeyMod.CtrlCmd | KeyCode.UpArrow }, weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1129,15 +1063,12 @@ registerAction2(class extends NotebookAction { super({ id: NOTEBOOK_FOCUS_BOTTOM, title: localize('focusLastCell', 'Focus Last Cell'), - category: NOTEBOOK_ACTIONS_CATEGORY, keybinding: { when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, ContextKeyExpr.not(InputFocusedContextKey)), primary: KeyMod.CtrlCmd | KeyCode.End, mac: { primary: KeyMod.CtrlCmd | KeyCode.DownArrow }, weight: KeybindingWeight.WorkbenchContrib }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1157,15 +1088,13 @@ registerAction2(class extends NotebookAction { super({ id: CLEAR_CELL_OUTPUTS_COMMAND_ID, title: localize('clearActiveCellOutputs', 'Clear Active Cell Outputs'), - category: NOTEBOOK_ACTIONS_CATEGORY, menu: { id: MenuId.NotebookCellTitle, when: ContextKeyExpr.and(NOTEBOOK_CELL_TYPE.isEqualTo('code'), NOTEBOOK_EDITOR_RUNNABLE), - order: CellToolbarOrder.ClearCellOutput + order: CellToolbarOrder.ClearCellOutput, + group: CELL_TITLE_GROUP_ID }, icon: { id: 'codicon/clear-all' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1189,9 +1118,6 @@ export class ChangeCellLanguageAction extends NotebookAction { super({ id: CHANGE_CELL_LANGUAGE, title: localize('changeLanguage', 'Change Cell Language'), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1287,7 +1213,6 @@ registerAction2(class extends NotebookAction { super({ id: CLEAR_ALL_CELLS_OUTPUTS_COMMAND_ID, title: localize('clearAllCellsOutputs', 'Clear All Cells Outputs'), - category: NOTEBOOK_ACTIONS_CATEGORY, menu: { id: MenuId.EditorTitle, when: NOTEBOOK_EDITOR_FOCUSED, @@ -1295,8 +1220,6 @@ registerAction2(class extends NotebookAction { order: 0 }, icon: { id: 'codicon/clear-all' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1325,15 +1248,13 @@ registerAction2(class extends NotebookAction { { id: SPLIT_CELL_COMMAND_ID, title: localize('notebookActions.splitCell', "Split Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, menu: { id: MenuId.NotebookCellTitle, - when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_CELL_TYPE.isEqualTo('code'), NOTEBOOK_EDITOR_EDITABLE, InputFocusedContext), - order: CellToolbarOrder.SplitCell + when: ContextKeyExpr.and(NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_CELL_TYPE.isEqualTo('code'), NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_CELL_EDITABLE, InputFocusedContext), + order: CellToolbarOrder.SplitCell, + group: CELL_TITLE_GROUP_ID }, icon: { id: 'codicon/split-vertical' }, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1356,9 +1277,6 @@ registerAction2(class extends NotebookAction { { id: JOIN_CELL_ABOVE_COMMAND_ID, title: localize('notebookActions.joinCellAbove', "Join with Previous Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1373,9 +1291,6 @@ registerAction2(class extends NotebookAction { { id: JOIN_CELL_BELOW_COMMAND_ID, title: localize('notebookActions.joinCellBelow', "Join with Next Cell"), - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } @@ -1397,9 +1312,6 @@ registerAction2(class extends NotebookAction { }, weight: KeybindingWeight.WorkbenchContrib }, - category: NOTEBOOK_ACTIONS_CATEGORY, - precondition: NOTEBOOK_IS_ACTIVE_EDITOR, - f1: true }); } 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 9e57315644..997015a025 100644 --- a/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts +++ b/src/vs/workbench/contrib/notebook/browser/contrib/find/findController.ts @@ -133,7 +133,7 @@ export class NotebookFindWidget extends SimpleFindReplaceWidget implements INote this._findMatches[cellIndex].cell.editState = CellEditState.Editing; this._notebookEditor.selectElement(this._findMatches[cellIndex].cell); this._notebookEditor.setCellSelection(this._findMatches[cellIndex].cell, this._findMatches[cellIndex].matches[matchIndex].range); - this._notebookEditor.revealRangeInCenterIfOutsideViewport(this._findMatches[cellIndex].cell, this._findMatches[cellIndex].matches[matchIndex].range); + this._notebookEditor.revealRangeInCenterIfOutsideViewportAsync(this._findMatches[cellIndex].cell, this._findMatches[cellIndex].matches[matchIndex].range); } hide() { diff --git a/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts b/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts index db91028db5..6dba27352d 100644 --- a/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts +++ b/src/vs/workbench/contrib/notebook/browser/extensionPoint.ts @@ -7,17 +7,20 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema'; import * as nls from 'vs/nls'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { NotebookSelector } from 'vs/workbench/contrib/notebook/common/notebookProvider'; +import { NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon'; namespace NotebookEditorContribution { export const viewType = 'viewType'; export const displayName = 'displayName'; export const selector = 'selector'; + export const priority = 'priority'; } -interface INotebookEditorContribution { +export interface INotebookEditorContribution { readonly [NotebookEditorContribution.viewType]: string; readonly [NotebookEditorContribution.displayName]: string; readonly [NotebookEditorContribution.selector]?: readonly NotebookSelector[]; + readonly [NotebookEditorContribution.priority]?: string; } namespace NotebookRendererContribution { @@ -32,8 +35,6 @@ interface INotebookRendererContribution { readonly [NotebookRendererContribution.mimeTypes]?: readonly string[]; } - - const notebookProviderContribution: IJSONSchema = { description: nls.localize('contributes.notebook.provider', 'Contributes notebook document provider.'), type: 'array', @@ -70,6 +71,19 @@ const notebookProviderContribution: IJSONSchema = { } } } + }, + [NotebookEditorContribution.priority]: { + type: 'string', + markdownDeprecationMessage: nls.localize('contributes.priority', 'Controls if the custom editor is enabled automatically when the user opens a file. This may be overridden by users using the `workbench.editorAssociations` setting.'), + enum: [ + NotebookEditorPriority.default, + NotebookEditorPriority.option, + ], + markdownEnumDescriptions: [ + nls.localize('contributes.priority.default', 'The editor is automatically used when the user opens a resource, provided that no other default custom editors are registered for that resource.'), + nls.localize('contributes.priority.option', 'The editor is not automatically used when the user opens a resource, but a user can switch to the editor using the `Reopen With` command.'), + ], + default: 'default' } } } diff --git a/src/vs/workbench/contrib/notebook/browser/media/notebook.css b/src/vs/workbench/contrib/notebook/browser/media/notebook.css index 10fb06c197..90e02e980c 100644 --- a/src/vs/workbench/contrib/notebook/browser/media/notebook.css +++ b/src/vs/workbench/contrib/notebook/browser/media/notebook.css @@ -11,46 +11,46 @@ position: relative; } -.cell.markdown { +.monaco-workbench .cell.markdown { user-select: text; -webkit-user-select: text; white-space: initial; } -.notebookOverlay .simple-fr-find-part-wrapper.visible { +.monaco-workbench .notebookOverlay .simple-fr-find-part-wrapper.visible { z-index: 100; } -.notebookOverlay .cell-list-container .overflowingContentWidgets > div { +.monaco-workbench .notebookOverlay .cell-list-container .overflowingContentWidgets > div { z-index: 600 !important; /* @rebornix: larger than the editor title bar */ } -.notebookOverlay .cell-list-container .monaco-list-rows { +.monaco-workbench .notebookOverlay .cell-list-container .monaco-list-rows { min-height: 100%; overflow: visible !important; } -.notebookOverlay .cell-list-container { +.monaco-workbench .notebookOverlay .cell-list-container { position: relative; } -.notebookOverlay.global-drag-active .webview { +.monaco-workbench .notebookOverlay.global-drag-active .webview { pointer-events: none; } -.notebookOverlay .cell-list-container .webview-cover { +.monaco-workbench .notebookOverlay .cell-list-container .webview-cover { position: absolute; top: 0; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row { cursor: default; overflow: visible !important; width: 100%; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image { position: absolute; top: -500px; z-index: 1000; @@ -58,114 +58,128 @@ padding-top: 8px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .notebook-cell-focus-indicator { top: 8px !important; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .notebook-cell-focus-indicator { bottom: 8px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .output { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .output { display: none !important; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image > .monaco-toolbar { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image > .monaco-toolbar { display: none; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-statusbar-container { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-statusbar-container { display: none; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-editor-part { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-editor-part { width: calc(100% - 32px); /* minus left gutter */ } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-editor-container > div > div { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-editor-container > div > div { /* Rendered code content - show a single unwrapped line */ height: 20px; overflow: hidden; white-space: pre-wrap; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .cell.markdown { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image.markdown-cell-row .cell.markdown { white-space: nowrap; overflow: hidden; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell { display: flex; } -.notebookOverlay .notebook-content-widgets { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:not(.selected) .monaco-editor .lines-content .selected-text, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:not(.selected) .monaco-editor .lines-content .selectionHighlight { + opacity: 0.33; +} + +.monaco-workbench .notebookOverlay .notebook-content-widgets { position: absolute; top: 0; left: 0; width: 100%; } -.notebookOverlay .output { - padding-left: 8px; - padding-right: 8px; +.monaco-workbench .notebookOverlay .output { + position: absolute; + height: 0px; + width: 100%; user-select: text; transform: translate3d(0px, 0px, 0px); cursor: auto; box-sizing: border-box; } -.notebookOverlay .output p { +.monaco-workbench .notebookOverlay .output p { white-space: initial; overflow-x: auto; margin: 0px; } -.notebookOverlay .output > div.foreground { +.monaco-workbench .notebookOverlay .output > div.foreground { + width: 100%; + min-height: 24px; + box-sizing: border-box; +} + +.monaco-workbench .notebookOverlay .output > div.foreground > .output-inner-container { + width: 100%; padding: 8px; box-sizing: border-box; } -.notebookOverlay .output > div.foreground .output-stream, -.notebookOverlay .output > div.foreground .output-plaintext { - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; +.monaco-workbench .notebookOverlay .output > div.foreground .output-stream, +.monaco-workbench .notebookOverlay .output > div.foreground .output-plaintext { + font-family: var(--monaco-monospace-font); white-space: pre-wrap; } -.notebookOverlay .cell-drag-image .output .multi-mimetype-output { +.monaco-workbench .notebookOverlay .cell-drag-image .output .multi-mimetype-output { display: none; } -.notebookOverlay .output .multi-mimetype-output { +.monaco-workbench .notebookOverlay .output .multi-mimetype-output { position: absolute; top: 4px; - left: -32px; + left: -26px; width: 16px; height: 16px; cursor: pointer; + padding: 4px; } -.notebookOverlay .output .error_message { +.monaco-workbench .notebookOverlay .output .error_message { color: red; } -.notebookOverlay .output .error > div { +.monaco-workbench .notebookOverlay .output .error > div { white-space: normal; } -.notebookOverlay .output .error pre.traceback { +.monaco-workbench .notebookOverlay .output .error pre.traceback { margin: 8px 0; } -.notebookOverlay .output .error .traceback > span { +.monaco-workbench .notebookOverlay .output .error .traceback > span { display: block; } -.notebookOverlay .output .display img { +.monaco-workbench .notebookOverlay .output .display img { max-width: 100%; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu { position: absolute; left: 0; top: 28px; @@ -176,40 +190,40 @@ } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu.mouseover, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .menu, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .menu { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu.mouseover, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .menu, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .menu { visibility: visible; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover { outline: none !important; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.selected, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.selected, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused { outline: none !important; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu.mouseover, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu:hover { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu.mouseover, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .menu:hover { cursor: pointer; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar { visibility: hidden; display: inline-block; position: absolute; height: 26px; - right: 36px; - top: -14px; + right: 32px; + top: -20px; /* this lines up the bottom toolbar border with the current line when on line 01 */ z-index: 30; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item { width: 24px; height: 24px; display: flex; @@ -217,59 +231,52 @@ margin: 1px 2px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item .action-label { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item .action-label { display: flex; align-items: center; margin: auto; } -.notebookOverlay .cell-statusbar-container { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item .monaco-dropdown { + width: 100%; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row > .monaco-toolbar .action-item .monaco-dropdown .dropdown-label { + display: flex; +} + +.monaco-workbench .notebookOverlay .cell-statusbar-container { height: 21px; font-size: 12px; display: flex; position: relative; } -.notebookOverlay .cell-statusbar-container .cell-status-left { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-status-left { display: flex; flex-grow: 1; } -.notebookOverlay .cell-statusbar-container .cell-status-right { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-status-right { padding-right: 12px; } -.notebookOverlay .cell-statusbar-container .cell-language-picker { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-language-picker { padding: 0px 6px; cursor: pointer; } -.notebookOverlay .cell-statusbar-container .cell-language-picker:hover { - background-color: rgba(255, 255, 255, 0.6); -} - -.notebookOverlay .cell-statusbar-container .cell-language-picker:hover { - background-color: rgba(255, 255, 255, 0.9); -} - -.monaco-workbench.vs-dark .notebookOverlay .cell-statusbar-container .cell-language-picker:hover { - background-color: rgba(255, 255, 255, 0.15); -} - -.monaco-workbench.vs-dark .notebookOverlay .cell-statusbar-container .cell-language-picker:active { - background-color: rgba(255, 255, 255, 0.2); -} - -.notebookOverlay .cell-statusbar-container .cell-run-duration { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-duration { margin-right: 8px; } -.notebookOverlay .cell-statusbar-container .cell-status-message { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-duration, +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-status-message { display: flex; align-items: center; } -.notebookOverlay .cell-statusbar-container .cell-run-status { +.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-status { height: 100%; display: flex; align-items: center; @@ -278,58 +285,49 @@ margin-right: 2px; } -.notebookOverlay .cell-statusbar-container .codicon { +.monaco-workbench .notebookOverlay .cell-statusbar-container .codicon { font-size: 14px; } -.notebookOverlay .cell-statusbar-container .cell-run-status .codicon-check { - color: #89D185; -} - -.monaco-workbench.vs .notebookOverlay .cell-statusbar-container .cell-run-status .codicon-check { - color: #388A34; -} - -.notebookOverlay .cell-status-placeholder { +.monaco-workbench .notebookOverlay .cell-status-placeholder { position: absolute; left: 18px; - color: #ccc9; display: flex; align-items: center; bottom: 0px; top: 0px; } - -.monaco-workbench.vs .notebookOverlay .cell-status-placeholder { - color: #616161e6; -} - -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container { position: relative; height: 22px; flex-shrink: 0; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar { - margin-top: 8px; +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar { + margin-top: 4px; visibility: hidden; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar .codicon { - margin-right: 8px; +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar .codicon { + margin: 0 0 0 2px; /* accounts for 2px indicator on left */ + padding: 4px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .cell.runnable .run-button-container .monaco-toolbar, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused .cell.runnable .run-button-container .monaco-toolbar, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .cell.runnable .run-button-container .monaco-toolbar { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .monaco-toolbar .actions-container { + justify-content: center; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .cell.runnable .run-button-container .monaco-toolbar, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused .cell.runnable .run-button-container .monaco-toolbar, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .cell.runnable .run-button-container .monaco-toolbar { visibility: visible; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .execution-count-label { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell .run-button-container .execution-count-label { position: absolute; top: 2px; font-size: 10px; - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; + font-family: var(--monaco-monospace-font); visibility: visible; white-space: pre; width: 100%; @@ -339,17 +337,17 @@ opacity: .6; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .cell .run-button-container .execution-count-label, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .cell .run-button-container .execution-count-label, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused .cell .run-button-container .execution-count-label { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row:hover .cell .run-button-container .execution-count-label, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-output-hover .cell .run-button-container .execution-count-label, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.focused .cell .run-button-container .execution-count-label { visibility: hidden; } -.notebookOverlay .cell .cell-editor-part { +.monaco-workbench .notebookOverlay .cell .cell-editor-part { position: relative; } -.notebookOverlay .cell .monaco-progress-container { +.monaco-workbench .notebookOverlay .cell .monaco-progress-container { top: -5px; position: absolute; @@ -358,23 +356,23 @@ height: 2px; } -.notebookOverlay .cell .monaco-progress-container .progress-bit { +.monaco-workbench .notebookOverlay .cell .monaco-progress-container .progress-bit { height: 2px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions.focused > .monaco-toolbar, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions.cell-output-hover > .monaco-toolbar, -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions:hover > .monaco-toolbar { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions.focused > .monaco-toolbar, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions.cell-output-hover > .monaco-toolbar, +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-has-toolbar-actions:hover > .monaco-toolbar { visibility: visible; } -.notebookOverlay > .cell-list-container > .monaco-list:not(.element-focused):focus:before { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list:not(.element-focused):focus:before { outline: none !important; } -.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { display: block; content: ' '; position: absolute; @@ -383,31 +381,30 @@ border-left-width: 2px; border-left-style: solid; top: 22px; - bottom: 36px; visibility: hidden; opacity: 0.6; } -.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator:hover { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator:hover { cursor: grab; } -.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator .codicon:hover { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator .codicon:hover { cursor: pointer; } -.notebookOverlay .monaco-list .monaco-list-row:hover .notebook-cell-focus-indicator, -.notebookOverlay .monaco-list .monaco-list-row.cell-output-hover .notebook-cell-focus-indicator, -.notebookOverlay .monaco-list .monaco-list-row.focused .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row:hover .notebook-cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.cell-output-hover .notebook-cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row.focused .notebook-cell-focus-indicator { visibility: visible; } -.notebookOverlay .monaco-list:focus .monaco-list-row .notebook-cell-focus-indicator, -.notebookOverlay .monaco-list:focus-within .monaco-list-row .notebook-cell-focus-indicator { +.monaco-workbench .notebookOverlay .monaco-list:focus .monaco-list-row .notebook-cell-focus-indicator, +.monaco-workbench .notebookOverlay .monaco-list:focus-within .monaco-list-row .notebook-cell-focus-indicator { opacity: 1; } -.notebookOverlay .monaco-list-row.cell-editor-focus .cell-editor-part:before { +.monaco-workbench .notebookOverlay .monaco-list-row .cell-editor-part:before { z-index: 20; content: ""; right: 0px; @@ -420,11 +417,11 @@ pointer-events: none; } -.notebookOverlay .monaco-list .monaco-list-row .cell-insertion-indicator-top { +.monaco-workbench .notebookOverlay .monaco-list .monaco-list-row .cell-insertion-indicator-top { top: -15px; } -.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { +.monaco-workbench .notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { position: absolute; height: 2px; left: 0px; @@ -434,11 +431,11 @@ z-index: 10; } -.notebookOverlay > .cell-list-container > .monaco-list .monaco-list-row.cell-dragging { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list .monaco-list-row.cell-dragging { opacity: 0.5 !important; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container { position: absolute; display: flex; opacity: 0; @@ -447,39 +444,59 @@ padding: 0; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-bottom-toolbar-container { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row.cell-drag-image .cell-bottom-toolbar-container { display: none; } -.notebookOverlay.notebook-editor-editable > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container:focus-within, -.notebookOverlay.notebook-editor-editable > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container:hover { +.monaco-workbench .notebookOverlay.notebook-editor-editable > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container:focus-within, +.monaco-workbench .notebookOverlay.notebook-editor-editable > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container:hover { opacity: 1; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .seperator { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar { + margin: 0px 8px; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-item { + display: flex; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-item.active { + transform: none; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-label { + font-size: 12px; + margin: 0px; + display: inline-flex; + padding: 0px 4px; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-toolbar .action-label .codicon { + margin-right: 3px; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .monaco-action-bar { + display: flex; + align-items: center; +} + +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .separator { height: 1px; flex-grow: 1; align-self: center; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .seperator-short { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .action-item:first-child::after { + content: ' '; + display: block; height: 1px; width: 16px; align-self: center; + margin: 0px 8px; } -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container .button { - display: flex; - margin: 0 8px; - padding: 0 8px; - align-self: center; - align-items: center; - white-space: pre; - cursor: pointer; - font-size: 12px; -} - -.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container span.codicon { +.monaco-workbench .notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element > .monaco-list-rows > .monaco-list-row .cell-bottom-toolbar-container span.codicon { text-align: center; font-size: 14px; color: inherit; @@ -488,34 +505,34 @@ /* markdown */ -.notebookOverlay .cell.markdown img { +.monaco-workbench .notebookOverlay .cell.markdown img { max-width: 100%; max-height: 100%; } -.notebookOverlay .cell.markdown a { +.monaco-workbench .notebookOverlay .cell.markdown a { text-decoration: none; } -.notebookOverlay .cell.markdown a:hover { +.monaco-workbench .notebookOverlay .cell.markdown a:hover { text-decoration: underline; } -.notebookOverlay .cell.markdown a:focus, -.notebookOverlay .cell.markdown input:focus, -.notebookOverlay .cell.markdown select:focus, -.notebookOverlay .cell.markdown textarea:focus { +.monaco-workbench .notebookOverlay .cell.markdown a:focus, +.monaco-workbench .notebookOverlay .cell.markdown input:focus, +.monaco-workbench .notebookOverlay .cell.markdown select:focus, +.monaco-workbench .notebookOverlay .cell.markdown textarea:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; } -.notebookOverlay .cell.markdown hr { +.monaco-workbench .notebookOverlay .cell.markdown hr { border: 0; height: 2px; border-bottom: 2px solid; } -.notebookOverlay .cell.markdown h1 { +.monaco-workbench .notebookOverlay .cell.markdown h1 { padding-bottom: 0.3em; line-height: 1.2; border-bottom-width: 1px; @@ -523,107 +540,96 @@ border-color: rgba(255, 255, 255, 0.18); } -.monaco-workbench.vs .notebookOverlay .cell.markdown h1 { +.monaco-workbench.vs .monaco-workbench .notebookOverlay .cell.markdown h1 { border-color: rgba(0, 0, 0, 0.18); } -.notebookOverlay .cell.markdown h1, -.notebookOverlay .cell.markdown h2, -.notebookOverlay .cell.markdown h3 { +.monaco-workbench .notebookOverlay .cell.markdown h1, +.monaco-workbench .notebookOverlay .cell.markdown h2, +.monaco-workbench .notebookOverlay .cell.markdown h3 { font-weight: normal; } -.notebookOverlay .cell.markdown div { +.monaco-workbench .notebookOverlay .cell.markdown div { width: 100%; } /* Adjust margin of first item in markdown cell */ -.notebookOverlay .cell.markdown div *:first-child { +.monaco-workbench .notebookOverlay .cell.markdown div *:first-child { margin-top: 4px; } /* h1 tags don't need top margin */ -.notebookOverlay .cell.markdown div h1:first-child { +.monaco-workbench .notebookOverlay .cell.markdown div h1:first-child { margin-top: 0; } /* Removes bottom margin when only one item exists in markdown cell */ -.notebookOverlay .cell.markdown div *:only-child, -.notebookOverlay .cell.markdown div *:last-child { +.monaco-workbench .notebookOverlay .cell.markdown div *:only-child, +.monaco-workbench .notebookOverlay .cell.markdown div *:last-child { margin-bottom: 0; } /* makes all markdown cells consistent */ -.notebookOverlay .cell.markdown div { +.monaco-workbench .notebookOverlay .cell.markdown div { min-height: 32px; } -.notebookOverlay .cell.markdown table { +.monaco-workbench .notebookOverlay .cell.markdown table { border-collapse: collapse; border-spacing: 0; } -.notebookOverlay .cell.markdown table th, -.notebookOverlay .cell.markdown table td { +.monaco-workbench .notebookOverlay .cell.markdown table th, +.monaco-workbench .notebookOverlay .cell.markdown table td { border: 1px solid; } -.notebookOverlay .cell.markdown table > thead > tr > th { +.monaco-workbench .notebookOverlay .cell.markdown table > thead > tr > th { text-align: left; border-bottom: 1px solid; } -.notebookOverlay .cell.markdown table > thead > tr > th, -.notebookOverlay .cell.markdown table > thead > tr > td, -.notebookOverlay .cell.markdown table > tbody > tr > th, -.notebookOverlay .cell.markdown table > tbody > tr > td { +.monaco-workbench .notebookOverlay .cell.markdown table > thead > tr > th, +.monaco-workbench .notebookOverlay .cell.markdown table > thead > tr > td, +.monaco-workbench .notebookOverlay .cell.markdown table > tbody > tr > th, +.monaco-workbench .notebookOverlay .cell.markdown table > tbody > tr > td { padding: 5px 10px; } -.notebookOverlay .cell.markdown table > tbody > tr + tr > td { +.monaco-workbench .notebookOverlay .cell.markdown table > tbody > tr + tr > td { border-top: 1px solid; } -.notebookOverlay .cell.markdown blockquote { +.monaco-workbench .notebookOverlay .cell.markdown blockquote { margin: 0 7px 0 5px; padding: 0 16px 0 10px; border-left-width: 5px; border-left-style: solid; } -.notebookOverlay .cell.markdown code { - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; +.monaco-workbench .notebookOverlay .cell.markdown code, +.monaco-workbench .notebookOverlay .cell.markdown .code { + font-family: var(--monaco-monospace-font); font-size: 1em; line-height: 1.357em; } -.notebookOverlay .cell.markdown body.wordWrap pre { +.monaco-workbench .notebookOverlay .cell.markdown .code { white-space: pre-wrap; } -.notebookOverlay .cell.markdown pre:not(.hljs), -.notebookOverlay .cell.markdown pre.hljs code > div { - padding: 16px; - border-radius: 3px; - overflow: auto; -} - -.notebookOverlay .cell.markdown pre code { - color: var(--vscode-editor-foreground); - tab-size: 4; -} - -.notebookOverlay .cell.markdown .latex-block { +.monaco-workbench .notebookOverlay .cell.markdown .latex-block { display: block; } -.notebookOverlay .cell.markdown .latex { +.monaco-workbench .notebookOverlay .cell.markdown .latex { vertical-align: middle; display: inline-block; } -.notebookOverlay .cell.markdown .latex img, -.notebookOverlay .cell.markdown .latex-block img { +.monaco-workbench .notebookOverlay .cell.markdown .latex img, +.monaco-workbench .notebookOverlay .cell.markdown .latex-block img { filter: brightness(0) invert(0) } @@ -632,50 +638,53 @@ filter: brightness(0) invert(1) } -.notebookOverlay > .cell-list-container .notebook-folding-indicator { +.monaco-workbench .notebookOverlay > .cell-list-container .notebook-folding-indicator { position: absolute; - top: 8px; - left: 6px; + top: 4px; + left: 0px; + right: 0; } -.notebookOverlay > .cell-list-container .notebook-folding-indicator .codicon { +.monaco-workbench .notebookOverlay > .cell-list-container .notebook-folding-indicator .codicon { visibility: visible; + padding: 4px; + width: calc(100% - 8px); } /** Theming */ -/* .notebookOverlay .cell.markdown pre { +/* .monaco-workbench .notebookOverlay .cell.markdown pre { background-color: rgba(220, 220, 220, 0.4); } -.monaco-workbench.vs-dark .notebookOverlay .cell.markdown pre { +.monaco-workbench.vs-dark .monaco-workbench .notebookOverlay .cell.markdown pre { background-color: rgba(10, 10, 10, 0.4); } -.monaco-workbench.hc-black .notebookOverlay .cell.markdown pre { +.monaco-workbench.hc-black .monaco-workbench .notebookOverlay .cell.markdown pre { background-color: rgb(0, 0, 0); } -.monaco-workbench.hc-black .notebookOverlay .cell.markdown h1 { +.monaco-workbench.hc-black .monaco-workbench .notebookOverlay .cell.markdown h1 { border-color: rgb(0, 0, 0); } -.notebookOverlay .cell.markdown table > thead > tr > th { +.monaco-workbench .notebookOverlay .cell.markdown table > thead > tr > th { border-color: rgba(0, 0, 0, 0.18); } -.monaco-workbench.vs-dark .notebookOverlay .cell.markdown table > thead > tr > th { +.monaco-workbench.vs-dark .monaco-workbench .notebookOverlay .cell.markdown table > thead > tr > th { border-color: rgba(255, 255, 255, 0.18); } -.notebookOverlay .cell.markdown h1, -.notebookOverlay .cell.markdown hr, -.notebookOverlay .cell.markdown table > tbody > tr > td { +.monaco-workbench .notebookOverlay .cell.markdown h1, +.monaco-workbench .notebookOverlay .cell.markdown hr, +.monaco-workbench .notebookOverlay .cell.markdown table > tbody > tr > td { border-color: rgba(0, 0, 0, 0.18); } -.monaco-workbench.vs-dark .notebookOverlay .cell.markdown h1, -.monaco-workbench.vs-dark .notebookOverlay .cell.markdown hr, -.monaco-workbench.vs-dark .notebookOverlay .cell.markdown table > tbody > tr > td { +.monaco-workbench.vs-dark .monaco-workbench .notebookOverlay .cell.markdown h1, +.monaco-workbench.vs-dark .monaco-workbench .notebookOverlay .cell.markdown hr, +.monaco-workbench.vs-dark .monaco-workbench .notebookOverlay .cell.markdown table > tbody > tr > td { border-color: rgba(255, 255, 255, 0.18); } */ diff --git a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts index cedbd1cce5..82bde5bfb2 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebook.contribution.ts @@ -3,10 +3,11 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { coalesce, distinct } from 'vs/base/common/arrays'; +import { Schemas } from 'vs/base/common/network'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { ResourceMap } from 'vs/base/common/map'; import { parse } from 'vs/base/common/marshalling'; -import { basename, isEqual } from 'vs/base/common/resources'; +import { isEqual } from 'vs/base/common/resources'; import { assertType } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ITextModel, ITextBufferFactory, DefaultEndOfLine, ITextBuffer } from 'vs/editor/common/model'; @@ -15,7 +16,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelContentProvider, ITextModelService } from 'vs/editor/common/services/resolverService'; import * as nls from 'vs/nls'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { IEditorOptions, ITextEditorOptions, IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -24,22 +25,22 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { EditorDescriptor, Extensions as EditorExtensions, IEditorRegistry } from 'vs/workbench/browser/editor'; import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { EditorInput, Extensions as EditorInputExtensions, IEditorInput, IEditorInputFactory, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; +import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { NotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookEditor'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { NotebookService } from 'vs/workbench/contrib/notebook/browser/notebookServiceImpl'; -import { CellKind, CellUri } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, CellUri, NotebookDocumentBackupData, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; -import { IEditorGroup, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, IOpenEditorOverride } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { CustomEditorsAssociations, customEditorsAssociationsSettingId } from 'vs/workbench/services/editor/common/editorAssociationsSetting'; -import { coalesce, distinct } from 'vs/base/common/arrays'; import { CustomEditorInfo } from 'vs/workbench/contrib/customEditor/common/customEditor'; import { NotebookEditorOptions } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { INotebookEditorModelResolverService, NotebookModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; // Editor Contribution @@ -70,42 +71,66 @@ Registry.as(EditorExtensions.Editors).registerEditor( ] ); +class NotebookEditorFactory implements IEditorInputFactory { + canSerialize(): boolean { + return true; + } + serialize(input: EditorInput): string { + assertType(input instanceof NotebookEditorInput); + return JSON.stringify({ + resource: input.resource, + name: input.name, + viewType: input.viewType, + }); + } + deserialize(instantiationService: IInstantiationService, raw: string) { + type Data = { resource: URI, name: string, viewType: string, group: number }; + const data = parse(raw); + if (!data) { + return undefined; + } + const { resource, name, viewType } = data; + if (!data || !URI.isUri(resource) || typeof name !== 'string' || typeof viewType !== 'string') { + return undefined; + } + + const input = NotebookEditorInput.create(instantiationService, resource, name, viewType); + return input; + } + + static async createCustomEditorInput(resource: URI, instantiationService: IInstantiationService): Promise { + return instantiationService.invokeFunction(async accessor => { + const backupFileService = accessor.get(IBackupFileService); + + const backup = await backupFileService.resolve(resource); + if (!backup?.meta) { + throw new Error(`No backup found for Notebook editor: ${resource}`); + } + + const input = NotebookEditorInput.create(instantiationService, resource, backup.meta.name, backup.meta.viewType, { startDirty: true }); + return input; + }); + } + + static canResolveBackup(editorInput: IEditorInput, backupResource: URI): boolean { + if (editorInput instanceof NotebookEditorInput) { + if (isEqual(editorInput.resource.with({ scheme: Schemas.vscodeNotebook }), backupResource)) { + return true; + } + } + + return false; + } +} + Registry.as(EditorInputExtensions.EditorInputFactories).registerEditorInputFactory( NotebookEditorInput.ID, - class implements IEditorInputFactory { - canSerialize(): boolean { - return true; - } - serialize(input: EditorInput): string { - assertType(input instanceof NotebookEditorInput); - return JSON.stringify({ - resource: input.resource, - name: input.name, - viewType: input.viewType, - group: input.group - }); - } - deserialize(instantiationService: IInstantiationService, raw: string) { - type Data = { resource: URI, name: string, viewType: string, group: number }; - const data = parse(raw); - if (!data) { - return undefined; - } - const { resource, name, viewType } = data; - if (!data || !URI.isUri(resource) || typeof name !== 'string' || typeof viewType !== 'string') { - return undefined; - } + NotebookEditorFactory +); - // if we have two editors open with the same resource (in different editor groups), we should then create two different - // editor inputs, instead of `getOrCreate`. - const input = NotebookEditorInput.create(instantiationService, resource, name, viewType); - if (typeof data.group === 'number') { - input.updateGroup(data.group); - } - - return input; - } - } +Registry.as(EditorInputExtensions.EditorInputFactories).registerCustomEditorInputFactory( + Schemas.vscodeNotebook, + NotebookEditorFactory ); function getFirstNotebookInfo(notebookService: INotebookService, uri: URI): NotebookProviderInfo | undefined { @@ -113,14 +138,13 @@ function getFirstNotebookInfo(notebookService: INotebookService, uri: URI): Note } export class NotebookContribution extends Disposable implements IWorkbenchContribution { - private _resourceMapping = new ResourceMap(); constructor( @IEditorService private readonly editorService: IEditorService, @INotebookService private readonly notebookService: INotebookService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IUndoRedoService undoRedoService: IUndoRedoService + @IUndoRedoService undoRedoService: IUndoRedoService, ) { super(); @@ -135,19 +159,13 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri return null; } - return data.notebook.scheme + ':' + data.notebook.fsPath; - - // const documentUri = this._resourceMapping.get(data.notebook)?.resource; - // if (documentUri) { - // return documentUri.toString(); - // } - - // return null; + return data.notebook.toString(); } })); this._register(this.editorService.overrideOpenEditor({ getEditorOverrides: (resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) => { + const currentEditorForResource = group?.editors.find(editor => isEqual(editor.resource, resource)); const associatedEditors = distinct([ @@ -164,13 +182,16 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri }; }); }, - open: (editor, options, group, context, id) => this.onEditorOpening(editor, options, group, context, id) + open: (editor, options, group) => { + return this.onEditorOpening2(editor, options, group); + } })); this._register(this.editorService.onDidVisibleEditorsChange(() => { const visibleNotebookEditors = editorService.visibleEditorPanes .filter(pane => (pane as any).isNotebookEditor) .map(pane => pane.getControl() as INotebookEditor) + .filter(control => !!control) .map(editor => editor.getId()); this.notebookService.updateVisibleNotebookEditor(visibleNotebookEditors); @@ -185,22 +206,6 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri this.notebookService.updateActiveNotebookEditor(null); } })); - - this._register(this.editorService.onDidCloseEditor(({ editor }) => { - if (!(editor instanceof NotebookEditorInput)) { - return; - } - - if (!this.editorService.editors.some(other => ( - other.resource === editor.resource - && other instanceof NotebookEditorInput - && other.viewType === editor.viewType - ))) { - editor.clearTextModel(); - } - - editor.dispose(); - })); } getUserAssociatedEditors(resource: URI) { @@ -222,116 +227,82 @@ export class NotebookContribution extends Disposable implements IWorkbenchContri return this.notebookService.getContributedNotebookProviders(resource); } - private onEditorOpening(originalInput: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext, id: string | undefined): IOpenEditorOverride | undefined { - if (originalInput instanceof NotebookEditorInput) { - if ((originalInput.group === group.id || originalInput.group === undefined) && (originalInput.viewType === id || typeof id !== 'string')) { - // No need to do anything - originalInput.updateGroup(group.id); - return { - override: this.editorService.openEditor(originalInput, new NotebookEditorOptions(options || {}).with({ ignoreOverrides: true }), group) - }; - } else { - // Create a copy of the input. - // Unlike normal editor inputs, we do not want to share custom editor inputs - // between multiple editors / groups. - const copiedInput = this.instantiationService.createInstance(NotebookEditorInput, originalInput.resource, originalInput.name, originalInput.viewType); - copiedInput.updateGroup(group.id); + private onEditorOpening2(originalInput: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup): IOpenEditorOverride | undefined { - if (context === OpenEditorContext.MOVE_EDITOR) { - // transfer ownership of editor widget - const widgetRef = NotebookRegistry.getNotebookEditorWidget(originalInput); - if (widgetRef) { - NotebookRegistry.releaseNotebookEditorWidget(originalInput); - NotebookRegistry.claimNotebookEditorWidget(copiedInput, widgetRef); - } - } - - return { - override: this.editorService.openEditor(copiedInput, new NotebookEditorOptions(options || {}).with({ ignoreOverrides: true }), group) - }; - } - } - - let resource = originalInput.resource; - if (!resource) { + const id = typeof options?.override === 'string' ? options.override : undefined; + if (id === undefined && originalInput.isUntitled()) { return undefined; } + if (!originalInput.resource) { + return undefined; + } + + if (originalInput instanceof NotebookEditorInput) { + return undefined; + } + + let notebookUri: URI = originalInput.resource; + let cellOptions: IResourceEditorInput | undefined; + + const data = CellUri.parse(originalInput.resource); + if (data) { + notebookUri = data.notebook; + cellOptions = { resource: originalInput.resource, options }; + } + if (id === undefined) { - const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, resource) && !(editor instanceof NotebookEditorInput)); + const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, notebookUri) && !(editor instanceof NotebookEditorInput)); if (existingEditors.length) { return undefined; } - const userAssociatedEditors = this.getUserAssociatedEditors(resource); + const userAssociatedEditors = this.getUserAssociatedEditors(notebookUri); const notebookEditor = userAssociatedEditors.filter(association => this.notebookService.getContributedNotebookProvider(association.viewType)); if (userAssociatedEditors.length && !notebookEditor.length) { // user pick a non-notebook editor for this resource return undefined; } - } else { - const existingEditors = group.editors.filter(editor => editor.resource && isEqual(editor.resource, resource) && (editor instanceof NotebookEditorInput) && editor.viewType === id); - if (existingEditors.length) { - // switch to this cell - return { override: this.editorService.openEditor(existingEditors[0], new NotebookEditorOptions(options || {}).with({ ignoreOverrides: true }), group) }; + // user might pick a notebook editor + + const associatedEditors = distinct([ + ...this.getUserAssociatedNotebookEditors(notebookUri), + ...(this.getContributedEditors(notebookUri).filter(editor => editor.priority === NotebookEditorPriority.default)) + ], editor => editor.id); + + if (!associatedEditors.length) { + // there is no notebook editor contribution which is enabled by default + return undefined; } } - if (this._resourceMapping.has(resource)) { - const input = this._resourceMapping.get(resource); + const infos = this.notebookService.getContributedNotebookProviders(notebookUri); + let info = infos.find(info => !id || info.id === id); - if (!input!.isDisposed()) { - input?.updateGroup(group.id); - return { override: this.editorService.openEditor(input!, new NotebookEditorOptions(options || {}).with({ ignoreOverrides: true }), group) }; - } else { - this._resourceMapping.delete(resource); - } + if (!info && id !== undefined) { + info = this.notebookService.getContributedNotebookProvider(id); } - let info: NotebookProviderInfo | undefined; - const data = CellUri.parse(resource); - if (data) { - const infos = this.getContributedEditors(data.notebook); - - if (infos.length) { - const info = id === undefined ? infos[0] : (infos.find(info => info.id === id) || infos[0]); - // cell-uri -> open (container) notebook - const name = basename(data.notebook); - let input = this._resourceMapping.get(data.notebook); - if (!input || input.isDisposed()) { - input = NotebookEditorInput.create(this.instantiationService, data.notebook, name, info.id); - this._resourceMapping.set(data.notebook, input); - } - - input.updateGroup(group.id); - return { override: this.editorService.openEditor(input, new NotebookEditorOptions({ ...options, forceReload: true, cellOptions: { resource, options } }), group) }; - } - } - - const infos = this.notebookService.getContributedNotebookProviders(resource); - info = id === undefined ? infos[0] : infos.find(info => info.id === id); - if (!info) { return undefined; } - const input = NotebookEditorInput.create(this.instantiationService, resource, originalInput.getName(), info.id); - input.updateGroup(group.id); - this._resourceMapping.set(resource, input); /** * Scenario: we are reopening a file editor input which is pinned, we should open in a new editor tab. */ let index = undefined; - if (group.activeEditor === originalInput && isEqual(originalInput.resource, resource)) { + if (group.activeEditor === originalInput && isEqual(originalInput.resource, notebookUri)) { const originalEditorIndex = group.getIndexOfEditor(originalInput); index = group.isPinned(originalInput) ? originalEditorIndex + 1 : originalEditorIndex; } - return { override: this.editorService.openEditor(input, new NotebookEditorOptions(options || {}).with({ ignoreOverrides: true, index }), group) }; + const notebookInput = NotebookEditorInput.create(this.instantiationService, notebookUri, originalInput.getName(), info.id); + const notebookOptions = new NotebookEditorOptions({ ...options, cellOptions, override: false, index }); + return { override: this.editorService.openEditor(notebookInput, notebookOptions, group) }; } } @@ -344,6 +315,7 @@ class CellContentProvider implements ITextModelContentProvider { @IModelService private readonly _modelService: IModelService, @IModeService private readonly _modeService: IModeService, @INotebookService private readonly _notebookService: INotebookService, + @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, ) { this._registration = textModelService.registerTextModelContentProvider(CellUri.scheme, this); } @@ -367,12 +339,10 @@ class CellContentProvider implements ITextModelContentProvider { return null; } - const editorModel = this._notebookService.modelManager.get(data.notebook); - if (!editorModel) { - return null; - } + const ref = await this._notebookModelResolverService.resolve(data.notebook, info.id); + let result: ITextModel | null = null; - for (let cell of editorModel.notebook.cells) { + for (let cell of ref.object.notebook.cells) { if (cell.uri.toString() === resource.toString()) { const bufferFactory: ITextBufferFactory = { create: (defaultEOL) => { @@ -385,15 +355,23 @@ class CellContentProvider implements ITextModelContentProvider { } }; const language = cell.cellKind === CellKind.Markdown ? this._modeService.create('markdown') : (cell.language ? this._modeService.create(cell.language) : this._modeService.createByFilepathOrFirstLine(resource, cell.textBuffer.getLineContent(1))); - return this._modelService.createModel( + result = this._modelService.createModel( bufferFactory, language, resource ); + break; } } - return null; + if (result) { + const once = result.onWillDispose(() => { + once.dispose(); + ref.dispose(); + }); + } + + return result; } } @@ -402,6 +380,7 @@ workbenchContributionsRegistry.registerWorkbenchContribution(NotebookContributio workbenchContributionsRegistry.registerWorkbenchContribution(CellContentProvider, LifecyclePhase.Starting); registerSingleton(INotebookService, NotebookService); +registerSingleton(INotebookEditorModelResolverService, NotebookModelResolverService, true); const configurationRegistry = Registry.as(Extensions.Configuration); configurationRegistry.registerConfiguration({ diff --git a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts index 6a38702042..7cc22aa2e7 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookBrowser.ts @@ -34,6 +34,7 @@ export const NOTEBOOK_IS_ACTIVE_EDITOR = ContextKeyExpr.equals('activeEditor', ' // Editor keys export const NOTEBOOK_EDITOR_FOCUSED = new RawContextKey('notebookEditorFocused', false); +export const NOTEBOOK_OUTPUT_FOCUSED = new RawContextKey('notebookOutputFocused', false); export const NOTEBOOK_EDITOR_EDITABLE = new RawContextKey('notebookEditable', true); export const NOTEBOOK_EDITOR_RUNNABLE = new RawContextKey('notebookRunnable', true); export const NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK = new RawContextKey('notebookExecuting', false); @@ -94,7 +95,6 @@ export interface MarkdownCellLayoutChangeEvent { font?: BareFontInfo; outerWidth?: number; totalHeight?: number; - editorHeight?: boolean; } export interface ICellViewModel { @@ -110,6 +110,7 @@ export interface ICellViewModel { currentTokenSource: CancellationTokenSource | undefined; focusMode: CellFocusMode; getText(): string; + getTextLength(): number; metadata: NotebookCellMetadata | undefined; textModel: ITextModel | undefined; hasModel(): this is IEditableCellViewModel; @@ -159,6 +160,8 @@ export interface INotebookEditor extends IEditor { activeKernel: INotebookKernelInfo | undefined; readonly onDidChangeKernel: Event; + isDisposed: boolean; + getId(): string; getDomNode(): HTMLElement; getInnerWebview(): Webview | undefined; @@ -219,19 +222,6 @@ export interface INotebookEditor extends IEditor { */ moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise; - /** - * Switch the cell into editing mode. - * - * For code cell, the monaco editor will be focused. - * For markdown cell, it will switch from preview mode to editing mode, which focuses the monaco editor. - */ - editNotebookCell(cell: ICellViewModel): void; - - /** - * Quit cell editing mode. - */ - saveNotebookCell(cell: ICellViewModel): void; - /** * Focus the container of a cell (the monaco editor inside is not focused). */ @@ -305,32 +295,32 @@ export interface INotebookEditor extends IEditor { /** * Reveal a line in notebook cell into viewport with minimal scrolling. */ - revealLineInView(cell: ICellViewModel, line: number): void; + revealLineInViewAsync(cell: ICellViewModel, line: number): Promise; /** * Reveal a line in notebook cell into viewport center. */ - revealLineInCenter(cell: ICellViewModel, line: number): void; + revealLineInCenterAsync(cell: ICellViewModel, line: number): Promise; /** * Reveal a line in notebook cell into viewport center. */ - revealLineInCenterIfOutsideViewport(cell: ICellViewModel, line: number): void; + revealLineInCenterIfOutsideViewportAsync(cell: ICellViewModel, line: number): Promise; /** * Reveal a range in notebook cell into viewport with minimal scrolling. */ - revealRangeInView(cell: ICellViewModel, range: Range): void; + revealRangeInViewAsync(cell: ICellViewModel, range: Range): Promise; /** * Reveal a range in notebook cell into viewport center. */ - revealRangeInCenter(cell: ICellViewModel, range: Range): void; + revealRangeInCenterAsync(cell: ICellViewModel, range: Range): Promise; /** * Reveal a range in notebook cell into viewport center. */ - revealRangeInCenterIfOutsideViewport(cell: ICellViewModel, range: Range): void; + revealRangeInCenterIfOutsideViewportAsync(cell: ICellViewModel, range: Range): Promise; /** * Set hidden areas on cell text models. @@ -391,12 +381,12 @@ export interface INotebookCellList { revealElementInView(element: ICellViewModel): void; revealElementInCenterIfOutsideViewport(element: ICellViewModel): void; revealElementInCenter(element: ICellViewModel): void; - revealElementLineInView(element: ICellViewModel, line: number): void; - revealElementLineInCenter(element: ICellViewModel, line: number): void; - revealElementLineInCenterIfOutsideViewport(element: ICellViewModel, line: number): void; - revealElementRangeInView(element: ICellViewModel, range: Range): void; - revealElementRangeInCenter(element: ICellViewModel, range: Range): void; - revealElementRangeInCenterIfOutsideViewport(element: ICellViewModel, range: Range): void; + revealElementLineInViewAsync(element: ICellViewModel, line: number): Promise; + revealElementLineInCenterAsync(element: ICellViewModel, line: number): Promise; + revealElementLineInCenterIfOutsideViewportAsync(element: ICellViewModel, line: number): Promise; + revealElementRangeInViewAsync(element: ICellViewModel, range: Range): Promise; + revealElementRangeInCenterAsync(element: ICellViewModel, range: Range): Promise; + revealElementRangeInCenterIfOutsideViewportAsync(element: ICellViewModel, range: Range): Promise; setHiddenAreas(_ranges: ICellRange[], triggerViewUpdate: boolean): boolean; domElementOfElement(element: ICellViewModel): HTMLElement | null; focusView(): void; @@ -421,6 +411,7 @@ export interface BaseCellRenderTemplate { container: HTMLElement; cellContainer: HTMLElement; toolbar: ToolBar; + betweenCellToolbar: ToolBar; focusIndicator: HTMLElement; disposables: DisposableStore; elementDisposables: DisposableStore; @@ -445,6 +436,7 @@ export interface CodeCellRenderTemplate extends BaseCellRenderTemplate { runButtonContainer: HTMLElement; executionOrderLabel: HTMLElement; outputContainer: HTMLElement; + focusSinkElement: HTMLElement; editor: ICodeEditor; progressBar: ProgressBar; timer: TimerRenderer; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts index 415c58ff21..eb79f9c5b0 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditor.ts @@ -12,52 +12,60 @@ 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 { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; -import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; -import { EditorOptions, IEditorCloseEvent, IEditorMemento } from 'vs/workbench/common/editor'; +import { EditorOptions, IEditorMemento, IEditorInput } from 'vs/workbench/common/editor'; import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; import { INotebookEditorViewState, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; -import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; +import { INotebookEditorWidgetService, IBorrowValue } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidgetService'; +import { localize } from 'vs/nls'; const NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY = 'NotebookEditorViewState'; export class NotebookEditor extends BaseEditor { static readonly ID: string = 'workbench.editor.notebook'; - private editorMemento: IEditorMemento; - private readonly groupListener = this._register(new MutableDisposable()); - private _widget?: NotebookEditorWidget; + + private readonly _editorMemento: IEditorMemento; + private readonly _groupListener = this._register(new MutableDisposable()); + private readonly _widgetDisposableStore: DisposableStore = new DisposableStore(); + private _widget: IBorrowValue = { value: undefined }; private _rootElement!: HTMLElement; - private dimension: DOM.Dimension | null = null; - private _widgetDisposableStore: DisposableStore = new DisposableStore(); + private _dimension?: DOM.Dimension; + + // todo@rebornix is there a reason that `super.fireOnDidFocus` isn't used? private readonly _onDidFocusWidget = this._register(new Emitter()); - public get onDidFocus(): Event { return this._onDidFocusWidget.event; } + get onDidFocus(): Event { return this._onDidFocusWidget.event; } + + private readonly _onDidChangeModel = this._register(new Emitter()); + readonly onDidChangeModel: Event = this._onDidChangeModel.event; constructor( @ITelemetryService telemetryService: ITelemetryService, @IThemeService themeService: IThemeService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IStorageService storageService: IStorageService, - @IEditorGroupsService editorGroupService: IEditorGroupsService) { + @IEditorService private readonly _editorService: IEditorService, + @IEditorGroupsService private readonly _editorGroupService: IEditorGroupsService, + @INotificationService private readonly _notificationService: INotificationService, + @INotebookEditorWidgetService private readonly _notebookWidgetService: INotebookEditorWidgetService, + ) { super(NotebookEditor.ID, telemetryService, themeService, storageService); - - // this._widget = this.instantiationService.createInstance(NotebookEditorWidget); - this.editorMemento = this.getEditorMemento(editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY); + this._editorMemento = this.getEditorMemento(_editorGroupService, NOTEBOOK_EDITOR_VIEW_STATE_PREFERENCE_KEY); } - private readonly _onDidChangeModel = new Emitter(); - readonly onDidChangeModel: Event = this._onDidChangeModel.event; - - set viewModel(newModel: NotebookViewModel | undefined) { - if (this._widget) { - this._widget.viewModel = newModel; + if (this._widget.value) { + this._widget.value.viewModel = newModel; this._onDidChangeModel.fire(); } } get viewModel() { - return this._widget?.viewModel; + return this._widget.value?.viewModel; } get minimumWidth(): number { return 375; } @@ -67,11 +75,9 @@ export class NotebookEditor extends BaseEditor { set minimumWidth(value: number) { /*noop*/ } set maximumWidth(value: number) { /*noop*/ } - //#region Editor Core - - public get isNotebookEditor() { + get isNotebookEditor() { return true; } @@ -79,132 +85,126 @@ export class NotebookEditor extends BaseEditor { this._rootElement = DOM.append(parent, DOM.$('.notebook-editor')); // this._widget.createEditor(); - this._register(this.onDidFocus(() => this._widget?.updateEditorFocus())); - this._register(this.onDidBlur(() => this._widget?.updateEditorFocus())); + this._register(this.onDidFocus(() => this._widget.value?.updateEditorFocus())); + this._register(this.onDidBlur(() => this._widget.value?.updateEditorFocus())); } getDomNode() { return this._rootElement; } - getControl() { - return this._widget; + getControl(): NotebookEditorWidget | undefined { + return this._widget.value; } onWillHide() { - if (this.input && this.input instanceof NotebookEditorInput && !this.input.isDisposed()) { - this.saveEditorViewState(this.input); + this._saveEditorViewState(this.input); + if (this.input && this._widget.value) { + // the widget is not transfered to other editor inputs + this._widget.value.onWillHide(); } - - this._widget?.onWillHide(); super.onWillHide(); } setEditorVisible(visible: boolean, group: IEditorGroup | undefined): void { super.setEditorVisible(visible, group); - this.groupListener.value = ((group as IEditorGroupView).onWillCloseEditor(e => this.onWillCloseEditorInGroup(e))); - } - - private onWillCloseEditorInGroup(e: IEditorCloseEvent): void { - const editor = e.editor; - if (!(editor instanceof NotebookEditorInput)) { - return; // only handle files - } - - if (editor === this.input) { - this.saveEditorViewState(editor); - } + this._groupListener.value = group?.onWillCloseEditor(e => this._saveEditorViewState(e.editor)); } focus() { super.focus(); - this._widget?.focus(); + this._widget.value?.focus(); } async setInput(input: NotebookEditorInput, options: EditorOptions | undefined, token: CancellationToken): Promise { - if (this.input instanceof NotebookEditorInput) { - if (!this.input.isDisposed()) { - // set a new input, let's hide previous input - this.saveEditorViewState(this.input as NotebookEditorInput); - this._widget?.onWillHide(); - } - } + const group = this.group!; + + this._saveEditorViewState(this.input); await super.setInput(input, options, token); - // input attached - Event.once(input.onDispose)(() => { - // make sure the editor widget is removed from the view - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(this.input as NotebookEditorInput); - if (existingEditorWidgetForInput) { - existingEditorWidgetForInput?.getDomNode().remove(); - existingEditorWidgetForInput?.dispose(); - NotebookRegistry.releaseNotebookEditorWidget(this.input as NotebookEditorInput); - } - }); - this._widgetDisposableStore.clear(); - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(input); - if (existingEditorWidgetForInput) { - // hide current widget - this._widget?.onWillHide(); - // previous widget is then detached - // set the new one - this._widget = existingEditorWidgetForInput; - NotebookRegistry.claimNotebookEditorWidget(input, this._widget); - } else { - // hide current widget - this._widget?.onWillHide(); - // create a new widget - this._widget = this.instantiationService.createInstance(NotebookEditorWidget); - this._widget.createEditor(); - NotebookRegistry.claimNotebookEditorWidget(input, this._widget); + // there currently is a widget which we still own so + // we need to hide it before getting a new widget + if (this._widget.value) { + this._widget.value.onWillHide(); } - if (this.dimension) { - this._widget.layout(this.dimension, this._rootElement); + this._widget = this.instantiationService.invokeFunction(this._notebookWidgetService.retrieveWidget, group, input); + + if (this._dimension) { + this._widget.value!.layout(this._dimension, this._rootElement); } - const model = await input.resolve(this._widget!.getId()); - const viewState = this.loadTextEditorViewState(input); + const model = await input.resolve(this._widget.value!.getId()); - this._widget.setModel(model.notebook, viewState, options); - this._widgetDisposableStore.add(this._widget.onDidFocus(() => this._onDidFocusWidget.fire())); + if (model === null) { + this._notificationService.prompt( + Severity.Error, + localize('fail.noEditor', "Cannot open resource with notebook editor type '${input.viewType}', please check if you have the right extension installed or enabled."), + [{ + label: localize('fail.reOpen', "Reopen file with VS Code standard text editor"), + run: async () => { + const fileEditorInput = this._editorService.createEditorInput({ resource: input.resource, forceFile: true }); + const textOptions: IEditorOptions | ITextEditorOptions = options ? { ...options, override: false } : { override: false }; + await this._editorService.openEditor(fileEditorInput, textOptions); + } + }] + ); + return; + } + + const viewState = this._loadTextEditorViewState(input); + + await this._widget.value!.setModel(model.notebook, viewState, options); + this._widgetDisposableStore.add(this._widget.value!.onDidFocus(() => this._onDidFocusWidget.fire())); + + if (this._editorGroupService instanceof EditorPart) { + this._widgetDisposableStore.add(this._editorGroupService.createEditorDropTarget(this._widget.value!.getDomNode(), { + groupContainsPredicate: (group) => this.group?.id === group.group.id + })); + } } clearInput(): void { - const existingEditorWidgetForInput = NotebookRegistry.getNotebookEditorWidget(this.input as NotebookEditorInput); - existingEditorWidgetForInput?.onWillHide(); - this._widget = undefined; + if (this._widget.value) { + this._widget.value.onWillHide(); + } super.clearInput(); } - private saveEditorViewState(input: NotebookEditorInput): void { - if (this.group && this._widget) { - const state = this._widget.getEditorViewState(); - this.editorMemento.saveEditorState(this.group, input.resource, state); + + protected saveState(): void { + this._saveEditorViewState(this.input); + super.saveState(); + } + + private _saveEditorViewState(input: IEditorInput | undefined): void { + if (this.group && this._widget.value && input instanceof NotebookEditorInput) { + const state = this._widget.value.getEditorViewState(); + this._editorMemento.saveEditorState(this.group, input.resource, state); } } - private loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined { + private _loadTextEditorViewState(input: NotebookEditorInput): INotebookEditorViewState | undefined { if (this.group) { - return this.editorMemento.loadEditorState(this.group, input.resource); + return this._editorMemento.loadEditorState(this.group, input.resource); } return undefined; // {{SQL CARBON EDIT}} strict-null-check } layout(dimension: DOM.Dimension): void { - DOM.toggleClass(this._rootElement, 'mid-width', dimension.width < 1000 && dimension.width >= 600); - DOM.toggleClass(this._rootElement, 'narrow-width', dimension.width < 600); - this.dimension = dimension; + this._rootElement.classList.toggle('mid-width', dimension.width < 1000 && dimension.width >= 600); + this._rootElement.classList.toggle('narrow-width', dimension.width < 600); + this._dimension = dimension; - if (this._input === undefined || this._widget === undefined) { + if (!this._widget.value || !(this._input instanceof NotebookEditorInput)) { return; } - if (this._input.resource?.toString() !== this._widget?.viewModel?.uri.toString()) { + if (this._input.resource.toString() !== this._widget.value.viewModel?.uri.toString() && this._widget.value?.viewModel) { // input and widget mismatch // this happens when // 1. open document A, pin the document @@ -214,15 +214,7 @@ export class NotebookEditor extends BaseEditor { return; } - this._widget?.layout(this.dimension, this._rootElement); - } - - protected saveState(): void { - if (this.input instanceof NotebookEditorInput) { - this.saveEditorViewState(this.input); - } - - super.saveState(); + this._widget.value.layout(this._dimension, this._rootElement); } //#endregion @@ -241,4 +233,3 @@ export class NotebookEditor extends BaseEditor { }; } } - diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts index 82827b9487..978a91e1b0 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorInput.ts @@ -9,40 +9,38 @@ import { URI } from 'vs/base/common/uri'; import { isEqual, basename } from 'vs/base/common/resources'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IFilesConfigurationService, AutoSaveMode } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { NotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { INotebookEditorModelResolverService } from 'vs/workbench/contrib/notebook/common/notebookEditorModelResolverService'; +import { IReference } from 'vs/base/common/lifecycle'; +import { INotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; + +interface NotebookEditorInputOptions { + startDirty?: boolean; +} -let NOTEBOOK_EDITOR_INPUT_HANDLE = 0; export class NotebookEditorInput extends EditorInput { - static create(instantiationService: IInstantiationService, resource: URI, name: string, viewType: string | undefined) { - return instantiationService.createInstance(NotebookEditorInput, resource, name, viewType); + static create(instantiationService: IInstantiationService, resource: URI, name: string, viewType: string | undefined, options: NotebookEditorInputOptions = {}) { + return instantiationService.createInstance(NotebookEditorInput, resource, name, viewType, options); } static readonly ID: string = 'workbench.input.notebook'; - private textModel: NotebookEditorModel | null = null; - private _group: GroupIdentifier | undefined; + private _textModel: IReference | null = null; + private _defaultDirtyState: boolean = false; - public get group(): GroupIdentifier | undefined { - return this._group; - } - - public updateGroup(group: GroupIdentifier): void { - this._group = group; - } - - readonly id: number = NOTEBOOK_EDITOR_INPUT_HANDLE++; constructor( - public resource: URI, - public name: string, + public readonly resource: URI, + public readonly name: string, public readonly viewType: string | undefined, - @INotebookService private readonly notebookService: INotebookService, - @IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService, - @IFileDialogService private readonly fileDialogService: IFileDialogService, - // @IEditorService private readonly editorService: IEditorService, - @IInstantiationService private readonly instantiationService: IInstantiationService + public readonly options: NotebookEditorInputOptions, + @INotebookService private readonly _notebookService: INotebookService, + @INotebookEditorModelResolverService private readonly _notebookModelResolverService: INotebookEditorModelResolverService, + @IFilesConfigurationService private readonly _filesConfigurationService: IFilesConfigurationService, + @IFileDialogService private readonly _fileDialogService: IFileDialogService, + @IInstantiationService private readonly _instantiationService: IInstantiationService ) { super(); + this._defaultDirtyState = !!options.startDirty; } getTypeId(): string { @@ -54,14 +52,21 @@ export class NotebookEditorInput extends EditorInput { } isDirty() { - return this.textModel?.isDirty() || false; + if (!this._textModel) { + return !!this._defaultDirtyState; + } + return this._textModel.object.isDirty(); + } + + isUntitled(): boolean { + return this._textModel?.object.isUntitled() || false; } isReadonly() { return false; } - public isSaving(): boolean { + isSaving(): boolean { if (this.isUntitled()) { return false; // untitled is never saving automatically } @@ -70,7 +75,7 @@ export class NotebookEditorInput extends EditorInput { return false; // the editor needs to be dirty for being saved } - if (this.filesConfigurationService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) { + if (this._filesConfigurationService.getAutoSaveMode() === AutoSaveMode.AFTER_SHORT_DELAY) { return true; // a short auto save is configured, treat this as being saved } @@ -78,8 +83,8 @@ export class NotebookEditorInput extends EditorInput { } async save(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (this.textModel) { - await this.textModel.save(); + if (this._textModel) { + await this._textModel.object.save(); return this; } @@ -87,17 +92,17 @@ export class NotebookEditorInput extends EditorInput { } async saveAs(group: GroupIdentifier, options?: ISaveOptions): Promise { - if (!this.textModel) { + if (!this._textModel) { return undefined; } - const dialogPath = this.textModel.resource; - const target = await this.fileDialogService.pickFileToSave(dialogPath, options?.availableFileSystems); + const dialogPath = this._textModel.object.resource; + const target = await this._fileDialogService.pickFileToSave(dialogPath, options?.availableFileSystems); if (!target) { return undefined; // save cancelled } - if (!await this.textModel.saveAs(target)) { + if (!await this._textModel.object.saveAs(target)) { return undefined; } @@ -105,46 +110,48 @@ export class NotebookEditorInput extends EditorInput { } // called when users rename a notebook document - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { - if (this.textModel) { - const contributedNotebookProviders = this.notebookService.getContributedNotebookProviders(target); + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { + if (this._textModel) { + const contributedNotebookProviders = this._notebookService.getContributedNotebookProviders(target); - if (contributedNotebookProviders.find(provider => provider.id === this.textModel!.viewType)) { + if (contributedNotebookProviders.find(provider => provider.id === this._textModel!.object.viewType)) { return this._move(group, target); } } return undefined; } - _move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { - const editorInput = NotebookEditorInput.create(this.instantiationService, newResource, basename(newResource), this.viewType); + private _move(group: GroupIdentifier, newResource: URI): { editor: IEditorInput } | undefined { + const editorInput = NotebookEditorInput.create(this._instantiationService, newResource, basename(newResource), this.viewType); return { editor: editorInput }; } async revert(group: GroupIdentifier, options?: IRevertOptions): Promise { - if (this.textModel) { - await this.textModel.revert(options); + if (this._textModel) { + await this._textModel.object.revert(options); } return; } - async resolve(editorId?: string): Promise { - if (!await this.notebookService.canResolve(this.viewType!)) { - throw new Error(`Cannot open notebook of type '${this.viewType}'`); + async resolve(editorId?: string): Promise { + if (!await this._notebookService.canResolve(this.viewType!)) { + return null; } - this.textModel = await this.notebookService.modelManager.resolve(this.resource, this.viewType!, editorId); + if (!this._textModel) { + this._textModel = await this._notebookModelResolverService.resolve(this.resource, this.viewType!, editorId); - this._register(this.textModel.onDidChangeDirty(() => { - this._onDidChangeDirty.fire(); - })); + this._register(this._textModel.object.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); + })); - if (this.textModel.isDirty()) { - this._onDidChangeDirty.fire(); + if (this._textModel.object.isDirty()) { + this._onDidChangeDirty.fire(); + } } - return this.textModel; + return this._textModel.object; } matches(otherInput: unknown): boolean { @@ -158,14 +165,11 @@ export class NotebookEditorInput extends EditorInput { return false; } - clearTextModel() { - if (this.textModel) { - this.notebookService.destoryNotebookDocument(this.textModel!.notebook.viewType, this.textModel!.notebook); - this.textModel.dispose(); - } - } - dispose() { + if (this._textModel) { + this._textModel.dispose(); + this._textModel = null; + } super.dispose(); } } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index 45f1459d15..ca7d287324 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -15,22 +15,20 @@ import 'vs/css!./media/notebook'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { BareFontInfo } from 'vs/editor/common/config/fontInfo'; -import { IPosition, Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IEditor } from 'vs/editor/common/editorCommon'; -import { IReadonlyTextBuffer } from 'vs/editor/common/model'; import * as nls from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IResourceEditorInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { contrastBorder, editorBackground, focusBorder, foreground, registerColor, textBlockQuoteBackground, textBlockQuoteBorder, textLinkActiveForeground, textLinkForeground, textPreformatForeground } from 'vs/platform/theme/common/colorRegistry'; +import { contrastBorder, editorBackground, focusBorder, foreground, registerColor, textBlockQuoteBackground, textBlockQuoteBorder, textLinkActiveForeground, textLinkForeground, textPreformatForeground, errorForeground, transparent } from 'vs/platform/theme/common/colorRegistry'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { EditorMemento } from 'vs/workbench/browser/parts/editor/baseEditor'; import { EditorOptions, IEditorMemento } from 'vs/workbench/common/editor'; -import { CELL_MARGIN, CELL_RUN_GUTTER, EDITOR_BOTTOM_PADDING, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, SCROLLABLE_ELEMENT_PADDING_TOP } from 'vs/workbench/contrib/notebook/browser/constants'; -import { CellEditState, CellFocusMode, ICellRange, ICellViewModel, IEditableCellViewModel, INotebookCellList, INotebookEditor, INotebookEditorContribution, INotebookEditorMouseEvent, NotebookLayoutInfo, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_RUNNABLE, NOTEBOOK_HAS_MULTIPLE_KERNELS } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CELL_MARGIN, CELL_RUN_GUTTER, EDITOR_BOTTOM_PADDING, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING, SCROLLABLE_ELEMENT_PADDING_TOP, BOTTOM_CELL_TOOLBAR_HEIGHT } from 'vs/workbench/contrib/notebook/browser/constants'; +import { CellEditState, CellFocusMode, ICellRange, ICellViewModel, INotebookCellList, INotebookEditor, INotebookEditorContribution, INotebookEditorMouseEvent, NotebookLayoutInfo, NOTEBOOK_EDITOR_EDITABLE, NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK, NOTEBOOK_EDITOR_FOCUSED, NOTEBOOK_EDITOR_RUNNABLE, NOTEBOOK_HAS_MULTIPLE_KERNELS, NOTEBOOK_OUTPUT_FOCUSED } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { NotebookEditorExtensionsRegistry } from 'vs/workbench/contrib/notebook/browser/notebookEditorExtensions'; import { NotebookCellList } from 'vs/workbench/contrib/notebook/browser/view/notebookCellList'; import { OutputRenderer } from 'vs/workbench/contrib/notebook/browser/view/output/outputRenderer'; @@ -42,13 +40,15 @@ import { CellViewModel, IModelDecorationsChangeAccessor, INotebookEditorViewStat import { CellKind, IProcessedOutput, INotebookKernelInfo, INotebookKernelInfoDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; -import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/common/walkThroughUtils'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { generateUuid } from 'vs/base/common/uuid'; import { Memento, MementoObject } from 'vs/workbench/common/memento'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { URI } from 'vs/base/common/uri'; +import { PANEL_BORDER } from 'vs/workbench/common/theme'; +import { debugIconStartForeground } from 'vs/workbench/contrib/debug/browser/debugToolBar'; +import { CellContextKeyManager } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys'; const $ = DOM.$; @@ -70,62 +70,39 @@ export class NotebookEditorOptions extends EditorOptions { export class NotebookEditorWidget extends Disposable implements INotebookEditor { static readonly ID: string = 'workbench.editor.notebook'; private static readonly EDITOR_MEMENTOS = new Map>(); - private overlayContainer!: HTMLElement; - private body!: HTMLElement; - private webview: BackLayerWebView | null = null; - private webviewTransparentCover: HTMLElement | null = null; - private list: INotebookCellList | undefined; - private dndController: CellDragAndDropController | null = null; - private renderedEditors: Map = new Map(); - private eventDispatcher: NotebookEventDispatcher | undefined; - private notebookViewModel: NotebookViewModel | undefined; - private localStore: DisposableStore = this._register(new DisposableStore()); - private fontInfo: BareFontInfo | undefined; - private dimension: DOM.Dimension | null = null; - private shadowElementViewInfo: { height: number, width: number, top: number; left: number; } | null = null; - private editorFocus: IContextKey | null = null; - private editorEditable: IContextKey | null = null; - private editorRunnable: IContextKey | null = null; - private editorExecutingNotebook: IContextKey | null = null; - private notebookHasMultipleKernels: IContextKey | null = null; - private outputRenderer: OutputRenderer; + private _overlayContainer!: HTMLElement; + private _body!: HTMLElement; + private _webview: BackLayerWebView | null = null; + private _webviewTransparentCover: HTMLElement | null = null; + private _list: INotebookCellList | undefined; + private _dndController: CellDragAndDropController | null = null; + private _renderedEditors: Map = new Map(); + private _eventDispatcher: NotebookEventDispatcher | undefined; + private _notebookViewModel: NotebookViewModel | undefined; + private _localStore: DisposableStore = this._register(new DisposableStore()); + private _fontInfo: BareFontInfo | undefined; + private _dimension: DOM.Dimension | null = null; + private _shadowElementViewInfo: { height: number, width: number, top: number; left: number; } | null = null; + private _editorFocus: IContextKey | null = null; + private _outputFocus: IContextKey | null = null; + private _editorEditable: IContextKey | null = null; + private _editorRunnable: IContextKey | null = null; + private _editorExecutingNotebook: IContextKey | null = null; + private _notebookHasMultipleKernels: IContextKey | null = null; + private _outputRenderer: OutputRenderer; protected readonly _contributions: { [key: string]: INotebookEditorContribution; }; - private scrollBeyondLastLine: boolean; - private readonly memento: Memento; + private _scrollBeyondLastLine: boolean; + private readonly _memento: Memento; + private readonly _onDidFocusEmitter = this._register(new Emitter()); + public readonly onDidFocus = this._onDidFocusEmitter.event; + private _cellContextKeyManager: CellContextKeyManager | null = null; + private _isVisible = false; + private readonly _uuid = generateUuid(); + private _isDisposed: boolean = false; - private readonly _onDidFocusWidget = this._register(new Emitter()); - public get onDidFocus(): Event { return this._onDidFocusWidget.event; } - constructor( - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IStorageService storageService: IStorageService, - @INotebookService private notebookService: INotebookService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IContextKeyService readonly contextKeyService: IContextKeyService, - @ILayoutService private readonly _layoutService: ILayoutService - ) { - super(); - this.memento = new Memento(NotebookEditorWidget.ID, storageService); - - this.outputRenderer = new OutputRenderer(this, this.instantiationService); - this._contributions = {}; - this.scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); - - this.configurationService.onDidChangeConfiguration(e => { - if (e.affectsConfiguration('editor.scrollBeyondLastLine')) { - this.scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); - if (this.dimension) { - this.layout(this.dimension); - } - } - }); - - this.notebookService.addNotebookEditor(this); - } - - private _uuid = generateUuid(); - public getId(): string { - return this._uuid; + get isDisposed() { + return this._isDisposed; } private readonly _onDidChangeModel = new Emitter(); @@ -135,24 +112,20 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor readonly onDidFocusEditorWidget = this._onDidFocusEditorWidget.event; set viewModel(newModel: NotebookViewModel | undefined) { - this.notebookViewModel = newModel; + this._notebookViewModel = newModel; this._onDidChangeModel.fire(newModel?.notebookDocument); } get viewModel() { - return this.notebookViewModel; + return this._notebookViewModel; } get uri() { - return this.notebookViewModel?.uri; + return this._notebookViewModel?.uri; } get textModel() { - return this.notebookViewModel?.notebookDocument; - } - - hasModel() { - return !!this.notebookViewModel; + return this._notebookViewModel?.notebookDocument; } private _activeKernel: INotebookKernelInfo | undefined = undefined; @@ -164,6 +137,10 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } set activeKernel(kernel: INotebookKernelInfo | undefined) { + if (this._isDisposed) { + return; + } + this._activeKernel = kernel; this._onDidChangeKernel.fire(); } @@ -172,8 +149,48 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor readonly onDidChangeActiveEditor: Event = this._onDidChangeActiveEditor.event; get activeCodeEditor(): IEditor | undefined { - const [focused] = this.list!.getFocusedElements(); - return this.renderedEditors.get(focused); + if (this._isDisposed) { + // {{SQL CARBON EDIT}} + return undefined; + } + + const [focused] = this._list!.getFocusedElements(); + return this._renderedEditors.get(focused); + } + + constructor( + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IStorageService storageService: IStorageService, + @INotebookService private notebookService: INotebookService, + @IConfigurationService private readonly configurationService: IConfigurationService, + @IContextKeyService readonly contextKeyService: IContextKeyService, + @ILayoutService private readonly layoutService: ILayoutService + ) { + super(); + this._memento = new Memento(NotebookEditorWidget.ID, storageService); + + this._outputRenderer = new OutputRenderer(this, this.instantiationService); + this._contributions = {}; + this._scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); + + this.configurationService.onDidChangeConfiguration(e => { + if (e.affectsConfiguration('editor.scrollBeyondLastLine')) { + this._scrollBeyondLastLine = this.configurationService.getValue('editor.scrollBeyondLastLine'); + if (this._dimension && this._isVisible) { + this.layout(this._dimension); + } + } + }); + + this.notebookService.addNotebookEditor(this); + } + + public getId(): string { + return this._uuid; + } + + hasModel() { + return !!this._notebookViewModel; } //#region Editor Core @@ -191,7 +208,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } protected getMemento(scope: StorageScope): MementoObject { - return this.memento.getMemento(scope); + return this._memento.getMemento(scope); } public get isNotebookEditor() { @@ -201,33 +218,35 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor updateEditorFocus() { // Note - focus going to the webview will fire 'blur', but the webview element will be // a descendent of the notebook editor root. - this.editorFocus?.set(DOM.isAncestor(document.activeElement, this.overlayContainer)); + this._editorFocus?.set(DOM.isAncestor(document.activeElement, this._overlayContainer)); } hasFocus() { - return this.editorFocus?.get() || false; + return this._editorFocus?.get() || false; } createEditor(): void { - this.overlayContainer = document.createElement('div'); + this._overlayContainer = document.createElement('div'); const id = generateUuid(); - this.overlayContainer.id = `notebook-${id}`; - this.overlayContainer.className = 'notebookOverlay'; - DOM.addClass(this.overlayContainer, 'notebook-editor'); - this.overlayContainer.style.visibility = 'hidden'; + this._overlayContainer.id = `notebook-${id}`; + this._overlayContainer.className = 'notebookOverlay'; + DOM.addClass(this._overlayContainer, 'notebook-editor'); + this._overlayContainer.style.visibility = 'hidden'; - this._layoutService.container.appendChild(this.overlayContainer); - this.createBody(this.overlayContainer); - this.generateFontInfo(); - this.editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService); - this.editorFocus.set(true); - this.editorEditable = NOTEBOOK_EDITOR_EDITABLE.bindTo(this.contextKeyService); - this.editorEditable.set(true); - this.editorRunnable = NOTEBOOK_EDITOR_RUNNABLE.bindTo(this.contextKeyService); - this.editorRunnable.set(true); - this.editorExecutingNotebook = NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK.bindTo(this.contextKeyService); - this.notebookHasMultipleKernels = NOTEBOOK_HAS_MULTIPLE_KERNELS.bindTo(this.contextKeyService); - this.notebookHasMultipleKernels.set(false); + this.layoutService.container.appendChild(this._overlayContainer); + this._createBody(this._overlayContainer); + this._generateFontInfo(); + this._editorFocus = NOTEBOOK_EDITOR_FOCUSED.bindTo(this.contextKeyService); + this._editorFocus.set(true); + this._isVisible = true; + this._outputFocus = NOTEBOOK_OUTPUT_FOCUSED.bindTo(this.contextKeyService); + this._editorEditable = NOTEBOOK_EDITOR_EDITABLE.bindTo(this.contextKeyService); + this._editorEditable.set(true); + this._editorRunnable = NOTEBOOK_EDITOR_RUNNABLE.bindTo(this.contextKeyService); + this._editorRunnable.set(true); + this._editorExecutingNotebook = NOTEBOOK_EDITOR_EXECUTING_NOTEBOOK.bindTo(this.contextKeyService); + this._notebookHasMultipleKernels = NOTEBOOK_HAS_MULTIPLE_KERNELS.bindTo(this.contextKeyService); + this._notebookHasMultipleKernels.set(false); const contributions = NotebookEditorExtensionsRegistry.getEditorContributions(); @@ -241,32 +260,32 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } - private generateFontInfo(): void { + private _generateFontInfo(): void { const editorOptions = this.configurationService.getValue('editor'); - this.fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()); + this._fontInfo = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()); } - private createBody(parent: HTMLElement): void { - this.body = document.createElement('div'); - DOM.addClass(this.body, 'cell-list-container'); - this.createCellList(); - DOM.append(parent, this.body); + private _createBody(parent: HTMLElement): void { + this._body = document.createElement('div'); + DOM.addClass(this._body, 'cell-list-container'); + this._createCellList(); + DOM.append(parent, this._body); } - private createCellList(): void { - DOM.addClass(this.body, 'cell-list-container'); + private _createCellList(): void { + DOM.addClass(this._body, 'cell-list-container'); - this.dndController = this._register(new CellDragAndDropController(this, this.body)); - const getScopedContextKeyService = (container?: HTMLElement) => this.list!.contextKeyService.createScoped(container); + this._dndController = this._register(new CellDragAndDropController(this, this._body)); + const getScopedContextKeyService = (container?: HTMLElement) => this._list!.contextKeyService.createScoped(container); const renderers = [ - this.instantiationService.createInstance(CodeCellRenderer, this, this.renderedEditors, this.dndController, getScopedContextKeyService), - this.instantiationService.createInstance(MarkdownCellRenderer, this, this.dndController, this.renderedEditors, getScopedContextKeyService), + this.instantiationService.createInstance(CodeCellRenderer, this, this._renderedEditors, this._dndController, getScopedContextKeyService), + this.instantiationService.createInstance(MarkdownCellRenderer, this, this._dndController, this._renderedEditors, getScopedContextKeyService), ]; - this.list = this.instantiationService.createInstance( + this._list = this.instantiationService.createInstance( NotebookCellList, 'NotebookCellList', - this.body, + this._body, this.instantiationService.createInstance(NotebookCellListDelegate), renderers, this.contextKeyService, @@ -281,7 +300,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor enableKeyboardNavigation: true, additionalScrollHeight: 0, transformOptimization: false, - styleController: (_suffix: string) => { return this.list!; }, + styleController: (_suffix: string) => { return this._list!; }, overrideStyles: { listBackground: editorBackground, listActiveSelectionBackground: editorBackground, @@ -307,95 +326,107 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } }, ); - this.dndController.setList(this.list); + this._dndController.setList(this._list); // create Webview - this._register(this.list); + this._register(this._list); this._register(combinedDisposable(...renderers)); // transparent cover - this.webviewTransparentCover = DOM.append(this.list.rowsContainer, $('.webview-cover')); - this.webviewTransparentCover.style.display = 'none'; + this._webviewTransparentCover = DOM.append(this._list.rowsContainer, $('.webview-cover')); + this._webviewTransparentCover.style.display = 'none'; - this._register(DOM.addStandardDisposableGenericMouseDownListner(this.overlayContainer, (e: StandardMouseEvent) => { - if (DOM.hasClass(e.target, 'slider') && this.webviewTransparentCover) { - this.webviewTransparentCover.style.display = 'block'; + this._register(DOM.addStandardDisposableGenericMouseDownListner(this._overlayContainer, (e: StandardMouseEvent) => { + if (DOM.hasClass(e.target, 'slider') && this._webviewTransparentCover) { + this._webviewTransparentCover.style.display = 'block'; } })); - this._register(DOM.addStandardDisposableGenericMouseUpListner(this.overlayContainer, () => { - if (this.webviewTransparentCover) { + this._register(DOM.addStandardDisposableGenericMouseUpListner(this._overlayContainer, () => { + if (this._webviewTransparentCover) { // no matter when - this.webviewTransparentCover.style.display = 'none'; + this._webviewTransparentCover.style.display = 'none'; } })); - this._register(this.list.onMouseDown(e => { + this._register(this._list.onMouseDown(e => { if (e.element) { this._onMouseDown.fire({ event: e.browserEvent, target: e.element }); } })); - this._register(this.list.onMouseUp(e => { + this._register(this._list.onMouseUp(e => { if (e.element) { this._onMouseUp.fire({ event: e.browserEvent, target: e.element }); } })); - this._register(this.list.onDidChangeFocus(_e => this._onDidChangeActiveEditor.fire(this))); + this._register(this._list.onDidChangeFocus(_e => this._onDidChangeActiveEditor.fire(this))); const widgetFocusTracker = DOM.trackFocus(this.getDomNode()); this._register(widgetFocusTracker); - this._register(widgetFocusTracker.onDidFocus(() => this._onDidFocusWidget.fire())); + this._register(widgetFocusTracker.onDidFocus(() => this._onDidFocusEmitter.fire())); } getDomNode() { - return this.overlayContainer; + return this._overlayContainer; } onWillHide() { - this.editorFocus?.set(false); - this.overlayContainer.style.visibility = 'hidden'; - this.overlayContainer.style.display = 'none'; + this._isVisible = false; + this._editorFocus?.set(false); + this._overlayContainer.style.visibility = 'hidden'; + this._overlayContainer.style.left = '-50000px'; } getInnerWebview(): Webview | undefined { - return this.webview?.webview; + return this._webview?.webview; } - focus() { - this.editorFocus?.set(true); - this.list?.domFocus(); + this._isVisible = true; + this._editorFocus?.set(true); + this._list?.domFocus(); this._onDidFocusEditorWidget.fire(); } async setModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined, options: EditorOptions | undefined): Promise { - if (this.notebookViewModel === undefined || !this.notebookViewModel.equal(textModel)) { - this.detachModel(); - await this.attachModel(textModel, viewState); + if (this._notebookViewModel === undefined || !this._notebookViewModel.equal(textModel)) { + this._detachModel(); + await this._attachModel(textModel, viewState); } // clear state - this.dndController?.clearGlobalDragState(); + this._dndController?.clearGlobalDragState(); this._setKernels(textModel); - this.localStore.add(this.notebookService.onDidChangeKernels(() => { + this._localStore.add(this.notebookService.onDidChangeKernels(() => { if (this.activeKernel === undefined) { this._setKernels(textModel); } })); + this._localStore.add(this._list!.onDidChangeFocus(() => { + const focused = this._list!.getFocusedElements()[0]; + if (focused) { + if (!this._cellContextKeyManager) { + this._cellContextKeyManager = this._localStore.add(new CellContextKeyManager(this.contextKeyService, textModel, focused as any)); + } + + this._cellContextKeyManager.updateForElement(focused as any); + } + })); + // reveal cell if editor options tell to do so if (options instanceof NotebookEditorOptions && options.cellOptions) { const cellOptions = options.cellOptions; - const cell = this.notebookViewModel!.viewCells.find(cell => cell.uri.toString() === cellOptions.resource.toString()); + const cell = this._notebookViewModel!.viewCells.find(cell => cell.uri.toString() === cellOptions.resource.toString()); if (cell) { this.selectElement(cell); this.revealInCenterIfOutsideViewport(cell); - const editor = this.renderedEditors.get(cell)!; + const editor = this._renderedEditors.get(cell)!; if (editor) { if (cellOptions.options?.selection) { const { selection } = cellOptions.options; @@ -404,27 +435,43 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor endLineNumber: selection.endLineNumber || selection.startLineNumber, endColumn: selection.endColumn || selection.startColumn }); + editor.revealPositionInCenterIfOutsideViewport({ + lineNumber: selection.startLineNumber, + column: selection.startColumn + }); } if (!cellOptions.options?.preserveFocus) { editor.focus(); } } } + } else if (this._notebookViewModel!.viewCells.length === 1 && this._notebookViewModel!.viewCells[0].cellKind === CellKind.Code) { + // there is only one code cell in the document + const cell = this._notebookViewModel!.viewCells[0]; + if (cell.getTextLength() === 0) { + // the cell is empty, very likely a template cell, focus it + this.selectElement(cell); + await this.revealLineInCenterAsync(cell, 1); + const editor = this._renderedEditors.get(cell)!; + if (editor) { + editor.focus(); + } + } } } - private detachModel() { - this.localStore.clear(); - this.list?.detachViewModel(); + private _detachModel() { + this._localStore.clear(); + this._list?.detachViewModel(); this.viewModel?.dispose(); // avoid event - this.notebookViewModel = undefined; + this._notebookViewModel = undefined; // this.webview?.clearInsets(); // this.webview?.clearPreloadsCache(); - this.webview?.dispose(); - this.webview?.element.remove(); - this.webview = null; - this.list?.clear(); + this._webview?.dispose(); + this._webview?.element.remove(); + this._webview = null; + this._list?.clear(); } private _setKernels(textModel: NotebookTextModel) { @@ -432,66 +479,71 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor const availableKernels = this.notebookService.getContributedNotebookKernels(textModel.viewType, textModel.uri); if (provider.kernel && availableKernels.length > 0) { - this.notebookHasMultipleKernels!.set(true); + this._notebookHasMultipleKernels!.set(true); } else if (availableKernels.length > 1) { - this.notebookHasMultipleKernels!.set(true); + this._notebookHasMultipleKernels!.set(true); } else { - this.notebookHasMultipleKernels!.set(false); + this._notebookHasMultipleKernels!.set(false); } if (provider && provider.kernel) { // it has a builtin kernel, don't automatically choose a kernel - this.loadKernelPreloads(provider.providerExtensionLocation, provider.kernel); + this._loadKernelPreloads(provider.providerExtensionLocation, provider.kernel); return; } // the provider doesn't have a builtin kernel, choose a kernel this.activeKernel = availableKernels[0]; if (this.activeKernel) { - this.loadKernelPreloads(this.activeKernel.extensionLocation, this.activeKernel); + this._loadKernelPreloads(this.activeKernel.extensionLocation, this.activeKernel); } } - private loadKernelPreloads(extensionLocation: URI, kernel: INotebookKernelInfoDto) { + private _loadKernelPreloads(extensionLocation: URI, kernel: INotebookKernelInfoDto) { if (kernel.preloads) { - this.webview?.updateKernelPreloads([extensionLocation], kernel.preloads.map(preload => URI.revive(preload))); + this._webview?.updateKernelPreloads([extensionLocation], kernel.preloads.map(preload => URI.revive(preload))); } } - private updateForMetadata(): void { - this.editorEditable?.set(!!this.viewModel!.metadata?.editable); - this.editorRunnable?.set(!!this.viewModel!.metadata?.runnable); - DOM.toggleClass(this.overlayContainer, 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); + private _updateForMetadata(): void { + this._editorEditable?.set(!!this.viewModel!.metadata?.editable); + this._editorRunnable?.set(!!this.viewModel!.metadata?.runnable); + DOM.toggleClass(this._overlayContainer, 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); DOM.toggleClass(this.getDomNode(), 'notebook-editor-editable', !!this.viewModel!.metadata?.editable); } - private async createWebview(id: string, document: URI): Promise { - this.webview = this.instantiationService.createInstance(BackLayerWebView, this, id, document); - await this.webview.waitForInitialization(); - this.webview.webview.onDidBlur(() => this.updateEditorFocus()); - this.webview.webview.onDidFocus(() => { + private async _createWebview(id: string, document: URI): Promise { + this._webview = this.instantiationService.createInstance(BackLayerWebView, this, id, document); + // attach the webview container to the DOM tree first + this._list?.rowsContainer.insertAdjacentElement('afterbegin', this._webview.element); + await this._webview.createWebview(); + this._webview.webview.onDidBlur(() => { + this._outputFocus?.set(false); this.updateEditorFocus(); - this._onDidFocusWidget.fire(); + }); + this._webview.webview.onDidFocus(() => { + this._outputFocus?.set(true); + this.updateEditorFocus(); + this._onDidFocusEmitter.fire(); }); - this.localStore.add(this.webview.onMessage(message => { + this._localStore.add(this._webview.onMessage(message => { if (this.viewModel) { this.notebookService.onDidReceiveMessage(this.viewModel.viewType, this.getId(), message); } })); - this.list?.rowsContainer.insertAdjacentElement('afterbegin', this.webview.element); } - private async attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined) { - await this.createWebview(this.getId(), textModel.uri); + private async _attachModel(textModel: NotebookTextModel, viewState: INotebookEditorViewState | undefined) { + await this._createWebview(this.getId(), textModel.uri); - this.eventDispatcher = new NotebookEventDispatcher(); - this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this.eventDispatcher, this.getLayoutInfo()); - this.eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); + this._eventDispatcher = new NotebookEventDispatcher(); + this.viewModel = this.instantiationService.createInstance(NotebookViewModel, textModel.viewType, textModel, this._eventDispatcher, this.getLayoutInfo()); + this._eventDispatcher.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); - this.updateForMetadata(); - this.localStore.add(this.eventDispatcher.onDidChangeMetadata(() => { - this.updateForMetadata(); + this._updateForMetadata(); + this._localStore.add(this._eventDispatcher.onDidChangeMetadata(() => { + this._updateForMetadata(); })); // restore view states, including contributions @@ -513,25 +565,29 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } - this.webview?.updateRendererPreloads(this.viewModel.renderers); + this._webview?.updateRendererPreloads(this.viewModel.renderers); - this.localStore.add(this.list!.onWillScroll(e => { - this.webview!.updateViewScrollTop(-e.scrollTop, []); - this.webviewTransparentCover!.style.top = `${e.scrollTop}px`; + this._localStore.add(this._list!.onWillScroll(e => { + this._webview!.updateViewScrollTop(-e.scrollTop, []); + this._webviewTransparentCover!.style.top = `${e.scrollTop}px`; })); - this.localStore.add(this.list!.onDidChangeContentHeight(() => { + this._localStore.add(this._list!.onDidChangeContentHeight(() => { DOM.scheduleAtNextAnimationFrame(() => { - const scrollTop = this.list?.scrollTop || 0; - const scrollHeight = this.list?.scrollHeight || 0; - this.webview!.element.style.height = `${scrollHeight}px`; + if (this._isDisposed) { + return; + } - if (this.webview?.insetMapping) { + const scrollTop = this._list?.scrollTop || 0; + const scrollHeight = this._list?.scrollHeight || 0; + this._webview!.element.style.height = `${scrollHeight}px`; + + if (this._webview?.insetMapping) { let updateItems: { cell: CodeCellViewModel, output: IProcessedOutput, cellTop: number }[] = []; let removedItems: IProcessedOutput[] = []; - this.webview?.insetMapping.forEach((value, key) => { + this._webview?.insetMapping.forEach((value, key) => { const cell = value.cell; - const viewIndex = this.list?.getViewIndex(cell); + const viewIndex = this._list?.getViewIndex(cell); if (viewIndex === undefined) { return; @@ -542,8 +598,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor removedItems.push(key); } - const cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - if (this.webview!.shouldUpdateInset(cell, key, cellTop)) { + const cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + if (this._webview!.shouldUpdateInset(cell, key, cellTop)) { updateItems.push({ cell: cell, output: key, @@ -552,50 +608,50 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } }); - removedItems.forEach(output => this.webview?.removeInset(output)); + removedItems.forEach(output => this._webview?.removeInset(output)); if (updateItems.length) { - this.webview?.updateViewScrollTop(-scrollTop, updateItems); + this._webview?.updateViewScrollTop(-scrollTop, updateItems); } } }); })); - this.list!.attachViewModel(this.viewModel); - this.localStore.add(this.list!.onDidRemoveOutput(output => { + this._list!.attachViewModel(this.viewModel); + this._localStore.add(this._list!.onDidRemoveOutput(output => { this.removeInset(output); })); - this.localStore.add(this.list!.onDidHideOutput(output => { + this._localStore.add(this._list!.onDidHideOutput(output => { this.hideInset(output); })); - this.list!.layout(); - this.dndController?.clearGlobalDragState(); + this._list!.layout(); + this._dndController?.clearGlobalDragState(); // restore list state at last, it must be after list layout - this.restoreListViewState(viewState); + this._restoreListViewState(viewState); } - private restoreListViewState(viewState: INotebookEditorViewState | undefined): void { + private _restoreListViewState(viewState: INotebookEditorViewState | undefined): void { if (viewState?.scrollPosition !== undefined) { - this.list!.scrollTop = viewState!.scrollPosition.top; - this.list!.scrollLeft = viewState!.scrollPosition.left; + this._list!.scrollTop = viewState!.scrollPosition.top; + this._list!.scrollLeft = viewState!.scrollPosition.left; } else { - this.list!.scrollTop = 0; - this.list!.scrollLeft = 0; + this._list!.scrollTop = 0; + this._list!.scrollLeft = 0; } const focusIdx = typeof viewState?.focus === 'number' ? viewState.focus : 0; - if (focusIdx < this.list!.length) { - this.list!.setFocus([focusIdx]); - this.list!.setSelection([focusIdx]); - } else if (this.list!.length > 0) { - this.list!.setFocus([0]); + if (focusIdx < this._list!.length) { + this._list!.setFocus([focusIdx]); + this._list!.setSelection([focusIdx]); + } else if (this._list!.length > 0) { + this._list!.setFocus([0]); } if (viewState?.editorFocused) { - this.list?.focusView(); - const cell = this.notebookViewModel?.viewCells[focusIdx]; + this._list?.focusView(); + const cell = this._notebookViewModel?.viewCells[focusIdx]; if (cell) { cell.focusMode = CellFocusMode.Editor; } @@ -603,7 +659,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } getEditorViewState(): INotebookEditorViewState { - const state = this.notebookViewModel?.getEditorViewState(); + const state = this._notebookViewModel?.getEditorViewState(); if (!state) { return { editingCells: {}, @@ -611,8 +667,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor }; } - if (this.list) { - state.scrollPosition = { left: this.list.scrollLeft, top: this.list.scrollTop }; + if (this._list) { + state.scrollPosition = { left: this._list.scrollLeft, top: this._list.scrollTop }; let cellHeights: { [key: number]: number } = {}; for (let i = 0; i < this.viewModel!.length; i++) { const elm = this.viewModel!.viewCells[i] as CellViewModel; @@ -625,10 +681,10 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor state.cellTotalHeights = cellHeights; - const focus = this.list.getFocus()[0]; + const focus = this._list.getFocus()[0]; if (typeof focus === 'number') { - const element = this.notebookViewModel!.viewCells[focus]; - const itemDOM = this.list?.domElementOfElement(element!); + const element = this._notebookViewModel!.viewCells[focus]; + const itemDOM = this._list?.domElementOfElement(element!); let editorFocused = false; if (document.activeElement && itemDOM && itemDOM.contains(document.activeElement)) { editorFocused = true; @@ -664,15 +720,15 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor // } layout(dimension: DOM.Dimension, shadowElement?: HTMLElement): void { - if (!shadowElement && this.shadowElementViewInfo === null) { - this.dimension = dimension; + if (!shadowElement && this._shadowElementViewInfo === null) { + this._dimension = dimension; return; } if (shadowElement) { const containerRect = shadowElement.getBoundingClientRect(); - this.shadowElementViewInfo = { + this._shadowElementViewInfo = { height: containerRect.height, width: containerRect.width, top: containerRect.top, @@ -680,25 +736,25 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor }; } - this.dimension = new DOM.Dimension(dimension.width, dimension.height); - DOM.size(this.body, dimension.width, dimension.height); - this.list?.updateOptions({ additionalScrollHeight: this.scrollBeyondLastLine ? dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP : 0 }); - this.list?.layout(dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP, dimension.width); + this._dimension = new DOM.Dimension(dimension.width, dimension.height); + DOM.size(this._body, dimension.width, dimension.height); + this._list?.updateOptions({ additionalScrollHeight: this._scrollBeyondLastLine ? dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP : 0 }); + this._list?.layout(dimension.height - SCROLLABLE_ELEMENT_PADDING_TOP, dimension.width); - this.overlayContainer.style.visibility = 'visible'; - this.overlayContainer.style.display = 'block'; - this.overlayContainer.style.position = 'absolute'; - this.overlayContainer.style.top = `${this.shadowElementViewInfo!.top}px`; - this.overlayContainer.style.left = `${this.shadowElementViewInfo!.left}px`; - this.overlayContainer.style.width = `${dimension ? dimension.width : this.shadowElementViewInfo!.width}px`; - this.overlayContainer.style.height = `${dimension ? dimension.height : this.shadowElementViewInfo!.height}px`; + this._overlayContainer.style.visibility = 'visible'; + this._overlayContainer.style.display = 'block'; + this._overlayContainer.style.position = 'absolute'; + this._overlayContainer.style.top = `${this._shadowElementViewInfo!.top}px`; + this._overlayContainer.style.left = `${this._shadowElementViewInfo!.left}px`; + this._overlayContainer.style.width = `${dimension ? dimension.width : this._shadowElementViewInfo!.width}px`; + this._overlayContainer.style.height = `${dimension ? dimension.height : this._shadowElementViewInfo!.height}px`; - if (this.webviewTransparentCover) { - this.webviewTransparentCover.style.height = `${dimension.height}px`; - this.webviewTransparentCover.style.width = `${dimension.width}px`; + if (this._webviewTransparentCover) { + this._webviewTransparentCover.style.height = `${dimension.height}px`; + this._webviewTransparentCover.style.width = `${dimension.width}px`; } - this.eventDispatcher?.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); + this._eventDispatcher?.emit([new NotebookLayoutChangedEvent({ width: true, fontInfo: true }, this.getLayoutInfo())]); } // protected saveState(): void { @@ -714,56 +770,56 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region Editor Features selectElement(cell: ICellViewModel) { - this.list?.selectElement(cell); + this._list?.selectElement(cell); // this.viewModel!.selectionHandles = [cell.handle]; } revealInView(cell: ICellViewModel) { - this.list?.revealElementInView(cell); + this._list?.revealElementInView(cell); } revealInCenterIfOutsideViewport(cell: ICellViewModel) { - this.list?.revealElementInCenterIfOutsideViewport(cell); + this._list?.revealElementInCenterIfOutsideViewport(cell); } revealInCenter(cell: ICellViewModel) { - this.list?.revealElementInCenter(cell); + this._list?.revealElementInCenter(cell); } - revealLineInView(cell: ICellViewModel, line: number): void { - this.list?.revealElementLineInView(cell, line); + async revealLineInViewAsync(cell: ICellViewModel, line: number): Promise { + return this._list?.revealElementLineInViewAsync(cell, line); } - revealLineInCenter(cell: ICellViewModel, line: number) { - this.list?.revealElementLineInCenter(cell, line); + async revealLineInCenterAsync(cell: ICellViewModel, line: number): Promise { + return this._list?.revealElementLineInCenterAsync(cell, line); } - revealLineInCenterIfOutsideViewport(cell: ICellViewModel, line: number) { - this.list?.revealElementLineInCenterIfOutsideViewport(cell, line); + async revealLineInCenterIfOutsideViewportAsync(cell: ICellViewModel, line: number): Promise { + return this._list?.revealElementLineInCenterIfOutsideViewportAsync(cell, line); } - revealRangeInView(cell: ICellViewModel, range: Range): void { - this.list?.revealElementRangeInView(cell, range); + async revealRangeInViewAsync(cell: ICellViewModel, range: Range): Promise { + return this._list?.revealElementRangeInViewAsync(cell, range); } - revealRangeInCenter(cell: ICellViewModel, range: Range): void { - this.list?.revealElementRangeInCenter(cell, range); + async revealRangeInCenterAsync(cell: ICellViewModel, range: Range): Promise { + return this._list?.revealElementRangeInCenterAsync(cell, range); } - revealRangeInCenterIfOutsideViewport(cell: ICellViewModel, range: Range): void { - this.list?.revealElementRangeInCenterIfOutsideViewport(cell, range); + async revealRangeInCenterIfOutsideViewportAsync(cell: ICellViewModel, range: Range): Promise { + return this._list?.revealElementRangeInCenterIfOutsideViewportAsync(cell, range); } setCellSelection(cell: ICellViewModel, range: Range): void { - this.list?.setCellSelection(cell, range); + this._list?.setCellSelection(cell, range); } changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { - return this.notebookViewModel?.changeDecorations(callback); + return this._notebookViewModel?.changeDecorations(callback); } setHiddenAreas(_ranges: ICellRange[]): boolean { - return this.list!.setHiddenAreas(_ranges, true); + return this._list!.setHiddenAreas(_ranges, true); } //#endregion @@ -781,14 +837,18 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region Cell operations async layoutNotebookCell(cell: ICellViewModel, height: number): Promise { - const viewIndex = this.list!.getViewIndex(cell); + const viewIndex = this._list!.getViewIndex(cell); if (viewIndex === undefined) { // the cell is hidden return; } let relayout = (cell: ICellViewModel, height: number) => { - this.list?.updateElementHeight2(cell, height); + if (this._isDisposed) { + return; + } + + this._list?.updateElementHeight2(cell, height); }; if (this.pendingLayouts.has(cell)) { @@ -816,218 +876,88 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } insertNotebookCell(cell: ICellViewModel | undefined, type: CellKind, direction: 'above' | 'below' = 'above', initialText: string = '', ui: boolean = false): CellViewModel | null { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return null; } - const newLanguages = this.notebookViewModel!.languages; + const newLanguages = this._notebookViewModel!.languages; const language = (type === CellKind.Code && newLanguages && newLanguages.length) ? newLanguages[0] : 'markdown'; - const index = cell ? this.notebookViewModel!.getCellIndex(cell) : 0; - const nextIndex = ui ? this.notebookViewModel!.getNextVisibleCellIndex(index) : index + 1; + const index = cell ? this._notebookViewModel!.getCellIndex(cell) : 0; + const nextIndex = ui ? this._notebookViewModel!.getNextVisibleCellIndex(index) : index + 1; const insertIndex = cell ? (direction === 'above' ? index : nextIndex) : index; - const newCell = this.notebookViewModel!.createCell(insertIndex, initialText.split(/\r?\n/g), language, type, true); + const newCell = this._notebookViewModel!.createCell(insertIndex, initialText.split(/\r?\n/g), language, type, cell?.metadata, true); return newCell; } - private pushIfAbsent(positions: IPosition[], p: IPosition) { - const last = positions.length > 0 ? positions[positions.length - 1] : undefined; - if (!last || last.lineNumber !== p.lineNumber || last.column !== p.column) { - positions.push(p); - } - } - - /** - * Add split point at the beginning and the end; - * Move end of line split points to the beginning of the next line; - * Avoid duplicate split points - */ - private splitPointsToBoundaries(splitPoints: IPosition[], textBuffer: IReadonlyTextBuffer): IPosition[] | null { - const boundaries: IPosition[] = []; - const lineCnt = textBuffer.getLineCount(); - const getLineLen = (lineNumber: number) => { - return textBuffer.getLineLength(lineNumber); - }; - - // split points need to be sorted - splitPoints = splitPoints.sort((l, r) => { - const lineDiff = l.lineNumber - r.lineNumber; - const columnDiff = l.column - r.column; - return lineDiff !== 0 ? lineDiff : columnDiff; - }); - - // eat-up any split point at the beginning, i.e. we ignore the split point at the very beginning - this.pushIfAbsent(boundaries, new Position(1, 1)); - - for (let sp of splitPoints) { - if (getLineLen(sp.lineNumber) + 1 === sp.column && sp.lineNumber < lineCnt) { - sp = new Position(sp.lineNumber + 1, 1); - } - this.pushIfAbsent(boundaries, sp); - } - - // eat-up any split point at the beginning, i.e. we ignore the split point at the very end - this.pushIfAbsent(boundaries, new Position(lineCnt, getLineLen(lineCnt) + 1)); - - // if we only have two then they describe the whole range and nothing needs to be split - return boundaries.length > 2 ? boundaries : null; - } - - private computeCellLinesContents(cell: IEditableCellViewModel, splitPoints: IPosition[]): string[] | null { - const rangeBoundaries = this.splitPointsToBoundaries(splitPoints, cell.textBuffer); - if (!rangeBoundaries) { - return null; - } - const newLineModels: string[] = []; - for (let i = 1; i < rangeBoundaries.length; i++) { - const start = rangeBoundaries[i - 1]; - const end = rangeBoundaries[i]; - - newLineModels.push(cell.textModel.getValueInRange(new Range(start.lineNumber, start.column, end.lineNumber, end.column))); - } - - return newLineModels; - } - async splitNotebookCell(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { - return null; - } + const index = this._notebookViewModel!.getCellIndex(cell); - let splitPoints = cell.getSelectionsStartPosition(); - if (splitPoints && splitPoints.length > 0) { - await cell.resolveTextModel(); - - if (!cell.hasModel()) { - return null; - } - - let newLinesContents = this.computeCellLinesContents(cell, splitPoints); - if (newLinesContents) { - - // update the contents of the first cell - cell.textModel.applyEdits([ - { range: cell.textModel.getFullModelRange(), text: newLinesContents[0] } - ], true); - - // create new cells based on the new text models - const language = cell.model.language; - const kind = cell.cellKind; - let insertIndex = this.notebookViewModel!.getCellIndex(cell) + 1; - const newCells = []; - for (let j = 1; j < newLinesContents.length; j++, insertIndex++) { - newCells.push(this.notebookViewModel!.createCell(insertIndex, newLinesContents[j], language, kind, true)); - } - return newCells; - } - } - - return null; + return this._notebookViewModel!.splitNotebookCell(index); } async joinNotebookCells(cell: ICellViewModel, direction: 'above' | 'below', constraint?: CellKind): Promise { - if (!this.notebookViewModel!.metadata.editable) { - return null; - } + const index = this._notebookViewModel!.getCellIndex(cell); + const ret = await this._notebookViewModel!.joinNotebookCells(index, direction, constraint); - if (constraint && cell.cellKind !== constraint) { - return null; - } + if (ret) { + ret.deletedCells.forEach(cell => { + if (this.pendingLayouts.has(cell)) { + this.pendingLayouts.get(cell)!.dispose(); + } + }); - const index = this.notebookViewModel!.getCellIndex(cell); - if (index === 0 && direction === 'above') { - return null; - } - - if (index === this.notebookViewModel!.length - 1 && direction === 'below') { - return null; - } - - if (direction === 'above') { - const above = this.notebookViewModel!.viewCells[index - 1]; - if (constraint && above.cellKind !== constraint) { - return null; - } - - await above.resolveTextModel(); - if (!above.hasModel()) { - return null; - } - - const insertContent = cell.getText(); - const aboveCellLineCount = above.textModel.getLineCount(); - const aboveCellLastLineEndColumn = above.textModel.getLineLength(aboveCellLineCount); - above.textModel.applyEdits([ - { range: new Range(aboveCellLineCount, aboveCellLastLineEndColumn + 1, aboveCellLineCount, aboveCellLastLineEndColumn + 1), text: insertContent } - ]); - - await this.deleteNotebookCell(cell); - return above; + return ret.cell; } else { - const below = this.notebookViewModel!.viewCells[index + 1]; - if (constraint && below.cellKind !== constraint) { - return null; - } - - await cell.resolveTextModel(); - if (!cell.hasModel()) { - return null; - } - - const insertContent = below.getText(); - - const cellLineCount = cell.textModel.getLineCount(); - const cellLastLineEndColumn = cell.textModel.getLineLength(cellLineCount); - cell.textModel.applyEdits([ - { range: new Range(cellLineCount, cellLastLineEndColumn + 1, cellLineCount, cellLastLineEndColumn + 1), text: insertContent } - ]); - - await this.deleteNotebookCell(below); - return cell; + return null; } } async deleteNotebookCell(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return false; } - const index = this.notebookViewModel!.getCellIndex(cell); - this.notebookViewModel!.deleteCell(index, true); + if (this.pendingLayouts.has(cell)) { + this.pendingLayouts.get(cell)!.dispose(); + } + + const index = this._notebookViewModel!.getCellIndex(cell); + this._notebookViewModel!.deleteCell(index, true); return true; } async moveCellDown(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return false; } - const index = this.notebookViewModel!.getCellIndex(cell); - if (index === this.notebookViewModel!.length - 1) { + const index = this._notebookViewModel!.getCellIndex(cell); + if (index === this._notebookViewModel!.length - 1) { return false; } const newIdx = index + 1; - return this.moveCellToIndex(index, newIdx); + return this._moveCellToIndex(index, newIdx); } async moveCellUp(cell: ICellViewModel): Promise { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return false; } - const index = this.notebookViewModel!.getCellIndex(cell); + const index = this._notebookViewModel!.getCellIndex(cell); if (index === 0) { return false; } const newIdx = index - 1; - return this.moveCellToIndex(index, newIdx); + return this._moveCellToIndex(index, newIdx); } async moveCell(cell: ICellViewModel, relativeToCell: ICellViewModel, direction: 'above' | 'below'): Promise { - if (!this.notebookViewModel!.metadata.editable) { + if (!this._notebookViewModel!.metadata.editable) { return false; } @@ -1035,29 +965,33 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor return false; } - const originalIdx = this.notebookViewModel!.getCellIndex(cell); - const relativeToIndex = this.notebookViewModel!.getCellIndex(relativeToCell); + const originalIdx = this._notebookViewModel!.getCellIndex(cell); + const relativeToIndex = this._notebookViewModel!.getCellIndex(relativeToCell); let newIdx = direction === 'above' ? relativeToIndex : relativeToIndex + 1; if (originalIdx < newIdx) { newIdx--; } - return this.moveCellToIndex(originalIdx, newIdx); + return this._moveCellToIndex(originalIdx, newIdx); } - private async moveCellToIndex(index: number, newIdx: number): Promise { + private async _moveCellToIndex(index: number, newIdx: number): Promise { if (index === newIdx) { return false; } - if (!this.notebookViewModel!.moveCellToIdx(index, newIdx, true)) { + if (!this._notebookViewModel!.moveCellToIdx(index, newIdx, true)) { throw new Error('Notebook Editor move cell, index out of range'); } let r: (val: boolean) => void; DOM.scheduleAtNextAnimationFrame(() => { - this.list?.revealElementInView(this.notebookViewModel!.viewCells[newIdx]); + if (this._isDisposed) { + r(false); + } + + this._list?.revealElementInView(this._notebookViewModel!.viewCells[newIdx]); r(true); }); @@ -1065,21 +999,17 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } editNotebookCell(cell: CellViewModel): void { - if (!cell.getEvaluatedMetadata(this.notebookViewModel!.metadata).editable) { + if (!cell.getEvaluatedMetadata(this._notebookViewModel!.metadata).editable) { return; } cell.editState = CellEditState.Editing; - this.renderedEditors.get(cell)?.focus(); - } - - saveNotebookCell(cell: ICellViewModel): void { - cell.editState = CellEditState.Preview; + this._renderedEditors.get(cell)?.focus(); } getActiveCell() { - let elements = this.list?.getFocusedElements(); + let elements = this._list?.getFocusedElements(); if (elements && elements.length) { return elements[0]; @@ -1089,17 +1019,17 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } cancelNotebookExecution(): void { - if (!this.notebookViewModel!.currentTokenSource) { + if (!this._notebookViewModel!.currentTokenSource) { throw new Error('Notebook is not executing'); } - this.notebookViewModel!.currentTokenSource.cancel(); - this.notebookViewModel!.currentTokenSource = undefined; + this._notebookViewModel!.currentTokenSource.cancel(); + this._notebookViewModel!.currentTokenSource = undefined; } async executeNotebook(): Promise { - if (!this.notebookViewModel!.metadata.runnable) { + if (!this._notebookViewModel!.metadata.runnable) { return; } @@ -1107,21 +1037,21 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } async _executeNotebook(): Promise { - if (this.notebookViewModel!.currentTokenSource) { + if (this._notebookViewModel!.currentTokenSource) { return; } const tokenSource = new CancellationTokenSource(); try { - this.editorExecutingNotebook!.set(true); - this.notebookViewModel!.currentTokenSource = tokenSource; + this._editorExecutingNotebook!.set(true); + this._notebookViewModel!.currentTokenSource = tokenSource; const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; if (provider) { const viewType = provider.id; - const notebookUri = this.notebookViewModel!.uri; + const notebookUri = this._notebookViewModel!.uri; if (this._activeKernel) { - await this.notebookService.executeNotebook2(this.notebookViewModel!.viewType, this.notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); + await this.notebookService.executeNotebook2(this._notebookViewModel!.viewType, this._notebookViewModel!.uri, this._activeKernel.id, tokenSource.token); } else if (provider.kernel) { return await this.notebookService.executeNotebook(viewType, notebookUri, true, tokenSource.token); } else { @@ -1130,8 +1060,8 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } finally { - this.editorExecutingNotebook!.set(false); - this.notebookViewModel!.currentTokenSource = undefined; + this._editorExecutingNotebook!.set(false); + this._notebookViewModel!.currentTokenSource = undefined; tokenSource.dispose(); } } @@ -1147,11 +1077,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor async executeNotebookCell(cell: ICellViewModel): Promise { if (cell.cellKind === CellKind.Markdown) { - cell.editState = CellEditState.Preview; + this.focusNotebookCell(cell, 'container'); return; } - if (!cell.getEvaluatedMetadata(this.notebookViewModel!.metadata).runnable) { + if (!cell.getEvaluatedMetadata(this._notebookViewModel!.metadata).runnable) { return; } @@ -1170,7 +1100,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor const provider = this.notebookService.getContributedNotebookProviders(this.viewModel!.uri)[0]; if (provider) { const viewType = provider.id; - const notebookUri = this.notebookViewModel!.uri; + const notebookUri = this._notebookViewModel!.uri; if (this._activeKernel) { return await this.notebookService.executeNotebookCell2(viewType, notebookUri, cell.handle, this._activeKernel.id, tokenSource.token); @@ -1186,27 +1116,31 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } focusNotebookCell(cell: ICellViewModel, focusItem: 'editor' | 'container' | 'output') { + if (this._isDisposed) { + return; + } + if (focusItem === 'editor') { this.selectElement(cell); - this.list?.focusView(); + this._list?.focusView(); cell.editState = CellEditState.Editing; cell.focusMode = CellFocusMode.Editor; this.revealInCenterIfOutsideViewport(cell); } else if (focusItem === 'output') { this.selectElement(cell); - this.list?.focusView(); + this._list?.focusView(); - if (!this.webview) { + if (!this._webview) { return; } - this.webview.focusOutput(cell.id); + this._webview.focusOutput(cell.id); cell.editState = CellEditState.Preview; cell.focusMode = CellFocusMode.Container; this.revealInCenterIfOutsideViewport(cell); } else { - let itemDOM = this.list?.domElementOfElement(cell); + let itemDOM = this._list?.domElementOfElement(cell); if (document.activeElement && itemDOM && itemDOM.contains(document.activeElement)) { (document.activeElement as HTMLElement).blur(); } @@ -1216,7 +1150,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this.selectElement(cell); this.revealInCenterIfOutsideViewport(cell); - this.list?.focusView(); + this._list?.focusView(); } } @@ -1225,61 +1159,61 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor //#region MISC getLayoutInfo(): NotebookLayoutInfo { - if (!this.list) { + if (!this._list) { throw new Error('Editor is not initalized successfully'); } return { - width: this.dimension!.width, - height: this.dimension!.height, - fontInfo: this.fontInfo! + width: this._dimension!.width, + height: this._dimension!.height, + fontInfo: this._fontInfo! }; } triggerScroll(event: IMouseWheelEvent) { - this.list?.triggerScrollFromMouseWheelEvent(event); + this._list?.triggerScrollFromMouseWheelEvent(event); } createInset(cell: CodeCellViewModel, output: IProcessedOutput, shadowContent: string, offset: number) { - if (!this.webview) { + if (!this._webview) { return; } - let preloads = this.notebookViewModel!.renderers; + let preloads = this._notebookViewModel!.renderers; - if (!this.webview!.insetMapping.has(output)) { - let cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - this.webview!.createInset(cell, output, cellTop, offset, shadowContent, preloads); + if (!this._webview!.insetMapping.has(output)) { + let cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + this._webview!.createInset(cell, output, cellTop, offset, shadowContent, preloads); } else { - let cellTop = this.list?.getAbsoluteTopOfElement(cell) || 0; - let scrollTop = this.list?.scrollTop || 0; + let cellTop = this._list?.getAbsoluteTopOfElement(cell) || 0; + let scrollTop = this._list?.scrollTop || 0; - this.webview!.updateViewScrollTop(-scrollTop, [{ cell: cell, output: output, cellTop: cellTop }]); + this._webview!.updateViewScrollTop(-scrollTop, [{ cell: cell, output: output, cellTop: cellTop }]); } } removeInset(output: IProcessedOutput) { - if (!this.webview) { + if (!this._webview) { return; } - this.webview!.removeInset(output); + this._webview!.removeInset(output); } hideInset(output: IProcessedOutput) { - if (!this.webview) { + if (!this._webview) { return; } - this.webview!.hideInset(output); + this._webview!.hideInset(output); } getOutputRenderer(): OutputRenderer { - return this.outputRenderer; + return this._outputRenderer; } postMessage(message: any) { - this.webview?.webview.sendMessage(message); + this._webview?.webview.postMessage(message); } //#endregion @@ -1300,11 +1234,11 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor this._contributions[contributionId].dispose(); } - this.localStore.clear(); - this.list?.clear(); - this.webview?.dispose(); + this._localStore.clear(); + this._list?.dispose(); + this._webview?.dispose(); - this.overlayContainer.remove(); + this._overlayContainer.remove(); this.viewModel?.dispose(); // this._layoutService.container.removeChild(this.overlayContainer); @@ -1319,20 +1253,47 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditor } } -const embeddedEditorBackground = 'walkThrough.embeddedEditorBackground'; +export const notebookCellBorder = registerColor('notebook.cellBorderColor', { + dark: transparent(PANEL_BORDER, .6), + light: transparent(PANEL_BORDER, .4), + hc: PANEL_BORDER +}, nls.localize('notebook.cellBorderColor', "The border color for notebook cells.")); export const focusedCellIndicator = registerColor('notebook.focusedCellIndicator', { - light: new Color(new RGBA(102, 175, 224)), - dark: new Color(new RGBA(12, 125, 157)), - hc: new Color(new RGBA(0, 73, 122)) -}, nls.localize('notebook.focusedCellIndicator', "The color of the focused notebook cell indicator.")); + light: focusBorder, + dark: focusBorder, + hc: focusBorder +}, nls.localize('notebook.focusedCellIndicator', "The color of the notebook cell indicator.")); + +export const focusedEditorIndicator = registerColor('notebook.focusedEditorIndicator', { + light: focusBorder, + dark: focusBorder, + hc: focusBorder +}, nls.localize('notebook.focusedEditorIndicator', "The color of the notebook cell editor indicator.")); + +export const cellStatusIconSuccess = registerColor('notebookStatusSuccessIcon.foreground', { + light: debugIconStartForeground, + dark: debugIconStartForeground, + hc: debugIconStartForeground +}, nls.localize('notebookStatusSuccessIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); + +export const cellStatusIconError = registerColor('notebookStatusErrorIcon.foreground', { + light: errorForeground, + dark: errorForeground, + hc: errorForeground +}, nls.localize('notebookStatusErrorIcon.foreground', "The error icon color of notebook cells in the cell status bar.")); + +export const cellStatusIconRunning = registerColor('notebookStatusRunningIcon.foreground', { + light: foreground, + dark: foreground, + hc: foreground +}, nls.localize('notebookStatusRunningIcon.foreground', "The running icon color of notebook cells in the cell status bar.")); export const notebookOutputContainerColor = registerColor('notebook.outputContainerBackgroundColor', { - dark: new Color(new RGBA(255, 255, 255, 0.06)), - light: new Color(new RGBA(237, 239, 249)), + dark: notebookCellBorder, + light: notebookCellBorder, hc: null -} - , nls.localize('notebook.outputContainerBackgroundColor', "The Color of the notebook output container background.")); +}, nls.localize('notebook.outputContainerBackgroundColor', "The Color of the notebook output container background.")); // TODO currently also used for toolbar border, if we keep all of this, pick a generic name export const CELL_TOOLBAR_SEPERATOR = registerColor('notebook.cellToolbarSeperator', { @@ -1341,6 +1302,11 @@ export const CELL_TOOLBAR_SEPERATOR = registerColor('notebook.cellToolbarSeperat hc: contrastBorder }, nls.localize('cellToolbarSeperator', "The color of seperator in Cell bottom toolbar")); +export const cellStatusBarItemHover = registerColor('notebook.cellStatusBarItemHoverBackground', { + light: new Color(new RGBA(0, 0, 0, 0.08)), + dark: new Color(new RGBA(255, 255, 255, 0.15)), + hc: new Color(new RGBA(255, 255, 255, 0.15)), +}, nls.localize('notebook.cellStatusBarItemHoverBackground', "The background color of notebook cell status bar items.")); registerThemingParticipant((theme, collector) => { collector.addRule(`.notebookOverlay > .cell-list-container > .monaco-list > .monaco-scrollable-element { @@ -1348,7 +1314,8 @@ registerThemingParticipant((theme, collector) => { box-sizing: border-box; }`); - const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: '#f4f4f4', hc: null }); + // const color = getExtraColor(theme, embeddedEditorBackground, { dark: 'rgba(0, 0, 0, .4)', extra_dark: 'rgba(200, 235, 255, .064)', light: '#f4f4f4', hc: null }); + const color = theme.getColor(editorBackground); if (color) { collector.addRule(`.notebookOverlay .cell .monaco-editor-background, .notebookOverlay .cell .margin-view-overlays, @@ -1386,6 +1353,7 @@ registerThemingParticipant((theme, collector) => { const containerBackground = theme.getColor(notebookOutputContainerColor); if (containerBackground) { collector.addRule(`.notebookOverlay .output { background-color: ${containerBackground}; }`); + collector.addRule(`.notebookOverlay .output-element { background-color: ${containerBackground}; }`); } const editorBackgroundColor = theme.getColor(editorBackground); @@ -1397,8 +1365,8 @@ registerThemingParticipant((theme, collector) => { const cellToolbarSeperator = theme.getColor(CELL_TOOLBAR_SEPERATOR); if (cellToolbarSeperator) { - collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .seperator { background-color: ${cellToolbarSeperator} }`); - collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .seperator-short { background-color: ${cellToolbarSeperator} }`); + collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .separator { background-color: ${cellToolbarSeperator} }`); + collector.addRule(`.notebookOverlay .cell-bottom-toolbar-container .action-item:first-child::after { background-color: ${cellToolbarSeperator} }`); collector.addRule(`.notebookOverlay .monaco-list-row > .monaco-toolbar { border: solid 1px ${cellToolbarSeperator}; }`); collector.addRule(`.notebookOverlay .monaco-list-row:hover .notebook-cell-focus-indicator, .notebookOverlay .monaco-list-row.cell-output-hover .notebook-cell-focus-indicator { border-color: ${cellToolbarSeperator}; }`); @@ -1409,7 +1377,41 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.notebookOverlay .monaco-list-row.focused .notebook-cell-focus-indicator { border-color: ${focusedCellIndicatorColor}; }`); collector.addRule(`.notebookOverlay .monaco-list-row .notebook-cell-focus-indicator { border-color: ${focusedCellIndicatorColor}; }`); collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { background-color: ${focusedCellIndicatorColor}; }`); - collector.addRule(`.notebookOverlay .monaco-list-row.cell-editor-focus .cell-editor-part:before { outline: solid 1px ${focusedCellIndicatorColor}; }`); + } + + const focusedEditorIndicatorColor = theme.getColor(focusedEditorIndicator); + if (focusedEditorIndicatorColor) { + collector.addRule(`.notebookOverlay .monaco-list-row.cell-editor-focus .cell-editor-part:before { outline: solid 1px ${focusedEditorIndicatorColor}; }`); + } + + const editorBorderColor = theme.getColor(notebookCellBorder); + if (editorBorderColor) { + collector.addRule(`.notebookOverlay .monaco-list-row .cell-editor-part:before { outline: solid 1px ${editorBorderColor}; }`); + } + + const headingBorderColor = theme.getColor(notebookCellBorder); + if (headingBorderColor) { + collector.addRule(`.notebookOverlay .cell.markdown h1 { border-color: ${headingBorderColor}; }`); + } + + const cellStatusSuccessIcon = theme.getColor(cellStatusIconSuccess); + if (cellStatusSuccessIcon) { + collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-status .codicon-check { color: ${cellStatusSuccessIcon} }`); + } + + const cellStatusErrorIcon = theme.getColor(cellStatusIconError); + if (cellStatusErrorIcon) { + collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-status .codicon-error { color: ${cellStatusErrorIcon} }`); + } + + const cellStatusRunningIcon = theme.getColor(cellStatusIconRunning); + if (cellStatusRunningIcon) { + collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-run-status .codicon-sync { color: ${cellStatusRunningIcon} }`); + } + + const cellStatusBarHoverBg = theme.getColor(cellStatusBarItemHover); + if (cellStatusBarHoverBg) { + collector.addRule(`.monaco-workbench .notebookOverlay .cell-statusbar-container .cell-language-picker:hover { background-color: ${cellStatusBarHoverBg}; }`); } // const widgetShadowColor = theme.getColor(widgetShadow); @@ -1430,5 +1432,5 @@ registerThemingParticipant((theme, collector) => { collector.addRule(`.notebookOverlay .cell .run-button-container { width: ${CELL_RUN_GUTTER}px; }`); collector.addRule(`.notebookOverlay > .cell-list-container > .cell-list-insertion-indicator { left: ${CELL_MARGIN + CELL_RUN_GUTTER}px; right: ${CELL_MARGIN}px; }`); collector.addRule(`.notebookOverlay .cell-drag-image .cell-editor-container > div { padding: ${EDITOR_TOP_PADDING}px 16px ${EDITOR_BOTTOM_PADDING}px 16px; }`); - collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { left: ${CELL_MARGIN}px; }`); + collector.addRule(`.notebookOverlay .monaco-list .monaco-list-row .notebook-cell-focus-indicator { left: ${CELL_MARGIN}px; bottom: ${BOTTOM_CELL_TOOLBAR_HEIGHT}px; }`); }); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts new file mode 100644 index 0000000000..b2135ac6c9 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidgetService.ts @@ -0,0 +1,158 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { ResourceMap } from 'vs/base/common/map'; +import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; +import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; +import { IEditorGroupsService, IEditorGroup, GroupChangeKind, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IInstantiationService, createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; + +export const INotebookEditorWidgetService = createDecorator('INotebookEditorWidgetService'); + +export interface IBorrowValue { + readonly value: T | undefined; +} + +export interface INotebookEditorWidgetService { + _serviceBrand: undefined; + retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput): IBorrowValue; +} + +class NotebookEditorWidgetService implements INotebookEditorWidgetService { + + readonly _serviceBrand: undefined; + + private _tokenPool = 1; + + private readonly _notebookWidgets = new Map>(); + private readonly _disposables = new DisposableStore(); + + constructor( + @IEditorGroupsService editorGroupService: IEditorGroupsService, + @IEditorService editorService: IEditorService, + ) { + + const groupListener = new Map(); + const onNewGroup = (group: IEditorGroup) => { + const { id } = group; + const listener = group.onDidGroupChange(e => { + const widgets = this._notebookWidgets.get(group.id); + if (!widgets || e.kind !== GroupChangeKind.EDITOR_CLOSE || !(e.editor instanceof NotebookEditorInput)) { + return; + } + const value = widgets.get(e.editor.resource); + if (!value) { + return; + } + value.token = undefined; + this._disposeWidget(value.widget); + widgets.delete(e.editor.resource); + }); + groupListener.set(id, listener); + }; + this._disposables.add(editorGroupService.onDidAddGroup(onNewGroup)); + editorGroupService.groups.forEach(onNewGroup); + + // group removed -> clean up listeners, clean up widgets + this._disposables.add(editorGroupService.onDidRemoveGroup(group => { + const listener = groupListener.get(group.id); + if (listener) { + listener.dispose(); + groupListener.delete(group.id); + } + const widgets = this._notebookWidgets.get(group.id); + this._notebookWidgets.delete(group.id); + if (widgets) { + for (let value of widgets.values()) { + value.token = undefined; + this._disposeWidget(value.widget); + } + } + })); + + // HACK + // we use the open override to spy on tab movements because that's the only + // way to do that... + this._disposables.add(editorService.overrideOpenEditor({ + open: (input, _options, group, context) => { + if (input instanceof NotebookEditorInput && context === OpenEditorContext.MOVE_EDITOR) { + // when moving a notebook editor we release it from its current tab and we + // "place" it into its future slot so that the editor can pick it up from there + this._freeWidget(input, editorGroupService.activeGroup, group); + } + return undefined; + } + })); + } + + private _disposeWidget(widget: NotebookEditorWidget): void { + widget.onWillHide(); + widget.getDomNode().remove(); + widget.dispose(); + } + + private _freeWidget(input: NotebookEditorInput, source: IEditorGroup, target: IEditorGroup): void { + const targetWidget = this._notebookWidgets.get(target.id)?.get(input.resource); + if (targetWidget) { + // not needed + return; + } + + const widget = this._notebookWidgets.get(source.id)?.get(input.resource); + if (!widget) { + throw new Error('no widget at source group'); + } + this._notebookWidgets.get(source.id)?.delete(input.resource); + widget.token = undefined; + + let targetMap = this._notebookWidgets.get(target.id); + if (!targetMap) { + targetMap = new ResourceMap(); + this._notebookWidgets.set(target.id, targetMap); + } + targetMap.set(input.resource, widget); + } + + retrieveWidget(accessor: ServicesAccessor, group: IEditorGroup, input: NotebookEditorInput): IBorrowValue { + + let value = this._notebookWidgets.get(group.id)?.get(input.resource); + + if (!value) { + // NEW widget + const instantiationService = accessor.get(IInstantiationService); + const widget = instantiationService.createInstance(NotebookEditorWidget); + widget.createEditor(); + const token = this._tokenPool++; + value = { widget, token }; + + let map = this._notebookWidgets.get(group.id); + if (!map) { + map = new ResourceMap(); + this._notebookWidgets.set(group.id, map); + } + map.set(input.resource, value); + + } else { + // reuse a widget which was either free'ed before or which + // is simply being reused... + value.token = this._tokenPool++; + } + + return this._createBorrowValue(value.token!, value); + } + + private _createBorrowValue(myToken: number, widget: { widget: NotebookEditorWidget, token: number | undefined }): IBorrowValue { + return { + get value() { + return widget.token === myToken ? widget.widget : undefined; + } + }; + } +} + +registerSingleton(INotebookEditorWidgetService, NotebookEditorWidgetService, true); diff --git a/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts b/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts index 84403af5d4..8362c71c67 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookRegistry.ts @@ -6,8 +6,6 @@ import { CellOutputKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { BrandedService, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { NotebookEditorInput } from 'vs/workbench/contrib/notebook/browser/notebookEditorInput'; -import { NotebookEditorWidget } from 'vs/workbench/contrib/notebook/browser/notebookEditorWidget'; export type IOutputTransformCtor = IConstructorSignature1; @@ -17,56 +15,16 @@ export interface IOutputTransformDescription { ctor: IOutputTransformCtor; } -export namespace NotebookRegistry { - export function getOutputTransformContributions(): IOutputTransformDescription[] { - return NotebookRegistryImpl.INSTANCE.getNotebookOutputTransform(); - } - export function claimNotebookEditorWidget(editorInput: NotebookEditorInput, widget: NotebookEditorWidget) { - NotebookRegistryImpl.INSTANCE.claimNotebookEditorWidget(editorInput, widget); - } +export const NotebookRegistry = new class NotebookRegistryImpl { - export function releaseNotebookEditorWidget(editorInput: NotebookEditorInput) { - NotebookRegistryImpl.INSTANCE.releaseNotebookEditorWidget(editorInput); - } - - export function getNotebookEditorWidget(editorInput: NotebookEditorInput): NotebookEditorWidget | undefined { - return NotebookRegistryImpl.INSTANCE.getNotebookEditorWidget(editorInput); - } -} - -export function registerOutputTransform(id: string, kind: CellOutputKind, ctor: { new(editor: INotebookEditor, ...services: Services): IOutputTransformContribution }): void { - NotebookRegistryImpl.INSTANCE.registerOutputTransform(id, kind, ctor); -} - -class NotebookRegistryImpl { - - static readonly INSTANCE = new NotebookRegistryImpl(); - - private readonly outputTransforms: IOutputTransformDescription[]; - private readonly notebookEditorWidgetOwnership = new Map(); - - constructor() { - this.outputTransforms = []; - } + readonly outputTransforms: IOutputTransformDescription[] = []; registerOutputTransform(id: string, kind: CellOutputKind, ctor: { new(editor: INotebookEditor, ...services: Services): IOutputTransformContribution }): void { this.outputTransforms.push({ id: id, kind: kind, ctor: ctor as IOutputTransformCtor }); } - getNotebookOutputTransform(): IOutputTransformDescription[] { + getOutputTransformContributions(): IOutputTransformDescription[] { return this.outputTransforms.slice(0); } - - claimNotebookEditorWidget(editorInput: NotebookEditorInput, widget: NotebookEditorWidget) { - this.notebookEditorWidgetOwnership.set(editorInput, widget); - } - - releaseNotebookEditorWidget(editorInput: NotebookEditorInput) { - this.notebookEditorWidgetOwnership.delete(editorInput); - } - - getNotebookEditorWidget(editorInput: NotebookEditorInput) { - return this.notebookEditorWidgetOwnership.get(editorInput); - } -} +}; diff --git a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts index 19faad7e98..420c6c0d11 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookServiceImpl.ts @@ -5,13 +5,12 @@ import * as nls from 'vs/nls'; import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { notebookProviderExtensionPoint, notebookRendererExtensionPoint } from 'vs/workbench/contrib/notebook/browser/extensionPoint'; -import { NotebookProviderInfo } from 'vs/workbench/contrib/notebook/common/notebookProvider'; +import { notebookProviderExtensionPoint, notebookRendererExtensionPoint, INotebookEditorContribution } from 'vs/workbench/contrib/notebook/browser/extensionPoint'; +import { NotebookProviderInfo, NotebookEditorDescriptor } from 'vs/workbench/contrib/notebook/common/notebookProvider'; import { NotebookExtensionDescription } from 'vs/workbench/api/common/extHost.protocol'; import { Emitter, Event } from 'vs/base/common/event'; -import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, CellOutputKind, ITransformedDisplayOutputDto, IDisplayOutput, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes, IOrderedMimeType, mimeTypeSupportedByCore, IOutputRenderRequestOutputInfo, IOutputRenderRequestCellInfo, NotebookCellOutputsSplice, ICellEditOperation, CellEditType, ICellInsertEdit, IOutputRenderResponse, IProcessedOutput, BUILTIN_RENDERER_ID } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, ICellDto2, INotebookKernelInfo, CellOutputKind, ITransformedDisplayOutputDto, IDisplayOutput, ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER, NOTEBOOK_DISPLAY_ORDER, sortMimeTypes, IOrderedMimeType, mimeTypeSupportedByCore, IOutputRenderRequestOutputInfo, IOutputRenderRequestCellInfo, NotebookCellOutputsSplice, ICellEditOperation, CellEditType, ICellInsertEdit, IOutputRenderResponse, IProcessedOutput, BUILTIN_RENDERER_ID, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { NotebookOutputRendererInfo } from 'vs/workbench/contrib/notebook/common/notebookOutputRenderer'; import { Iterable } from 'vs/base/common/iterator'; @@ -19,42 +18,95 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService, ICustomEditorViewTypesHandler, ICustomEditorInfo } from 'vs/workbench/services/editor/common/editorService'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { NotebookEditorModelManager } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; import { INotebookService, IMainNotebookController } from 'vs/workbench/contrib/notebook/common/notebookService'; import * as glob from 'vs/base/common/glob'; -import { basename } from 'vs/base/common/resources'; +import { basename } from 'vs/base/common/path'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; +import { Memento } from 'vs/workbench/common/memento'; +import { StorageScope, IStorageService } from 'vs/platform/storage/common/storage'; +import { IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { generateUuid } from 'vs/base/common/uuid'; function MODEL_ID(resource: URI): string { return resource.toString(); } -export class NotebookProviderInfoStore { - private readonly contributedEditors = new Map(); +export class NotebookProviderInfoStore implements IDisposable { + private static readonly CUSTOM_EDITORS_STORAGE_ID = 'notebookEditors'; + private static readonly CUSTOM_EDITORS_ENTRY_ID = 'editors'; + + private readonly _memento: Memento; + constructor(storageService: IStorageService) { + this._memento = new Memento(NotebookProviderInfoStore.CUSTOM_EDITORS_STORAGE_ID, storageService); + + const mementoObject = this._memento.getMemento(StorageScope.GLOBAL); + for (const info of (mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] || []) as NotebookEditorDescriptor[]) { + this.add(new NotebookProviderInfo(info)); + } + } + + update(extensions: readonly IExtensionPointUser[]) { + this.clear(); + + for (const extension of extensions) { + for (const notebookContribution of extension.value) { + this.add(new NotebookProviderInfo({ + id: notebookContribution.viewType, + displayName: notebookContribution.displayName, + selector: notebookContribution.selector || [], + priority: this._convertPriority(notebookContribution.priority), + providerDisplayName: extension.description.isBuiltin ? nls.localize('builtinProviderDisplayName', "Built-in") : extension.description.displayName || extension.description.identifier.value, + providerExtensionLocation: extension.description.extensionLocation + })); + } + } + + const mementoObject = this._memento.getMemento(StorageScope.GLOBAL); + mementoObject[NotebookProviderInfoStore.CUSTOM_EDITORS_ENTRY_ID] = Array.from(this._contributedEditors.values()); + this._memento.saveMemento(); + } + + private _convertPriority(priority?: string) { + if (!priority) { + return NotebookEditorPriority.default; + } + + if (priority === NotebookEditorPriority.default) { + return NotebookEditorPriority.default; + } + + return NotebookEditorPriority.option; + + } + + dispose(): void { + } + + private readonly _contributedEditors = new Map(); clear() { - this.contributedEditors.clear(); + this._contributedEditors.clear(); } get(viewType: string): NotebookProviderInfo | undefined { - return this.contributedEditors.get(viewType); + return this._contributedEditors.get(viewType); } add(info: NotebookProviderInfo): void { - if (this.contributedEditors.has(info.id)) { + if (this._contributedEditors.has(info.id)) { return; } - this.contributedEditors.set(info.id, info); + this._contributedEditors.set(info.id, info); } getContributedNotebook(resource: URI): readonly NotebookProviderInfo[] { - return [...Iterable.filter(this.contributedEditors.values(), customEditor => customEditor.matches(resource))]; + return [...Iterable.filter(this._contributedEditors.values(), customEditor => resource.scheme === 'untitled' || customEditor.matches(resource))]; } public [Symbol.iterator](): Iterator { - return this.contributedEditors.values(); + return this._contributedEditors.values(); } } @@ -97,22 +149,26 @@ class ModelData implements IDisposable { } } export class NotebookService extends Disposable implements INotebookService, ICustomEditorViewTypesHandler { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _notebookProviders = new Map(); private readonly _notebookRenderers = new Map(); private readonly _notebookKernels = new Map(); - notebookProviderInfoStore: NotebookProviderInfoStore = new NotebookProviderInfoStore(); + notebookProviderInfoStore: NotebookProviderInfoStore; notebookRenderersInfoStore: NotebookOutputRendererInfoStore = new NotebookOutputRendererInfoStore(); - private readonly _models: { [modelId: string]: ModelData; }; + private readonly _models = new Map(); private _onDidChangeActiveEditor = new Emitter(); onDidChangeActiveEditor: Event = this._onDidChangeActiveEditor.event; private _onDidChangeVisibleEditors = new Emitter(); onDidChangeVisibleEditors: Event = this._onDidChangeVisibleEditors.event; private readonly _onNotebookEditorAdd: Emitter = this._register(new Emitter()); public readonly onNotebookEditorAdd: Event = this._onNotebookEditorAdd.event; - private readonly _onNotebookEditorRemove: Emitter = this._register(new Emitter()); - public readonly onNotebookEditorRemove: Event = this._onNotebookEditorRemove.event; - private readonly _notebookEditors: { [editorId: string]: INotebookEditor; }; + private readonly _onNotebookEditorsRemove: Emitter = this._register(new Emitter()); + public readonly onNotebookEditorsRemove: Event = this._onNotebookEditorsRemove.event; + private readonly _onNotebookDocumentAdd: Emitter = this._register(new Emitter()); + public readonly onNotebookDocumentAdd: Event = this._onNotebookDocumentAdd.event; + private readonly _onNotebookDocumentRemove: Emitter = this._register(new Emitter()); + public readonly onNotebookDocumentRemove: Event = this._onNotebookDocumentRemove.event; + private readonly _notebookEditors = new Map(); private readonly _onDidChangeViewTypes = new Emitter(); onDidChangeViewTypes: Event = this._onDidChangeViewTypes.event; @@ -121,36 +177,23 @@ export class NotebookService extends Disposable implements INotebookService, ICu onDidChangeKernels: Event = this._onDidChangeKernels.event; private cutItems: NotebookCellTextModel[] | undefined; - modelManager: NotebookEditorModelManager; private _displayOrder: { userOrder: string[], defaultOrder: string[] } = Object.create(null); constructor( - @IExtensionService private readonly extensionService: IExtensionService, - @IEditorService private readonly editorService: IEditorService, - @IConfigurationService private readonly configurationService: IConfigurationService, - @IAccessibilityService private readonly accessibilityService: IAccessibilityService, - @IInstantiationService private readonly instantiationService: IInstantiationService + @IExtensionService private readonly _extensionService: IExtensionService, + @IEditorService private readonly _editorService: IEditorService, + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IAccessibilityService private readonly _accessibilityService: IAccessibilityService, + @IStorageService private readonly _storageService: IStorageService ) { super(); - this._models = {}; - this._notebookEditors = Object.create(null); - this.modelManager = this.instantiationService.createInstance(NotebookEditorModelManager); + this.notebookProviderInfoStore = new NotebookProviderInfoStore(this._storageService); + this._register(this.notebookProviderInfoStore); notebookProviderExtensionPoint.setHandler((extensions) => { - this.notebookProviderInfoStore.clear(); + this.notebookProviderInfoStore.update(extensions); - for (const extension of extensions) { - for (const notebookContribution of extension.value) { - this.notebookProviderInfoStore.add(new NotebookProviderInfo({ - id: notebookContribution.viewType, - displayName: notebookContribution.displayName, - selector: notebookContribution.selector || [], - providerDisplayName: extension.description.isBuiltin ? nls.localize('builtinProviderDisplayName', "Built-in") : extension.description.displayName || extension.description.identifier.value, - providerExtensionLocation: extension.description.extensionLocation - })); - } - } // console.log(this._notebookProviderInfoStore); }); @@ -170,25 +213,25 @@ export class NotebookService extends Disposable implements INotebookService, ICu // console.log(this.notebookRenderersInfoStore); }); - this.editorService.registerCustomEditorViewTypesHandler('Notebook', this); + this._editorService.registerCustomEditorViewTypesHandler('Notebook', this); const updateOrder = () => { - let userOrder = this.configurationService.getValue('notebook.displayOrder'); + let userOrder = this._configurationService.getValue('notebook.displayOrder'); this._displayOrder = { - defaultOrder: this.accessibilityService.isScreenReaderOptimized() ? ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER : NOTEBOOK_DISPLAY_ORDER, + defaultOrder: this._accessibilityService.isScreenReaderOptimized() ? ACCESSIBLE_NOTEBOOK_DISPLAY_ORDER : NOTEBOOK_DISPLAY_ORDER, userOrder: userOrder }; }; updateOrder(); - this._register(this.configurationService.onDidChangeConfiguration(e => { + this._register(this._configurationService.onDidChangeConfiguration(e => { if (e.affectedKeys.indexOf('notebook.displayOrder') >= 0) { updateOrder(); } })); - this._register(this.accessibilityService.onDidChangeScreenReaderOptimized(() => { + this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => { updateOrder(); })); } @@ -203,8 +246,11 @@ export class NotebookService extends Disposable implements INotebookService, ICu async canResolve(viewType: string): Promise { if (!this._notebookProviders.has(viewType)) { + await this._extensionService.whenInstalledExtensionsRegistered(); + // notebook providers/kernels/renderers might use `*` as activation event. + await this._extensionService.activateByEvent(`*`); // this awaits full activation of all matching extensions - await this.extensionService.activateByEvent(`onNotebookEditor:${viewType}`); + await this._extensionService.activateByEvent(`onNotebookEditor:${viewType}`); } return this._notebookProviders.has(viewType); } @@ -270,7 +316,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu private _notebookKernelMatch(resource: URI, selectors: (string | glob.IRelativePattern)[]): boolean { for (let i = 0; i < selectors.length; i++) { const pattern = typeof selectors[i] !== 'string' ? selectors[i] : selectors[i].toString(); - if (glob.match(pattern, basename(resource).toLowerCase())) { + if (glob.match(pattern, basename(resource.fsPath).toLowerCase())) { return true; } } @@ -291,7 +337,6 @@ export class NotebookService extends Disposable implements INotebookService, ICu } const notebookModel = await provider.controller.createNotebook(viewType, uri, { metadata, languages, cells }, false, editorId); - await this.transformTextModelOutputs(notebookModel!); if (!notebookModel) { return undefined; } @@ -300,29 +345,42 @@ export class NotebookService extends Disposable implements INotebookService, ICu const modelId = MODEL_ID(uri); const modelData = new ModelData( notebookModel, - (model) => this._onWillDispose(model), + (model) => this._onWillDisposeDocument(model), ); - this._models[modelId] = modelData; + this._models.set(modelId, modelData); + this._onNotebookDocumentAdd.fire([notebookModel.uri]); + // after the document is added to the store and sent to ext host, we transform the ouputs + await this.transformTextModelOutputs(notebookModel!); return modelData.model; } - async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string): Promise { + async resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise { const provider = this._notebookProviders.get(viewType); if (!provider) { return undefined; } - const notebookModel = await provider.controller.createNotebook(viewType, uri, undefined, forceReload, editorId); - await this.transformTextModelOutputs(notebookModel!); + const notebookModel = await provider.controller.createNotebook(viewType, uri, undefined, forceReload, editorId, backupId); + if (!notebookModel) { + return undefined; + } // new notebook model created const modelId = MODEL_ID(uri); const modelData = new ModelData( notebookModel!, - (model) => this._onWillDispose(model), + (model) => this._onWillDisposeDocument(model), ); - this._models[modelId] = modelData; + this._models.set(modelId, modelData); + this._onNotebookDocumentAdd.fire([notebookModel!.uri]); + // after the document is added to the store and sent to ext host, we transform the ouputs + await this.transformTextModelOutputs(notebookModel!); + + if (editorId) { + await provider.controller.resolveNotebookEditor(viewType, uri, editorId); + } + return modelData.model; } @@ -377,14 +435,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu outputs.forEach((output, index) => { if (output.outputKind === CellOutputKind.Rich) { // TODO no string[] casting - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -411,14 +469,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu const outputRequest: IOutputRenderRequestOutputInfo[] = []; outputs.map((output, index) => { if (output.outputKind === CellOutputKind.Rich) { - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -447,14 +505,14 @@ export class NotebookService extends Disposable implements INotebookService, ICu const outputRequest: IOutputRenderRequestOutputInfo[] = []; outputs.map((output, index) => { if (output.outputKind === CellOutputKind.Rich) { - const ret = this._transformMimeTypes(output, textModel.metadata.displayOrder as string[] || []); + const ret = this._transformMimeTypes(output, output.outputId, textModel.metadata.displayOrder as string[] || []); const orderedMimeTypes = ret.orderedMimeTypes!; const pickedMimeTypeIndex = ret.pickedMimeTypeIndex!; output.pickedMimeTypeIndex = pickedMimeTypeIndex; output.orderedMimeTypes = orderedMimeTypes; if (orderedMimeTypes[pickedMimeTypeIndex!].rendererId && orderedMimeTypes[pickedMimeTypeIndex].rendererId !== BUILTIN_RENDERER_ID) { - outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output }); + outputRequest.push({ index, handlerId: orderedMimeTypes[pickedMimeTypeIndex].rendererId!, mimeType: orderedMimeTypes[pickedMimeTypeIndex].mimeType, output: output, outputId: output.outputId }); renderers.add(orderedMimeTypes[pickedMimeTypeIndex].rendererId!); } } @@ -478,6 +536,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu outputs: [ { index: 0, + outputId: generateUuid(), handlerId: rendererId, mimeType: mimeType, output: output @@ -502,7 +561,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu return undefined; // {{SQL CARBON EDIT}} strict-null-checks } - private _transformMimeTypes(output: IDisplayOutput, documentDisplayOrder: string[]): ITransformedDisplayOutputDto { + private _transformMimeTypes(output: IDisplayOutput, outputId: string, documentDisplayOrder: string[]): ITransformedDisplayOutputDto { let mimeTypes = Object.keys(output.data); let coreDisplayOrder = this._displayOrder; const sorted = sortMimeTypes(mimeTypes, coreDisplayOrder?.userOrder || [], documentDisplayOrder, coreDisplayOrder?.defaultOrder || []); @@ -547,6 +606,7 @@ export class NotebookService extends Disposable implements INotebookService, ICu return { outputKind: output.outputKind, + outputId, data: output.data, orderedMimeTypes: orderMimeTypes, pickedMimeTypeIndex: 0 @@ -610,30 +670,37 @@ export class NotebookService extends Disposable implements INotebookService, ICu } removeNotebookEditor(editor: INotebookEditor) { - if (delete this._notebookEditors[editor.getId()]) { - this._onNotebookEditorRemove.fire(editor); + let editorCache = this._notebookEditors.get(editor.getId()); + + if (editorCache) { + this._notebookEditors.delete(editor.getId()); + this._onNotebookEditorsRemove.fire([editor]); } } addNotebookEditor(editor: INotebookEditor) { - this._notebookEditors[editor.getId()] = editor; + this._notebookEditors.set(editor.getId(), editor); this._onNotebookEditorAdd.fire(editor); } listNotebookEditors(): INotebookEditor[] { - return Object.keys(this._notebookEditors).map(id => this._notebookEditors[id]); + return [...this._notebookEditors].map(e => e[1]); + } + + listVisibleNotebookEditors(): INotebookEditor[] { + return this._editorService.visibleEditorPanes + .filter(pane => (pane as any).isNotebookEditor) + .map(pane => pane.getControl() as INotebookEditor) + .filter(editor => !!editor) + .filter(editor => this._notebookEditors.has(editor.getId())); } listNotebookDocuments(): NotebookTextModel[] { - return Object.keys(this._models).map(id => this._models[id].model); + return [...this._models].map(e => e[1].model); } destoryNotebookDocument(viewType: string, notebook: INotebookTextModel): void { - let provider = this._notebookProviders.get(viewType); - - if (provider) { - provider.controller.removeNotebookDocument(notebook); - } + this._onWillDisposeDocument(notebook); } updateActiveNotebookEditor(editor: INotebookEditor | null) { @@ -641,7 +708,8 @@ export class NotebookService extends Disposable implements INotebookService, ICu } updateVisibleNotebookEditor(editors: string[]) { - this._onDidChangeVisibleEditors.fire(editors); + const alreadyCreated = editors.filter(editorId => this._notebookEditors.has(editorId)); + this._onDidChangeVisibleEditors.fire(alreadyCreated); } setToCopy(items: NotebookCellTextModel[]) { @@ -672,6 +740,16 @@ export class NotebookService extends Disposable implements INotebookService, ICu return false; } + async backup(viewType: string, uri: URI, token: CancellationToken): Promise { + let provider = this._notebookProviders.get(viewType); + + if (provider) { + return provider.controller.backup(uri, token); + } + + return undefined; // {{SQL CARBON EDIT}} strict-null-check + } + onDidReceiveMessage(viewType: string, editorId: string, message: any): void { let provider = this._notebookProviders.get(viewType); @@ -680,13 +758,33 @@ export class NotebookService extends Disposable implements INotebookService, ICu } } - private _onWillDispose(model: INotebookTextModel): void { + private _onWillDisposeDocument(model: INotebookTextModel): void { let modelId = MODEL_ID(model.uri); - let modelData = this._models[modelId]; - delete this._models[modelId]; - modelData?.dispose(); + let modelData = this._models.get(modelId); + this._models.delete(modelId); - // this._onModelRemoved.fire(model); + if (modelData) { + // delete editors and documents + const willRemovedEditors: INotebookEditor[] = []; + this._notebookEditors.forEach(editor => { + if (editor.textModel === modelData!.model) { + willRemovedEditors.push(editor); + } + }); + + willRemovedEditors.forEach(e => this._notebookEditors.delete(e.getId())); + + let provider = this._notebookProviders.get(modelData!.model.viewType); + + if (provider) { + provider.controller.removeNotebookDocument(modelData!.model); + } + + + this._onNotebookEditorsRemove.fire(willRemovedEditors.map(e => e)); + this._onNotebookDocumentRemove.fire([modelData.model.uri]); + modelData?.dispose(); + } } } diff --git a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts index 40f55898f6..4de0ab6ee2 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/notebookCellList.ts @@ -6,7 +6,7 @@ import * as DOM from 'vs/base/browser/dom'; import { IMouseWheelEvent } from 'vs/base/browser/mouseEvent'; import { IListRenderer, IListVirtualDelegate, ListError } from 'vs/base/browser/ui/list/list'; -import { IListStyles, IStyleController, MouseController, IListOptions } from 'vs/base/browser/ui/list/listWidget'; +import { IListStyles, IStyleController } from 'vs/base/browser/ui/list/listWidget'; import { Emitter, Event } from 'vs/base/common/event'; import { DisposableStore, IDisposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; @@ -19,10 +19,11 @@ 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, ICellRange, ICellViewModel, INotebookCellList, reduceCellRanges, CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CellRevealPosition, CellRevealType, CursorAtBoundary, getVisibleCells, ICellRange, ICellViewModel, INotebookCellList, reduceCellRanges, CellEditState, CellFocusMode } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellViewModel, NotebookViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { diff, IProcessedOutput, NOTEBOOK_EDITOR_CURSOR_BOUNDARY, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { clamp } from 'vs/base/common/numbers'; +import { SCROLLABLE_ELEMENT_PADDING_TOP } from 'vs/workbench/contrib/notebook/browser/constants'; export class NotebookCellList extends WorkbenchList implements IDisposable, IStyleController, INotebookCellList { get onWillScroll(): Event { return this.view.onWillScroll; } @@ -55,7 +56,6 @@ export class NotebookCellList extends WorkbenchList implements ID @IThemeService themeService: IThemeService, @IConfigurationService configurationService: IConfigurationService, @IKeybindingService keybindingService: IKeybindingService - ) { super(listUser, container, delegate, renderers, options, contextKeyService, listService, themeService, configurationService, keybindingService); this._previousFocusedElements = this.getFocusedElements(); @@ -67,18 +67,9 @@ export class NotebookCellList extends WorkbenchList implements ID }); this._previousFocusedElements = e.elements; - // if focus is in the list, but is not inside the focused element, then reset focus - setTimeout(() => { - if (DOM.isAncestor(document.activeElement, this.rowsContainer)) { - const focusedElement = this.getFocusedElements()[0]; - if (focusedElement) { - const focusedDomElement = this.domElementOfElement(focusedElement); - if (focusedDomElement && !DOM.isAncestor(document.activeElement, focusedDomElement)) { - focusedDomElement.focus(); - } - } - } - }, 0); + if (document.activeElement && document.activeElement.classList.contains('webview')) { + super.domFocus(); + } })); const notebookEditorCursorAtBoundaryContext = NOTEBOOK_EDITOR_CURSOR_BOUNDARY.bindTo(contextKeyService); @@ -133,6 +124,13 @@ export class NotebookCellList extends WorkbenchList implements ID notebookEditorCursorAtBoundaryContext.set('none'); })); + this._localDisposableStore.add(this.view.onMouseDblClick(() => { + const focus = this.getFocusedElements()[0]; + if (focus && focus.cellKind === CellKind.Markdown) { + focus.editState = CellEditState.Editing; + focus.focusMode = CellFocusMode.Editor; + } + })); } elementAt(position: number): ICellViewModel | undefined { @@ -155,10 +153,6 @@ export class NotebookCellList extends WorkbenchList implements ID return this.view.elementHeight(index); } - protected createMouseController(_options: IListOptions): MouseController { - return new NotebookMouseController(this); - } - detachViewModel() { this._viewModelStore.clear(); this._viewModel = null; @@ -446,51 +440,51 @@ export class NotebookCellList extends WorkbenchList implements ID } } - revealElementLineInView(cell: ICellViewModel, line: number): void { + async revealElementLineInViewAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealLineInView(index, line); + return this._revealLineInViewAsync(index, line); } } - revealElementLineInCenter(cell: ICellViewModel, line: number) { + async revealElementLineInCenterAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealLineInCenter(index, line); + return this._revealLineInCenterAsync(index, line); } } - revealElementLineInCenterIfOutsideViewport(cell: ICellViewModel, line: number) { + async revealElementLineInCenterIfOutsideViewportAsync(cell: ICellViewModel, line: number): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealLineInCenterIfOutsideViewport(index, line); + return this._revealLineInCenterIfOutsideViewportAsync(index, line); } } - revealElementRangeInView(cell: ICellViewModel, range: Range): void { + async revealElementRangeInViewAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealRangeInView(index, range); + return this._revealRangeInView(index, range); } } - revealElementRangeInCenter(cell: ICellViewModel, range: Range): void { + async revealElementRangeInCenterAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealRangeInCenter(index, range); + return this._revealRangeInCenterAsync(index, range); } } - revealElementRangeInCenterIfOutsideViewport(cell: ICellViewModel, range: Range): void { + async revealElementRangeInCenterIfOutsideViewportAsync(cell: ICellViewModel, range: Range): Promise { const index = this._getViewIndexUpperBound(cell); if (index !== undefined) { - this._revealRangeInCenterIfOutsideViewport(index, range); + return this._revealRangeInCenterIfOutsideViewportAsync(index, range); } } @@ -534,7 +528,10 @@ export class NotebookCellList extends WorkbenchList implements ID // override domFocus() { - if (document.activeElement && this.view.domNode.contains(document.activeElement)) { + const focused = this.getFocusedElements()[0]; + const focusedDomElement = this.domElementOfElement(focused); + + if (document.activeElement && focusedDomElement && focusedDomElement.contains(document.activeElement)) { // for example, when focus goes into monaco editor, if we refocus the list view, the editor will lose focus. return; } @@ -546,28 +543,35 @@ export class NotebookCellList extends WorkbenchList implements ID super.domFocus(); } + getViewScrollTop() { + return this.view.getScrollTop(); + } + + getViewScrollBottom() { + return this.getViewScrollTop() + this.view.renderHeight - SCROLLABLE_ELEMENT_PADDING_TOP; + } + private _revealRange(viewIndex: number, range: Range, revealType: CellRevealType, newlyCreated: boolean, alignToBottom: boolean) { const element = this.view.element(viewIndex); - const scrollTop = this.view.getScrollTop(); - const wrapperBottom = scrollTop + this.view.renderHeight; - const startLineNumber = range.startLineNumber; - const lineOffset = element.getLineScrollTopOffset(startLineNumber); + const scrollTop = this.getViewScrollTop(); + const wrapperBottom = this.getViewScrollBottom(); + const positionOffset = element.getPositionScrollTopOffset(range.startLineNumber, range.startColumn); const elementTop = this.view.elementTop(viewIndex); - const lineTop = elementTop + lineOffset; + const positionTop = elementTop + positionOffset; // TODO@rebornix 30 ---> line height * 1.5 - if (lineTop < scrollTop) { - this.view.setScrollTop(lineTop - 30); - } else if (lineTop > wrapperBottom) { - this.view.setScrollTop(scrollTop + lineTop - wrapperBottom + 30); + if (positionTop < scrollTop) { + this.view.setScrollTop(positionTop - 30); + } else if (positionTop > wrapperBottom) { + this.view.setScrollTop(scrollTop + positionTop - wrapperBottom + 30); } else if (newlyCreated) { // newly scrolled into view if (alignToBottom) { // align to the bottom - this.view.setScrollTop(scrollTop + lineTop - wrapperBottom + 30); + this.view.setScrollTop(scrollTop + positionTop - wrapperBottom + 30); } else { // align to to top - this.view.setScrollTop(lineTop - 30); + this.view.setScrollTop(positionTop - 30); } } @@ -579,9 +583,9 @@ export class NotebookCellList extends WorkbenchList implements ID // List items have real dynamic heights, which means after we set `scrollTop` based on the `elementTop(index)`, the element at `index` might still be removed from the view once all relayouting tasks are done. // For example, we scroll item 10 into the view upwards, in the first round, items 7, 8, 9, 10 are all in the viewport. Then item 7 and 8 resize themselves to be larger and finally item 10 is removed from the view. // To ensure that item 10 is always there, we need to scroll item 10 to the top edge of the viewport. - private _revealRangeInternal(viewIndex: number, range: Range, revealType: CellRevealType) { - const scrollTop = this.view.getScrollTop(); - const wrapperBottom = scrollTop + this.view.renderHeight; + private async _revealRangeInternalAsync(viewIndex: number, range: Range, revealType: CellRevealType): Promise { + const scrollTop = this.getViewScrollTop(); + const wrapperBottom = this.getViewScrollBottom(); const elementTop = this.view.elementTop(viewIndex); const element = this.view.element(viewIndex); @@ -607,26 +611,26 @@ export class NotebookCellList extends WorkbenchList implements ID }); }); - editorAttachedPromise.then(() => { + return editorAttachedPromise.then(() => { this._revealRange(viewIndex, range, revealType, true, upwards); }); } } - private _revealLineInView(viewIndex: number, line: number) { - this._revealRangeInternal(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); + private async _revealLineInViewAsync(viewIndex: number, line: number): Promise { + return this._revealRangeInternalAsync(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); } - private _revealRangeInView(viewIndex: number, range: Range): void { - this._revealRangeInternal(viewIndex, range, CellRevealType.Range); + private async _revealRangeInView(viewIndex: number, range: Range): Promise { + return this._revealRangeInternalAsync(viewIndex, range, CellRevealType.Range); } - private _revealRangeInCenterInternal(viewIndex: number, range: Range, revealType: CellRevealType) { + private async _revealRangeInCenterInternalAsync(viewIndex: number, range: Range, revealType: CellRevealType): Promise { const reveal = (viewIndex: number, range: Range, revealType: CellRevealType) => { const element = this.view.element(viewIndex); - let lineOffset = element.getLineScrollTopOffset(range.startLineNumber); - let lineOffsetInView = this.view.elementTop(viewIndex) + lineOffset; - this.view.setScrollTop(lineOffsetInView - this.view.renderHeight / 2); + let positionOffset = element.getPositionScrollTopOffset(range.startLineNumber, range.startColumn); + let positionOffsetInView = this.view.elementTop(viewIndex) + positionOffset; + this.view.setScrollTop(positionOffsetInView - this.view.renderHeight / 2); if (revealType === CellRevealType.Range) { element.revealRangeInCenter(range); @@ -639,41 +643,42 @@ export class NotebookCellList extends WorkbenchList implements ID const element = this.view.element(viewIndex); if (!element.editorAttached) { - getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); + return getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); } else { reveal(viewIndex, range, revealType); } } - private _revealLineInCenter(viewIndex: number, line: number) { - this._revealRangeInCenterInternal(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); + private async _revealLineInCenterAsync(viewIndex: number, line: number): Promise { + return this._revealRangeInCenterInternalAsync(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); } - private _revealRangeInCenter(viewIndex: number, range: Range): void { - this._revealRangeInCenterInternal(viewIndex, range, CellRevealType.Range); + private _revealRangeInCenterAsync(viewIndex: number, range: Range): Promise { + return this._revealRangeInCenterInternalAsync(viewIndex, range, CellRevealType.Range); } - private _revealRangeInCenterIfOutsideViewportInternal(viewIndex: number, range: Range, revealType: CellRevealType) { + private async _revealRangeInCenterIfOutsideViewportInternalAsync(viewIndex: number, range: Range, revealType: CellRevealType): Promise { const reveal = (viewIndex: number, range: Range, revealType: CellRevealType) => { const element = this.view.element(viewIndex); - let lineOffset = element.getLineScrollTopOffset(range.startLineNumber); - let lineOffsetInView = this.view.elementTop(viewIndex) + lineOffset; - this.view.setScrollTop(lineOffsetInView - this.view.renderHeight / 2); + let positionOffset = element.getPositionScrollTopOffset(range.startLineNumber, range.startColumn); + let positionOffsetInView = this.view.elementTop(viewIndex) + positionOffset; + this.view.setScrollTop(positionOffsetInView - this.view.renderHeight / 2); if (revealType === CellRevealType.Range) { element.revealRangeInCenter(range); } }; - const scrollTop = this.view.getScrollTop(); - const wrapperBottom = scrollTop + this.view.renderHeight; + const scrollTop = this.getViewScrollTop(); + const wrapperBottom = this.getViewScrollBottom(); const elementTop = this.view.elementTop(viewIndex); const viewItemOffset = elementTop; const element = this.view.element(viewIndex); + const positionOffset = viewItemOffset + element.getPositionScrollTopOffset(range.startLineNumber, range.startColumn); - if (viewItemOffset < scrollTop || viewItemOffset > wrapperBottom) { + if (positionOffset < scrollTop || positionOffset > wrapperBottom) { // let it render - this.view.setScrollTop(viewItemOffset - this.view.renderHeight / 2); + this.view.setScrollTop(positionOffset - this.view.renderHeight / 2); // after rendering, it might be pushed down due to markdown cell dynamic height const elementTop = this.view.elementTop(viewIndex); @@ -681,7 +686,7 @@ export class NotebookCellList extends WorkbenchList implements ID // reveal editor if (!element.editorAttached) { - getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); + return getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); } else { // for example markdown } @@ -690,17 +695,17 @@ export class NotebookCellList extends WorkbenchList implements ID element.revealRangeInCenter(range); } else { // for example, markdown cell in preview mode - getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); + return getEditorAttachedPromise(element).then(() => reveal(viewIndex, range, revealType)); } } } - private _revealLineInCenterIfOutsideViewport(viewIndex: number, line: number) { - this._revealRangeInCenterIfOutsideViewportInternal(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); + private async _revealLineInCenterIfOutsideViewportAsync(viewIndex: number, line: number): Promise { + return this._revealRangeInCenterIfOutsideViewportInternalAsync(viewIndex, new Range(line, 1, line, 1), CellRevealType.Line); } - private _revealRangeInCenterIfOutsideViewport(viewIndex: number, range: Range): void { - this._revealRangeInCenterIfOutsideViewportInternal(viewIndex, range, CellRevealType.Range); + private async _revealRangeInCenterIfOutsideViewportAsync(viewIndex: number, range: Range): Promise { + return this._revealRangeInCenterIfOutsideViewportInternalAsync(viewIndex, range, CellRevealType.Range); } private _revealInternal(viewIndex: number, ignoreIfInsideViewport: boolean, revealPosition: CellRevealPosition) { @@ -708,8 +713,8 @@ export class NotebookCellList extends WorkbenchList implements ID return; } - const scrollTop = this.view.getScrollTop(); - const wrapperBottom = scrollTop + this.view.renderHeight; + const scrollTop = this.getViewScrollTop(); + const wrapperBottom = this.getViewScrollBottom(); const elementTop = this.view.elementTop(viewIndex); if (ignoreIfInsideViewport && elementTop >= scrollTop && elementTop < wrapperBottom) { @@ -869,6 +874,7 @@ export class NotebookCellList extends WorkbenchList implements ID } dispose() { + this._viewModelStore.dispose(); this._localDisposableStore.dispose(); super.dispose(); } @@ -883,13 +889,3 @@ function getEditorAttachedPromise(element: CellViewModel) { function isContextMenuFocused() { return !!DOM.findParentWithClass(document.activeElement, 'context-view'); } - - -class NotebookMouseController extends MouseController { - protected onDoubleClick(): void { - const focus = this.list.getFocusedElements()[0]; - if (focus && focus.cellKind === CellKind.Markdown) { - focus.editState = CellEditState.Editing; - } - } -} diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts index fa60ada8f3..8b406dd170 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/errorTransform.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IRenderOutput, CellOutputKind, IErrorOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import * as DOM from 'vs/base/browser/dom'; import { RGBA, Color } from 'vs/base/common/color'; import { ansiColorIdentifiers } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; @@ -45,7 +45,7 @@ class ErrorTransform implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.error', CellOutputKind.Error, ErrorTransform); +NotebookRegistry.registerOutputTransform('notebook.output.error', CellOutputKind.Error, ErrorTransform); /** * @param text The content to stylize. 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 a9fdd18633..68f3e51e9a 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,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IRenderOutput, CellOutputKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import * as DOM from 'vs/base/browser/dom'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { isArray } from 'vs/base/common/types'; @@ -225,7 +225,7 @@ class RichRenderer implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.rich', CellOutputKind.Rich, RichRenderer); +NotebookRegistry.registerOutputTransform('notebook.output.rich', CellOutputKind.Rich, RichRenderer); export function getOutputSimpleEditorOptions(): IEditorOptions { diff --git a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts index 922ad34050..f0c8d4d036 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/output/transforms/streamTransform.ts @@ -5,7 +5,7 @@ import * as DOM from 'vs/base/browser/dom'; import { IRenderOutput, CellOutputKind, IStreamOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; -import { registerOutputTransform } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; +import { NotebookRegistry } from 'vs/workbench/contrib/notebook/browser/notebookRegistry'; import { INotebookEditor, IOutputTransformContribution } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; class StreamRenderer implements IOutputTransformContribution { @@ -28,4 +28,4 @@ class StreamRenderer implements IOutputTransformContribution { } } -registerOutputTransform('notebook.output.stream', CellOutputKind.Text, StreamRenderer); +NotebookRegistry.registerOutputTransform('notebook.output.stream', CellOutputKind.Text, StreamRenderer); 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 e5871cd2e4..215e85a868 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -16,13 +16,14 @@ import { IOpenerService, matchesScheme } from 'vs/platform/opener/common/opener' import { CELL_MARGIN, CELL_RUN_GUTTER } from 'vs/workbench/contrib/notebook/browser/constants'; import { INotebookEditor } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; -import { IProcessedOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellOutputKind, IProcessedOutput } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { IWebviewService, WebviewElement } from 'vs/workbench/contrib/webview/browser/webview'; import { asWebviewUri } from 'vs/workbench/contrib/webview/common/webviewUri'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { dirname, joinPath } from 'vs/base/common/resources'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { preloadsScriptStr } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads'; import { Schemas } from 'vs/base/common/network'; import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IFileService } from 'vs/platform/files/common/files'; @@ -98,6 +99,7 @@ export interface ICreationRequestMessage { top: number; left: number; initiallyHidden?: boolean; + apiNamespace?: string | undefined; } export interface IContentWidgetTopRequest { @@ -121,12 +123,62 @@ export interface IScrollRequestMessage { version: number; } +export interface IClearOutputRequestMessage { + type: 'clearOutput'; + id: string; + cellUri: string; + apiNamespace: string | undefined; +} + +export interface IHideOutputMessage { + type: 'hideOutput'; + id: string; +} + +export interface IShowOutputMessage { + type: 'showOutput'; + id: string; + top: number; +} + +export interface IFocusOutputMessage { + type: 'focus-output'; + id: string; +} + +export interface IPreloadResource { + uri: string +} + export interface IUpdatePreloadResourceMessage { type: 'preload'; - resources: string[]; - source: string; + resources: IPreloadResource[]; + source: 'renderer' | 'kernel'; } +export type FromWebviewMessage = + | WebviewIntialized + | IDimensionMessage + | IMouseEnterMessage + | IMouseLeaveMessage + | IWheelMessage + | IScrollAckMessage + | IBlurOutputMessage; + +export type ToWebviewMessage = + | IClearMessage + | IFocusOutputMessage + | ICreationRequestMessage + | IViewScrollTopRequestMessage + | IScrollRequestMessage + | IClearOutputRequestMessage + | IHideOutputMessage + | IShowOutputMessage + | IUpdatePreloadResourceMessage + | IFocusOutputMessage; + +export type AnyMessage = FromWebviewMessage | ToWebviewMessage; + interface ICachedInset { outputId: string; cell: CodeCellViewModel; @@ -158,7 +210,7 @@ export class BackLayerWebView extends Disposable { private readonly _onMessage = this._register(new Emitter()); public readonly onMessage: Event = this._onMessage.event; private _loaded!: Promise; - private _initalized: Promise; + private _initalized?: Promise; private _disposed = false; constructor( @@ -175,51 +227,14 @@ export class BackLayerWebView extends Disposable { @IFileService private readonly fileService: IFileService, ) { super(); + this.element = document.createElement('div'); this.element.style.width = `calc(100% - ${CELL_MARGIN * 2 + CELL_RUN_GUTTER}px)`; this.element.style.height = '1400px'; this.element.style.position = 'absolute'; this.element.style.margin = `0px 0 0px ${CELL_MARGIN + CELL_RUN_GUTTER}px`; - - const pathsPath = getPathFromAmdModule(require, 'vs/loader.js'); - const loader = asWebviewUri(this.workbenchEnvironmentService, this.id, URI.file(pathsPath)); - - let coreDependencies = ''; - let resolveFunc: () => void; - - this._initalized = new Promise((resolve, reject) => { - resolveFunc = resolve; - }); - - const baseUrl = asWebviewUri(this.workbenchEnvironmentService, this.id, dirname(documentUri)); - - if (!isWeb) { - coreDependencies = ``; - const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); - this.initialize(htmlContent); - resolveFunc!(); - } else { - fetch(pathsPath).then(async response => { - if (response.status !== 200) { - throw new Error(response.statusText); - } - - const loaderJs = await response.text(); - - coreDependencies = ` - -`; - - const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); - this.initialize(htmlContent); - resolveFunc!(); - }); - } } - generateContent(outputNodePadding: number, coreDependencies: string, baseUrl: string) { return html` @@ -247,306 +262,9 @@ ${loaderJs} ${coreDependencies}
- - -`; + + + `; } private resolveOutputId(id: string): { cell: CodeCellViewModel, output: IProcessedOutput } | undefined { @@ -558,9 +276,51 @@ ${loaderJs} return { cell: this.insetMapping.get(output)!.cell, output }; } + async createWebview(): Promise { + const pathsPath = getPathFromAmdModule(require, 'vs/loader.js'); + const loader = asWebviewUri(this.workbenchEnvironmentService, this.id, URI.file(pathsPath)); + + let coreDependencies = ''; + let resolveFunc: () => void; + + this._initalized = new Promise((resolve, reject) => { + resolveFunc = resolve; + }); + + const baseUrl = asWebviewUri(this.workbenchEnvironmentService, this.id, dirname(this.documentUri)); + + if (!isWeb) { + coreDependencies = ``; + const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); + this.initialize(htmlContent); + resolveFunc!(); + } else { + fetch(pathsPath).then(async response => { + if (response.status !== 200) { + throw new Error(response.statusText); + } + + const loaderJs = await response.text(); + + coreDependencies = ` + +`; + + const htmlContent = this.generateContent(8, coreDependencies, baseUrl.toString()); + this.initialize(htmlContent); + resolveFunc!(); + }); + } + + await this._initalized; + } + async initialize(content: string) { this.webview = this._createInset(this.webviewService, content); this.webview.mountTo(this.element); + this._register(this.webview); this._register(this.webview.onDidClickLink(link => { if (!link) { @@ -577,7 +337,7 @@ ${loaderJs} this.preloadsCache.clear(); for (const [output, inset] of this.insetMapping.entries()) { this.updateRendererPreloads(inset.preloads); - this.webview.sendMessage({ ...inset.cachedCreation, initiallyHidden: this.hiddenInsetMapping.has(output) }); + this._sendMessageToWebview({ ...inset.cachedCreation, initiallyHidden: this.hiddenInsetMapping.has(output) }); } })); @@ -680,10 +440,6 @@ ${loaderJs} await this.openerService.open(newFileUri); } - async waitForInitialization() { - await this._initalized; - } - private _createInset(webviewService: IWebviewService, content: string) { const rootPath = URI.file(path.dirname(getPathFromAmdModule(require, ''))); const workspaceFolders = this.contextService.getWorkspace().folders.map(x => x.uri); @@ -755,14 +511,12 @@ ${loaderJs} }; }); - let message: IViewScrollTopRequestMessage = { + this._sendMessageToWebview({ top, type: 'view-scroll', version: version++, widgets: widgets - }; - - this.webview.sendMessage(message); + }); } createInset(cell: CodeCellViewModel, output: IProcessedOutput, cellTop: number, offset: number, shadowContent: string, preloads: Set) { @@ -778,7 +532,7 @@ ${loaderJs} if (outputCache) { this.hiddenInsetMapping.delete(output); - this.webview.sendMessage({ + this._sendMessageToWebview({ type: 'showOutput', id: outputCache.outputId, top: initialTop @@ -787,18 +541,26 @@ ${loaderJs} } } - let outputId = UUID.generateUuid(); + let outputId = output.outputKind === CellOutputKind.Rich ? output.outputId : UUID.generateUuid(); + let apiNamespace: string | undefined; + if (output.outputKind === CellOutputKind.Rich && output.pickedMimeTypeIndex !== undefined) { + const pickedMimeTypeRenderer = output.orderedMimeTypes?.[output.pickedMimeTypeIndex]; + if (pickedMimeTypeRenderer?.rendererId) { + apiNamespace = this.notebookService.getRendererInfo(pickedMimeTypeRenderer.rendererId)?.id; + } + } let message: ICreationRequestMessage = { type: 'html', content: shadowContent, id: cell.id, + apiNamespace, outputId: outputId, top: initialTop, left: 0 }; - this.webview.sendMessage(message); + this._sendMessageToWebview(message); this.insetMapping.set(output, { outputId: outputId, cell: cell, preloads, cachedCreation: message }); this.hiddenInsetMapping.delete(output); this.reversedInsetMapping.set(outputId, output); @@ -816,8 +578,10 @@ ${loaderJs} let id = outputCache.outputId; - this.webview.sendMessage({ + this._sendMessageToWebview({ type: 'clearOutput', + apiNamespace: outputCache.cachedCreation.apiNamespace, + cellUri: outputCache.cell.uri.toString(), id: id }); this.insetMapping.delete(output); @@ -837,7 +601,7 @@ ${loaderJs} let id = outputCache.outputId; this.hiddenInsetMapping.add(output); - this.webview.sendMessage({ + this._sendMessageToWebview({ type: 'hideOutput', id: id }); @@ -848,7 +612,7 @@ ${loaderJs} return; } - this.webview.sendMessage({ + this._sendMessageToWebview({ type: 'clear' }); @@ -863,7 +627,7 @@ ${loaderJs} this.webview.focus(); setTimeout(() => { // Need this, or focus decoration is not shown. No clue. - this.webview.sendMessage({ + this._sendMessageToWebview({ type: 'focus-output', id: cellId }); @@ -877,7 +641,7 @@ ${loaderJs} await this._loaded; - let resources: string[] = []; + let resources: IPreloadResource[] = []; preloads = preloads.map(preload => { if (this.environmentService.isExtensionDevelopment && (preload.scheme === 'http' || preload.scheme === 'https')) { return preload; @@ -887,7 +651,7 @@ ${loaderJs} preloads.forEach(e => { if (!this.preloadsCache.has(e.toString())) { - resources.push(e.toString()); + resources.push({ uri: e.toString() }); this.preloadsCache.set(e.toString(), true); } }); @@ -907,7 +671,7 @@ ${loaderJs} await this._loaded; - let resources: string[] = []; + let resources: IPreloadResource[] = []; let extensionLocations: URI[] = []; preloads.forEach(preload => { let rendererInfo = this.notebookService.getRendererInfo(preload); @@ -922,7 +686,7 @@ ${loaderJs} extensionLocations.push(rendererInfo.extensionLocation); preloadResources.forEach(e => { if (!this.preloadsCache.has(e.toString())) { - resources.push(e.toString()); + resources.push({ uri: e.toString() }); this.preloadsCache.set(e.toString(), true); } }); @@ -937,18 +701,20 @@ ${loaderJs} this._updatePreloads(resources, 'renderer'); } - private _updatePreloads(resources: string[], source: string) { + private _updatePreloads(resources: IPreloadResource[], source: 'renderer' | 'kernel') { const mixedResourceRoots = [...(this.localResourceRootsCache || []), ...this.rendererRootsCache, ...this.kernelRootsCache]; this.webview.localResourcesRoot = mixedResourceRoots; - let message: IUpdatePreloadResourceMessage = { + this._sendMessageToWebview({ type: 'preload', resources: resources, source: source - }; + }); + } - this.webview.sendMessage(message); + private _sendMessageToWebview(message: ToWebviewMessage) { + this.webview.postMessage(message); } clearPreloadsCache() { diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts new file mode 100644 index 0000000000..c904928832 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys.ts @@ -0,0 +1,101 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { INotebookTextModel, NotebookCellRunState } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; +import { NOTEBOOK_CELL_TYPE, NOTEBOOK_VIEW_TYPE, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_RUNNABLE, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_RUN_STATE, NOTEBOOK_CELL_HAS_OUTPUTS, CellViewModelStateChangeEvent, CellEditState } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; +import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; + +export class CellContextKeyManager extends Disposable { + + private cellType: IContextKey; + private viewType: IContextKey; + private cellEditable: IContextKey; + private cellRunnable: IContextKey; + private cellRunState: IContextKey; + private cellHasOutputs: IContextKey; + + private markdownEditMode: IContextKey; + + private elementDisposables = new DisposableStore(); + + constructor( + private readonly contextKeyService: IContextKeyService, + private readonly notebookTextModel: INotebookTextModel, + private element: BaseCellViewModel + ) { + super(); + + this.cellType = NOTEBOOK_CELL_TYPE.bindTo(this.contextKeyService); + this.viewType = NOTEBOOK_VIEW_TYPE.bindTo(this.contextKeyService); + this.cellEditable = NOTEBOOK_CELL_EDITABLE.bindTo(this.contextKeyService); + this.cellRunnable = NOTEBOOK_CELL_RUNNABLE.bindTo(this.contextKeyService); + this.markdownEditMode = NOTEBOOK_CELL_MARKDOWN_EDIT_MODE.bindTo(this.contextKeyService); + this.cellRunState = NOTEBOOK_CELL_RUN_STATE.bindTo(this.contextKeyService); + this.cellHasOutputs = NOTEBOOK_CELL_HAS_OUTPUTS.bindTo(this.contextKeyService); + + this.updateForElement(element); + } + + public updateForElement(element: BaseCellViewModel) { + this.elementDisposables.clear(); + this.elementDisposables.add(element.onDidChangeState(e => this.onDidChangeState(e))); + + if (element instanceof CodeCellViewModel) { + this.elementDisposables.add(element.onDidChangeOutputs(() => this.updateForOutputs())); + } + + this.element = element; + if (this.element instanceof MarkdownCellViewModel) { + this.cellType.set('markdown'); + } else if (this.element instanceof CodeCellViewModel) { + this.cellType.set('code'); + } + + this.updateForMetadata(); + this.updateForEditState(); + this.updateForOutputs(); + + this.viewType.set(this.element.viewType); + } + + private onDidChangeState(e: CellViewModelStateChangeEvent) { + if (e.metadataChanged) { + this.updateForMetadata(); + } + + if (e.editStateChanged) { + this.updateForEditState(); + } + } + + private updateForMetadata() { + const metadata = this.element.getEvaluatedMetadata(this.notebookTextModel.metadata); + this.cellEditable.set(!!metadata.editable); + this.cellRunnable.set(!!metadata.runnable); + + const runState = metadata.runState ?? NotebookCellRunState.Idle; + this.cellRunState.set(NotebookCellRunState[runState]); + } + + private updateForEditState() { + if (this.element instanceof MarkdownCellViewModel) { + this.markdownEditMode.set(this.element.editState === CellEditState.Editing); + } else { + this.markdownEditMode.set(false); + } + } + + private updateForOutputs() { + if (this.element instanceof CodeCellViewModel) { + this.cellHasOutputs.set(this.element.outputs.length > 0); + } else { + this.cellHasOutputs.set(false); + } + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus.ts index fa34d52e5d..9adad43c73 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellMenus.ts @@ -19,6 +19,10 @@ export class CellMenus { return this.getMenu(MenuId.NotebookCellTitle, contextKeyService); } + getCellInsertionMenu(contextKeyService: IContextKeyService): IMenu { + return this.getMenu(MenuId.NotebookCellBetween, contextKeyService); + } + private getMenu(menuId: MenuId, contextKeyService: IContextKeyService): IMenu { const menu = this.menuService.createMenu(menuId, contextKeyService); 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 d11b190233..227313b68f 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/cellRenderer.ts @@ -8,20 +8,17 @@ import 'vs/css!vs/workbench/contrib/notebook/browser/media/notebook'; import { getZoomLevel } from 'vs/base/browser/browser'; import * as DOM from 'vs/base/browser/dom'; import { domEvent } from 'vs/base/browser/event'; -import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { ToolBar } from 'vs/base/browser/ui/toolbar/toolbar'; -import { ActionRunner, IAction } from 'vs/base/common/actions'; +import { IAction } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import { renderCodicons } from 'vs/base/common/codicons'; import { Color } from 'vs/base/common/color'; import { Emitter, Event } from 'vs/base/common/event'; -import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { deepClone } from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; -import { escape } from 'vs/base/common/strings'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { EditorOption, EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -42,8 +39,8 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { BOTTOM_CELL_TOOLBAR_HEIGHT, EDITOR_BOTTOM_PADDING, EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN, EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; -import { CancelCellAction, ChangeCellLanguageAction, ExecuteCellAction, INotebookCellActionContext, InsertCodeCellAction, InsertMarkdownCellAction } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; -import { BaseCellRenderTemplate, CellEditState, CodeCellRenderTemplate, ICellViewModel, INotebookCellList, INotebookEditor, MarkdownCellRenderTemplate, NOTEBOOK_CELL_EDITABLE, NOTEBOOK_CELL_HAS_OUTPUTS, NOTEBOOK_CELL_MARKDOWN_EDIT_MODE, NOTEBOOK_CELL_RUNNABLE, NOTEBOOK_CELL_RUN_STATE, NOTEBOOK_CELL_TYPE, NOTEBOOK_VIEW_TYPE } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { CancelCellAction, ChangeCellLanguageAction, ExecuteCellAction, INotebookCellActionContext, CELL_TITLE_GROUP_ID } from 'vs/workbench/contrib/notebook/browser/contrib/coreActions'; +import { BaseCellRenderTemplate, CellEditState, CodeCellRenderTemplate, ICellViewModel, INotebookCellList, INotebookEditor, MarkdownCellRenderTemplate } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellMenus } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellMenus'; import { CodeCell } from 'vs/workbench/contrib/notebook/browser/view/renderers/codeCell'; import { StatefullMarkdownCell } from 'vs/workbench/contrib/notebook/browser/view/renderers/markdownCell'; @@ -51,21 +48,22 @@ import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewMod import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel'; import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; import { CellKind, NotebookCellRunState, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellContextKeyManager } from 'vs/workbench/contrib/notebook/browser/view/renderers/cellContextKeys'; const $ = DOM.$; export class NotebookCellListDelegate implements IListVirtualDelegate { - private _lineHeight: number; + private readonly lineHeight: number; constructor( @IConfigurationService private readonly configurationService: IConfigurationService ) { const editorOptions = this.configurationService.getValue('editor'); - this._lineHeight = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()).lineHeight; + this.lineHeight = BareFontInfo.createFromRawSettings(editorOptions, getZoomLevel()).lineHeight; } getHeight(element: CellViewModel): number { - return element.getHeight(this._lineHeight); + return element.getHeight(this.lineHeight); } hasDynamicHeight(element: CellViewModel): boolean { @@ -84,11 +82,11 @@ export class NotebookCellListDelegate implements IListVirtualDelegate(); readonly onDidChange: Event = this._onDidChange.event; constructor(configurationService: IConfigurationService, language: string) { - this._disposable = configurationService.onDidChangeConfiguration(e => { + this.disposable = configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration('editor')) { this._value = computeEditorOptions(); this._onDidChange.fire(this.value); @@ -152,7 +150,7 @@ export class CellEditorOptions { dispose(): void { this._onDidChange.dispose(); - this._disposable.dispose(); + this.disposable.dispose(); } get value(): IEditorOptions { @@ -169,7 +167,6 @@ export class CellEditorOptions { abstract class AbstractCellRenderer { protected editorOptions: CellEditorOptions; - private actionRunner = new ActionRunner(); constructor( protected readonly instantiationService: IInstantiationService, @@ -189,7 +186,7 @@ abstract class AbstractCellRenderer { this.editorOptions.dispose(); } - protected createBottomCellToolbar(container: HTMLElement): ToolBar { + protected createBetweenCellToolbar(container: HTMLElement, disposables: DisposableStore, contextKeyService: IContextKeyService): ToolBar { const toolbar = new ToolBar(container, this.contextMenuService, { actionViewItemProvider: action => { if (action instanceof MenuItemAction) { @@ -202,65 +199,27 @@ abstract class AbstractCellRenderer { }); toolbar.getContainer().style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}px`; + + container.style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}px`; + + const cellMenu = this.instantiationService.createInstance(CellMenus); + const menu = disposables.add(cellMenu.getCellInsertionMenu(contextKeyService)); + + const actions = this.getCellToolbarActions(menu); + toolbar.setActions(actions.primary, actions.secondary)(); + return toolbar; } - protected setupBetweenCellToolbarActions(element: CodeCellViewModel | MarkdownCellViewModel, templateData: BaseCellRenderTemplate, disposables: DisposableStore, context: INotebookCellActionContext): void { + protected setBetweenCellToolbarContext(templateData: BaseCellRenderTemplate, element: CodeCellViewModel | MarkdownCellViewModel, context: INotebookCellActionContext): void { + templateData.betweenCellToolbar.context = context; + const container = templateData.bottomCellContainer; - container.innerHTML = ''; - container.style.height = `${BOTTOM_CELL_TOOLBAR_HEIGHT}px`; - - DOM.append(container, $('.seperator')); - const addCodeCell = DOM.append(container, $('span.button')); - addCodeCell.innerHTML = renderCodicons(escape(`$(add) Code `)); - addCodeCell.tabIndex = 0; - const insertCellBelow = this.instantiationService.createInstance(InsertCodeCellAction); - - const toolbarContext = { - ...context, - ui: true - }; - - disposables.add(DOM.addDisposableListener(addCodeCell, DOM.EventType.CLICK, e => { - this.actionRunner.run(insertCellBelow, toolbarContext); - e.stopPropagation(); - })); - - disposables.add((DOM.addDisposableListener(addCodeCell, DOM.EventType.KEY_DOWN, async e => { - const event = new StandardKeyboardEvent(e); - if ((event.equals(KeyCode.Enter) || event.equals(KeyCode.Space))) { - e.preventDefault(); - e.stopPropagation(); - this.actionRunner.run(insertCellBelow, toolbarContext); - } - }))); - - DOM.append(container, $('.seperator-short')); - const addMarkdownCell = DOM.append(container, $('span.button')); - addMarkdownCell.innerHTML = renderCodicons(escape('$(add) Markdown ')); - addMarkdownCell.tabIndex = 0; - const insertMarkdownBelow = this.instantiationService.createInstance(InsertMarkdownCellAction); - disposables.add(DOM.addDisposableListener(addMarkdownCell, DOM.EventType.CLICK, e => { - this.actionRunner.run(insertMarkdownBelow, toolbarContext); - e.stopPropagation(); - })); - - disposables.add((DOM.addDisposableListener(addMarkdownCell, DOM.EventType.KEY_DOWN, async e => { - const event = new StandardKeyboardEvent(e); - if ((event.equals(KeyCode.Enter) || event.equals(KeyCode.Space))) { - e.preventDefault(); - e.stopPropagation(); - this.actionRunner.run(insertMarkdownBelow, toolbarContext); - } - }))); - - DOM.append(container, $('.seperator')); - if (element instanceof CodeCellViewModel) { const bottomToolbarOffset = element.layoutInfo.bottomToolbarOffset; container.style.top = `${bottomToolbarOffset}px`; - disposables.add(element.onDidChangeLayout(() => { + templateData.elementDisposables.add(element.onDidChangeLayout(() => { const bottomToolbarOffset = element.layoutInfo.bottomToolbarOffset; container.style.top = `${bottomToolbarOffset}px`; })); @@ -285,13 +244,19 @@ abstract class AbstractCellRenderer { return toolbar; } - private getCellToolbarActions(menu: IMenu): IAction[] { - const actions: IAction[] = []; - for (let [, menuActions] of menu.getActions({ shouldForwardArgs: true })) { - actions.push(...menuActions); + private getCellToolbarActions(menu: IMenu): { primary: IAction[], secondary: IAction[] } { + const primary: IAction[] = []; + const secondary: IAction[] = []; + const actions = menu.getActions({ shouldForwardArgs: true }); + for (let [id, menuActions] of actions) { + if (id === CELL_TITLE_GROUP_ID) { + primary.push(...menuActions); + } else { + secondary.push(...menuActions); + } } - return actions; + return { primary, secondary }; } protected setupCellToolbarActions(scopedContextKeyService: IContextKeyService, templateData: BaseCellRenderTemplate, disposables: DisposableStore): void { @@ -301,10 +266,14 @@ abstract class AbstractCellRenderer { const updateActions = () => { const actions = this.getCellToolbarActions(menu); - templateData.toolbar.setActions(actions)(); + const hadFocus = DOM.isAncestor(document.activeElement, templateData.toolbar.getContainer()); + templateData.toolbar.setActions(actions.primary, actions.secondary)(); + if (hadFocus) { + this.notebookEditor.focus(); + } if (templateData.focusIndicator) { - if (actions.length) { + if (actions.primary.length || actions.secondary.length) { templateData.container.classList.add('cell-has-toolbar-actions'); templateData.focusIndicator.style.top = `${EDITOR_TOOLBAR_HEIGHT + EDITOR_TOP_MARGIN}px`; } else { @@ -316,6 +285,10 @@ abstract class AbstractCellRenderer { updateActions(); disposables.add(menu.onDidChange(() => { + if (this.notebookEditor.isDisposed) { + return; + } + updateActions(); })); } @@ -359,7 +332,6 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR } renderTemplate(container: HTMLElement): MarkdownCellRenderTemplate { - container.tabIndex = -1; container.classList.add('markdown-cell-row'); const disposables = new DisposableStore(); const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); @@ -376,6 +348,9 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR const foldingIndicator = DOM.append(focusIndicator, DOM.$('.notebook-folding-indicator')); const bottomCellContainer = DOM.append(container, $('.cell-bottom-toolbar-container')); + DOM.append(bottomCellContainer, $('.separator')); + const betweenCellToolbar = disposables.add(this.createBetweenCellToolbar(bottomCellContainer, disposables, contextKeyService)); + DOM.append(bottomCellContainer, $('.separator')); const statusBar = this.instantiationService.createInstance(CellEditorStatusBar, editorPart); @@ -390,6 +365,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR disposables, elementDisposables: new DisposableStore(), toolbar, + betweenCellToolbar, bottomCellContainer, statusBarContainer: statusBar.statusBarContainer, languageStatusBarItem: statusBar.languageStatusBarItem, @@ -402,13 +378,13 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR private getDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { if (templateData.currentRenderedCell!.editState === CellEditState.Editing) { - return this._getEditDragImage(templateData); + return this.getEditDragImage(templateData); } else { - return this._getMarkdownDragImage(templateData); + return this.getMarkdownDragImage(templateData); } } - private _getMarkdownDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { + private getMarkdownDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { const dragImageContainer = DOM.$('.cell-drag-image.monaco-list-row.focused.markdown-cell-row'); dragImageContainer.innerHTML = templateData.container.innerHTML; @@ -422,7 +398,7 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR return dragImageContainer; } - private _getEditDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { + private getEditDragImage(templateData: MarkdownCellRenderTemplate): HTMLElement { return new CodeCellDragImageRenderer().getDragImage(templateData, templateData.currentEditor!, 'markdown'); } @@ -438,54 +414,31 @@ export class MarkdownCellRenderer extends AbstractCellRenderer implements IListR templateData.cellContainer.appendChild(renderedHTML); } - if (height) { - const elementDisposables = templateData.elementDisposables; - - // render toolbar first - this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); - - const toolbarContext = { - cell: element, - notebookEditor: this.notebookEditor, - $mid: 12 - }; - templateData.toolbar.context = toolbarContext; - - this.setupBetweenCellToolbarActions(element, templateData, elementDisposables, toolbarContext); - - const markdownCell = this.instantiationService.createInstance(StatefullMarkdownCell, this.notebookEditor, element, templateData, this.editorOptions.value, this.renderedEditors); - elementDisposables.add(this.editorOptions.onDidChange(newValue => markdownCell.updateEditorOptions(newValue))); - elementDisposables.add(markdownCell); - - NOTEBOOK_CELL_TYPE.bindTo(templateData.contextKeyService).set('markdown'); - NOTEBOOK_VIEW_TYPE.bindTo(templateData.contextKeyService).set(element.viewType); - const metadata = element.getEvaluatedMetadata(this.notebookEditor.viewModel!.notebookDocument.metadata); - const cellEditableKey = NOTEBOOK_CELL_EDITABLE.bindTo(templateData.contextKeyService); - cellEditableKey.set(!!metadata.editable); - const updateForMetadata = () => { - const metadata = element.getEvaluatedMetadata(this.notebookEditor.viewModel!.notebookDocument.metadata); - cellEditableKey.set(!!metadata.editable); - }; - - updateForMetadata(); - elementDisposables.add(element.onDidChangeState((e) => { - if (e.metadataChanged) { - updateForMetadata(); - } - })); - - const editModeKey = NOTEBOOK_CELL_MARKDOWN_EDIT_MODE.bindTo(templateData.contextKeyService); - editModeKey.set(element.editState === CellEditState.Editing); - elementDisposables.add(element.onDidChangeState((e) => { - if (e.editStateChanged) { - editModeKey.set(element.editState === CellEditState.Editing); - } - })); - - element.totalHeight = height; - - templateData.languageStatusBarItem.update(element, this.notebookEditor); + if (height === undefined) { + return; } + + const elementDisposables = templateData.elementDisposables; + + elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); + + // render toolbar first + this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); + + const toolbarContext = { + cell: element, + notebookEditor: this.notebookEditor, + $mid: 12 + }; + templateData.toolbar.context = toolbarContext; + + this.setBetweenCellToolbarContext(templateData, element, toolbarContext); + + const markdownCell = this.instantiationService.createInstance(StatefullMarkdownCell, this.notebookEditor, element, templateData, this.editorOptions.value, this.renderedEditors); + elementDisposables.add(this.editorOptions.onDidChange(newValue => markdownCell.updateEditorOptions(newValue))); + elementDisposables.add(markdownCell); + + templateData.languageStatusBarItem.update(element, this.notebookEditor); } disposeTemplate(templateData: MarkdownCellRenderTemplate): void { @@ -619,6 +572,15 @@ export class CellDragAndDropController extends Disposable { } private onCellDragover(event: CellDragEvent): void { + if (!event.browserEvent.dataTransfer) { + return; + } + + if (!this.currentDraggedCell) { + event.browserEvent.dataTransfer.dropEffect = 'none'; + return; + } + if (this.isScrolling || this.currentDraggedCell === event.draggedOverCell) { this.setInsertIndicatorVisibility(false); return; @@ -719,10 +681,10 @@ export class CellDragAndDropController extends Disposable { } export class CellLanguageStatusBarItem extends Disposable { - private labelElement: HTMLElement; + private readonly labelElement: HTMLElement; - private _cell: ICellViewModel | undefined; - private _editor: INotebookEditor | undefined; + private cell: ICellViewModel | undefined; + private editor: INotebookEditor | undefined; private cellDisposables: DisposableStore; @@ -737,7 +699,7 @@ export class CellLanguageStatusBarItem extends Disposable { this._register(DOM.addDisposableListener(this.labelElement, DOM.EventType.CLICK, () => { this.instantiationService.invokeFunction(accessor => { - new ChangeCellLanguageAction().run(accessor, { notebookEditor: this._editor!, cell: this._cell! }); + new ChangeCellLanguageAction().run(accessor, { notebookEditor: this.editor!, cell: this.cell! }); }); })); this._register(this.cellDisposables = new DisposableStore()); @@ -745,15 +707,15 @@ export class CellLanguageStatusBarItem extends Disposable { update(cell: ICellViewModel, editor: INotebookEditor): void { this.cellDisposables.clear(); - this._cell = cell; - this._editor = editor; + this.cell = cell; + this.editor = editor; this.render(); - this.cellDisposables.add(this._cell.model.onDidChangeLanguage(() => this.render())); + this.cellDisposables.add(this.cell.model.onDidChangeLanguage(() => this.render())); } private render(): void { - this.labelElement.textContent = this.modeService.getLanguageName(this._cell!.language!); + this.labelElement.textContent = this.modeService.getLanguageName(this.cell!.language!); } } @@ -765,7 +727,7 @@ class EditorTextRenderer { return null; } - const colorMap = this._getDefaultColorMap(); + const colorMap = this.getDefaultColorMap(); const fontInfo = editor.getOptions().get(EditorOption.fontInfo); const fontFamily = fontInfo.fontFamily === EDITOR_FONT_DEFAULTS.fontFamily ? fontInfo.fontFamily : `'${fontInfo.fontFamily}', ${EDITOR_FONT_DEFAULTS.fontFamily}`; @@ -778,11 +740,11 @@ class EditorTextRenderer { + `line-height: ${fontInfo.lineHeight}px;` + `white-space: pre;` + `">` - + this._getRichTextLines(model, modelRange, colorMap) + + this.getRichTextLines(model, modelRange, colorMap) + ''; } - private _getRichTextLines(model: ITextModel, modelRange: Range, colorMap: string[]): string { + private getRichTextLines(model: ITextModel, modelRange: Range, colorMap: string[]): string { const startLineNumber = modelRange.startLineNumber; const startColumn = modelRange.startColumn; const endLineNumber = modelRange.endLineNumber; @@ -808,7 +770,7 @@ class EditorTextRenderer { return result; } - private _getDefaultColorMap(): string[] { + private getDefaultColorMap(): string[] { let colorMap = modes.TokenizationRegistry.getColorMap(); let result: string[] = ['#000000']; if (colorMap) { @@ -822,7 +784,7 @@ class EditorTextRenderer { class CodeCellDragImageRenderer { getDragImage(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement { - let dragImage = this._getDragImage(templateData, editor, type); + let dragImage = this.getDragImageImpl(templateData, editor, type); if (!dragImage) { // TODO@roblourens I don't think this can happen dragImage = document.createElement('div'); @@ -832,7 +794,7 @@ class CodeCellDragImageRenderer { return dragImage; } - private _getDragImage(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement | null { + private getDragImageImpl(templateData: BaseCellRenderTemplate, editor: ICodeEditor, type: 'code' | 'markdown'): HTMLElement | null { const dragImageContainer = DOM.$(`.cell-drag-image.monaco-list-row.focused.${type}-cell-row`); dragImageContainer.innerHTML = templateData.container.innerHTML; @@ -901,7 +863,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende renderTemplate(container: HTMLElement): CodeCellRenderTemplate { container.classList.add('code-cell-row'); - container.tabIndex = -1; const disposables = new DisposableStore(); const contextKeyService = disposables.add(this.contextKeyServiceProvider(container)); const toolbar = disposables.add(this.createToolbar(container)); @@ -940,9 +901,12 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende const timer = new TimerRenderer(statusBar.durationContainer); const outputContainer = DOM.append(container, $('.output')); - const focusSink = DOM.append(container, $('.cell-editor-focus-sink')); - focusSink.setAttribute('tabindex', '0'); + const focusSinkElement = DOM.append(container, $('.cell-editor-focus-sink')); + focusSinkElement.setAttribute('tabindex', '0'); const bottomCellContainer = DOM.append(container, $('.cell-bottom-toolbar-container')); + DOM.append(bottomCellContainer, $('.separator')); + const betweenCellToolbar = this.createBetweenCellToolbar(bottomCellContainer, disposables, contextKeyService); + DOM.append(bottomCellContainer, $('.separator')); const templateData: CodeCellRenderTemplate = { contextKeyService, @@ -955,6 +919,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende progressBar, focusIndicator, toolbar, + betweenCellToolbar, + focusSinkElement, runToolbar, runButtonContainer, executionOrderLabel, @@ -969,8 +935,8 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende this.dndController.registerDragHandle(templateData, () => new CodeCellDragImageRenderer().getDragImage(templateData, templateData.editor, 'code')); - disposables.add(DOM.addDisposableListener(focusSink, DOM.EventType.FOCUS, () => { - if (templateData.currentRenderedCell) { + disposables.add(DOM.addDisposableListener(focusSinkElement, DOM.EventType.FOCUS, () => { + if (templateData.currentRenderedCell && (templateData.currentRenderedCell as CodeCellViewModel).outputs.length) { this.notebookEditor.focusNotebookCell(templateData.currentRenderedCell, 'output'); } })); @@ -985,8 +951,6 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende runState = NotebookCellRunState.Idle; } - const runStateKey = NOTEBOOK_CELL_RUN_STATE.bindTo(templateData.contextKeyService); - runStateKey.set(NotebookCellRunState[runState]); if (runState === NotebookCellRunState.Running) { templateData.progressBar.infinite().show(500); @@ -1002,15 +966,18 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende } } - private updateForMetadata(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { - const cellEditableKey = NOTEBOOK_CELL_EDITABLE.bindTo(templateData.contextKeyService); - const cellRunnableKey = NOTEBOOK_CELL_RUNNABLE.bindTo(templateData.contextKeyService); + private updateForOutputs(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { + if (element.outputs.length) { + DOM.show(templateData.focusSinkElement); + } else { + DOM.hide(templateData.focusSinkElement); + } + } + private updateForMetadata(element: CodeCellViewModel, templateData: CodeCellRenderTemplate): void { const metadata = element.getEvaluatedMetadata(this.notebookEditor.viewModel!.notebookDocument.metadata); DOM.toggleClass(templateData.cellContainer, 'runnable', !!metadata.runnable); this.updateExecutionOrder(metadata, templateData); - cellEditableKey.set(!!metadata.editable); - cellRunnableKey.set(!!metadata.runnable); templateData.cellStatusMessageContainer.textContent = metadata?.statusMessage || ''; if (metadata.runState === NotebookCellRunState.Success) { @@ -1073,19 +1040,15 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende elementDisposables.add(this.instantiationService.createInstance(CodeCell, this.notebookEditor, element, templateData)); this.renderedEditors.set(element, templateData.editor); + elementDisposables.add(new CellContextKeyManager(templateData.contextKeyService, this.notebookEditor.viewModel?.notebookDocument!, element)); + templateData.focusIndicator.style.height = `${element.layoutInfo.indicatorHeight}px`; + templateData.outputContainer.style.top = `${element.layoutInfo.outputContainerOffset}px`; elementDisposables.add(element.onDidChangeLayout(() => { templateData.focusIndicator.style.height = `${element.layoutInfo.indicatorHeight}px`; + templateData.outputContainer.style.top = `${element.layoutInfo.outputContainerOffset}px`; })); - const cellHasOutputsContext = NOTEBOOK_CELL_HAS_OUTPUTS.bindTo(templateData.contextKeyService); - cellHasOutputsContext.set(element.outputs.length > 0); - elementDisposables.add(element.onDidChangeOutputs(() => { - cellHasOutputsContext.set(element.outputs.length > 0); - })); - - NOTEBOOK_CELL_TYPE.bindTo(templateData.contextKeyService).set('code'); - NOTEBOOK_VIEW_TYPE.bindTo(templateData.contextKeyService).set(element.viewType); this.updateForMetadata(element, templateData); elementDisposables.add(element.onDidChangeState((e) => { if (e.metadataChanged) { @@ -1097,6 +1060,9 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende } })); + this.updateForOutputs(element, templateData); + elementDisposables.add(element.onDidChangeOutputs(_e => this.updateForOutputs(element, templateData))); + this.setupCellToolbarActions(templateData.contextKeyService, templateData, elementDisposables); const toolbarContext = { @@ -1108,7 +1074,7 @@ export class CodeCellRenderer extends AbstractCellRenderer implements IListRende templateData.toolbar.context = toolbarContext; templateData.runToolbar.context = toolbarContext; - this.setupBetweenCellToolbarActions(element, templateData, elementDisposables, toolbarContext); + this.setBetweenCellToolbarContext(templateData, element, toolbarContext); templateData.languageStatusBarItem.update(element, this.notebookEditor); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts index 52e520b68c..172b27d5cd 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/codeCell.ts @@ -132,7 +132,7 @@ export class CodeCell extends Disposable { const primarySelection = templateData.editor!.getSelection(); if (primarySelection) { - this.notebookEditor.revealLineInView(viewCell, primarySelection!.positionLineNumber); + this.notebookEditor.revealLineInViewAsync(viewCell, primarySelection!.positionLineNumber); } })); @@ -176,7 +176,7 @@ export class CodeCell extends Disposable { let prevElement: HTMLElement | undefined = undefined; - this.viewCell.outputs.reverse().forEach(output => { + [...this.viewCell.outputs].reverse().forEach(output => { if (this.outputElements.has(output)) { // already exist prevElement = this.outputElements.get(output); @@ -200,6 +200,17 @@ export class CodeCell extends Disposable { } })); + this._register(viewCell.onDidChangeLayout(() => { + this.outputElements.forEach((value, key) => { + const index = viewCell.outputs.indexOf(key); + if (index >= 0) { + const top = this.viewCell.getOutputOffsetInContainer(index); + value.style.top = `${top}px`; + } + }); + + })); + const updateFocusMode = () => viewCell.focusMode = templateData.editor!.hasWidgetFocus() ? CellFocusMode.Editor : CellFocusMode.Container; this._register(templateData.editor!.onDidFocusEditorWidget(() => { updateFocusMode(); @@ -311,15 +322,21 @@ export class CodeCell extends Disposable { } let pickedMimeTypeRenderer = currOutput.orderedMimeTypes![currOutput.pickedMimeTypeIndex!]; + const innerContainer = DOM.$('.output-inner-container'); + DOM.append(outputItemDiv, innerContainer); + if (pickedMimeTypeRenderer.isResolved) { // html - result = this.notebookEditor.getOutputRenderer().render({ outputKind: CellOutputKind.Rich, data: { 'text/html': pickedMimeTypeRenderer.output! } } as any, outputItemDiv, 'text/html'); + result = this.notebookEditor.getOutputRenderer().render({ outputKind: CellOutputKind.Rich, data: { 'text/html': pickedMimeTypeRenderer.output! } } as any, innerContainer, 'text/html'); } else { - result = this.notebookEditor.getOutputRenderer().render(currOutput, outputItemDiv, pickedMimeTypeRenderer.mimeType); + result = this.notebookEditor.getOutputRenderer().render(currOutput, innerContainer, pickedMimeTypeRenderer.mimeType); } } else { // for text and error, there is no mimetype - result = this.notebookEditor.getOutputRenderer().render(currOutput, outputItemDiv, undefined); + const innerContainer = DOM.$('.output-inner-container'); + DOM.append(outputItemDiv, innerContainer); + + result = this.notebookEditor.getOutputRenderer().render(currOutput, innerContainer, undefined); } if (!result) { @@ -340,6 +357,8 @@ export class CodeCell extends Disposable { this.notebookEditor.createInset(this.viewCell, currOutput, result.shadowContent, this.viewCell.getOutputOffset(index)); } else { DOM.addClass(outputItemDiv, 'foreground'); + DOM.addClass(outputItemDiv, 'output-element'); + outputItemDiv.style.position = 'absolute'; } let hasDynamicHeight = result.hasDynamicHeight; @@ -352,10 +371,9 @@ export class CodeCell extends Disposable { }; const elementSizeObserver = getResizesObserver(outputItemDiv, dimension, () => { if (this.templateData.outputContainer && document.body.contains(this.templateData.outputContainer!)) { - let height = elementSizeObserver.getHeight() + 8 * 2; // include padding + let height = Math.ceil(elementSizeObserver.getHeight()); if (clientHeight === height) { - // console.log(this.viewCell.outputs); return; } @@ -375,13 +393,13 @@ export class CodeCell extends Disposable { if (result.shadowContent) { // webview // noop - // let cachedHeight = this.viewCell.getOutputHeight(currOutput); } else { // static output - - // @TODO@rebornix, if we stop checking output height, we need to evaluate it later when checking the height of output container - let clientHeight = outputItemDiv.clientHeight; + let clientHeight = Math.ceil(outputItemDiv.clientHeight); this.viewCell.updateOutputHeight(index, clientHeight); + + const top = this.viewCell.getOutputOffsetInContainer(index); + outputItemDiv.style.top = `${top}px`; } } } @@ -394,7 +412,7 @@ export class CodeCell extends Disposable { let renderInfo = this.notebookService.getRendererInfo(renderId); if (renderInfo) { - return renderInfo.extensionId.value; + return `${renderId} (${renderInfo.extensionId.value})`; } return nls.localize('builtinRenderInfo', "built-in"); @@ -407,9 +425,8 @@ export class CodeCell extends Disposable { id: mimeType.mimeType, index: index, picked: index === currIndex, - description: this.generateRendererInfo(mimeType.rendererId) + (index === currIndex - ? nls.localize('curruentActiveMimeType', " (Currently Active)") - : ''), + detail: this.generateRendererInfo(mimeType.rendererId), + description: index === currIndex ? nls.localize('curruentActiveMimeType', "Currently Active") : undefined })); const picker = this.quickInputService.createQuickPick(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts index f8a8e7a9bc..c3c7bea5a5 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/markdownCell.ts @@ -10,9 +10,8 @@ import { renderCodicons } from 'vs/base/common/codicons'; import { Disposable, DisposableStore, toDisposable } from 'vs/base/common/lifecycle'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; -import { ITextModel } from 'vs/editor/common/model'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { EDITOR_BOTTOM_PADDING, EDITOR_TOP_PADDING, CELL_STATUSBAR_HEIGHT } from 'vs/workbench/contrib/notebook/browser/constants'; +import { EDITOR_BOTTOM_PADDING, EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellEditState, CellFocusMode, INotebookEditor, MarkdownCellRenderTemplate, ICellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellFoldingState } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel'; @@ -25,166 +24,34 @@ import { getResizesObserver } from 'vs/workbench/contrib/notebook/browser/view/r export class StatefullMarkdownCell extends Disposable { private editor: CodeEditorWidget | null = null; - private editorOptions: IEditorOptions; private markdownContainer: HTMLElement; private editorPart: HTMLElement; - private localDisposables: DisposableStore; + private localDisposables = new DisposableStore(); private foldingState: CellFoldingState; constructor( - private notebookEditor: INotebookEditor, - private viewCell: MarkdownCellViewModel, - private templateData: MarkdownCellRenderTemplate, - editorOptions: IEditorOptions, - renderedEditors: Map, - @IContextKeyService contextKeyService: IContextKeyService, - @IInstantiationService instantiationService: IInstantiationService, + private readonly notebookEditor: INotebookEditor, + private readonly viewCell: MarkdownCellViewModel, + private readonly templateData: MarkdownCellRenderTemplate, + private editorOptions: IEditorOptions, + private readonly renderedEditors: Map, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + @IInstantiationService private readonly instantiationService: IInstantiationService, ) { super(); this.markdownContainer = templateData.cellContainer; this.editorPart = templateData.editorPart; - this.editorOptions = editorOptions; - this.localDisposables = new DisposableStore(); this._register(this.localDisposables); this._register(toDisposable(() => renderedEditors.delete(this.viewCell))); - const viewUpdate = () => { - if (viewCell.editState === CellEditState.Editing) { - // switch to editing mode - let editorHeight: number; - - show(this.editorPart); - hide(this.markdownContainer); - if (this.editor) { - editorHeight = this.editor!.getContentHeight(); - - // not first time, we don't need to create editor or bind listeners - viewCell.attachTextEditor(this.editor); - if (notebookEditor.getActiveCell() === viewCell) { - this.editor.focus(); - } - - this.bindEditorListeners(this.editor.getModel()!); - } else { - const width = viewCell.layoutInfo.editorWidth; - const lineNum = viewCell.lineCount; - const lineHeight = viewCell.layoutInfo.fontInfo?.lineHeight || 17; - editorHeight = Math.max(lineNum, 1) * lineHeight + EDITOR_TOP_PADDING + EDITOR_BOTTOM_PADDING; - - this.templateData.editorContainer.innerHTML = ''; - - // create a special context key service that set the inCompositeEditor-contextkey - const editorContextKeyService = contextKeyService.createScoped(); - const editorInstaService = instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService])); - EditorContextKeys.inCompositeEditor.bindTo(editorContextKeyService).set(true); - - this.editor = editorInstaService.createInstance(CodeEditorWidget, this.templateData.editorContainer, { - ...this.editorOptions, - dimension: { - width: width, - height: editorHeight - } - }, {}); - templateData.currentEditor = this.editor; - - const cts = new CancellationTokenSource(); - this._register({ dispose() { cts.dispose(true); } }); - raceCancellation(viewCell.resolveTextModel(), cts.token).then(model => { - if (!model) { - return; - } - - this.editor!.setModel(model); - if (notebookEditor.getActiveCell() === viewCell) { - this.editor!.focus(); - } - - const realContentHeight = this.editor!.getContentHeight(); - if (realContentHeight !== editorHeight) { - this.editor!.layout( - { - width: width, - height: realContentHeight - } - ); - editorHeight = realContentHeight; - } - - viewCell.attachTextEditor(this.editor!); - - if (viewCell.editState === CellEditState.Editing) { - this.editor!.focus(); - } - - this.bindEditorListeners(model, { - width: width, - height: editorHeight - }); - - - const clientHeight = this.markdownContainer.clientHeight; - const totalHeight = editorHeight + 32 + clientHeight + CELL_STATUSBAR_HEIGHT; - this.viewCell.totalHeight = totalHeight; - notebookEditor.layoutNotebookCell(viewCell, totalHeight); - }); - } - - const clientHeight = this.markdownContainer.clientHeight; - const totalHeight = editorHeight + 32 + clientHeight + CELL_STATUSBAR_HEIGHT; - this.viewCell.totalHeight = totalHeight; - notebookEditor.layoutNotebookCell(viewCell, totalHeight); - this.editor.focus(); - renderedEditors.set(this.viewCell, this.editor!); - } else { - this.viewCell.detachTextEditor(); - hide(this.editorPart); - show(this.markdownContainer); - renderedEditors.delete(this.viewCell); - if (this.editor) { - // switch from editing mode - const clientHeight = templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - notebookEditor.layoutNotebookCell(viewCell, clientHeight); - } else { - // first time, readonly mode - this.markdownContainer.innerHTML = ''; - let markdownRenderer = viewCell.getMarkdownRenderer(); - let renderedHTML = viewCell.getHTML(); - if (renderedHTML) { - this.markdownContainer.appendChild(renderedHTML); - } - - this.localDisposables.add(markdownRenderer.onDidUpdateRender(() => { - const clientHeight = templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - notebookEditor.layoutNotebookCell(viewCell, clientHeight); - })); - - this.localDisposables.add(viewCell.onDidChangeState((e) => { - if (!e.contentChanged) { - return; - } - - this.markdownContainer.innerHTML = ''; - let renderedHTML = viewCell.getHTML(); - if (renderedHTML) { - this.markdownContainer.appendChild(renderedHTML); - } - })); - - const clientHeight = templateData.container.clientHeight; - this.viewCell.totalHeight = clientHeight; - notebookEditor.layoutNotebookCell(viewCell, clientHeight); - } - } - }; - this._register(viewCell.onDidChangeState((e) => { if (e.editStateChanged) { this.localDisposables.clear(); - viewUpdate(); + this.viewUpdate(); + } else if (e.contentChanged) { + this.viewUpdate(); } })); @@ -196,7 +63,7 @@ export class StatefullMarkdownCell extends Disposable { const updateForFocusMode = () => { if (viewCell.focusMode === CellFocusMode.Editor) { - this.editor?.focus(); + this.focusEditorIfNeeded(); } toggleClass(templateData.container, 'cell-editor-focus', viewCell.focusMode === CellFocusMode.Editor); @@ -235,7 +102,136 @@ export class StatefullMarkdownCell extends Disposable { } })); - viewUpdate(); + this.viewUpdate(); + } + + private viewUpdate(): void { + if (this.viewCell.editState === CellEditState.Editing) { + this.viewUpdateEditing(); + } else { + this.viewUpdatePreview(); + } + } + + private viewUpdateEditing(): void { + // switch to editing mode + let editorHeight: number; + + show(this.editorPart); + hide(this.markdownContainer); + if (this.editor) { + editorHeight = this.editor!.getContentHeight(); + + // not first time, we don't need to create editor or bind listeners + this.viewCell.attachTextEditor(this.editor); + this.focusEditorIfNeeded(); + + this.bindEditorListeners(); + } else { + const width = this.viewCell.layoutInfo.editorWidth; + const lineNum = this.viewCell.lineCount; + const lineHeight = this.viewCell.layoutInfo.fontInfo?.lineHeight || 17; + editorHeight = Math.max(lineNum, 1) * lineHeight + EDITOR_TOP_PADDING + EDITOR_BOTTOM_PADDING; + + this.templateData.editorContainer.innerHTML = ''; + + // create a special context key service that set the inCompositeEditor-contextkey + const editorContextKeyService = this.contextKeyService.createScoped(); + const editorInstaService = this.instantiationService.createChild(new ServiceCollection([IContextKeyService, editorContextKeyService])); + EditorContextKeys.inCompositeEditor.bindTo(editorContextKeyService).set(true); + + this.editor = editorInstaService.createInstance(CodeEditorWidget, this.templateData.editorContainer, { + ...this.editorOptions, + dimension: { + width: width, + height: editorHeight + } + }, {}); + this.templateData.currentEditor = this.editor; + + const cts = new CancellationTokenSource(); + this._register({ dispose() { cts.dispose(true); } }); + raceCancellation(this.viewCell.resolveTextModel(), cts.token).then(model => { + if (!model) { + return; + } + + this.editor!.setModel(model); + this.focusEditorIfNeeded(); + + const realContentHeight = this.editor!.getContentHeight(); + if (realContentHeight !== editorHeight) { + this.editor!.layout( + { + width: width, + height: realContentHeight + } + ); + editorHeight = realContentHeight; + } + + this.viewCell.attachTextEditor(this.editor!); + + if (this.viewCell.editState === CellEditState.Editing) { + this.focusEditorIfNeeded(); + } + + this.bindEditorListeners(); + + this.viewCell.editorHeight = editorHeight; + }); + } + + this.viewCell.editorHeight = editorHeight; + this.focusEditorIfNeeded(); + this.renderedEditors.set(this.viewCell, this.editor!); + } + + private viewUpdatePreview(): void { + this.viewCell.detachTextEditor(); + hide(this.editorPart); + show(this.markdownContainer); + this.renderedEditors.delete(this.viewCell); + + this.markdownContainer.innerHTML = ''; + let markdownRenderer = this.viewCell.getMarkdownRenderer(); + let renderedHTML = this.viewCell.getHTML(); + if (renderedHTML) { + this.markdownContainer.appendChild(renderedHTML); + } + + if (this.editor) { + // switch from editing mode + const clientHeight = this.templateData.container.clientHeight; + this.viewCell.totalHeight = clientHeight; + this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + } else { + // first time, readonly mode + this.localDisposables.add(markdownRenderer.onDidUpdateRender(() => { + const clientHeight = this.templateData.container.clientHeight; + this.viewCell.totalHeight = clientHeight; + this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + })); + + this.localDisposables.add(this.viewCell.textBuffer.onDidChangeContent(() => { + this.markdownContainer.innerHTML = ''; + this.viewCell.clearHTML(); + let renderedHTML = this.viewCell.getHTML(); + if (renderedHTML) { + this.markdownContainer.appendChild(renderedHTML); + } + })); + + const clientHeight = this.templateData.container.clientHeight; + this.viewCell.totalHeight = clientHeight; + this.notebookEditor.layoutNotebookCell(this.viewCell, clientHeight); + } + } + + private focusEditorIfNeeded() { + if (this.viewCell.focusMode === CellFocusMode.Editor) { + this.editor?.focus(); + } } private layoutEditor(dimension: IDimension): void { @@ -284,22 +280,7 @@ export class StatefullMarkdownCell extends Disposable { } } - bindEditorListeners(model: ITextModel, dimension?: IDimension) { - this.localDisposables.add(model.onDidChangeContent(() => { - // we don't need to update view cell text anymore as the textbuffer is shared - this.viewCell.clearHTML(); - let clientHeight = this.markdownContainer.clientHeight; - this.markdownContainer.innerHTML = ''; - let renderedHTML = this.viewCell.getHTML(); - if (renderedHTML) { - this.markdownContainer.appendChild(renderedHTML); - clientHeight = this.markdownContainer.clientHeight; - } - - this.viewCell.totalHeight = this.editor!.getContentHeight() + 32 + clientHeight + CELL_STATUSBAR_HEIGHT; - this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); - })); - + private bindEditorListeners() { this.localDisposables.add(this.editor!.onDidContentSizeChange(e => { let viewLayout = this.editor!.getLayoutInfo(); @@ -310,9 +291,7 @@ export class StatefullMarkdownCell extends Disposable { height: e.contentHeight } ); - const clientHeight = this.markdownContainer.clientHeight; - this.viewCell.totalHeight = e.contentHeight + 32 + clientHeight + CELL_STATUSBAR_HEIGHT; - this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); + this.viewCell.editorHeight = e.contentHeight; } })); @@ -325,22 +304,10 @@ export class StatefullMarkdownCell extends Disposable { const primarySelection = this.editor!.getSelection(); if (primarySelection) { - this.notebookEditor.revealLineInView(this.viewCell, primarySelection!.positionLineNumber); + this.notebookEditor.revealLineInViewAsync(this.viewCell, primarySelection!.positionLineNumber); } })); - let markdownRenderer = this.viewCell.getMarkdownRenderer(); - this.markdownContainer.innerHTML = ''; - let renderedHTML = this.viewCell.getHTML(); - if (renderedHTML) { - this.markdownContainer.appendChild(renderedHTML); - this.localDisposables.add(markdownRenderer.onDidUpdateRender(() => { - const clientHeight = this.markdownContainer.clientHeight; - this.viewCell.totalHeight = clientHeight; - this.notebookEditor.layoutNotebookCell(this.viewCell, this.viewCell.layoutInfo.totalHeight); - })); - } - const updateFocusMode = () => this.viewCell.focusMode = this.editor!.hasWidgetFocus() ? CellFocusMode.Editor : CellFocusMode.Container; this.localDisposables.add(this.editor!.onDidFocusEditorWidget(() => { updateFocusMode(); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts new file mode 100644 index 0000000000..e72408cf26 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -0,0 +1,418 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import type { Event } from 'vs/base/common/event'; +import type { IDisposable } from 'vs/base/common/lifecycle'; +import { ToWebviewMessage } from 'vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView'; + +// !! IMPORTANT !! everything must be in-line within the webviewPreloads +// function. Imports are not allowed. This is stringifies and injected into +// the webview. + +declare const acquireVsCodeApi: () => ({ 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); + observe(element: Element): void; + disconnect(): void; +} + +declare const __outputNodePadding__: number; + +type Listener = { fn: (evt: T) => void; thisArg: unknown }; + +interface EmitterLike { + fire(data: T): void; + event: Event; +} + +function webviewPreloads() { + const vscode = acquireVsCodeApi(); + + const handleInnerClick = (event: MouseEvent) => { + if (!event || !event.view || !event.view.document) { + return; + } + + for (let node = event.target as HTMLElement | null; node; node = node.parentNode as HTMLElement) { + if (node instanceof HTMLAnchorElement && node.href) { + if (node.href.startsWith('blob:')) { + handleBlobUrlClick(node.href, node.download); + } + event.preventDefault(); + break; + } + } + }; + + const handleBlobUrlClick = async (url: string, downloadName: string) => { + try { + const response = await fetch(url); + const blob = await response.blob(); + const reader = new FileReader(); + reader.addEventListener('load', () => { + const data = reader.result; + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'clicked-data-url', + data, + downloadName + }); + }); + reader.readAsDataURL(blob); + } catch (e) { + console.error(e.message); + } + }; + + document.body.addEventListener('click', handleInnerClick); + + const preservedScriptAttributes: (keyof HTMLScriptElement)[] = [ + 'type', 'src', 'nonce', 'noModule', 'async', + ]; + + // derived from https://github.com/jquery/jquery/blob/d0ce00cdfa680f1f0c38460bc51ea14079ae8b07/src/core/DOMEval.js + const domEval = (container: Element) => { + const arr = Array.from(container.getElementsByTagName('script')); + for (let n = 0; n < arr.length; n++) { + let node = arr[n]; + let scriptTag = document.createElement('script'); + scriptTag.text = node.innerText; + for (let key of preservedScriptAttributes) { + const val = node[key] || node.getAttribute && node.getAttribute(key); + if (val) { + scriptTag.setAttribute(key, val as any); + } + } + + // TODO: should script with src not be removed? + container.appendChild(scriptTag).parentNode!.removeChild(scriptTag); + } + }; + + let observers: ResizeObserver[] = []; + + const resizeObserve = (container: Element, id: string) => { + const resizeObserver = new ResizeObserver(entries => { + for (let entry of entries) { + if (entry.target.id === id && entry.contentRect) { + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'dimension', + id: id, + data: { + height: entry.contentRect.height + __outputNodePadding__ * 2 + } + }); + } + } + }); + + resizeObserver.observe(container); + observers.push(resizeObserver); + }; + + function scrollWillGoToParent(event: WheelEvent) { + for (let node = event.target as Node | null; node; node = node.parentNode) { + if (!(node instanceof Element) || node.id === 'container') { + return false; + } + + if (event.deltaY < 0 && node.scrollTop > 0) { + return true; + } + + if (event.deltaY > 0 && node.scrollTop + node.clientHeight < node.scrollHeight) { + return true; + } + } + + return false; + } + + const handleWheel = (event: WheelEvent) => { + if (event.defaultPrevented || scrollWillGoToParent(event)) { + return; + } + + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'did-scroll-wheel', + payload: { + deltaMode: event.deltaMode, + deltaX: event.deltaX, + deltaY: event.deltaY, + deltaZ: event.deltaZ, + detail: event.detail, + type: event.type + } + }); + }; + + function focusFirstFocusableInCell(cellId: string) { + const cellOutputContainer = document.getElementById(cellId); + if (cellOutputContainer) { + const focusableElement = cellOutputContainer.querySelector('[tabindex="0"], [href], button, input, option, select, textarea') as HTMLElement | null; + focusableElement?.focus(); + } + } + + function createFocusSink(cellId: string, outputId: string, focusNext?: boolean) { + const element = document.createElement('div'); + element.tabIndex = 0; + element.addEventListener('focus', () => { + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'focus-editor', + id: outputId, + focusNext + }); + + setTimeout(() => { // Wait a tick to prevent the focus indicator blinking before webview blurs + // Move focus off the focus sink - single use + focusFirstFocusableInCell(cellId); + }, 50); + }); + + return element; + } + + function addMouseoverListeners(element: HTMLElement, outputId: string): void { + element.addEventListener('mouseenter', () => { + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'mouseenter', + id: outputId, + data: {} + }); + }); + element.addEventListener('mouseleave', () => { + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'mouseleave', + id: outputId, + data: {} + }); + }); + } + + const dontEmit = Symbol('dontEmit'); + + function createEmitter(listenerChange: (listeners: Set>) => void = () => undefined): EmitterLike { + const listeners = new Set>(); + return { + fire(data) { + for (const listener of [...listeners]) { + listener.fn.call(listener.thisArg, data); + } + }, + event(fn, thisArg, disposables) { + const listenerObj = { fn, thisArg }; + const disposable: IDisposable = { + dispose: () => { + listeners.delete(listenerObj); + listenerChange(listeners); + }, + }; + + listeners.add(listenerObj); + listenerChange(listeners); + + if (disposables instanceof Array) { + disposables.push(disposable); + } else if (disposables) { + disposables.add(disposable); + } + + return disposable; + }, + }; + } + + // Maps the events in the given emitter, invoking mapFn on each one. mapFn can return + // the dontEmit symbol to skip emission. + function mapEmitter(emitter: EmitterLike, mapFn: (data: T) => R | typeof dontEmit) { + let listener: IDisposable; + const mapped = createEmitter(listeners => { + if (listeners.size && !listener) { + listener = emitter.event(data => { + const v = mapFn(data); + if (v !== dontEmit) { + mapped.fire(v); + } + }); + } else if (listener && !listeners.size) { + listener.dispose(); + } + }); + + return mapped.event; + } + + interface ICreateCellInfo { + outputId: string; + element: HTMLElement; + } + + interface IDestroyCellInfo { + outputId: string; + } + + const onWillDestroyOutput = createEmitter<[string | undefined /* namespace */, IDestroyCellInfo | undefined /* cell uri */]>(); + const onDidCreateOutput = createEmitter<[string | undefined /* namespace */, ICreateCellInfo]>(); + + const matchesNs = (namespace: string, query: string | undefined) => namespace === '*' || query === namespace || query === 'undefined'; + + (window as any).acquireNotebookRendererApi = (namespace: string) => { + if (!namespace || typeof namespace !== 'string') { + throw new Error(`acquireNotebookRendererApi should be called your renderer type as a string, got: ${namespace}.`); + } + + return { + postMessage: vscode.postMessage, + setState(newState: T) { + vscode.setState({ ...vscode.getState(), [namespace]: newState }); + }, + getState(): T | undefined { + const state = vscode.getState(); + return typeof state === 'object' && state ? state[namespace] as T : undefined; + }, + onWillDestroyOutput: mapEmitter(onWillDestroyOutput, ([ns, data]) => matchesNs(namespace, ns) ? data : dontEmit), + onDidCreateOutput: mapEmitter(onDidCreateOutput, ([ns, data]) => matchesNs(namespace, ns) ? data : dontEmit), + }; + }; + + window.addEventListener('wheel', handleWheel); + + window.addEventListener('message', rawEvent => { + const event = rawEvent as ({ data: ToWebviewMessage }); + + switch (event.data.type) { + case 'html': + { + const id = event.data.id; + let cellOutputContainer = document.getElementById(id); + let outputId = event.data.outputId; + if (!cellOutputContainer) { + const container = document.getElementById('container')!; + + const upperWrapperElement = createFocusSink(id, outputId); + container.appendChild(upperWrapperElement); + + let newElement = document.createElement('div'); + + newElement.id = id; + container.appendChild(newElement); + cellOutputContainer = newElement; + + const lowerWrapperElement = createFocusSink(id, outputId, true); + container.appendChild(lowerWrapperElement); + } + + let outputNode = document.createElement('div'); + outputNode.style.position = 'absolute'; + outputNode.style.top = event.data.top + 'px'; + outputNode.style.left = event.data.left + 'px'; + outputNode.style.width = 'calc(100% - ' + event.data.left + 'px)'; + outputNode.style.minHeight = '32px'; + outputNode.id = outputId; + + addMouseoverListeners(outputNode, outputId); + let content = event.data.content; + outputNode.innerHTML = content; + cellOutputContainer.appendChild(outputNode); + + // eval + domEval(outputNode); + resizeObserve(outputNode, outputId); + onDidCreateOutput.fire([event.data.apiNamespace, { element: outputNode, outputId }]); + + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'dimension', + id: outputId, + data: { + height: outputNode.clientHeight + } + }); + + // don't hide until after this step so that the height is right + cellOutputContainer.style.display = event.data.initiallyHidden ? 'none' : 'block'; + } + break; + case 'view-scroll': + { + // const date = new Date(); + // console.log('----- will scroll ---- ', date.getMinutes() + ':' + date.getSeconds() + ':' + date.getMilliseconds()); + + for (let i = 0; i < event.data.widgets.length; i++) { + let widget = document.getElementById(event.data.widgets[i].id)!; + widget.style.top = event.data.widgets[i].top + 'px'; + widget.parentElement!.style.display = 'block'; + } + break; + } + case 'clear': + onWillDestroyOutput.fire([undefined, undefined]); + document.getElementById('container')!.innerHTML = ''; + for (let i = 0; i < observers.length; i++) { + observers[i].disconnect(); + } + + observers = []; + break; + case 'clearOutput': + { + const id = event.data.id; + onWillDestroyOutput.fire([event.data.apiNamespace, { outputId: id }]); + let output = document.getElementById(id); + if (output && output.parentNode) { + document.getElementById(id)!.parentNode!.removeChild(output); + } + // @TODO remove observer + } + break; + case 'hideOutput': + { + const container = document.getElementById(event.data.id)?.parentElement; + if (container) { + container.style.display = 'none'; + } + } + break; + case 'showOutput': + { + let output = document.getElementById(event.data.id); + if (output) { + output.parentElement!.style.display = 'block'; + output.style.top = event.data.top + 'px'; + } + } + break; + case 'preload': + let resources = event.data.resources; + let preloadsContainer = document.getElementById('__vscode_preloads')!; + for (let i = 0; i < resources.length; i++) { + const { uri } = resources[i]; + const scriptTag = document.createElement('script'); + scriptTag.setAttribute('src', uri); + preloadsContainer.appendChild(scriptTag); + } + break; + case 'focus-output': + { + focusFirstFocusableInCell(event.data.id); + break; + } + } + }); + + vscode.postMessage({ + __vscode_notebook_message: true, + type: 'initialized' + }); +} + +export const preloadsScriptStr = (outputNodePadding: number) => `(${webviewPreloads})()`.replace(/__outputNodePadding__/g, `${outputNodePadding}`); diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts index 76912217ad..6e2e01f853 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel.ts @@ -8,11 +8,12 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; import { IPosition } from 'vs/editor/common/core/position'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as model from 'vs/editor/common/model'; import { SearchParams } from 'vs/editor/common/model/textModelSearch'; -import { EDITOR_TOOLBAR_HEIGHT, EDITOR_TOP_MARGIN } from 'vs/workbench/contrib/notebook/browser/constants'; +import { EDITOR_TOP_PADDING } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellEditState, CellFocusMode, CursorAtBoundary, CellViewModelStateChangeEvent, IEditableCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { CellKind, NotebookCellMetadata, NotebookDocumentMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; @@ -151,9 +152,10 @@ export abstract class BaseCellViewModel extends Disposable { } this._textEditor = editor; + this._textModel = this._textEditor.getModel() || undefined; if (this._editorViewStates) { - this.restoreViewState(this._editorViewStates); + this._restoreViewState(this._editorViewStates); } this._resolvedDecorations.forEach((value, key) => { @@ -185,6 +187,7 @@ export abstract class BaseCellViewModel extends Disposable { }); this._textEditor = undefined; + this._textModel = undefined; this._cursorChangeListener?.dispose(); this._cursorChangeListener = null; this._onDidChangeEditorAttachState.fire(); @@ -194,6 +197,10 @@ export abstract class BaseCellViewModel extends Disposable { return this.model.getValue(); } + getTextLength(): number { + return this.model.getTextLength(); + } + private saveViewState(): void { if (!this._textEditor) { return; @@ -214,7 +221,7 @@ export abstract class BaseCellViewModel extends Disposable { this._editorViewStates = editorViewStates; } - private restoreViewState(state: editorCommon.ICodeEditorViewState | null): void { + private _restoreViewState(state: editorCommon.ICodeEditorViewState | null): void { if (state) { this._textEditor?.restoreViewState(state); } @@ -264,6 +271,14 @@ export abstract class BaseCellViewModel extends Disposable { this._textEditor?.setSelection(range); } + setSelections(selections: Selection[]) { + this._textEditor?.setSelections(selections); + } + + getSelections() { + return this._textEditor?.getSelections() || []; + } + getSelectionsStartPosition(): IPosition[] | undefined { if (this._textEditor) { const selections = this._textEditor.getSelections(); @@ -279,7 +294,15 @@ export abstract class BaseCellViewModel extends Disposable { return 0; } - return this._textEditor.getTopForLineNumber(line) + EDITOR_TOP_MARGIN + EDITOR_TOOLBAR_HEIGHT; + return this._textEditor.getTopForLineNumber(line) + EDITOR_TOP_PADDING; + } + + getPositionScrollTopOffset(line: number, column: number): number { + if (!this._textEditor) { + return 0; + } + + return this._textEditor.getTopForPosition(line, column) + EDITOR_TOP_PADDING; } cursorAtBoundary(): CursorAtBoundary { @@ -318,6 +341,8 @@ export abstract class BaseCellViewModel extends Disposable { return this.model.textBuffer; } + abstract resolveTextModel(): Promise; + protected cellStartFind(value: string): model.FindMatch[] | null { let cellMatches: model.FindMatch[] = []; @@ -359,6 +384,10 @@ export abstract class BaseCellViewModel extends Disposable { }; } + dispose() { + super.dispose(); + } + toJSON(): any { return { handle: this.handle diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts index abcd5161e1..8a1f7bef37 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/cellEdit.ts @@ -3,11 +3,14 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ICell } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { ICell, CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { IResourceUndoRedoElement, UndoRedoElementType } from 'vs/platform/undoRedo/common/undoRedo'; import { URI } from 'vs/base/common/uri'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; import { CellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel'; +import { CellFocusMode } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; /** * It should not modify Undo/Redo stack @@ -17,6 +20,7 @@ export interface ICellEditingDelegate { deleteCell?(index: number): void; moveCell?(fromIndex: number, toIndex: number): void; createCellViewModel?(cell: ICell): BaseCellViewModel; + createCell?(index: number, source: string | string[], language: string, type: CellKind): BaseCellViewModel; setSelections(selections: number[]): void; } @@ -171,3 +175,124 @@ export class SpliceCellsEdit implements IResourceUndoRedoElement { this.editingDelegate.setSelections(this.endHandles); } } + +export class JoinCellEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Join Cell'; + private _deletedRawCell: ICell; + constructor( + public resource: URI, + private index: number, + private direction: 'above' | 'below', + private cell: BaseCellViewModel, + private selections: Selection[], + private inverseRange: Range, + private insertContent: string, + private removedCell: BaseCellViewModel, + private editingDelegate: ICellEditingDelegate, + ) { + this._deletedRawCell = this.removedCell.model; + } + + async undo(): Promise { + if (!this.editingDelegate.insertCell || !this.editingDelegate.createCellViewModel) { + throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); + } + + await this.cell.resolveTextModel(); + + this.cell.textModel?.applyEdits([ + { range: this.inverseRange, text: '' } + ]); + + this.cell.setSelections(this.selections); + + const cell = this.editingDelegate.createCellViewModel(this._deletedRawCell); + if (this.direction === 'above') { + this.editingDelegate.insertCell(this.index, cell); + this.editingDelegate.setSelections([cell.handle]); + cell.focusMode = CellFocusMode.Editor; + } else { + this.editingDelegate.insertCell(this.index, cell); + this.editingDelegate.setSelections([this.cell.handle]); + this.cell.focusMode = CellFocusMode.Editor; + } + } + + async redo(): Promise { + if (!this.editingDelegate.deleteCell) { + throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); + } + + await this.cell.resolveTextModel(); + this.cell.textModel?.applyEdits([ + { range: this.inverseRange, text: this.insertContent } + ]); + + this.editingDelegate.deleteCell(this.index); + this.editingDelegate.setSelections([this.cell.handle]); + this.cell.focusMode = CellFocusMode.Editor; + } +} + + +export class SplitCellEdit implements IResourceUndoRedoElement { + type: UndoRedoElementType.Resource = UndoRedoElementType.Resource; + label: string = 'Join Cell'; + constructor( + public resource: URI, + private index: number, + private cell: BaseCellViewModel, + private selections: Selection[], + private cellContents: string[], + private language: string, + private cellKind: CellKind, + private editingDelegate: ICellEditingDelegate + ) { + + } + + async undo(): Promise { + if (!this.editingDelegate.deleteCell || !this.editingDelegate.createCellViewModel) { + throw new Error('Notebook Delete Cell not implemented for Undo/Redo'); + } + + await this.cell.resolveTextModel(); + this.cell.textModel!.applyEdits([ + { + range: this.cell.textModel!.getFullModelRange(), + text: this.cellContents.join('') + } + ]); + this.cell.setSelections(this.selections); + + for (let j = 1; j < this.cellContents.length; j++) { + this.editingDelegate.deleteCell(this.index + 1); + } + + this.editingDelegate.setSelections([this.cell.handle]); + this.cell.focusMode = CellFocusMode.Editor; + } + + async redo(): Promise { + if (!this.editingDelegate.insertCell || !this.editingDelegate.createCell) { + throw new Error('Notebook Insert Cell not implemented for Undo/Redo'); + } + + await this.cell.resolveTextModel(); + this.cell.textModel!.applyEdits([ + { range: this.cell.textModel!.getFullModelRange(), text: this.cellContents[0] } + ], false); + + let insertIndex = this.index + 1; + let lastCell; + for (let j = 1; j < this.cellContents.length; j++, insertIndex++) { + lastCell = this.editingDelegate.createCell(insertIndex, this.cellContents[j], this.language, this.cellKind); + } + + if (lastCell) { + this.editingDelegate.setSelections([lastCell.handle]); + lastCell.focusMode = CellFocusMode.Editor; + } + } +} diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts index 8d64f7853c..565e79a681 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel.ts @@ -201,15 +201,18 @@ export class CodeCellViewModel extends BaseCellViewModel implements ICellViewMod this.layoutChange({ outputHeight: true }); } - getOutputOffset(index: number): number { + getOutputOffsetInContainer(index: number) { this._ensureOutputsTop(); if (index >= this._outputCollection.length) { throw new Error('Output index out of range!'); } - const offset = this._outputsTop!.getAccumulatedValue(index - 1); - return this.layoutInfo.outputContainerOffset + offset; + return this._outputsTop!.getAccumulatedValue(index - 1); + } + + getOutputOffset(index: number): number { + return this.layoutInfo.outputContainerOffset + this.getOutputOffsetInContainer(index); } spliceOutputHeights(start: number, deleteCnt: number, heights: number[]) { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts index db2ba1851f..0a77af5505 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel.ts @@ -8,7 +8,7 @@ import * as UUID from 'vs/base/common/uuid'; import * as editorCommon from 'vs/editor/common/editorCommon'; import * as model from 'vs/editor/common/model'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER } from 'vs/workbench/contrib/notebook/browser/constants'; +import { BOTTOM_CELL_TOOLBAR_HEIGHT, CELL_MARGIN, CELL_RUN_GUTTER, CELL_STATUSBAR_HEIGHT } from 'vs/workbench/contrib/notebook/browser/constants'; import { CellFindMatch, ICellViewModel, MarkdownCellLayoutChangeEvent, MarkdownCellLayoutInfo, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; import { MarkdownRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer'; import { BaseCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/baseCellViewModel'; @@ -39,7 +39,8 @@ export class MarkdownCellViewModel extends BaseCellViewModel implements ICellVie private _editorHeight = 0; set editorHeight(newHeight: number) { this._editorHeight = newHeight; - this.layoutChange({ editorHeight: true }); + + this.totalHeight = this._editorHeight + BOTTOM_CELL_TOOLBAR_HEIGHT + CELL_STATUSBAR_HEIGHT; } get editorHeight() { diff --git a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts index 384efbe99e..b4d7c596d4 100644 --- a/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts +++ b/src/vs/workbench/contrib/notebook/browser/viewModel/notebookViewModel.ts @@ -12,24 +12,26 @@ import { URI } from 'vs/base/common/uri'; import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; import { Range } from 'vs/editor/common/core/range'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { IModelDecorationOptions, IModelDeltaDecoration, TrackedRangeStickiness } from 'vs/editor/common/model'; +import { IModelDecorationOptions, IModelDeltaDecoration, TrackedRangeStickiness, IReadonlyTextBuffer } from 'vs/editor/common/model'; import { IntervalNode, IntervalTree } from 'vs/editor/common/model/intervalTree'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { WorkspaceTextEdit } from 'vs/editor/common/modes'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; -import { CellEditState, CellFindMatch, ICellRange, ICellViewModel, NotebookLayoutInfo } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; -import { DeleteCellEdit, InsertCellEdit, MoveCellEdit, SpliceCellsEdit } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEdit'; +import { CellEditState, CellFindMatch, ICellRange, ICellViewModel, NotebookLayoutInfo, IEditableCellViewModel } from 'vs/workbench/contrib/notebook/browser/notebookBrowser'; +import { DeleteCellEdit, InsertCellEdit, MoveCellEdit, SpliceCellsEdit, JoinCellEdit, SplitCellEdit } from 'vs/workbench/contrib/notebook/browser/viewModel/cellEdit'; import { CodeCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/codeCellViewModel'; import { NotebookEventDispatcher, NotebookMetadataChangedEvent } from 'vs/workbench/contrib/notebook/browser/viewModel/eventDispatcher'; import { CellFoldingState, EditorFoldingStateDelegate } from 'vs/workbench/contrib/notebook/browser/contrib/fold/foldingModel'; import { MarkdownCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markdownCellViewModel'; import { NotebookCellTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookCellTextModel'; -import { CellKind } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { CellKind, NotebookCellMetadata } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { FoldingRegions } from 'vs/editor/contrib/folding/foldingRanges'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; import { MarkdownRenderer } from 'vs/workbench/contrib/notebook/browser/view/renderers/mdRenderer'; import { dirname } from 'vs/base/common/resources'; +import { IPosition, Position } from 'vs/editor/common/core/position'; +import { PieceTreeTextBuffer } from 'vs/editor/common/model/pieceTreeTextBuffer/pieceTreeTextBuffer'; export interface INotebookEditorViewState { editingCells: { [key: number]: boolean }; @@ -246,9 +248,9 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD private _notebook: NotebookTextModel, readonly eventDispatcher: NotebookEventDispatcher, private _layoutInfo: NotebookLayoutInfo | null, - @IInstantiationService private readonly instantiationService: IInstantiationService, - @IBulkEditService private readonly bulkEditService: IBulkEditService, - @IUndoRedoService private readonly undoService: IUndoRedoService + @IInstantiationService private readonly _instantiationService: IInstantiationService, + @IBulkEditService private readonly _bulkEditService: IBulkEditService, + @IUndoRedoService private readonly _undoService: IUndoRedoService ) { super(); @@ -259,7 +261,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._register(this._notebook.onDidChangeCells(e => { const diffs = e.map(splice => { return [splice[0], splice[1], splice[2].map(cell => { - return createCellViewModel(this.instantiationService, this, cell as NotebookCellTextModel); + return createCellViewModel(this._instantiationService, this, cell as NotebookCellTextModel); })] as [number, number, CellViewModel[]]; }); @@ -313,7 +315,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } } - this.undoService.pushElement(new SpliceCellsEdit(this.uri, undoDiff, { + this._undoService.pushElement(new SpliceCellsEdit(this.uri, undoDiff, { insertCell: this._insertCellDelegate.bind(this), deleteCell: this._deleteCellDelegate.bind(this), setSelections: this._setSelectionsDelegate.bind(this) @@ -343,7 +345,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD })); this._viewCells = this._notebook!.cells.map(cell => { - return createCellViewModel(this.instantiationService, this, cell); + return createCellViewModel(this._instantiationService, this, cell); }); this._viewCells.forEach(cell => { @@ -580,6 +582,18 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return result; } + private _createCellDelegate(index: number, source: string | string[], language: string, type: CellKind) { + const cell = this._notebook.createCellTextModel(source, language, type, [], undefined); + let newCell: CellViewModel = createCellViewModel(this._instantiationService, this, cell); + this._viewCells!.splice(index, 0, newCell); + this._handleToViewCellMapping.set(newCell.handle, newCell); + this._notebook.insertNewCell(index, [cell]); + this._localStore.add(newCell); + this._decorationsTree.acceptReplace(index, 0, 1, true); + this._onDidChangeViewCells.fire({ synchronous: true, splices: [[index, 0, [newCell]]] }); + return newCell; + } + private _insertCellDelegate(insertIndex: number, insertCell: CellViewModel) { this._viewCells!.splice(insertIndex, 0, insertCell); this._handleToViewCellMapping.set(insertCell.handle, insertCell); @@ -594,6 +608,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._handleToViewCellMapping.delete(deleteCell.handle); this._notebook.removeCell(deleteIndex, 1); + this._decorationsTree.acceptReplace(deleteIndex, 1, 0, true); this._onDidChangeViewCells.fire({ synchronous: true, splices: [[deleteIndex, 1, []]] }); } @@ -601,19 +616,21 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this.selectionHandles = selections; } - createCell(index: number, source: string | string[], language: string, type: CellKind, synchronous: boolean) { - const cell = this._notebook.createCellTextModel(source, language, type, [], undefined); - let newCell: CellViewModel = createCellViewModel(this.instantiationService, this, cell); + createCell(index: number, source: string | string[], language: string, type: CellKind, metadata: NotebookCellMetadata | undefined, synchronous: boolean, pushUndoStop: boolean = true) { + const cell = this._notebook.createCellTextModel(source, language, type, [], metadata); + let newCell: CellViewModel = createCellViewModel(this._instantiationService, this, cell); this._viewCells!.splice(index, 0, newCell); this._handleToViewCellMapping.set(newCell.handle, newCell); this._notebook.insertNewCell(index, [cell]); this._localStore.add(newCell); - this.undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, this.selectionHandles)); + if (pushUndoStop) { + this._undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + setSelections: this._setSelectionsDelegate.bind(this) + }, this.selectionHandles, this.selectionHandles)); + } this._decorationsTree.acceptReplace(index, 0, 1, true); this._onDidChangeViewCells.fire({ synchronous: synchronous, splices: [[index, 0, [newCell]]] }); @@ -621,13 +638,13 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } insertCell(index: number, cell: NotebookCellTextModel, synchronous: boolean): CellViewModel { - let newCell: CellViewModel = createCellViewModel(this.instantiationService, this, cell); + let newCell: CellViewModel = createCellViewModel(this._instantiationService, this, cell); this._viewCells!.splice(index, 0, newCell); this._handleToViewCellMapping.set(newCell.handle, newCell); this._notebook.insertNewCell(index, [newCell.model]); this._localStore.add(newCell); - this.undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { + this._undoService.pushElement(new InsertCellEdit(this.uri, index, newCell, { insertCell: this._insertCellDelegate.bind(this), deleteCell: this._deleteCellDelegate.bind(this), setSelections: this._setSelectionsDelegate.bind(this) @@ -638,13 +655,12 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return newCell; } - deleteCell(index: number, synchronous: boolean) { + deleteCell(index: number, synchronous: boolean, pushUndoStop: boolean = true) { const primarySelectionIndex = this.selectionHandles.length ? this._viewCells.indexOf(this.getCellByHandle(this.selectionHandles[0])!) : null; let viewCell = this._viewCells[index]; this._viewCells.splice(index, 1); this._handleToViewCellMapping.delete(viewCell.handle); - this._notebook.removeCell(index, 1); let endSelections: number[] = []; @@ -664,14 +680,16 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD } } - this.undoService.pushElement(new DeleteCellEdit(this.uri, index, viewCell, { - insertCell: this._insertCellDelegate.bind(this), - deleteCell: this._deleteCellDelegate.bind(this), - createCellViewModel: (cell: NotebookCellTextModel) => { - return createCellViewModel(this.instantiationService, this, cell); - }, - setSelections: this._setSelectionsDelegate.bind(this) - }, this.selectionHandles, endSelections)); + if (pushUndoStop) { + this._undoService.pushElement(new DeleteCellEdit(this.uri, index, viewCell, { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + setSelections: this._setSelectionsDelegate.bind(this) + }, this.selectionHandles, endSelections)); + } this.selectionHandles = endSelections; @@ -692,7 +710,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD this._notebook.moveCellToIdx(index, newIdx); if (pushedToUndoStack) { - this.undoService.pushElement(new MoveCellEdit(this.uri, index, newIdx, { + this._undoService.pushElement(new MoveCellEdit(this.uri, index, newIdx, { moveCell: (fromIndex: number, toIndex: number) => { this.moveCellToIdx(fromIndex, toIndex, true, false); }, @@ -708,6 +726,249 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return true; } + private _pushIfAbsent(positions: IPosition[], p: IPosition) { + const last = positions.length > 0 ? positions[positions.length - 1] : undefined; + if (!last || last.lineNumber !== p.lineNumber || last.column !== p.column) { + positions.push(p); + } + } + + /** + * Add split point at the beginning and the end; + * Move end of line split points to the beginning of the next line; + * Avoid duplicate split points + */ + private _splitPointsToBoundaries(splitPoints: IPosition[], textBuffer: IReadonlyTextBuffer): IPosition[] | null { + const boundaries: IPosition[] = []; + const lineCnt = textBuffer.getLineCount(); + const getLineLen = (lineNumber: number) => { + return textBuffer.getLineLength(lineNumber); + }; + + // split points need to be sorted + splitPoints = splitPoints.sort((l, r) => { + const lineDiff = l.lineNumber - r.lineNumber; + const columnDiff = l.column - r.column; + return lineDiff !== 0 ? lineDiff : columnDiff; + }); + + // eat-up any split point at the beginning, i.e. we ignore the split point at the very beginning + this._pushIfAbsent(boundaries, new Position(1, 1)); + + for (let sp of splitPoints) { + if (getLineLen(sp.lineNumber) + 1 === sp.column && sp.lineNumber < lineCnt) { + sp = new Position(sp.lineNumber + 1, 1); + } + this._pushIfAbsent(boundaries, sp); + } + + // eat-up any split point at the beginning, i.e. we ignore the split point at the very end + this._pushIfAbsent(boundaries, new Position(lineCnt, getLineLen(lineCnt) + 1)); + + // if we only have two then they describe the whole range and nothing needs to be split + return boundaries.length > 2 ? boundaries : null; + } + + private _computeCellLinesContents(cell: IEditableCellViewModel, splitPoints: IPosition[]): string[] | null { + const rangeBoundaries = this._splitPointsToBoundaries(splitPoints, cell.textBuffer); + if (!rangeBoundaries) { + return null; + } + const newLineModels: string[] = []; + for (let i = 1; i < rangeBoundaries.length; i++) { + const start = rangeBoundaries[i - 1]; + const end = rangeBoundaries[i]; + + newLineModels.push(cell.textModel.getValueInRange(new Range(start.lineNumber, start.column, end.lineNumber, end.column))); + } + + return newLineModels; + } + + async splitNotebookCell(index: number): Promise { + const cell = this.viewCells[index] as CellViewModel; + + if (!this.metadata.editable) { + return null; + } + + if (!cell.getEvaluatedMetadata(this.notebookDocument.metadata).editable) { + return null; + } + + let splitPoints = cell.getSelectionsStartPosition(); + if (splitPoints && splitPoints.length > 0) { + await cell.resolveTextModel(); + + if (!cell.hasModel()) { + return null; + } + + let newLinesContents = this._computeCellLinesContents(cell, splitPoints); + if (newLinesContents) { + + const editorSelections = cell.getSelections(); + // update the contents of the first cell + cell.textModel.applyEdits([ + { range: cell.textModel.getFullModelRange(), text: newLinesContents[0] } + ], false); + + // create new cells based on the new text models + const language = cell.model.language; + const kind = cell.cellKind; + let insertIndex = this.getCellIndex(cell) + 1; + const newCells = []; + for (let j = 1; j < newLinesContents.length; j++, insertIndex++) { + newCells.push(this.createCell(insertIndex, newLinesContents[j], language, kind, undefined, true, false)); + } + + this.selectionHandles = [cell.handle]; + + this._undoService.pushElement(new SplitCellEdit( + this.uri, + index, + cell, + editorSelections, + newLinesContents, + language, + kind, + { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + createCell: this._createCellDelegate.bind(this), + setSelections: this._setSelectionsDelegate.bind(this) + } + )); + return newCells; + } + } + + return null; + } + + async joinNotebookCells(index: number, direction: 'above' | 'below', constraint?: CellKind): Promise<{ cell: ICellViewModel, deletedCells: ICellViewModel[] } | null> { + const cell = this.viewCells[index] as CellViewModel; + + if (!this.metadata.editable) { + return null; + } + + if (!cell.getEvaluatedMetadata(this.notebookDocument.metadata).editable) { + return null; + } + + if (constraint && cell.cellKind !== constraint) { + return null; + } + + if (index === 0 && direction === 'above') { + return null; + } + + if (index === this.length - 1 && direction === 'below') { + return null; + } + + if (direction === 'above') { + const above = this.viewCells[index - 1] as CellViewModel; + if (constraint && above.cellKind !== constraint) { + return null; + } + + if (!above.getEvaluatedMetadata(this.notebookDocument.metadata).editable) { + return null; + } + + await above.resolveTextModel(); + if (!above.hasModel()) { + return null; + } + + const endSelections = [cell.handle]; + const insertContent = (cell.textModel?.getEOL() ?? '') + cell.getText(); + const aboveCellLineCount = above.textModel.getLineCount(); + const aboveCellLastLineEndColumn = above.textModel.getLineLength(aboveCellLineCount); + const editOperation = { range: new Range(aboveCellLineCount, aboveCellLastLineEndColumn + 1, aboveCellLineCount, aboveCellLastLineEndColumn + 1), text: insertContent }; + const editorSelections = above.getSelections(); + above.textModel.applyEdits([editOperation]); + const inverseRange = PieceTreeTextBuffer._getInverseEditRange(editOperation.range, editOperation.text); + + await this.deleteCell(index, true, false); + + this._undoService.pushElement(new JoinCellEdit( + this.uri, + index, + direction, + above, + editorSelections, + inverseRange, + insertContent, + cell, + { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + setSelections: this._setSelectionsDelegate.bind(this) + }) + ); + + this.selectionHandles = endSelections; + + return { cell: above, deletedCells: [above] }; + } else { + const below = this.viewCells[index + 1] as CellViewModel; + if (constraint && below.cellKind !== constraint) { + return null; + } + + if (!below.getEvaluatedMetadata(this.notebookDocument.metadata).editable) { + return null; + } + + await cell.resolveTextModel(); + if (!cell.hasModel()) { + return null; + } + + const insertContent = (cell.textModel?.getEOL() ?? '') + below.getText(); + + const cellLineCount = cell.textModel.getLineCount(); + const cellLastLineEndColumn = cell.textModel.getLineLength(cellLineCount); + const editOperation = { range: new Range(cellLineCount, cellLastLineEndColumn + 1, cellLineCount, cellLastLineEndColumn + 1), text: insertContent }; + const editorSelections = cell.getSelections(); + cell.textModel.applyEdits([editOperation]); + const inverseRange = PieceTreeTextBuffer._getInverseEditRange(editOperation.range, editOperation.text); + + await this.deleteCell(index + 1, true, false); + + this._undoService.pushElement(new JoinCellEdit( + this.uri, + index + 1, + direction, + cell, + editorSelections, + inverseRange, + insertContent, + below, + { + insertCell: this._insertCellDelegate.bind(this), + deleteCell: this._deleteCellDelegate.bind(this), + createCellViewModel: (cell: NotebookCellTextModel) => { + return createCellViewModel(this._instantiationService, this, cell); + }, + setSelections: this._setSelectionsDelegate.bind(this) + }) + ); + + return { cell, deletedCells: [below] }; + } + } + getEditorViewState(): INotebookEditorViewState { const editingCells: { [key: number]: boolean } = {}; this._viewCells.filter(cell => cell.editState === CellEditState.Editing).forEach(cell => editingCells[cell.model.handle] = true); @@ -831,7 +1092,7 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD const viewCell = cell as CellViewModel; this._lastNotebookEditResource.push(viewCell.uri); return viewCell.resolveTextModel().then(() => { - this.bulkEditService.apply({ edits: [{ edit: { range: range, text: text }, resource: cell.uri }] }, { quotableLabel: 'Notebook Replace' }); + this._bulkEditService.apply({ edits: [{ edit: { range: range, text: text }, resource: cell.uri }] }, { quotableLabel: 'Notebook Replace' }); }); } @@ -855,21 +1116,21 @@ export class NotebookViewModel extends Disposable implements EditorFoldingStateD return Promise.all(matches.map(match => { return match.cell.resolveTextModel(); })).then(async () => { - this.bulkEditService.apply({ edits: textEdits }, { quotableLabel: 'Notebook Replace All' }); + this._bulkEditService.apply({ edits: textEdits }, { quotableLabel: 'Notebook Replace All' }); return; }); } canUndo(): boolean { - return this.undoService.canUndo(this.uri); + return this._undoService.canUndo(this.uri); } undo() { - this.undoService.undo(this.uri); + this._undoService.undo(this.uri); } redo() { - this.undoService.redo(this.uri); + this._undoService.redo(this.uri); } equal(notebook: NotebookTextModel) { diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts index 96835a6096..edc2b86ea4 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookCellTextModel.ts @@ -93,6 +93,10 @@ export class NotebookCellTextModel extends Disposable implements ICell { } } + getTextLength(): number { + return this.textBuffer.getLength(); + } + getFullModelRange() { const lineCount = this.textBuffer.getLineCount(); return new Range(1, 1, lineCount, this.textBuffer.getLineLength(lineCount) + 1); diff --git a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts index 85511d650b..b029851b88 100644 --- a/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts +++ b/src/vs/workbench/contrib/notebook/common/model/notebookTextModel.ts @@ -78,8 +78,6 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel onDidChangeContent: Event = this._onDidChangeContent.event; private _onDidChangeMetadata = new Emitter(); onDidChangeMetadata: Event = this._onDidChangeMetadata.event; - private readonly _onDidChangeUnknown = new Emitter(); - readonly onDidChangeUnknown: Event = this._onDidChangeUnknown.event; private _mapping: Map = new Map(); private _cellListeners: Map = new Map(); cells: NotebookCellTextModel[]; @@ -104,15 +102,31 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._onDidSelectionChangeProxy.fire(this._selections); } + private _dirty = false; + protected readonly _onDidChangeDirty = this._register(new Emitter()); + readonly onDidChangeDirty = this._onDidChangeDirty.event; + constructor( public handle: number, public viewType: string, + public supportBackup: boolean, public uri: URI ) { super(); this.cells = []; } + get isDirty() { + return this._dirty; + } + + setDirty(newState: boolean) { + if (this._dirty !== newState) { + this._dirty = newState; + this._onDidChangeDirty.fire(); + } + } + createCellTextModel( source: string | string[], language: string, @@ -134,10 +148,24 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel const cellUri = CellUri.generate(this.uri, cellHandle); return new NotebookCellTextModel(cellUri, cellHandle, cell.source, cell.language, cell.cellKind, cell.outputs || [], cell.metadata); }); - this.insertNewCell(0, mainCells); + + this._isUntitled = false; + + for (let i = 0; i < mainCells.length; i++) { + this._mapping.set(mainCells[i].handle, mainCells[i]); + let dirtyStateListener = mainCells[i].onDidChangeContent(() => { + this.setDirty(true); + this._onDidChangeContent.fire(); + }); + + this._cellListeners.set(mainCells[i].handle, dirtyStateListener); + } + + this.cells.splice(0, 0, ...mainCells); + this._increaseVersionId(); } - $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[]): boolean { + $applyEdit(modelVersionId: number, rawEdits: ICellEditOperation[], emitToExtHost: boolean = true): boolean { if (modelVersionId !== this._versionId) { return false; } @@ -198,19 +226,21 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel return [diff.start, diff.deleteCount, diff.toInsert] as [number, number, NotebookCellTextModel[]]; }); - this._onDidModelChangeProxy.fire({ - kind: NotebookCellsChangeType.ModelChange, - versionId: this._versionId, - changes: diffs.map(diff => [diff[0], diff[1], diff[2].map(cell => ({ - handle: cell.handle, - uri: cell.uri, - source: cell.textBuffer.getLinesContent(), - language: cell.language, - cellKind: cell.cellKind, - outputs: cell.outputs, - metadata: cell.metadata - }))] as [number, number, IMainCellDto[]]) - }); + if (emitToExtHost) { + this._onDidModelChangeProxy.fire({ + kind: NotebookCellsChangeType.ModelChange, + versionId: this._versionId, + changes: diffs.map(diff => [diff[0], diff[1], diff[2].map(cell => ({ + handle: cell.handle, + uri: cell.uri, + source: cell.textBuffer.getLinesContent(), + language: cell.language, + cellKind: cell.cellKind, + outputs: cell.outputs, + metadata: cell.metadata + }))] as [number, number, IMainCellDto[]]) + }); + } this._onDidChangeCells.fire(diffs); return true; @@ -225,7 +255,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } handleUnknownChange() { - this._onDidChangeUnknown.fire(); + this.setDirty(true); } updateLanguages(languages: string[]) { @@ -265,12 +295,14 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this.cells = [cell]; this._mapping.set(cell.handle, cell); - let dirtyStateListener = Event.any(cell.onDidChangeContent, cell.onDidChangeOutputs)(() => { + let dirtyStateListener = cell.onDidChangeContent(() => { this._isUntitled = false; + this.setDirty(true); this._onDidChangeContent.fire(); }); this._cellListeners.set(cell.handle, dirtyStateListener); + this.setDirty(true); this._onDidChangeContent.fire(); this._onDidModelChangeProxy.fire({ @@ -299,7 +331,8 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel for (let i = 0; i < cells.length; i++) { this._mapping.set(cells[i].handle, cells[i]); - let dirtyStateListener = Event.any(cells[i].onDidChangeContent, cells[i].onDidChangeOutputs)(() => { + let dirtyStateListener = cells[i].onDidChangeContent(() => { + this.setDirty(true); this._onDidChangeContent.fire(); }); @@ -307,7 +340,9 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel } this.cells.splice(index, 0, ...cells); + this.setDirty(true); this._onDidChangeContent.fire(); + this._increaseVersionId(); if (emitToExtHost) { @@ -342,6 +377,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel this._cellListeners.delete(cell.handle); } this.cells.splice(index, count); + this.setDirty(true); this._onDidChangeContent.fire(); this._increaseVersionId(); @@ -356,6 +392,8 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel const cells = this.cells.splice(index, 1); this.cells.splice(newIdx, 0, ...cells); + this.setDirty(true); + this._onDidChangeContent.fire(); this._increaseVersionId(); @@ -390,7 +428,7 @@ export class NotebookTextModel extends Disposable implements INotebookTextModel changeCellLanguage(handle: number, languageId: string) { let cell = this._mapping.get(handle); - if (cell) { + if (cell && cell.language !== languageId) { cell.language = languageId; this._increaseVersionId(); diff --git a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts index 9f83c568be..624c399057 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookCommon.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookCommon.ts @@ -17,6 +17,7 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { GlobPattern } from 'vs/workbench/api/common/extHost.protocol'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Schemas } from 'vs/base/common/network'; +import { IRevertOptions } from 'vs/workbench/common/editor'; export enum CellKind { Markdown = 1, @@ -98,8 +99,7 @@ export interface INotebookDisplayOrder { } export interface INotebookMimeTypeSelector { - type: string; - subTypes?: string[]; + mimeTypes?: string[]; } export interface INotebookRendererInfo { @@ -153,12 +153,21 @@ export interface IErrorOutput { traceback?: string[]; } +export interface NotebookCellOutputMetadata { + /** + * Additional attributes of a cell metadata. + */ + custom?: { [key: string]: any }; +} + export interface IDisplayOutput { outputKind: CellOutputKind.Rich; /** * { mime_type: value } */ data: { [key: string]: any; } + + metadata?: NotebookCellOutputMetadata; } export enum MimeTypeRendererResolver { @@ -176,7 +185,9 @@ export interface IOrderedMimeType { export interface ITransformedDisplayOutputDto { outputKind: CellOutputKind.Rich; + outputId: string; data: { [key: string]: any; } + metadata?: NotebookCellOutputMetadata; orderedMimeTypes?: IOrderedMimeType[]; pickedMimeTypeIndex?: number; @@ -195,6 +206,7 @@ export type IRawOutput = IDisplayOutput | IStreamOutput | IErrorOutput; export interface IOutputRenderRequestOutputInfo { index: number; + outputId: string; handlerId: string; mimeType: string; output?: IRawOutput; @@ -211,6 +223,7 @@ export interface IOutputRenderRequest { export interface IOutputRenderResponseOutputInfo { index: number; + outputId: string; mimeType: string; handlerId: string; transformedOutput: string; @@ -250,7 +263,7 @@ export interface IMetadata { export interface INotebookTextModel { handle: number; viewType: string; - // metadata: IMetadata; + metadata: NotebookDocumentMetadata readonly uri: URI; readonly versionId: number; languages: string[]; @@ -258,7 +271,6 @@ export interface INotebookTextModel { renderers: Set; onDidChangeCells?: Event; onDidChangeContent: Event; - onDidChangeUnknown: Event; onWillDispose(listener: () => void): IDisposable; } @@ -300,7 +312,14 @@ export enum NotebookCellsChangeType { Move = 2, CellClearOutput = 3, CellsClearOutput = 4, - ChangeLanguage = 5 + ChangeLanguage = 5, + Initialize = 6 +} + +export interface NotebookCellsInitializeEvent { + readonly kind: NotebookCellsChangeType.Initialize; + readonly changes: NotebookCellsSplice2[]; + readonly versionId: number; } export interface NotebookCellsModelChangedEvent { @@ -334,7 +353,7 @@ export interface NotebookCellsChangeLanguageEvent { readonly language: string; } -export type NotebookCellsChangedEvent = NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent; +export type NotebookCellsChangedEvent = NotebookCellsInitializeEvent | NotebookCellsModelChangedEvent | NotebookCellsModelMoveEvent | NotebookCellClearOutputEvent | NotebookCellsClearOutputEvent | NotebookCellsChangeLanguageEvent; export enum CellEditType { Insert = 1, Delete = 2 @@ -378,11 +397,12 @@ export interface NotebookDataDto { export namespace CellUri { export const scheme = 'vscode-notebook-cell'; + const _regex = /^\d{7,}/; export function generate(notebook: URI, handle: number): URI { return notebook.with({ scheme, - fragment: `${handle}${notebook.scheme !== Schemas.file ? notebook.scheme : ''}` + fragment: `${handle.toString().padStart(7, '0')}${notebook.scheme !== Schemas.file ? notebook.scheme : ''}` }); } @@ -390,14 +410,15 @@ export namespace CellUri { if (cell.scheme !== scheme) { return undefined; } - const handle = parseInt(cell.fragment); - if (isNaN(handle)) { + const match = _regex.exec(cell.fragment); + if (!match) { return undefined; } + const handle = Number(match[0]); return { handle, notebook: cell.with({ - scheme: cell.fragment.substr(handle.toString().length) || Schemas.file, + scheme: cell.fragment.substr(match[0].length) || Schemas.file, fragment: null }) }; @@ -540,9 +561,15 @@ export const NOTEBOOK_EDITOR_CURSOR_BOUNDARY = new RawContextKey<'none' | 'top' export interface INotebookEditorModel extends IEditorModel { - notebook: NotebookTextModel; + readonly onDidChangeDirty: Event; + readonly resource: URI; + readonly viewType: string; + readonly notebook: NotebookTextModel; isDirty(): boolean; + isUntitled(): boolean; save(): Promise; + saveAs(target: URI): Promise; + revert(options?: IRevertOptions | undefined): Promise; } export interface INotebookTextModelBackup { @@ -551,6 +578,12 @@ export interface INotebookTextModelBackup { cells: ICellDto2[] } +export interface NotebookDocumentBackupData { + readonly viewType: string; + readonly name: string; + readonly backupId?: string; +} + export interface IEditor extends editorCommon.ICompositeCodeEditor { readonly onDidChangeModel: Event; readonly onDidFocusEditorWidget: Event; @@ -561,3 +594,8 @@ export interface IEditor extends editorCommon.ICompositeCodeEditor { hasFocus(): boolean; hasModel(): boolean; } + +export enum NotebookEditorPriority { + default = 'default', + option = 'option', +} diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts index 38c88c5485..2f6281cbc0 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModel.ts @@ -5,18 +5,16 @@ import { EditorModel, IRevertOptions } from 'vs/workbench/common/editor'; import { Emitter, Event } from 'vs/base/common/event'; -import { INotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookEditorModel, NotebookDocumentBackupData } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/notebookTextModel'; -import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ResourceMap } from 'vs/base/common/map'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; import { URI } from 'vs/base/common/uri'; -import { IWorkingCopyService, IWorkingCopy, IWorkingCopyBackup } from 'vs/workbench/services/workingCopy/common/workingCopyService'; +import { IWorkingCopyService, IWorkingCopy, IWorkingCopyBackup, WorkingCopyCapabilities } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { basename } from 'vs/base/common/resources'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { DefaultEndOfLine, ITextBuffer, EndOfLinePreference } from 'vs/editor/common/model'; +import { Schemas } from 'vs/base/common/network'; export interface INotebookEditorModelManager { models: NotebookEditorModel[]; @@ -37,7 +35,6 @@ export interface INotebookLoadOptions { export class NotebookEditorModel extends EditorModel implements IWorkingCopy, INotebookEditorModel { - private _dirty = false; protected readonly _onDidChangeDirty = this._register(new Emitter()); readonly onDidChangeDirty = this._onDidChangeDirty.event; private readonly _onDidChangeContent = this._register(new Emitter()); @@ -59,18 +56,18 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN constructor( public readonly resource: URI, public readonly viewType: string, - @INotebookService private readonly notebookService: INotebookService, - @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, - @IBackupFileService private readonly backupFileService: IBackupFileService + @INotebookService private readonly _notebookService: INotebookService, + @IWorkingCopyService private readonly _workingCopyService: IWorkingCopyService, + @IBackupFileService private readonly _backupFileService: IBackupFileService ) { super(); const input = this; - this._workingCopyResource = resource.with({ scheme: 'vscode-notebook' }); + this._workingCopyResource = resource.with({ scheme: Schemas.vscodeNotebook }); const workingCopyAdapter = new class implements IWorkingCopy { readonly resource = input._workingCopyResource; get name() { return input.name; } - readonly capabilities = input.capabilities; + readonly capabilities = input.isUntitled() ? WorkingCopyCapabilities.Untitled : input.capabilities; readonly onDidChangeDirty = input.onDidChangeDirty; readonly onDidChangeContent = input.onDidChangeContent; isDirty(): boolean { return input.isDirty(); } @@ -79,42 +76,62 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN revert(options?: IRevertOptions): Promise { return input.revert(options); } }; - this._register(this.workingCopyService.registerWorkingCopy(workingCopyAdapter)); + this._register(this._workingCopyService.registerWorkingCopy(workingCopyAdapter)); } capabilities = 0; - async backup(): Promise { - return { content: this._notebook.createSnapshot(true) }; + async backup(): Promise> { + if (this._notebook.supportBackup) { + const tokenSource = new CancellationTokenSource(); + const backupId = await this._notebookService.backup(this.viewType, this.resource, tokenSource.token); + + return { + meta: { + name: this._name, + viewType: this._notebook.viewType, + backupId: backupId + } + }; + } else { + return { + meta: { + name: this._name, + viewType: this._notebook.viewType + }, + content: this._notebook.createSnapshot(true) + }; + } } async revert(options?: IRevertOptions | undefined): Promise { if (options?.soft) { - await this.backupFileService.discardBackup(this.resource); + await this._backupFileService.discardBackup(this.resource); return; } await this.load({ forceReadFromDisk: true }); - this._dirty = false; + + this._notebook.setDirty(false); this._onDidChangeDirty.fire(); - return; } async load(options?: INotebookLoadOptions): Promise { if (options?.forceReadFromDisk) { - return this.loadFromProvider(true); + return this.loadFromProvider(true, undefined, undefined); } + if (this.isResolved()) { return this; } - const backup = await this.backupFileService.resolve(this._workingCopyResource); + const backup = await this._backupFileService.resolve(this._workingCopyResource); if (this.isResolved()) { return this; // Make sure meanwhile someone else did not succeed in loading } - if (backup) { + if (backup && backup.meta?.backupId === undefined) { try { return await this.loadFromBackup(backup.value.create(DefaultEndOfLine.LF), options?.editorId); } catch (error) { @@ -122,46 +139,49 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN } } - return this.loadFromProvider(false, options?.editorId); + return this.loadFromProvider(false, options?.editorId, backup?.meta?.backupId); } private async loadFromBackup(content: ITextBuffer, editorId?: string): Promise { const fullRange = content.getRangeAt(0, content.getLength()); const data = JSON.parse(content.getValueInRange(fullRange, EndOfLinePreference.LF)); - const notebook = await this.notebookService.createNotebookFromBackup(this.viewType!, this.resource, data.metadata, data.languages, data.cells, editorId); + const notebook = await this._notebookService.createNotebookFromBackup(this.viewType!, this.resource, data.metadata, data.languages, data.cells, editorId); this._notebook = notebook!; this._name = basename(this._notebook!.uri); this._register(this._notebook.onDidChangeContent(() => { - this.setDirty(true); this._onDidChangeContent.fire(); })); - this._register(this._notebook.onDidChangeUnknown(() => { - this.setDirty(true); + this._register(this._notebook.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); })); - await this.backupFileService.discardBackup(this._workingCopyResource); - this.setDirty(true); + await this._backupFileService.discardBackup(this._workingCopyResource); + this._notebook.setDirty(true); return this; } - private async loadFromProvider(forceReloadFromDisk: boolean, editorId?: string) { - const notebook = await this.notebookService.resolveNotebook(this.viewType!, this.resource, forceReloadFromDisk, editorId); + private async loadFromProvider(forceReloadFromDisk: boolean, editorId: string | undefined, backupId: string | undefined) { + const notebook = await this._notebookService.resolveNotebook(this.viewType!, this.resource, forceReloadFromDisk, editorId, backupId); this._notebook = notebook!; this._name = basename(this._notebook!.uri); this._register(this._notebook.onDidChangeContent(() => { - this.setDirty(true); this._onDidChangeContent.fire(); })); - this._register(this._notebook.onDidChangeUnknown(() => { - this.setDirty(true); + this._register(this._notebook.onDidChangeDirty(() => { + this._onDidChangeDirty.fire(); })); + if (backupId) { + await this._backupFileService.discardBackup(this._workingCopyResource); + this._notebook.setDirty(true); + } + return this; } @@ -169,146 +189,25 @@ export class NotebookEditorModel extends EditorModel implements IWorkingCopy, IN return !!this._notebook; } - setDirty(newState: boolean) { - if (this._dirty !== newState) { - this._dirty = newState; - this._onDidChangeDirty.fire(); - } + isDirty() { + return this._notebook?.isDirty; } - isDirty() { - return this._dirty; + isUntitled() { + return this.resource.scheme === Schemas.untitled; } async save(): Promise { const tokenSource = new CancellationTokenSource(); - await this.notebookService.save(this.notebook.viewType, this.notebook.uri, tokenSource.token); - this._dirty = false; - this._onDidChangeDirty.fire(); + await this._notebookService.save(this.notebook.viewType, this.notebook.uri, tokenSource.token); + this._notebook.setDirty(false); return true; } async saveAs(targetResource: URI): Promise { const tokenSource = new CancellationTokenSource(); - await this.notebookService.saveAs(this.notebook.viewType, this.notebook.uri, targetResource, tokenSource.token); - this._dirty = false; - this._onDidChangeDirty.fire(); + await this._notebookService.saveAs(this.notebook.viewType, this.notebook.uri, targetResource, tokenSource.token); + this._notebook.setDirty(false); return true; } } - -export class NotebookEditorModelManager extends Disposable implements INotebookEditorModelManager { - - private readonly mapResourceToModel = new ResourceMap(); - private readonly mapResourceToModelListeners = new ResourceMap(); - private readonly mapResourceToDisposeListener = new ResourceMap(); - private readonly mapResourceToPendingModelLoaders = new ResourceMap>(); - - // private readonly modelLoadQueue = this._register(new ResourceQueue()); - - get models(): NotebookEditorModel[] { - return [...this.mapResourceToModel.values()]; - } - constructor( - @IInstantiationService readonly instantiationService: IInstantiationService - ) { - super(); - } - - async resolve(resource: URI, viewType: string, editorId?: string): Promise { - // Return early if model is currently being loaded - const pendingLoad = this.mapResourceToPendingModelLoaders.get(resource); - if (pendingLoad) { - return pendingLoad; - } - - let modelPromise: Promise; - let model = this.get(resource); - // let didCreateModel = false; - - // Model exists - if (model) { - // if (options?.reload) { - // } else { - modelPromise = Promise.resolve(model); - // } - } - - // Model does not exist - else { - // didCreateModel = true; - const newModel = model = this.instantiationService.createInstance(NotebookEditorModel, resource, viewType); - modelPromise = model.load({ editorId }); - - this.registerModel(newModel); - } - - // Store pending loads to avoid race conditions - this.mapResourceToPendingModelLoaders.set(resource, modelPromise); - - // Make known to manager (if not already known) - this.add(resource, model); - - // dispose and bind new listeners - - try { - const resolvedModel = await modelPromise; - - // Remove from pending loads - this.mapResourceToPendingModelLoaders.delete(resource); - return resolvedModel; - } catch (error) { - // Free resources of this invalid model - if (model) { - model.dispose(); - } - - // Remove from pending loads - this.mapResourceToPendingModelLoaders.delete(resource); - - throw error; - } - } - - add(resource: URI, model: NotebookEditorModel): void { - const knownModel = this.mapResourceToModel.get(resource); - if (knownModel === model) { - return; // already cached - } - - // dispose any previously stored dispose listener for this resource - const disposeListener = this.mapResourceToDisposeListener.get(resource); - if (disposeListener) { - disposeListener.dispose(); - } - - // store in cache but remove when model gets disposed - this.mapResourceToModel.set(resource, model); - this.mapResourceToDisposeListener.set(resource, model.onDispose(() => this.remove(resource))); - } - - remove(resource: URI): void { - this.mapResourceToModel.delete(resource); - - const disposeListener = this.mapResourceToDisposeListener.get(resource); - if (disposeListener) { - dispose(disposeListener); - this.mapResourceToDisposeListener.delete(resource); - } - - const modelListener = this.mapResourceToModelListeners.get(resource); - if (modelListener) { - dispose(modelListener); - this.mapResourceToModelListeners.delete(resource); - } - } - - - private registerModel(model: NotebookEditorModel): void { - - } - - get(resource: URI): NotebookEditorModel | undefined { - return this.mapResourceToModel.get(resource); - } -} diff --git a/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts new file mode 100644 index 0000000000..6ed66eee86 --- /dev/null +++ b/src/vs/workbench/contrib/notebook/common/notebookEditorModelResolverService.ts @@ -0,0 +1,71 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { URI } from 'vs/base/common/uri'; +import { INotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { NotebookEditorModel } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; +import { IReference, ReferenceCollection } from 'vs/base/common/lifecycle'; +import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; +import { ILogService } from 'vs/platform/log/common/log'; + +export const INotebookEditorModelResolverService = createDecorator('INotebookModelResolverService'); + +export interface INotebookEditorModelResolverService { + readonly _serviceBrand: undefined; + resolve(resource: URI, viewType: string, editorId?: string): Promise>; +} + + +export class NotebookModelReferenceCollection extends ReferenceCollection> { + + constructor( + @IInstantiationService readonly _instantiationService: IInstantiationService, + @INotebookService private readonly _notebookService: INotebookService, + @ILogService private readonly _logService: ILogService, + ) { + super(); + } + + protected createReferencedObject(key: string, ...args: any[]): Promise { + const [viewType, editorId] = args as [string, string | undefined]; + + const resource = URI.parse(key); + const model = this._instantiationService.createInstance(NotebookEditorModel, resource, viewType); + const promise = model.load({ editorId }); + return promise; + } + + protected destroyReferencedObject(_key: string, object: Promise): void { + object.then(model => { + this._notebookService.destoryNotebookDocument(model.viewType, model.notebook); + model.dispose(); + }).catch(err => { + this._logService.critical('FAILED to destory notebook', err); + }); + } +} + +export class NotebookModelResolverService implements INotebookEditorModelResolverService { + + readonly _serviceBrand: undefined; + + private readonly _data: NotebookModelReferenceCollection; + + constructor( + @IInstantiationService instantiationService: IInstantiationService + ) { + this._data = instantiationService.createInstance(NotebookModelReferenceCollection); + } + + async resolve(resource: URI, viewType: string, editorId?: string | undefined): Promise> { + const reference = this._data.acquire(resource.toString(), viewType, editorId); + const model = await reference.object; + return { + object: model, + dispose() { reference.dispose(); } + }; + } +} diff --git a/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer.ts b/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer.ts index 8ab0ddf800..1cbd451343 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookOutputRenderer.ts @@ -25,6 +25,10 @@ export class NotebookOutputRendererInfo { matches(mimeType: string) { let matched = this.mimeTypeGlobs.find(pattern => pattern(mimeType)); - return matched; + if (matched) { + return true; + } + + return this.mimeTypes.find(pattern => pattern === mimeType); } } diff --git a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts index a7be759351..07d0152b9d 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookProvider.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookProvider.ts @@ -5,33 +5,39 @@ import * as glob from 'vs/base/common/glob'; import { URI } from 'vs/base/common/uri'; -import { basename } from 'vs/base/common/resources'; -import { INotebookKernelInfoDto } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { basename } from 'vs/base/common/path'; +import { INotebookKernelInfoDto, NotebookEditorPriority } from 'vs/workbench/contrib/notebook/common/notebookCommon'; export interface NotebookSelector { readonly filenamePattern?: string; readonly excludeFileNamePattern?: string; } -export class NotebookProviderInfo { +export interface NotebookEditorDescriptor { + readonly id: string; + readonly displayName: string; + readonly selector: readonly NotebookSelector[]; + readonly priority: NotebookEditorPriority; + readonly providerDisplayName: string; + readonly providerExtensionLocation: URI; + kernel?: INotebookKernelInfoDto; +} + +export class NotebookProviderInfo implements NotebookEditorDescriptor { readonly id: string; readonly displayName: string; readonly selector: readonly NotebookSelector[]; + readonly priority: NotebookEditorPriority; readonly providerDisplayName: string; readonly providerExtensionLocation: URI; kernel?: INotebookKernelInfoDto; - constructor(descriptor: { - readonly id: string; - readonly displayName: string; - readonly selector: readonly NotebookSelector[]; - readonly providerDisplayName: string; - readonly providerExtensionLocation: URI; - }) { + constructor(descriptor: NotebookEditorDescriptor) { this.id = descriptor.id; this.displayName = descriptor.displayName; this.selector = descriptor.selector; + this.priority = descriptor.priority; this.providerDisplayName = descriptor.providerDisplayName; this.providerExtensionLocation = descriptor.providerExtensionLocation; } @@ -42,9 +48,9 @@ export class NotebookProviderInfo { static selectorMatches(selector: NotebookSelector, resource: URI): boolean { if (selector.filenamePattern) { - if (glob.match(selector.filenamePattern.toLowerCase(), basename(resource).toLowerCase())) { + if (glob.match(selector.filenamePattern.toLowerCase(), basename(resource.fsPath).toLowerCase())) { if (selector.excludeFileNamePattern) { - if (glob.match(selector.excludeFileNamePattern.toLowerCase(), basename(resource).toLowerCase())) { + if (glob.match(selector.excludeFileNamePattern.toLowerCase(), basename(resource.fsPath).toLowerCase())) { // should exclude return false; diff --git a/src/vs/workbench/contrib/notebook/common/notebookService.ts b/src/vs/workbench/contrib/notebook/common/notebookService.ts index 603c59db51..fc6157b726 100644 --- a/src/vs/workbench/contrib/notebook/common/notebookService.ts +++ b/src/vs/workbench/contrib/notebook/common/notebookService.ts @@ -12,29 +12,32 @@ import { INotebookTextModel, INotebookRendererInfo, NotebookDocumentMetadata, IC 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'; -import { INotebookEditorModelManager } from 'vs/workbench/contrib/notebook/common/notebookEditorModel'; + export const INotebookService = createDecorator('notebookService'); export interface IMainNotebookController { kernel: INotebookKernelInfoDto | undefined; - createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string): Promise; + createNotebook(viewType: string, uri: URI, backup: INotebookTextModelBackup | undefined, forceReload: boolean, editorId?: string, backupId?: string): Promise; + resolveNotebookEditor(viewType: string, uri: URI, editorId: string): Promise; executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; onDidReceiveMessage(editorId: string, message: any): void; executeNotebookCell(uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; removeNotebookDocument(notebook: INotebookTextModel): Promise; save(uri: URI, token: CancellationToken): Promise; saveAs(uri: URI, target: URI, token: CancellationToken): Promise; + backup(uri: URI, token: CancellationToken): Promise; } export interface INotebookService { - _serviceBrand: undefined; - modelManager: INotebookEditorModelManager; + readonly _serviceBrand: undefined; canResolve(viewType: string): Promise; onDidChangeActiveEditor: Event; onDidChangeVisibleEditors: Event; onNotebookEditorAdd: Event; - onNotebookEditorRemove: Event; + onNotebookEditorsRemove: Event; + onNotebookDocumentRemove: Event; + onNotebookDocumentAdd: Event; onDidChangeKernels: Event; registerNotebookController(viewType: string, extensionData: NotebookExtensionDescription, controller: IMainNotebookController): void; unregisterNotebookProvider(viewType: string): void; @@ -47,7 +50,7 @@ export interface INotebookService { unregisterNotebookKernel(id: string): void; getContributedNotebookKernels(viewType: string, resource: URI): readonly INotebookKernelInfo[]; getRendererInfo(id: string): INotebookRendererInfo | undefined; - resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string): Promise; + resolveNotebook(viewType: string, uri: URI, forceReload: boolean, editorId?: string, backupId?: string): Promise; createNotebookFromBackup(viewType: string, uri: URI, metadata: NotebookDocumentMetadata, languages: string[], cells: ICellDto2[], editorId?: string): Promise; executeNotebook(viewType: string, uri: URI, useAttachedKernel: boolean, token: CancellationToken): Promise; executeNotebookCell(viewType: string, uri: URI, handle: number, useAttachedKernel: boolean, token: CancellationToken): Promise; @@ -61,6 +64,7 @@ export interface INotebookService { updateVisibleNotebookEditor(editors: string[]): void; save(viewType: string, resource: URI, token: CancellationToken): Promise; saveAs(viewType: string, resource: URI, target: URI, token: CancellationToken): Promise; + backup(viewType: string, uri: URI, token: CancellationToken): Promise; onDidReceiveMessage(viewType: string, editorId: string, message: any): void; setToCopy(items: NotebookCellTextModel[]): void; getToCopy(): NotebookCellTextModel[] | undefined; @@ -69,6 +73,7 @@ export interface INotebookService { addNotebookEditor(editor: IEditor): void; removeNotebookEditor(editor: IEditor): void; listNotebookEditors(): readonly IEditor[]; + listVisibleNotebookEditors(): readonly IEditor[]; listNotebookDocuments(): readonly NotebookTextModel[]; } diff --git a/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts b/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts index 82045e6f91..f27c81928d 100644 --- a/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts +++ b/src/vs/workbench/contrib/notebook/test/notebookViewModel.test.ts @@ -23,7 +23,7 @@ suite('NotebookViewModel', () => { instantiationService.spy(IUndoRedoService, 'pushElement'); test('ctor', function () { - const notebook = new NotebookTextModel(0, 'notebook', URI.parse('test')); + const notebook = new NotebookTextModel(0, 'notebook', false, URI.parse('test')); const model = new NotebookEditorTestModel(notebook); const eventDispatcher = new NotebookEventDispatcher(); const viewModel = new NotebookViewModel('notebook', model.notebook, eventDispatcher, null, instantiationService, blukEditService, undoRedoService); diff --git a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts index 101b9811aa..e9072d5e23 100644 --- a/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts +++ b/src/vs/workbench/contrib/notebook/test/testNotebookEditor.ts @@ -22,6 +22,8 @@ import { NotebookTextModel } from 'vs/workbench/contrib/notebook/common/model/no import { CellKind, CellUri, INotebookEditorModel, IProcessedOutput, NotebookCellMetadata, INotebookKernelInfo } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { Webview } from 'vs/workbench/contrib/webview/browser/webview'; import { ICompositeCodeEditor, IEditor } from 'vs/editor/common/editorCommon'; +import { NotImplementedError } from 'vs/base/common/errors'; +import { Schemas } from 'vs/base/common/network'; export class TestCell extends NotebookCellTextModel { constructor( @@ -37,6 +39,11 @@ export class TestCell extends NotebookCellTextModel { } export class TestNotebookEditor implements INotebookEditor { + private _isDisposed = false; + + get isDisposed() { + return this._isDisposed; + } get viewModel() { return undefined; @@ -138,26 +145,26 @@ export class TestNotebookEditor implements INotebookEditor { setSelection(cell: CellViewModel, selection: Range): void { throw new Error('Method not implemented.'); } - revealRangeInView(cell: CellViewModel, range: Range): void { + revealRangeInViewAsync(cell: CellViewModel, range: Range): Promise { throw new Error('Method not implemented.'); } - revealRangeInCenter(cell: CellViewModel, range: Range): void { + revealRangeInCenterAsync(cell: CellViewModel, range: Range): Promise { throw new Error('Method not implemented.'); } - revealRangeInCenterIfOutsideViewport(cell: CellViewModel, range: Range): void { + revealRangeInCenterIfOutsideViewportAsync(cell: CellViewModel, range: Range): Promise { throw new Error('Method not implemented.'); } - revealLineInView(cell: CellViewModel, line: number): void { + revealLineInViewAsync(cell: CellViewModel, line: number): Promise { throw new Error('Method not implemented.'); } getLayoutInfo(): NotebookLayoutInfo { throw new Error('Method not implemented.'); } - revealLineInCenterIfOutsideViewport(cell: CellViewModel, line: number): void { + revealLineInCenterIfOutsideViewportAsync(cell: CellViewModel, line: number): Promise { throw new Error('Method not implemented.'); } - revealLineInCenter(cell: CellViewModel, line: number): void { + revealLineInCenterAsync(cell: CellViewModel, line: number): Promise { throw new Error('Method not implemented.'); } focus(): void { @@ -184,12 +191,6 @@ export class TestNotebookEditor implements INotebookEditor { deleteNotebookCell(cell: CellViewModel): Promise { throw new Error('Method not implemented.'); } - editNotebookCell(cell: CellViewModel): void { - // throw new Error('Method not implemented.'); - } - saveNotebookCell(cell: CellViewModel): void { - // throw new Error('Method not implemented.'); - } focusNotebookCell(cell: CellViewModel, focusItem: 'editor' | 'container' | 'output'): void { // throw new Error('Method not implemented.'); } @@ -222,6 +223,10 @@ export class TestNotebookEditor implements INotebookEditor { changeDecorations(callback: (changeAccessor: IModelDecorationsChangeAccessor) => any): any { throw new Error('Method not implemented.'); } + + dispose() { + this._isDisposed = true; + } } // export function createTestCellViewModel(instantiationService: IInstantiationService, viewType: string, notebookHandle: number, cellhandle: number, source: string[], language: string, cellKind: CellKind, outputs: IOutput[]) { @@ -239,6 +244,14 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi readonly onDidChangeContent: Event = this._onDidChangeContent.event; + get viewType() { + return this._notebook.viewType; + } + + get resource() { + return this._notebook.uri; + } + get notebook() { return this._notebook; } @@ -261,6 +274,10 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi return this._dirty; } + isUntitled() { + return this._notebook.uri.scheme === Schemas.untitled; + } + getNotebook(): NotebookTextModel { return this._notebook; } @@ -275,12 +292,20 @@ export class NotebookEditorTestModel extends EditorModel implements INotebookEdi return false; } + + saveAs(): Promise { + throw new NotImplementedError(); + } + + revert(): Promise { + throw new NotImplementedError(); + } } export function withTestNotebook(instantiationService: IInstantiationService, blukEditService: IBulkEditService, undoRedoService: IUndoRedoService, cells: [string[], string, CellKind, IProcessedOutput[], NotebookCellMetadata][], callback: (editor: TestNotebookEditor, viewModel: NotebookViewModel, textModel: NotebookTextModel) => void) { const viewType = 'notebook'; const editor = new TestNotebookEditor(); - const notebook = new NotebookTextModel(0, viewType, URI.parse('test')); + const notebook = new NotebookTextModel(0, viewType, false, URI.parse('test')); notebook.cells = cells.map((cell, index) => { return new NotebookCellTextModel(notebook.uri, index, cell[0], cell[1], cell[2], cell[3], cell[4]); }); diff --git a/src/vs/workbench/contrib/outline/browser/outlinePane.ts b/src/vs/workbench/contrib/outline/browser/outlinePane.ts index 85f20fbab2..59cd44a1cc 100644 --- a/src/vs/workbench/contrib/outline/browser/outlinePane.ts +++ b/src/vs/workbench/contrib/outline/browser/outlinePane.ts @@ -42,7 +42,6 @@ import { OutlineConfigKeys, OutlineViewFocused, OutlineViewFiltered } from 'vs/e import { FuzzyScore } from 'vs/base/common/filters'; import { OutlineDataSource, OutlineItemComparator, OutlineSortOrder, OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItem, OutlineIdentityProvider, OutlineNavigationLabelProvider, OutlineFilter, OutlineAccessibilityProvider } from 'vs/editor/contrib/documentSymbols/outlineTree'; import { IDataTreeViewState } from 'vs/base/browser/ui/tree/dataTree'; -import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { basename } from 'vs/base/common/resources'; import { IDataSource } from 'vs/base/browser/ui/tree/tree'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService'; @@ -344,7 +343,8 @@ export class OutlinePane extends ViewPane { hideTwistiesOfChildlessElements: true, overrideStyles: { listBackground: this.getBackgroundColor() - } + }, + openOnSingleClick: true } ); @@ -560,26 +560,11 @@ export class OutlinePane extends ViewPane { // feature: reveal outline selection in editor // on change -> reveal/select defining range this._editorDisposables.add(this._tree.onDidOpen(e => { - - let [first] = e.elements; - if (!(first instanceof OutlineElement)) { + if (!(e.element instanceof OutlineElement)) { return; } - let focus = false; - let aside = false; - // todo@Joh - if (e.browserEvent) { - if (e.browserEvent.type === 'keydown') { - focus = true; - } else if (e.browserEvent.type === 'click') { - const event = new StandardMouseEvent(e.browserEvent as MouseEvent); - focus = e.browserEvent.detail === 2; - aside = (!this._tree.useAltAsMultipleSelectionModifier && event.altKey) - || (this._tree.useAltAsMultipleSelectionModifier && (event.ctrlKey || event.metaKey)); - } - } - this._revealTreeSelection(newModel, first, focus, aside); + this._revealTreeSelection(newModel, e.element, !e.editorOptions.preserveFocus || !!e.editorOptions.pinned, e.sideBySide); })); // feature: reveal editor selection in outline diff --git a/src/vs/workbench/contrib/output/browser/logViewer.ts b/src/vs/workbench/contrib/output/browser/logViewer.ts index d62d2f3465..0111a2f51a 100644 --- a/src/vs/workbench/contrib/output/browser/logViewer.ts +++ b/src/vs/workbench/contrib/output/browser/logViewer.ts @@ -39,9 +39,9 @@ export class LogViewerInput extends ResourceEditorInput { @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService ) { super( + URI.from({ scheme: LOG_SCHEME, path: outputChannelDescriptor.id }), basename(outputChannelDescriptor.file.path), dirname(outputChannelDescriptor.file.path), - URI.from({ scheme: LOG_SCHEME, path: outputChannelDescriptor.id }), undefined, textModelResolverService, textFileService, diff --git a/src/vs/workbench/contrib/output/browser/outputServices.ts b/src/vs/workbench/contrib/output/browser/outputServices.ts index 5706c3561e..2ed79eca4c 100644 --- a/src/vs/workbench/contrib/output/browser/outputServices.ts +++ b/src/vs/workbench/contrib/output/browser/outputServices.ts @@ -56,7 +56,7 @@ class OutputChannel extends Disposable implements IOutputChannel { export class OutputService extends Disposable implements IOutputService, ITextModelContentProvider { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private channels: Map = new Map(); private activeChannelIdInStorage: string; diff --git a/src/vs/workbench/contrib/output/browser/outputView.ts b/src/vs/workbench/contrib/output/browser/outputView.ts index d435cb5ee0..836568f46c 100644 --- a/src/vs/workbench/contrib/output/browser/outputView.ts +++ b/src/vs/workbench/contrib/output/browser/outputView.ts @@ -157,7 +157,7 @@ export class OutputViewPane extends ViewPane { } private createInput(channel: IOutputChannel): ResourceEditorInput { - return this.instantiationService.createInstance(ResourceEditorInput, nls.localize('output model title', "{0} - Output", channel.label), nls.localize('channel', "Output channel for '{0}'", channel.label), channel.uri, undefined); + return this.instantiationService.createInstance(ResourceEditorInput, channel.uri, nls.localize('output model title', "{0} - Output", channel.label), nls.localize('channel', "Output channel for '{0}'", channel.label), undefined); } } diff --git a/src/vs/workbench/contrib/output/common/output.ts b/src/vs/workbench/contrib/output/common/output.ts index a78678f80f..ec39c5b119 100644 --- a/src/vs/workbench/contrib/output/common/output.ts +++ b/src/vs/workbench/contrib/output/common/output.ts @@ -60,7 +60,7 @@ export const IOutputService = createDecorator(OUTPUT_SERVICE_ID) * The output service to manage output from the various processes running. */ export interface IOutputService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Given the channel id returns the output channel instance. diff --git a/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts index 1b3d9c125a..8118f4a147 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts @@ -19,7 +19,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { writeTransientState } from 'vs/workbench/contrib/codeEditor/browser/toggleWordWrap'; import { mergeSort } from 'vs/base/common/arrays'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; @@ -58,9 +58,9 @@ export class PerfviewInput extends ResourceEditorInput { @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService ) { super( + PerfviewInput.Uri, localize('name', "Startup Performance"), undefined, - PerfviewInput.Uri, undefined, textModelResolverService, textFileService, @@ -89,6 +89,7 @@ class PerfModelContentProvider implements ITextModelContentProvider { @ILifecycleService private readonly _lifecycleService: ILifecycleService, @ITimerService private readonly _timerService: ITimerService, @IExtensionService private readonly _extensionService: IExtensionService, + @IProductService private readonly _productService: IProductService ) { } provideTextContent(resource: URI): Promise { @@ -143,7 +144,7 @@ class PerfModelContentProvider implements ITextModelContentProvider { private _addSummary(md: MarkdownBuilder, metrics: IStartupMetrics): void { md.heading(2, 'System Info'); - md.li(`${product.nameShort}: ${product.version} (${product.commit || '0000000'})`); + md.li(`${this._productService.nameShort}: ${this._productService.version} (${this._productService.commit || '0000000'})`); md.li(`OS: ${metrics.platform}(${metrics.release})`); if (metrics.cpus) { md.li(`CPUs: ${metrics.cpus.model}(${metrics.cpus.count} x ${metrics.cpus.speed})`); @@ -217,7 +218,7 @@ class PerfModelContentProvider implements ITextModelContentProvider { md.value += `Name\tTimestamp\tDelta\tTotal\n`; let lastStartTime = -1; let total = 0; - for (const { name, timestamp: startTime } of perf.getEntries()) { + for (const { name, startTime } of perf.getEntries()) { let delta = lastStartTime !== -1 ? startTime - lastStartTime : 0; total += delta; md.value += `${name}\t${startTime}\t${delta}\t${total}\n`; diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts index e5719b10fe..c1f622036d 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts @@ -11,7 +11,6 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import product from 'vs/platform/product/common/product'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { PerfviewInput } from 'vs/workbench/contrib/performance/electron-browser/perfviewEditor'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -109,7 +108,7 @@ export class StartupProfiler implements IWorkbenchContribution { } private async _createPerfIssue(files: string[]): Promise { - const reportIssueUrl = product.reportIssueUrl; + const reportIssueUrl = this._productService.reportIssueUrl; if (!reportIssueUrl) { return; } diff --git a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts index 930d7fe1d6..c4a151b37f 100644 --- a/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts @@ -11,7 +11,7 @@ import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { ILifecycleService, StartupKind, StartupKindToString } from 'vs/platform/lifecycle/common/lifecycle'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUpdateService } from 'vs/platform/update/common/update'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; @@ -34,7 +34,8 @@ export class StartupTimings implements IWorkbenchContribution { @ITelemetryService private readonly _telemetryService: ITelemetryService, @ILifecycleService private readonly _lifecycleService: ILifecycleService, @IUpdateService private readonly _updateService: IUpdateService, - @IWorkbenchEnvironmentService private readonly _envService: INativeWorkbenchEnvironmentService + @IWorkbenchEnvironmentService private readonly _envService: INativeWorkbenchEnvironmentService, + @IProductService private readonly _productService: IProductService ) { // this._report().catch(onUnexpectedError); @@ -73,7 +74,7 @@ export class StartupTimings implements IWorkbenchContribution { this._timerService.startupMetrics, timeout(15000), // wait: cached data creation, telemetry sending ]).then(([startupMetrics]) => { - return promisify(appendFile)(appendTo, `${startupMetrics.ellapsed}\t${product.nameShort}\t${(product.commit || '').slice(0, 10) || '0000000000'}\t${sessionId}\t${standardStartupError === undefined ? 'standard_start' : 'NO_standard_start : ' + standardStartupError}\n`); + return promisify(appendFile)(appendTo, `${startupMetrics.ellapsed}\t${this._productService.nameShort}\t${(this._productService.commit || '').slice(0, 10) || '0000000000'}\t${sessionId}\t${standardStartupError === undefined ? 'standard_start' : 'NO_standard_start : ' + standardStartupError}\n`); }).then(() => { this._electronService.quit(); }).catch(err => { @@ -123,7 +124,7 @@ export class StartupTimings implements IWorkbenchContribution { private _reportPerfTicks(): void { const entries: Record = Object.create(null); for (const entry of getEntries()) { - entries[entry.name] = entry.timestamp; + entries[entry.name] = entry.startTime; } /* __GDPR__ "startupRawTimers" : { @@ -133,4 +134,3 @@ export class StartupTimings implements IWorkbenchContribution { this._telemetryService.publicLog('startupRawTimers', { entries }); } } - diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 27d2ccffff..d4031b2ca5 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -30,7 +30,7 @@ import { IThemeService, registerThemingParticipant, IColorTheme, ICssStyleCollec import { IContextKeyService, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { listHighlightForeground, badgeBackground, contrastBorder, badgeForeground, listActiveSelectionForeground, listInactiveSelectionForeground, listHoverForeground, listFocusForeground, editorBackground } from 'vs/platform/theme/common/colorRegistry'; +import { listHighlightForeground, badgeBackground, contrastBorder, badgeForeground, listActiveSelectionForeground, listInactiveSelectionForeground, listHoverForeground, listFocusForeground, editorBackground, foreground, listActiveSelectionBackground, listInactiveSelectionBackground, listFocusBackground, listHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; @@ -44,6 +44,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { MenuRegistry, MenuId, isIMenuItem } from 'vs/platform/actions/common/actions'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { preferencesEditIcon } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; +import { Color, RGBA } from 'vs/base/common/color'; +import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; const $ = DOM.$; @@ -53,6 +55,8 @@ interface ColumnItem { width: number; } +const oddRowBackgroundColor = new Color(new RGBA(130, 130, 130, 0.04)); + export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditorPane { static readonly ID: string = 'workbench.editor.keybindings'; @@ -1119,11 +1123,56 @@ class AccessibilityProvider implements IListAccessibilityProvider { + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-header { background-color: ${oddRowBackgroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.odd:not(.focused):not(.selected):not(:hover) { background-color: ${oddRowBackgroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(:focus) .monaco-list-row.focused.odd:not(.selected):not(:hover) { background-color: ${oddRowBackgroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(.focused) .monaco-list-row.focused.odd:not(.selected):not(:hover) { background-color: ${oddRowBackgroundColor}; }`); + + const foregroundColor = theme.getColor(foreground); + if (foregroundColor) { + const whenForegroundColor = foregroundColor.transparent(.8).makeOpaque(WORKBENCH_BACKGROUND(theme)); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column > .code { color: ${whenForegroundColor}; }`); + const whenForegroundColorForOddRow = foregroundColor.transparent(.8).makeOpaque(oddRowBackgroundColor); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.odd > .column > .code { color: ${whenForegroundColorForOddRow}; }`); + } + + const listActiveSelectionForegroundColor = theme.getColor(listActiveSelectionForeground); + const listActiveSelectionBackgroundColor = theme.getColor(listActiveSelectionBackground); + if (listActiveSelectionForegroundColor && listActiveSelectionBackgroundColor) { + const whenForegroundColor = listActiveSelectionForegroundColor.transparent(.8).makeOpaque(listActiveSelectionBackgroundColor); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column > .code { color: ${whenForegroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.odd.selected > .column > .code { color: ${whenForegroundColor}; }`); + } + + const listInactiveSelectionForegroundColor = theme.getColor(listInactiveSelectionForeground); + const listInactiveSelectionBackgroundColor = theme.getColor(listInactiveSelectionBackground); + if (listInactiveSelectionForegroundColor && listInactiveSelectionBackgroundColor) { + const whenForegroundColor = listInactiveSelectionForegroundColor.transparent(.8).makeOpaque(listInactiveSelectionBackgroundColor); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list .monaco-list-row.selected > .column > .code { color: ${whenForegroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list .monaco-list-row.odd.selected > .column > .code { color: ${whenForegroundColor}; }`); + } + + const listFocusForegroundColor = theme.getColor(listFocusForeground); + const listFocusBackgroundColor = theme.getColor(listFocusBackground); + if (listFocusForegroundColor && listFocusBackgroundColor) { + const whenForegroundColor = listFocusForegroundColor.transparent(.8).makeOpaque(listFocusBackgroundColor); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.focused > .column > .code { color: ${whenForegroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.odd.focused > .column > .code { color: ${whenForegroundColor}; }`); + } + + const listHoverForegroundColor = theme.getColor(listHoverForeground); + const listHoverBackgroundColor = theme.getColor(listHoverBackground); + if (listHoverForegroundColor && listHoverBackgroundColor) { + const whenForegroundColor = listHoverForegroundColor.transparent(.8).makeOpaque(listHoverBackgroundColor); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row:hover:not(.focused):not(.selected) > .column > .code { color: ${whenForegroundColor}; }`); + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.odd:hover:not(.focused):not(.selected) > .column > .code { color: ${whenForegroundColor}; }`); + } + const listHighlightForegroundColor = theme.getColor(listHighlightForeground); if (listHighlightForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); } - const listActiveSelectionForegroundColor = theme.getColor(listActiveSelectionForeground); + if (listActiveSelectionForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected.focused > .column .monaco-keybinding-key { color: ${listActiveSelectionForegroundColor}; }`); collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected > .column .monaco-keybinding-key { color: ${listActiveSelectionForegroundColor}; }`); @@ -1132,11 +1181,9 @@ registerThemingParticipant((theme: IColorTheme, collector: ICssStyleCollector) = if (listInactiveFocusAndSelectionForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list .monaco-list-row.selected > .column .monaco-keybinding-key { color: ${listInactiveFocusAndSelectionForegroundColor}; }`); } - const listHoverForegroundColor = theme.getColor(listHoverForeground); if (listHoverForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list .monaco-list-row:hover:not(.selected):not(.focused) > .column .monaco-keybinding-key { color: ${listHoverForegroundColor}; }`); } - const listFocusForegroundColor = theme.getColor(listFocusForeground); if (listFocusForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list .monaco-list-row.focused > .column .monaco-keybinding-key { color: ${listFocusForegroundColor}; }`); } diff --git a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css index 705e5af46c..e756d04e21 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css +++ b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css @@ -84,13 +84,6 @@ display: flex; } -.keybindings-editor > .keybindings-body > .keybindings-list-header, -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row.odd:not(.focused):not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(:focus) .monaco-list-row.focused.odd:not(.selected):not(:hover), -.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:not(.focused) .monaco-list-row.focused.odd:not(.selected):not(:hover) { - background-color: rgba(130, 130, 130, 0.04); -} - .keybindings-editor > .keybindings-body > .keybindings-list-header > .header { text-align: left; font-weight: bold; @@ -147,7 +140,6 @@ .keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column > .code { font-family: var(--monaco-monospace-font); font-size: 90%; - opacity: 0.8; display: flex; overflow: hidden; } diff --git a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css index 2a5bf7d699..d6cdcadc0e 100644 --- a/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css +++ b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css @@ -7,14 +7,17 @@ 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-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-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; @@ -25,9 +28,24 @@ .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-sibling { max-width: 10%; } +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-key { + margin-left: 4px; + flex: 2; + min-width: 40%; +} +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-value { + flex: 3; +} +.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-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; } @@ -49,13 +67,31 @@ 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, +.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 { + 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 { + 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 { + background-color: rgba(130, 130, 130, 0.04); +} + .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-row:focus { outline: none; } @@ -84,14 +120,14 @@ padding: 2px 14px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-item-control.setting-list-new-mode .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 { display: inline-block; margin-top: 4px; - margin-right: 10px; + margin-right: 4px; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-edit-row { @@ -99,19 +135,31 @@ } .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-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; - flex: 1; - margin-right: 10px; + flex: 3; + margin-right: 4px; +} + +.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-object-widget .setting-list-object-input-key { + flex: 2; + min-width: 40%; } .settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-list .setting-list-okButton { - margin-right: 10px; + margin-right: 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-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-input select { + width: 100%; + height: 24px; +} diff --git a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts index f7060dac85..002d975011 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferences.contribution.ts @@ -39,6 +39,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultPreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; +import { AbstractSideBySideEditorInputFactory } from 'vs/workbench/browser/parts/editor/editor.contribution'; const SETTINGS_EDITOR_COMMAND_SEARCH = 'settings.action.search'; @@ -89,79 +90,11 @@ Registry.as(EditorExtensions.Editors).registerEditor( ] ); -interface ISerializedPreferencesEditorInput { - name: string; - description: string; - - detailsSerialized: string; - masterSerialized: string; - - detailsTypeId: string; - masterTypeId: string; -} - // Register Preferences Editor Input Factory -class PreferencesEditorInputFactory implements IEditorInputFactory { +class PreferencesEditorInputFactory extends AbstractSideBySideEditorInputFactory { - canSerialize(editorInput: EditorInput): boolean { - const input = editorInput; - - if (input.details && input.master) { - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId()); - const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId()); - - return !!(detailsInputFactory?.canSerialize(input.details) && masterInputFactory?.canSerialize(input.master)); - } - - return false; - } - - serialize(editorInput: EditorInput): string | undefined { - const input = editorInput; - - if (input.details && input.master) { - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(input.details.getTypeId()); - const masterInputFactory = registry.getEditorInputFactory(input.master.getTypeId()); - - if (detailsInputFactory && masterInputFactory) { - const detailsSerialized = detailsInputFactory.serialize(input.details); - const masterSerialized = masterInputFactory.serialize(input.master); - - if (detailsSerialized && masterSerialized) { - return JSON.stringify({ - name: input.getName(), - description: input.getDescription(), - detailsSerialized, - masterSerialized, - detailsTypeId: input.details.getTypeId(), - masterTypeId: input.master.getTypeId() - }); - } - } - } - - return undefined; - } - - deserialize(instantiationService: IInstantiationService, serializedEditorInput: string): EditorInput | undefined { - const deserialized: ISerializedPreferencesEditorInput = JSON.parse(serializedEditorInput); - - const registry = Registry.as(EditorInputExtensions.EditorInputFactories); - const detailsInputFactory = registry.getEditorInputFactory(deserialized.detailsTypeId); - const masterInputFactory = registry.getEditorInputFactory(deserialized.masterTypeId); - - if (detailsInputFactory && masterInputFactory) { - const detailsInput = detailsInputFactory.deserialize(instantiationService, deserialized.detailsSerialized); - const masterInput = masterInputFactory.deserialize(instantiationService, deserialized.masterSerialized); - - if (detailsInput && masterInput) { - return new PreferencesEditorInput(deserialized.name, deserialized.description, detailsInput, masterInput); - } - } - - return undefined; + protected createEditorInput(name: string, description: string | undefined, detailsInput: EditorInput, masterInput: EditorInput): EditorInput { + return new PreferencesEditorInput(name, description, detailsInput, masterInput); } } diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts index 3c626cfc91..e0ad99502e 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts @@ -80,7 +80,7 @@ export class PreferencesEditor extends BaseEditor { set minimumWidth(value: number) { /*noop*/ } set maximumWidth(value: number) { /*noop*/ } - readonly minimumHeight = 260; + get minimumHeight() { return 260; } private _onDidCreateWidget = this._register(new Emitter<{ width: number; height: number; } | undefined>()); readonly onDidSizeConstraintsChange: Event<{ width: number; height: number; } | undefined> = this._onDidCreateWidget.event; diff --git a/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts b/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts index 4c75009cb0..c8c636cb3f 100644 --- a/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesSearch.ts @@ -33,7 +33,7 @@ export interface IEndpointDetails { } export class PreferencesSearchService extends Disposable implements IPreferencesSearchService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _installedExtensions: Promise; diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index f926cbe61b..2055a6f381 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -35,10 +35,10 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { badgeBackground, badgeForeground, contrastBorder, editorForeground } from 'vs/platform/theme/common/colorRegistry'; -import { attachStylerCallback } from 'vs/platform/theme/common/styler'; +import { attachStylerCallback, attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { getUserDataSyncStore, IUserDataSyncService, SyncStatus, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { getUserDataSyncStore, IUserDataSyncService, SyncStatus, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditorMemento, IEditorPane } from 'vs/workbench/common/editor'; import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput'; @@ -172,7 +172,7 @@ export class SettingsEditor2 extends BaseEditor { @IKeybindingService private readonly keybindingService: IKeybindingService, @IStorageKeysSyncRegistryService storageKeysSyncRegistryService: IStorageKeysSyncRegistryService, @IProductService private readonly productService: IProductService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService ) { super(SettingsEditor2.ID, telemetryService, themeService, storageService); this.delayedFilterLogging = new Delayer(1000); @@ -477,7 +477,7 @@ export class SettingsEditor2 extends BaseEditor { this.settingsTargetsWidget.settingsTarget = ConfigurationTarget.USER_LOCAL; this.settingsTargetsWidget.onDidTargetChange(target => this.onDidSettingsTargetChange(target)); - if (syncAllowed(this.productService, this.configurationService) && this.userDataSyncEnablementService.canToggleEnablement()) { + if (syncAllowed(this.productService, this.configurationService) && this.userDataAutoSyncService.canToggleEnablement()) { const syncControls = this._register(this.instantiationService.createInstance(SyncControls, headerControlsContainer)); this._register(syncControls.onDidChangeLastSyncedLabel(lastSyncedLabel => this.updateInputAriaLabel(lastSyncedLabel))); } @@ -1410,13 +1410,15 @@ class SyncControls extends Disposable { container: HTMLElement, @ICommandService private readonly commandService: ICommandService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, + @IThemeService themeService: IThemeService, ) { super(); const headerRightControlsContainer = DOM.append(container, $('.settings-right-controls')); const turnOnSyncButtonContainer = DOM.append(headerRightControlsContainer, $('.turn-on-sync')); this.turnOnSyncButton = this._register(new Button(turnOnSyncButtonContainer, { title: true })); + this._register(attachButtonStyler(this.turnOnSyncButton, themeService)); this.lastSyncedLabel = DOM.append(headerRightControlsContainer, $('.last-synced-label')); DOM.hide(this.lastSyncedLabel); @@ -1425,7 +1427,7 @@ class SyncControls extends Disposable { DOM.hide(this.turnOnSyncButton.element); this._register(this.turnOnSyncButton.onDidClick(async () => { - await this.commandService.executeCommand('workbench.userData.actions.syncStart'); + await this.commandService.executeCommand('workbench.userDataSync.actions.turnOn'); })); this.updateLastSyncedTime(); @@ -1441,7 +1443,7 @@ class SyncControls extends Disposable { this.update(); })); - this._register(this.userDataSyncEnablementService.onDidChangeEnablement(() => { + this._register(this.userDataAutoSyncService.onDidChangeEnablement(() => { this.update(); })); } @@ -1465,7 +1467,7 @@ class SyncControls extends Disposable { return; } - if (this.userDataSyncEnablementService.isEnabled()) { + if (this.userDataAutoSyncService.isEnabled()) { DOM.show(this.lastSyncedLabel); DOM.hide(this.turnOnSyncButton.element); } else { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts index f21d46c2b2..f75efce0f4 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -30,7 +30,7 @@ import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle'; import { isIOS } from 'vs/base/common/platform'; import { ISpliceable } from 'vs/base/common/sequence'; import { escapeRegExpCharacters, startsWith } from 'vs/base/common/strings'; -import { isArray } from 'vs/base/common/types'; +import { isArray, isDefined, isUndefinedOrNull } from 'vs/base/common/types'; import { localize } from 'vs/nls'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ICommandService } from 'vs/platform/commands/common/commands'; @@ -45,14 +45,15 @@ import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticip import { getIgnoredSettings } from 'vs/platform/userDataSync/common/settingsMerge'; import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; -import { ExcludeSettingWidget, IListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { ExcludeSettingWidget, ISettingListChangeEvent, IListDataItem, ListSettingWidget, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground, ObjectSettingWidget, IObjectDataItem, IObjectEnumOption } 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'; -import { IUserDataSyncEnablementService, getDefaultIgnoredSettings } from 'vs/platform/userDataSync/common/userDataSync'; +import { getDefaultIgnoredSettings, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { getInvalidTypeError } from 'vs/workbench/services/preferences/common/preferencesValidation'; import { Codicon } from 'vs/base/common/codicons'; import { CodiconLabel } from 'vs/base/browser/ui/codicons/codiconLabel'; +import { IJSONSchema } from 'vs/base/common/jsonSchema'; const $ = DOM.$; @@ -75,6 +76,94 @@ function getExcludeDisplayValue(element: SettingsTreeSettingElement): IListDataI }); } +function areAllPropertiesDefined(properties: string[], itemsToDisplay: IObjectDataItem[]): boolean { + const staticProperties = new Set(properties); + itemsToDisplay.forEach(({ key }) => staticProperties.delete(key.data)); + return staticProperties.size === 0; +} + +function getEnumOptionsFromSchema(schema: IJSONSchema): IObjectEnumOption[] { + const enumDescriptions = schema.enumDescriptions ?? []; + + return (schema.enum ?? []).map((value, idx) => { + const description = idx < enumDescriptions.length + ? enumDescriptions[idx] + : undefined; + + return { value, description }; + }); +} + +function getObjectDisplayValue(element: SettingsTreeSettingElement): IObjectDataItem[] { + const data = element.isConfigured ? + { ...element.defaultValue, ...element.scopeValue } : + element.defaultValue; + + const { objectProperties, objectPatternProperties, objectAdditionalProperties } = element.setting; + const patternsAndSchemas = Object + .entries(objectPatternProperties ?? {}) + .map(([pattern, schema]) => ({ + pattern: new RegExp(pattern), + schema + })); + + const additionalValueEnums = getEnumOptionsFromSchema( + typeof objectAdditionalProperties === 'boolean' + ? {} + : objectAdditionalProperties ?? {} + ); + + const wellDefinedKeyEnumOptions = Object.entries(objectProperties ?? {}).map( + ([key, schema]) => ({ value: key, description: schema.description }) + ); + + return Object.keys(data).map(key => { + if (isDefined(objectProperties) && key in objectProperties) { + const defaultValue = element.defaultValue[key]; + const valueEnumOptions = getEnumOptionsFromSchema(objectProperties[key]); + + return { + key: { + type: 'enum', + data: key, + options: wellDefinedKeyEnumOptions, + }, + value: { + type: valueEnumOptions.length > 0 ? 'enum' : 'string', + data: data[key], + options: valueEnumOptions, + }, + removable: isUndefinedOrNull(defaultValue), + }; + } + + const schema = patternsAndSchemas.find(({ pattern }) => pattern.test(key))?.schema; + + if (schema) { + const valueEnumOptions = getEnumOptionsFromSchema(schema); + return { + key: { type: 'string', data: key }, + value: { + type: valueEnumOptions.length > 0 ? 'enum' : 'string', + data: data[key], + options: valueEnumOptions, + }, + removable: true, + }; + } + + return { + key: { type: 'string', data: key }, + value: { + type: additionalValueEnums.length > 0 ? 'enum' : 'string', + data: data[key], + options: additionalValueEnums, + }, + removable: true, + }; + }); +} + function getListDisplayValue(element: SettingsTreeSettingElement): IListDataItem[] { if (!element.value || !isArray(element.value)) { return []; @@ -242,6 +331,10 @@ interface ISettingExcludeItemTemplate extends ISettingItemTemplate { excludeWidget: ListSettingWidget; } +interface ISettingObjectItemTemplate extends ISettingItemTemplate { + objectWidget: ObjectSettingWidget; +} + interface ISettingNewExtensionsTemplate extends IDisposableTemplate { button: Button; context?: SettingsTreeNewExtensionsElement; @@ -258,6 +351,7 @@ const SETTINGS_ENUM_TEMPLATE_ID = 'settings.enum.template'; const SETTINGS_BOOL_TEMPLATE_ID = 'settings.bool.template'; const SETTINGS_ARRAY_TEMPLATE_ID = 'settings.array.template'; const SETTINGS_EXCLUDE_TEMPLATE_ID = 'settings.exclude.template'; +const SETTINGS_OBJECT_TEMPLATE_ID = 'settings.object.template'; const SETTINGS_COMPLEX_TEMPLATE_ID = 'settings.complex.template'; const SETTINGS_NEW_EXTENSIONS_TEMPLATE_ID = 'settings.newExtensions.template'; const SETTINGS_ELEMENT_TEMPLATE_ID = 'settings.group.template'; @@ -535,7 +629,7 @@ export abstract class AbstractSettingRenderer extends Disposable implements ITre // Rewrite `#editor.fontSize#` to link format text = fixSettingLinks(text); - const renderedMarkdown = renderMarkdown({ value: text }, { + const renderedMarkdown = renderMarkdown({ value: text, isTrusted: true }, { actionHandler: { callback: (content: string) => { if (startsWith(content, '#')) { @@ -797,7 +891,7 @@ export class SettingArrayRenderer extends AbstractSettingRenderer implements ITr }); } - private computeNewList(template: ISettingListItemTemplate, e: IListChangeEvent): string[] | undefined | null { + private computeNewList(template: ISettingListItemTemplate, e: ISettingListChangeEvent): string[] | undefined | null { if (template.context) { let newValue: string[] = []; if (isArray(template.context.scopeValue)) { @@ -808,23 +902,23 @@ export class SettingArrayRenderer extends AbstractSettingRenderer implements ITr if (e.targetIndex !== undefined) { // Delete value - if (!e.value && e.originalValue && e.targetIndex > -1) { + if (!e.item?.value && e.originalItem.value && e.targetIndex > -1) { newValue.splice(e.targetIndex, 1); } // Update value - else if (e.value && e.originalValue) { + else if (e.item?.value && e.originalItem.value) { if (e.targetIndex > -1) { - newValue[e.targetIndex] = e.value; + newValue[e.targetIndex] = e.item.value; } // For some reason, we are updating and cannot find original value // Just append the value in this case else { - newValue.push(e.value); + newValue.push(e.item.value); } } // Add value - else if (e.value && !e.originalValue && e.targetIndex >= newValue.length) { - newValue.push(e.value); + else if (e.item?.value && !e.originalItem.value && e.targetIndex >= newValue.length) { + newValue.push(e.item.value); } } if ( @@ -860,6 +954,87 @@ export class SettingArrayRenderer extends AbstractSettingRenderer implements ITr } } +export class SettingObjectRenderer extends AbstractSettingRenderer implements ITreeRenderer { + templateId = SETTINGS_OBJECT_TEMPLATE_ID; + + renderTemplate(container: HTMLElement): ISettingObjectItemTemplate { + const common = this.renderCommonTemplate(null, container, 'list'); + + const objectWidget = this._instantiationService.createInstance(ObjectSettingWidget, common.controlElement); + objectWidget.domNode.classList.add(AbstractSettingRenderer.CONTROL_CLASS); + common.toDispose.add(objectWidget); + + const template: ISettingObjectItemTemplate = { + ...common, + objectWidget: objectWidget, + }; + + this.addSettingElementFocusHandler(template); + + common.toDispose.add(objectWidget.onDidChangeList(e => this.onDidChangeObject(template, e))); + + return template; + } + + private onDidChangeObject(template: ISettingObjectItemTemplate, e: ISettingListChangeEvent): void { + if (template.context) { + const defaultValue: Record = template.context.defaultValue; + const scopeValue: Record = template.context.scopeValue; + const newValue: Record = {}; + + template.objectWidget.items.forEach(item => { + // Item was updated + if (isDefined(e.item) && e.originalItem.key.data === item.key.data) { + newValue[e.item.key.data] = e.item.value.data; + } + // All remaining items + else { + newValue[item.key.data] = item.value.data; + } + }); + + // Item was deleted + if (isUndefinedOrNull(e.item)) { + delete newValue[e.originalItem.key.data]; + } + // New item was added + else if (template.objectWidget.isItemNew(e.originalItem)) { + newValue[e.item.key.data] = e.item.value.data; + } + + Object.entries(newValue).forEach(([key, value]) => { + // value from the scope has changed back to the default + if (scopeValue[key] !== value && defaultValue[key] === value) { + delete newValue[key]; + } + }); + + this._onDidChangeSetting.fire({ + key: template.context.setting.key, + value: Object.keys(newValue).length === 0 ? undefined : newValue, + type: template.context.valueType + }); + } + } + + renderElement(element: ITreeNode, index: number, templateData: ISettingObjectItemTemplate): void { + super.renderSettingElement(element, index, templateData); + } + + protected renderValue(dataElement: SettingsTreeSettingElement, template: ISettingObjectItemTemplate, onChange: (value: string) => void): void { + const items = getObjectDisplayValue(dataElement); + + template.objectWidget.setValue(items, { + showAddButton: ( + isDefined(dataElement.setting.objectAdditionalProperties) || + isDefined(dataElement.setting.objectPatternProperties) || + !areAllPropertiesDefined(Object.keys(dataElement.setting.objectProperties ?? {}), items) + ), + }); + template.context = dataElement; + } +} + export class SettingExcludeRenderer extends AbstractSettingRenderer implements ITreeRenderer { templateId = SETTINGS_EXCLUDE_TEMPLATE_ID; @@ -882,27 +1057,27 @@ export class SettingExcludeRenderer extends AbstractSettingRenderer implements I return template; } - private onDidChangeExclude(template: ISettingExcludeItemTemplate, e: IListChangeEvent): void { + private onDidChangeExclude(template: ISettingExcludeItemTemplate, e: ISettingListChangeEvent): void { if (template.context) { const newValue = { ...template.context.scopeValue }; // first delete the existing entry, if present - if (e.originalValue) { - if (e.originalValue in template.context.defaultValue) { + if (e.originalItem.value) { + if (e.originalItem.value in template.context.defaultValue) { // delete a default by overriding it - newValue[e.originalValue] = false; + newValue[e.originalItem.value] = false; } else { - delete newValue[e.originalValue]; + delete newValue[e.originalItem.value]; } } // then add the new or updated entry, if present - if (e.value) { - if (e.value in template.context.defaultValue && !e.sibling) { + if (e.item?.value) { + if (e.item.value in template.context.defaultValue && !e.item.sibling) { // add a default by deleting its override - delete newValue[e.value]; + delete newValue[e.item.value]; } else { - newValue[e.value] = e.sibling ? { when: e.sibling } : true; + newValue[e.item.value] = e.item.sibling ? { when: e.item.sibling } : true; } } @@ -979,7 +1154,11 @@ export class SettingTextRenderer extends AbstractSettingRenderer implements ITre template.onChange = undefined; template.inputBox.value = dataElement.value; - template.onChange = value => { renderValidations(dataElement, template, false, label); onChange(value); }; + template.onChange = value => { + if (!renderValidations(dataElement, template, false, label)) { + onChange(value); + } + }; renderValidations(dataElement, template, true, label); } @@ -1126,8 +1305,9 @@ export class SettingNumberRenderer extends AbstractSettingRenderer implements IT template.onChange = undefined; template.inputBox.value = dataElement.value; template.onChange = value => { - renderValidations(dataElement, template, false, label); - onChange(nullNumParseFn(value)); + if (!renderValidations(dataElement, template, false, label)) { + onChange(nullNumParseFn(value)); + } }; renderValidations(dataElement, template, true, label); @@ -1256,7 +1436,7 @@ export class SettingTreeRenderers { @IInstantiationService private readonly _instantiationService: IInstantiationService, @IContextMenuService private readonly _contextMenuService: IContextMenuService, @IContextViewService private readonly _contextViewService: IContextViewService, - @IUserDataSyncEnablementService private readonly _userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService private readonly _userDataAutoSyncService: IUserDataAutoSyncService, ) { this.settingActions = [ new Action('settings.resetSetting', localize('resetSettingLabel', "Reset Setting"), undefined, undefined, (context: SettingsTreeSettingElement) => { @@ -1281,6 +1461,7 @@ export class SettingTreeRenderers { this._instantiationService.createInstance(SettingTextRenderer, this.settingActions, actionFactory), this._instantiationService.createInstance(SettingExcludeRenderer, this.settingActions, actionFactory), this._instantiationService.createInstance(SettingEnumRenderer, this.settingActions, actionFactory), + this._instantiationService.createInstance(SettingObjectRenderer, this.settingActions, actionFactory), ]; this.onDidClickOverrideElement = Event.any(...settingRenderers.map(r => r.onDidClickOverrideElement)); @@ -1300,7 +1481,7 @@ export class SettingTreeRenderers { } private getActionsForSetting(setting: ISetting): IAction[] { - const enableSync = this._userDataSyncEnablementService.isEnabled(); + const enableSync = this._userDataAutoSyncService.isEnabled(); return enableSync && !setting.disallowSyncIgnore ? [ new Separator(), @@ -1348,7 +1529,10 @@ export class SettingTreeRenderers { } } -function renderValidations(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, calledOnStartup: boolean, originalAriaLabel: string) { +/** + * Validate and render any error message. Returns true if the value is invalid. + */ +function renderValidations(dataElement: SettingsTreeSettingElement, template: ISettingTextItemTemplate, calledOnStartup: boolean, originalAriaLabel: string): boolean { if (dataElement.setting.validator) { const errMsg = dataElement.setting.validator(template.inputBox.value); if (errMsg) { @@ -1357,12 +1541,13 @@ function renderValidations(dataElement: SettingsTreeSettingElement, template: IS const validationError = localize('validationError', "Validation Error."); template.inputBox.inputElement.parentElement!.setAttribute('aria-label', [originalAriaLabel, validationError, errMsg].join(' ')); if (!calledOnStartup) { ariaAlert(validationError + ' ' + errMsg); } - return; + return true; } else { template.inputBox.inputElement.parentElement!.setAttribute('aria-label', originalAriaLabel); } } DOM.removeClass(template.containerElement, 'invalid-input'); + return false; } function renderArrayValidations( @@ -1515,6 +1700,10 @@ class SettingsTreeDelegate extends CachedListVirtualDelegate = TDataItem & { + editing?: boolean; + selected?: boolean; +}; + +export class ListSettingListModel { + protected _dataItems: TDataItem[] = []; private _editKey: EditKey | null = null; private _selectedIdx: number | null = null; + private _newDataItem: TDataItem; - get items(): IListViewItem[] { + get items(): IListViewItem[] { const items = this._dataItems.map((item, i) => { const editing = typeof this._editKey === 'number' && this._editKey === i; - return { + return { ...item, editing, selected: i === this._selectedIdx || editing @@ -159,19 +168,22 @@ export class ListSettingListModel { items.push({ editing: true, selected: true, - value: '', - sibling: '' + ...this._newDataItem, }); } return items; } + constructor(newItem: TDataItem) { + this._newDataItem = newItem; + } + setEditKey(key: EditKey): void { this._editKey = key; } - setValue(listData: IListDataItem[]): void { + setValue(listData: TDataItem[]): void { this._dataItems = listData; } @@ -200,30 +212,39 @@ export class ListSettingListModel { } } -export interface IListChangeEvent { - originalValue: string; - value?: string; - sibling?: string; +export interface ISettingListChangeEvent { + originalItem: TDataItem; + item?: TDataItem; targetIndex?: number; } -export class ListSettingWidget extends Disposable { +interface IEditHandlers { + onKeydown(event: IKeyboardEvent, updatedItem: TDataItem): void + onSubmit(updatedItem: TDataItem): void + onCancel(): void +} + +abstract class AbstractListSettingWidget extends Disposable { private listElement: HTMLElement; - private readonly listDisposables = this._register(new DisposableStore()); - private model = new ListSettingListModel(); + protected readonly _onDidChangeList = this._register(new Emitter>()); + protected readonly model = new ListSettingListModel(this.getEmptyItem()); + protected readonly listDisposables = this._register(new DisposableStore()); - private readonly _onDidChangeList = this._register(new Emitter()); - readonly onDidChangeList: Event = this._onDidChangeList.event; + readonly onDidChangeList: Event> = this._onDidChangeList.event; get domNode(): HTMLElement { return this.listElement; } + get items(): TDataItem[] { + return this.model.items; + } + constructor( private container: HTMLElement, - @IThemeService private readonly themeService: IThemeService, - @IContextViewService private readonly contextViewService: IContextViewService + @IThemeService protected readonly themeService: IThemeService, + @IContextViewService protected readonly contextViewService: IContextViewService ) { super(); @@ -257,33 +278,145 @@ export class ListSettingWidget extends Disposable { })); } - protected getLocalizedStrings() { - return { - deleteActionTooltip: localize('removeItem', "Remove Item"), - editActionTooltip: localize('editItem', "Edit Item"), - complexEditActionTooltip: localize('editItemInSettingsJson', "Edit Item in settings.json"), - addButtonLabel: localize('addItem', "Add Item"), - inputPlaceholder: localize('itemInputPlaceholder', "String Item..."), - siblingInputPlaceholder: localize('listSiblingInputPlaceholder', "Sibling...") - }; - } - - protected getSettingListRowLocalizedStrings(value?: string, sibling?: string) { - return { - settingListRowValueHintLabel: localize('listValueHintLabel', "List item `{0}`", value), - settingListRowSiblingHintLabel: localize('listSiblingHintLabel', "List item `{0}` with sibling `${1}`", value) - }; - } - - protected getContainerClasses() { - return ['setting-list-widget']; - } - - setValue(listData: IListDataItem[]): void { + setValue(listData: TDataItem[]): void { this.model.setValue(listData); this.renderList(); } + protected abstract getEmptyItem(): TDataItem; + protected abstract getContainerClasses(): string[]; + protected abstract getActionsForItem(item: TDataItem, idx: number): IAction[]; + protected abstract renderItem(item: TDataItem): HTMLElement; + protected abstract renderEdit(item: TDataItem, handlers: IEditHandlers): HTMLElement; + protected abstract isItemNew(item: TDataItem): boolean; + protected abstract getLocalizedRowTitle(item: TDataItem): string; + protected abstract getLocalizedStrings(): { + deleteActionTooltip: string + editActionTooltip: string + addButtonLabel: string + }; + + protected renderHeader(): HTMLElement | undefined { + return undefined; // {{SQL CARBON EDIT}} strict-null-checks + } + + protected isAddButtonVisible(): boolean { + return true; + } + + protected renderList(): void { + const focused = DOM.isAncestor(document.activeElement, this.listElement); + + DOM.clearNode(this.listElement); + this.listDisposables.clear(); + + const newMode = this.model.items.some(item => !!(item.editing && this.isItemNew(item))); + DOM.toggleClass(this.container, 'setting-list-hide-add-button', !this.isAddButtonVisible() || newMode); + + const header = this.renderHeader(); + const ITEM_HEIGHT = 24; + let listHeight = ITEM_HEIGHT * this.model.items.length; + + if (header) { + listHeight += ITEM_HEIGHT; + this.listElement.appendChild(header); + } + + this.model.items + .map((item, i) => this.renderDataOrEditItem(item, i, focused)) + .forEach(itemElement => this.listElement.appendChild(itemElement)); + + this.listElement.style.height = listHeight + 'px'; + } + + protected editSetting(idx: number): void { + this.model.setEditKey(idx); + this.renderList(); + } + + private renderDataOrEditItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { + return item.editing ? + this.renderEditItem(item, idx) : + this.renderDataItem(item, idx, listFocused); + } + + private renderDataItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { + const rowElement = this.renderItem(item); + + rowElement.setAttribute('data-index', idx + ''); + rowElement.setAttribute('tabindex', item.selected ? '0' : '-1'); + DOM.toggleClass(rowElement, 'selected', item.selected); + + const actionBar = new ActionBar(rowElement); + this.listDisposables.add(actionBar); + + actionBar.push(this.getActionsForItem(item, idx), { icon: true, label: true }); + rowElement.title = this.getLocalizedRowTitle(item); + + if (item.selected) { + if (listFocused) { + setTimeout(() => { + rowElement.focus(); + }, 10); + } + } + + return rowElement; + } + + private renderEditItem(item: IListViewItem, idx: number): HTMLElement { + let rowElement: HTMLElement | undefined; + + const onCancel = () => { + this.model.setEditKey('none'); + this.renderList(); + }; + + const onSubmit = (updatedItem: TDataItem) => { + this.model.setEditKey('none'); + + if (!isUndefinedOrNull(updatedItem)) { + this._onDidChangeList.fire({ + originalItem: item, + item: updatedItem, + targetIndex: idx, + }); + } + + this.renderList(); + }; + + const onKeydown = (e: StandardKeyboardEvent, updatedItem: TDataItem) => { + if (e.equals(KeyCode.Enter)) { + onSubmit(updatedItem); + } else if (e.equals(KeyCode.Escape)) { + onCancel(); + e.preventDefault(); + } + rowElement?.focus(); + }; + + rowElement = this.renderEdit(item, { onSubmit, onKeydown, onCancel }); + + return rowElement; + } + + private renderAddButton(): HTMLElement { + const rowElement = $('.setting-list-new-row'); + + const startAddButton = this._register(new Button(rowElement)); + startAddButton.label = this.getLocalizedStrings().addButtonLabel; + startAddButton.element.classList.add('setting-list-addButton'); + this._register(attachButtonStyler(startAddButton, this.themeService)); + + this._register(startAddButton.onDidClick(() => { + this.model.setEditKey('create'); + this.renderList(); + })); + + return rowElement; + } + private onListClick(e: MouseEvent): void { const targetIdx = this.getClickedItemIndex(e); if (targetIdx < 0) { @@ -338,133 +471,60 @@ export class ListSettingWidget extends Disposable { const targetIdx = parseInt(targetIdxStr); return targetIdx; } +} - private renderList(): void { - const focused = DOM.isAncestor(document.activeElement, this.listElement); +export interface IListDataItem { + value: string + sibling?: string +} - DOM.clearNode(this.listElement); - this.listDisposables.clear(); - - const newMode = this.model.items.some(item => !!(item.editing && !item.value)); - DOM.toggleClass(this.container, 'setting-list-new-mode', newMode); - - this.model.items - .map((item, i) => this.renderItem(item, i, focused)) - .forEach(itemElement => this.listElement.appendChild(itemElement)); - - const listHeight = 24 * this.model.items.length; - this.listElement.style.height = listHeight + 'px'; +export class ListSettingWidget extends AbstractListSettingWidget { + protected getEmptyItem(): IListDataItem { + return { value: '' }; } - private createDeleteAction(key: string, idx: number): IAction { - return { - class: 'codicon-close', - enabled: true, - id: 'workbench.action.removeListItem', - tooltip: this.getLocalizedStrings().deleteActionTooltip, - run: () => this._onDidChangeList.fire({ originalValue: key, value: undefined, targetIndex: idx }) - }; + protected getContainerClasses(): string[] { + return ['setting-list-widget']; } - private createEditAction(idx: number): IAction { - return { - class: preferencesEditIcon.classNames, - enabled: true, - id: 'workbench.action.editListItem', - tooltip: this.getLocalizedStrings().editActionTooltip, - run: () => { - this.editSetting(idx); + protected getActionsForItem(item: IListDataItem, idx: number): IAction[] { + return [ + { + class: preferencesEditIcon.classNames, + enabled: true, + id: 'workbench.action.editListItem', + tooltip: this.getLocalizedStrings().editActionTooltip, + run: () => this.editSetting(idx) + }, + { + class: 'codicon-close', + enabled: true, + id: 'workbench.action.removeListItem', + tooltip: this.getLocalizedStrings().deleteActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) } - }; + ] as IAction[]; } - private editSetting(idx: number): void { - this.model.setEditKey(idx); - this.renderList(); - } - - private renderItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { - return item.editing ? - this.renderEditItem(item, idx) : - this.renderDataItem(item, idx, listFocused); - } - - private renderDataItem(item: IListViewItem, idx: number, listFocused: boolean): HTMLElement { + protected renderItem(item: IListDataItem): HTMLElement { const rowElement = $('.setting-list-row'); - rowElement.setAttribute('data-index', idx + ''); - rowElement.setAttribute('tabindex', item.selected ? '0' : '-1'); - DOM.toggleClass(rowElement, 'selected', item.selected); - - const actionBar = new ActionBar(rowElement); - this.listDisposables.add(actionBar); const valueElement = DOM.append(rowElement, $('.setting-list-value')); const siblingElement = DOM.append(rowElement, $('.setting-list-sibling')); + valueElement.textContent = item.value; - siblingElement.textContent = item.sibling ? ('when: ' + item.sibling) : null; - - actionBar.push([ - this.createEditAction(idx), - this.createDeleteAction(item.value, idx) - ], { icon: true, label: false }); - - rowElement.title = item.sibling - ? this.getSettingListRowLocalizedStrings(item.value, item.sibling).settingListRowSiblingHintLabel - : this.getSettingListRowLocalizedStrings(item.value, item.sibling).settingListRowValueHintLabel; - - if (item.selected) { - if (listFocused) { - setTimeout(() => { - rowElement.focus(); - }, 10); - } - } + siblingElement.textContent = item.sibling ? `when: ${item.sibling}` : null; return rowElement; } - private renderAddButton(): HTMLElement { - const rowElement = $('.setting-list-new-row'); - - const startAddButton = this._register(new Button(rowElement)); - startAddButton.label = this.getLocalizedStrings().addButtonLabel; - startAddButton.element.classList.add('setting-list-addButton'); - this._register(attachButtonStyler(startAddButton, this.themeService)); - - this._register(startAddButton.onDidClick(() => { - this.model.setEditKey('create'); - this.renderList(); - })); - - return rowElement; - } - - private renderEditItem(item: IListViewItem, idx: number): HTMLElement { + protected renderEdit(item: IListDataItem, { onKeydown, onSubmit, onCancel }: IEditHandlers): HTMLElement { const rowElement = $('.setting-list-edit-row'); - const onSubmit = (edited: boolean) => { - this.model.setEditKey('none'); - const value = valueInput.value; - if (edited && !isUndefinedOrNull(value)) { - this._onDidChangeList.fire({ - originalValue: item.value, - value: value, - sibling: siblingInput && siblingInput.value, - targetIndex: idx - }); - } - this.renderList(); - }; - - const onKeydown = (e: StandardKeyboardEvent) => { - if (e.equals(KeyCode.Enter)) { - onSubmit(true); - } else if (e.equals(KeyCode.Escape)) { - onSubmit(false); - e.preventDefault(); - } - rowElement.focus(); - }; + const updatedItem = () => ({ + value: valueInput.value, + sibling: siblingInput?.value + }); const valueInput = new InputBox(rowElement, this.contextViewService, { placeholder: this.getLocalizedStrings().inputPlaceholder @@ -478,10 +538,11 @@ export class ListSettingWidget extends Disposable { })); this.listDisposables.add(valueInput); valueInput.value = item.value; - this.listDisposables.add(DOM.addStandardDisposableListener(valueInput.inputElement, DOM.EventType.KEY_DOWN, onKeydown)); - let siblingInput: InputBox; - if (item.sibling) { + this.listDisposables.add(DOM.addStandardDisposableListener(valueInput.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); + + let siblingInput: InputBox | undefined; + if (!isUndefinedOrNull(item.sibling)) { siblingInput = new InputBox(rowElement, this.contextViewService, { placeholder: this.getLocalizedStrings().siblingInputPlaceholder }); @@ -493,61 +554,351 @@ export class ListSettingWidget extends Disposable { inputBorder: settingsTextInputBorder })); siblingInput.value = item.sibling; - this.listDisposables.add(DOM.addStandardDisposableListener(siblingInput.inputElement, DOM.EventType.KEY_DOWN, onKeydown)); + + this.listDisposables.add(DOM.addStandardDisposableListener(siblingInput.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); } const okButton = this._register(new Button(rowElement)); okButton.label = localize('okButton', "OK"); okButton.element.classList.add('setting-list-okButton'); this.listDisposables.add(attachButtonStyler(okButton, this.themeService)); - this.listDisposables.add(okButton.onDidClick(() => onSubmit(true))); + this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem()))); const cancelButton = this._register(new Button(rowElement)); cancelButton.label = localize('cancelButton', "Cancel"); cancelButton.element.classList.add('setting-list-okButton'); this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService)); - this.listDisposables.add(cancelButton.onDidClick(() => onSubmit(false))); + this.listDisposables.add(cancelButton.onDidClick(onCancel)); this.listDisposables.add( disposableTimeout(() => { valueInput.focus(); valueInput.select(); - })); + }) + ); return rowElement; } + + protected isItemNew(item: IListDataItem): boolean { + return item.value === ''; + } + + protected getLocalizedRowTitle({ value, sibling }: IListDataItem): string { + return isUndefinedOrNull(sibling) + ? localize('listValueHintLabel', "List item `{0}`", value) + : localize('listSiblingHintLabel', "List item `{0}` with sibling `${1}`", value, sibling); + } + + protected getLocalizedStrings() { + return { + deleteActionTooltip: localize('removeItem', "Remove Item"), + editActionTooltip: localize('editItem', "Edit Item"), + addButtonLabel: localize('addItem', "Add Item"), + inputPlaceholder: localize('itemInputPlaceholder', "String Item..."), + siblingInputPlaceholder: localize('listSiblingInputPlaceholder', "Sibling..."), + }; + } } export class ExcludeSettingWidget extends ListSettingWidget { + protected getContainerClasses() { + return ['setting-list-exclude-widget']; + } + + protected getLocalizedRowTitle({ value, sibling }: IListDataItem): string { + return isUndefinedOrNull(sibling) + ? localize('excludePatternHintLabel', "Exclude files matching `{0}`", value) + : localize('excludeSiblingHintLabel', "Exclude files matching `{0}`, only when a file matching `{1}` is present", value, sibling); + } + protected getLocalizedStrings() { return { deleteActionTooltip: localize('removeExcludeItem', "Remove Exclude Item"), editActionTooltip: localize('editExcludeItem', "Edit Exclude Item"), - complexEditActionTooltip: localize('editExcludeItemInSettingsJson', "Edit Exclude Item in settings.json"), addButtonLabel: localize('addPattern', "Add Pattern"), inputPlaceholder: localize('excludePatternInputPlaceholder', "Exclude Pattern..."), - siblingInputPlaceholder: localize('excludeSiblingInputPlaceholder', "When Pattern Is Present...") + siblingInputPlaceholder: localize('excludeSiblingInputPlaceholder', "When Pattern Is Present..."), }; } +} - protected getSettingListRowLocalizedStrings(pattern?: string, sibling?: string) { +interface IObjectStringData { + type: 'string'; + data: string; +} + +export interface IObjectEnumOption { + value: string; + description?: string +} + +interface IObjectEnumData { + type: 'enum'; + data: string; + options: IObjectEnumOption[]; +} + +type ObjectKeyOrValue = IObjectStringData | IObjectEnumData; + +export interface IObjectDataItem { + key: ObjectKeyOrValue; + value: ObjectKeyOrValue; + removable: boolean; +} + +interface IObjectSetValueOptions { + showAddButton?: boolean; +} + +export class ObjectSettingWidget extends AbstractListSettingWidget { + private showAddButton: boolean = true; + + setValue(listData: IObjectDataItem[], options?: IObjectSetValueOptions): void { + this.showAddButton = options?.showAddButton ?? this.showAddButton; + super.setValue(listData); + } + + isItemNew(item: IObjectDataItem): boolean { + return item.key.data === '' && item.value.data === ''; + } + + protected isAddButtonVisible(): boolean { + return this.showAddButton; + } + + protected getEmptyItem(): IObjectDataItem { return { - settingListRowValueHintLabel: localize('excludePatternHintLabel', "Exclude files matching `{0}`", pattern), - settingListRowSiblingHintLabel: localize('excludeSiblingHintLabel', "Exclude files matching `{0}`, only when a file matching `{1}` is present", pattern, sibling) + key: { type: 'string', data: '' }, + value: { type: 'string', data: '' }, + removable: true, }; } protected getContainerClasses() { - return ['setting-list-exclude-widget']; + return ['setting-list-object-widget']; + } + + protected getActionsForItem(item: IObjectDataItem, idx: number): IAction[] { + const actions = [ + { + class: preferencesEditIcon.classNames, + enabled: true, + id: 'workbench.action.editListItem', + tooltip: this.getLocalizedStrings().editActionTooltip, + run: () => this.editSetting(idx) + }, + ] as IAction[]; + + if (item.removable) { + actions.push({ + class: 'codicon-close', + enabled: true, + id: 'workbench.action.removeListItem', + tooltip: this.getLocalizedStrings().deleteActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + } as IAction); + } else { + actions.push({ + class: 'codicon-discard', + enabled: true, + id: 'workbench.action.resetListItem', + tooltip: this.getLocalizedStrings().resetActionTooltip, + run: () => this._onDidChangeList.fire({ originalItem: item, item: undefined, targetIndex: idx }) + } as IAction); + } + + return actions; + } + + protected renderHeader() { + if (this.model.items.length > 0) { + const header = $('.setting-list-row-header'); + const keyHeader = DOM.append(header, $('.setting-list-object-key')); + const valueHeader = DOM.append(header, $('.setting-list-object-value')); + const { keyHeaderText, valueHeaderText } = this.getLocalizedStrings(); + + keyHeader.textContent = keyHeaderText; + valueHeader.textContent = valueHeaderText; + + return header; + } + + return undefined; // {{SQL CARBON EDIT}} strict-null-checks + } + + protected renderItem(item: IObjectDataItem): HTMLElement { + const rowElement = $('.setting-list-row'); + rowElement.classList.add('setting-list-object-row'); + + const keyElement = DOM.append(rowElement, $('.setting-list-object-key')); + const valueElement = DOM.append(rowElement, $('.setting-list-object-value')); + + keyElement.textContent = item.key.data; + valueElement.textContent = item.value.data; + + return rowElement; + } + + protected renderEdit(item: IObjectDataItem, { onSubmit, onKeydown, onCancel }: IEditHandlers): HTMLElement { + const rowElement = $('.setting-list-edit-row'); + rowElement.classList.add('setting-list-object-row'); + + let keyWidget: InputBox | SelectBox | undefined; + + if (this.showAddButton) { + keyWidget = this.renderEditWidget(item.key, rowElement, true); + } else { + const keyElement = DOM.append(rowElement, $('.setting-list-object-key')); + keyElement.textContent = item.key.data; + } + + const valueWidget = this.renderEditWidget(item.value, rowElement, false); + + const updatedItem = () => { + const newItem = { ...item }; + + if (keyWidget instanceof InputBox) { + newItem.key = { type: 'string', data: keyWidget.value }; + } + + if (valueWidget instanceof InputBox) { + newItem.value = { type: 'string', data: valueWidget.value }; + } + + return newItem; + }; + + if (keyWidget instanceof InputBox) { + keyWidget.setPlaceHolder(this.getLocalizedStrings().keyInputPlaceholder); + this.listDisposables.add(DOM.addStandardDisposableListener(keyWidget.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); + } else if (keyWidget instanceof SelectBox) { + this.listDisposables.add( + keyWidget.onDidSelect(({ selected }) => { + const editKey = this.model.items.findIndex(({ key }) => selected === key.data); + + if (editKey >= 0) { + this.model.select(editKey); + this.model.setEditKey(editKey); + this.renderList(); + } else { + onSubmit({ ...item, key: { ...item.key, data: selected } }); + } + }) + ); + } + + if (valueWidget instanceof InputBox) { + valueWidget.setPlaceHolder(this.getLocalizedStrings().valueInputPlaceholder); + this.listDisposables.add(DOM.addStandardDisposableListener(valueWidget.inputElement, DOM.EventType.KEY_DOWN, e => onKeydown(e, updatedItem()))); + } else if (valueWidget instanceof SelectBox) { + this.listDisposables.add( + valueWidget.onDidSelect(({ selected }) => { + onSubmit({ ...item, value: { ...item.value, data: selected } }); + }) + ); + } + + const okButton = this._register(new Button(rowElement)); + okButton.label = localize('okButton', "OK"); + okButton.element.classList.add('setting-list-okButton'); + this.listDisposables.add(attachButtonStyler(okButton, this.themeService)); + this.listDisposables.add(okButton.onDidClick(() => onSubmit(updatedItem()))); + + const cancelButton = this._register(new Button(rowElement)); + cancelButton.label = localize('cancelButton', "Cancel"); + cancelButton.element.classList.add('setting-list-okButton'); + this.listDisposables.add(attachButtonStyler(cancelButton, this.themeService)); + this.listDisposables.add(cancelButton.onDidClick(onCancel)); + + this.listDisposables.add( + disposableTimeout(() => { + const widget = keyWidget ?? valueWidget; + + widget.focus(); + + if (widget instanceof InputBox) { + widget.select(); + } + }) + ); + + return rowElement; + } + + protected getLocalizedRowTitle(item: IObjectDataItem): string { + const enumDescription = item.key.type === 'enum' + ? item.key.options.find(({ value }) => item.key.data === value)?.description + : undefined; + + return enumDescription ?? localize('objectPairHintLabel', "The key `{0}` maps to `{1}`", item.key.data, item.value.data); + } + + protected getLocalizedStrings() { + return { + deleteActionTooltip: localize('removeItem', "Remove Item"), + resetActionTooltip: localize('resetItem', "Reset Item"), + editActionTooltip: localize('editItem', "Edit Item"), + addButtonLabel: localize('addItem', "Add Item"), + keyHeaderText: localize('objectKeyHeader', "Item"), + valueHeaderText: localize('objectValueHeader', "Value"), + keyInputPlaceholder: localize('objectKeyInputPlaceholder', "Key"), + valueInputPlaceholder: localize('objectValueInputPlaceholder', "Value"), + }; + } + + private renderEditWidget(keyOrValue: ObjectKeyOrValue, rowElement: HTMLElement, isKey: boolean) { + switch (keyOrValue.type) { + case 'string': + return this.renderStringEditWidget(keyOrValue, rowElement, isKey); + case 'enum': + return this.renderEnumEditWidget(keyOrValue, rowElement, isKey); + } + } + + private renderStringEditWidget(keyOrValue: IObjectStringData, rowElement: HTMLElement, isKey: boolean) { + const inputBox = new InputBox(rowElement, this.contextViewService); + + inputBox.element.classList.add('setting-list-object-input'); + if (isKey) { + inputBox.element.classList.add('setting-list-object-input-key'); + } + + this.listDisposables.add(attachInputBoxStyler(inputBox, this.themeService, { + inputBackground: settingsTextInputBackground, + inputForeground: settingsTextInputForeground, + inputBorder: settingsTextInputBorder + })); + this.listDisposables.add(inputBox); + inputBox.value = keyOrValue.data; + + return inputBox; + } + + private renderEnumEditWidget(keyOrValue: IObjectEnumData, rowElement: HTMLElement, isKey: boolean) { + const selectBoxOptions = keyOrValue.options.map(({ value, description }) => ({ text: value, description })); + const dataIndex = keyOrValue.options.findIndex(option => keyOrValue.data === option.value); + const selected = dataIndex >= 0 ? dataIndex : 0; + + const selectBox = new SelectBox(selectBoxOptions, selected, this.contextViewService, undefined, { + useCustomDrawn: !(isIOS && BrowserFeatures.pointerEvents) + }); + + this.listDisposables.add(attachSelectBoxStyler(selectBox, this.themeService, { + selectBackground: settingsSelectBackground, + selectForeground: settingsSelectForeground, + selectBorder: settingsSelectBorder, + selectListBorder: settingsSelectListBorder + })); + + const wrapper = $('.setting-list-object-input'); + if (isKey) { + wrapper.classList.add('setting-list-object-input-key'); + } + + selectBox.render(wrapper); + rowElement.append(wrapper); + + return selectBox; } } - -export interface IListDataItem { - value: string; - sibling?: string; -} - -interface IListViewItem extends IListDataItem { - editing?: boolean; - selected?: boolean; -} diff --git a/src/vs/workbench/contrib/preferences/common/preferences.ts b/src/vs/workbench/contrib/preferences/common/preferences.ts index 61dd363649..895542e730 100644 --- a/src/vs/workbench/contrib/preferences/common/preferences.ts +++ b/src/vs/workbench/contrib/preferences/common/preferences.ts @@ -33,7 +33,7 @@ export interface IEndpointDetails { export const IPreferencesSearchService = createDecorator('preferencesSearchService'); export interface IPreferencesSearchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getLocalSearchProvider(filter: string): ISearchProvider; getRemoteSearchProvider(filter: string, newExtensionsOnly?: boolean): ISearchProvider | undefined; diff --git a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts index 22e364f8a1..78b5ecb3d6 100644 --- a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts @@ -24,7 +24,6 @@ import { IProductService } from 'vs/platform/product/common/productService'; interface IConfiguration extends IWindowsConfiguration { update: { mode: string; }; telemetry: { enableCrashReporter: boolean }; - workbench: { list: { horizontalScrolling: boolean } }; debug: { console: { wordWrap: boolean } }; editor: { accessibilitySupport: 'on' | 'off' | 'auto' }; } @@ -37,7 +36,6 @@ export class SettingsChangeRelauncher extends Disposable implements IWorkbenchCo private clickThroughInactive: boolean | undefined; private updateMode: string | undefined; private enableCrashReporter: boolean | undefined; - private treeHorizontalScrolling: boolean | undefined; private debugConsoleWordWrap: boolean | undefined; private accessibilitySupport: 'on' | 'off' | 'auto' | undefined; @@ -56,12 +54,6 @@ export class SettingsChangeRelauncher extends Disposable implements IWorkbenchCo private onConfigurationChange(config: IConfiguration, notify: boolean): void { let changed = false; - // Tree horizontal scrolling support - if (typeof config.workbench?.list?.horizontalScrolling === 'boolean' && config.workbench.list.horizontalScrolling !== this.treeHorizontalScrolling) { - this.treeHorizontalScrolling = config.workbench.list.horizontalScrolling; - changed = true; - } - // Debug console word wrap if (typeof config.debug?.console.wordWrap === 'boolean' && config.debug.console.wordWrap !== this.debugConsoleWordWrap) { this.debugConsoleWordWrap = config.debug.console.wordWrap; diff --git a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts index 32f58a6058..1f879f9473 100644 --- a/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts +++ b/src/vs/workbench/contrib/remote/browser/explorerViewItems.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { IActionRunner, IAction, Action } from 'vs/base/common/actions'; +import { IAction, Action } from 'vs/base/common/actions'; import { SelectActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; @@ -27,8 +27,6 @@ export interface IRemoteSelectItem extends ISelectOptionItem { export class SwitchRemoteViewItem extends SelectActionViewItem { - actionRunner!: IActionRunner; - constructor( action: IAction, private readonly optionsItems: IRemoteSelectItem[], diff --git a/src/vs/workbench/contrib/remote/browser/remote.ts b/src/vs/workbench/contrib/remote/browser/remote.ts index a54865a1ad..dcaf87c892 100644 --- a/src/vs/workbench/contrib/remote/browser/remote.ts +++ b/src/vs/workbench/contrib/remote/browser/remote.ts @@ -49,7 +49,7 @@ import { TunnelPanelDescriptor, TunnelViewModel, forwardedPortsViewEnabled } fro import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { ITreeRenderer, ITreeNode, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; 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'; @@ -415,9 +415,7 @@ class HelpPanel extends ViewPane { this.tree.setInput(model); - const helpItemNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false })); - - this._register(Event.debounce(helpItemNavigator.onDidOpenResource, (last, event) => event, 75, true)(e => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(e => { e.element.handleClick(); })); } diff --git a/src/vs/workbench/contrib/remote/browser/tunnelView.ts b/src/vs/workbench/contrib/remote/browser/tunnelView.ts index 9131ce5db4..5148ec7cc0 100644 --- a/src/vs/workbench/contrib/remote/browser/tunnelView.ts +++ b/src/vs/workbench/contrib/remote/browser/tunnelView.ts @@ -7,7 +7,7 @@ import 'vs/css!./media/tunnelView'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import { IViewDescriptor, IEditableData, IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; -import { WorkbenchAsyncDataTree, TreeResourceNavigator } from 'vs/platform/list/browser/listService'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IContextKeyService, IContextKey, RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; @@ -538,9 +538,7 @@ export class TunnelPanel extends ViewPane { this.tree.updateChildren(undefined, true); })); - const navigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false })); - - this._register(Event.debounce(navigator.onDidOpenResource, (last, event) => event, 75, true)(e => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(e => { if (e.element && (e.element.tunnelType === TunnelType.Add)) { this.commandService.executeCommand(ForwardPortAction.INLINE_ID); } diff --git a/src/vs/workbench/contrib/sash/browser/sash.contribution.ts b/src/vs/workbench/contrib/sash/browser/sash.contribution.ts index 9dffe6fa41..f0dbabbf9f 100644 --- a/src/vs/workbench/contrib/sash/browser/sash.contribution.ts +++ b/src/vs/workbench/contrib/sash/browser/sash.contribution.ts @@ -26,7 +26,7 @@ Registry.as(ConfigurationExtensions.Configuration) 'default': isIPad ? maxSize : minSize, 'minimum': minSize, 'maximum': maxSize, - 'description': localize('sashSize', "Controls the size of the sash.") + 'description': localize('sashSize', "Controls the feedback area size in pixels of the dragging area in between views/editors. Set it to a larger value if you feel it's hard to resize views using the mouse.") }, } }); diff --git a/src/vs/workbench/contrib/sash/browser/sash.ts b/src/vs/workbench/contrib/sash/browser/sash.ts index 6e84b8ec3d..390f5def22 100644 --- a/src/vs/workbench/contrib/sash/browser/sash.ts +++ b/src/vs/workbench/contrib/sash/browser/sash.ts @@ -3,6 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { clamp } from 'vs/base/common/numbers'; import { createStyleSheet } from 'vs/base/browser/dom'; import { setGlobalSashSize } from 'vs/base/browser/ui/sash/sash'; import { Event } from 'vs/base/common/event'; @@ -31,21 +32,19 @@ export class SashSizeController extends Disposable implements IWorkbenchContribu } private onDidChangeSizeConfiguration(): void { - const size = this.configurationService.getValue(this.configurationName); + const size = clamp(this.configurationService.getValue(this.configurationName) ?? minSize, minSize, maxSize); - if (size && size >= minSize && size <= maxSize) { - // Update styles - this.stylesheet.innerHTML = ` - .monaco-sash.vertical { cursor: ew-resize; top: 0; width: ${size}px; height: 100%; } - .monaco-sash.horizontal { cursor: ns-resize; left: 0; width: 100%; height: ${size}px; } - .monaco-sash:not(.disabled).orthogonal-start::before, .monaco-sash:not(.disabled).orthogonal-end::after { content: ' '; height: ${size * 2}px; width: ${size * 2}px; z-index: 100; display: block; cursor: all-scroll; position: absolute; } - .monaco-sash.orthogonal-start.vertical::before { left: -${size / 2}px; top: -${size}px; } - .monaco-sash.orthogonal-end.vertical::after { left: -${size / 2}px; bottom: -${size}px; } - .monaco-sash.orthogonal-start.horizontal::before { top: -${size / 2}px; left: -${size}px; } - .monaco-sash.orthogonal-end.horizontal::after { top: -${size / 2}px; right: -${size}px; }`; + // Update styles + this.stylesheet.innerHTML = ` + .monaco-sash.vertical { cursor: ew-resize; top: 0; width: ${size}px; height: 100%; } + .monaco-sash.horizontal { cursor: ns-resize; left: 0; width: 100%; height: ${size}px; } + .monaco-sash:not(.disabled).orthogonal-start::before, .monaco-sash:not(.disabled).orthogonal-end::after { content: ' '; height: ${size * 2}px; width: ${size * 2}px; z-index: 100; display: block; cursor: all-scroll; position: absolute; } + .monaco-sash.orthogonal-start.vertical::before { left: -${size / 2}px; top: -${size}px; } + .monaco-sash.orthogonal-end.vertical::after { left: -${size / 2}px; bottom: -${size}px; } + .monaco-sash.orthogonal-start.horizontal::before { top: -${size / 2}px; left: -${size}px; } + .monaco-sash.orthogonal-end.horizontal::after { top: -${size / 2}px; right: -${size}px; }`; - // Update behavor - setGlobalSashSize(size); - } + // Update behavor + setGlobalSashSize(size); } } diff --git a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css index 634bcff6c0..2bc2e0de9f 100644 --- a/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css +++ b/src/vs/workbench/contrib/scm/browser/media/scmViewlet.css @@ -210,12 +210,6 @@ color: inherit; } -.scm-viewlet .list-view-mode .monaco-tl-twistie:not(.force-twistie):not(.collapsible) { - background-image: none !important; - width: 8px !important; - margin-right: 0 !important; -} - .scm-viewlet .scm-status.show-file-icons.hide-arrows.tree-view-mode .monaco-tl-indent .indent-guide:first-child { border: none; } diff --git a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts index 78532a7fb7..9ff03562bc 100644 --- a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts +++ b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts @@ -20,14 +20,14 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { MenuItemAction, IMenuService } from 'vs/platform/actions/common/actions'; -import { IAction, IActionViewItem, ActionRunner, Action } from 'vs/base/common/actions'; +import { IAction, IActionViewItem, ActionRunner, Action, RadioGroup } from 'vs/base/common/actions'; import { ContextAwareMenuEntryActionViewItem } from 'vs/platform/actions/browser/menuEntryActionViewItem'; import { SCMMenus } from './menus'; -import { ActionBar, IActionViewItemProvider } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ActionBar, IActionViewItemProvider, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IThemeService, LIGHT, registerThemingParticipant, IFileIconTheme } from 'vs/platform/theme/common/themeService'; import { isSCMResource, isSCMResourceGroup, connectPrimaryMenuToInlineActionBar } from './util'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; -import { WorkbenchCompressibleObjectTree, TreeResourceNavigator, IOpenEvent } from 'vs/platform/list/browser/listService'; +import { WorkbenchCompressibleObjectTree, IOpenEvent } from 'vs/platform/list/browser/listService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { disposableTimeout, ThrottledDelayer } from 'vs/base/common/async'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -39,7 +39,7 @@ import { Iterable } from 'vs/base/common/iterator'; import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { URI } from 'vs/base/common/uri'; import { FileKind } from 'vs/platform/files/common/files'; -import { compareFileNames } from 'vs/base/common/comparers'; +import { compareFileNames, comparePaths } from 'vs/base/common/comparers'; import { FuzzyScore, createMatches, IMatch } from 'vs/base/common/filters'; import { IViewDescriptor, IViewDescriptorService } from 'vs/workbench/common/views'; import { localize } from 'vs/nls'; @@ -60,7 +60,7 @@ import { SelectionClipboardContributionID } from 'vs/workbench/contrib/codeEdito import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import * as platform from 'vs/base/common/platform'; -import { format } from 'vs/base/common/strings'; +import { format, compare } from 'vs/base/common/strings'; import { inputPlaceholderForeground, inputValidationInfoBorder, inputValidationWarningBorder, inputValidationErrorBorder, inputValidationInfoBackground, inputValidationInfoForeground, inputValidationWarningBackground, inputValidationWarningForeground, inputValidationErrorBackground, inputValidationErrorForeground, inputBackground, inputForeground, inputBorder, focusBorder } from 'vs/platform/theme/common/colorRegistry'; import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; @@ -74,6 +74,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ILabelService } from 'vs/platform/label/common/label'; +import { ContextSubMenu } from 'vs/base/browser/contextmenu'; +import { KeyCode } from 'vs/base/common/keyCodes'; +import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; type TreeElement = ISCMResourceGroup | IResourceNode | ISCMResource; @@ -371,14 +374,38 @@ export class SCMTreeSorter implements ITreeSorter { constructor(private viewModelProvider: () => ViewModel) { } compare(one: TreeElement, other: TreeElement): number { - if (this.viewModel.mode === ViewModelMode.List) { - return 0; - } - if (isSCMResourceGroup(one) && isSCMResourceGroup(other)) { return 0; } + // List + if (this.viewModel.mode === ViewModelMode.List) { + // FileName + if (this.viewModel.sortKey === ViewModelSortKey.Name) { + const oneName = basename((one as ISCMResource).sourceUri); + const otherName = basename((other as ISCMResource).sourceUri); + + return compareFileNames(oneName, otherName); + } + + // Status + if (this.viewModel.sortKey === ViewModelSortKey.Status) { + const oneTooltip = (one as ISCMResource).decorations.tooltip ?? ''; + const otherTooltip = (other as ISCMResource).decorations.tooltip ?? ''; + + if (oneTooltip !== otherTooltip) { + return compare(oneTooltip, otherTooltip); + } + } + + // Path (default) + const onePath = (one as ISCMResource).sourceUri.fsPath; + const otherPath = (other as ISCMResource).sourceUri.fsPath; + + return comparePaths(onePath, otherPath); + } + + // Tree const oneIsDirectory = ResourceTree.isResourceNode(one); const otherIsDirectory = ResourceTree.isResourceNode(other); @@ -496,6 +523,12 @@ const enum ViewModelMode { Tree = 'tree' } +const enum ViewModelSortKey { + Path, + Name, + Status +} + class ViewModel { private readonly _onDidChangeMode = new Emitter(); @@ -519,6 +552,14 @@ class ViewModel { this._onDidChangeMode.fire(mode); } + get sortKey(): ViewModelSortKey { return this._sortKey; } + set sortKey(sortKey: ViewModelSortKey) { + if (sortKey !== this._sortKey) { + this._sortKey = sortKey; + this.refresh(); + } + } + private items: IGroupItem[] = []; private visibilityDisposables = new DisposableStore(); private scrollTop: number | undefined; @@ -529,6 +570,7 @@ class ViewModel { private groups: ISequence, private tree: WorkbenchCompressibleObjectTree, private _mode: ViewModelMode, + private _sortKey: ViewModelSortKey, @IEditorService protected editorService: IEditorService, @IConfigurationService protected configurationService: IConfigurationService, ) { } @@ -659,30 +701,112 @@ class ViewModel { } } -export class ToggleViewModeAction extends Action { +class SCMViewSubMenuAction extends ContextSubMenu { + constructor(viewModel: ViewModel) { + super(localize('sortAction', "View & Sort"), + [ + ...new RadioGroup([ + new SCMViewModeListAction(viewModel), + new SCMViewModeTreeAction(viewModel) + ]).actions, + new Separator(), + ...new RadioGroup([ + new SCMSortByNameAction(viewModel), + new SCMSortByPathAction(viewModel), + new SCMSortByStatusAction(viewModel) + ]).actions + ] + ); + } +} - static readonly ID = 'workbench.scm.action.toggleViewMode'; - static readonly LABEL = localize('toggleViewMode', "Toggle View Mode"); +abstract class SCMViewModeAction extends Action { + constructor(id: string, label: string, private viewModel: ViewModel, private viewMode: ViewModelMode) { + super(id, label); - constructor(private viewModel: ViewModel) { - super(ToggleViewModeAction.ID, ToggleViewModeAction.LABEL); - - this._register(this.viewModel.onDidChangeMode(this.onDidChangeMode, this)); - this.onDidChangeMode(this.viewModel.mode); + this.checked = this.viewModel.mode === this.viewMode; } async run(): Promise { - this.viewModel.mode = this.viewModel.mode === ViewModelMode.List ? ViewModelMode.Tree : ViewModelMode.List; + if (this.viewMode !== this.viewModel.mode) { + this.checked = !this.checked; + this.viewModel.mode = this.viewMode; + } + } +} + +class SCMViewModeListAction extends SCMViewModeAction { + static readonly ID = 'workbench.scm.action.viewModeList'; + static readonly LABEL = localize('viewModeList', "View as List"); + + constructor(viewModel: ViewModel) { + super(SCMViewModeListAction.ID, SCMViewModeListAction.LABEL, viewModel, ViewModelMode.List); + } +} + +class SCMViewModeTreeAction extends SCMViewModeAction { + static readonly ID = 'workbench.scm.action.viewModeTree'; + static readonly LABEL = localize('viewModeTree', "View as Tree"); + + constructor(viewModel: ViewModel) { + super(SCMViewModeTreeAction.ID, SCMViewModeTreeAction.LABEL, viewModel, ViewModelMode.Tree); + } +} + +abstract class SCMSortAction extends Action { + + private readonly _listener: IDisposable; + + constructor(id: string, label: string, private viewModel: ViewModel, private sortKey: ViewModelSortKey) { + super(id, label); + + this.checked = this.sortKey === ViewModelSortKey.Path; + this.enabled = this.viewModel?.mode === ViewModelMode.List ?? false; + this._listener = viewModel?.onDidChangeMode(e => this.enabled = e === ViewModelMode.List); } - private onDidChangeMode(mode: ViewModelMode): void { - const iconClass = mode === ViewModelMode.List ? 'codicon-list-tree' : 'codicon-list-flat'; - this.class = `scm-action toggle-view-mode ${iconClass}`; + async run(): Promise { + if (this.sortKey !== this.viewModel.sortKey) { + this.checked = !this.checked; + this.viewModel.sortKey = this.sortKey; + } + } + + dispose(): void { + this._listener.dispose(); + super.dispose(); + } +} + +class SCMSortByNameAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByName'; + static readonly LABEL = localize('sortByName', "Sort by Name"); + + constructor(viewModel: ViewModel) { + super(SCMSortByNameAction.ID, SCMSortByNameAction.LABEL, viewModel, ViewModelSortKey.Name); + } +} + +class SCMSortByPathAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByPath'; + static readonly LABEL = localize('sortByPath', "Sort by Path"); + + constructor(viewModel: ViewModel) { + super(SCMSortByPathAction.ID, SCMSortByPathAction.LABEL, viewModel, ViewModelSortKey.Path); + } +} + +class SCMSortByStatusAction extends SCMSortAction { + static readonly ID = 'workbench.scm.action.sortByStatus'; + static readonly LABEL = localize('sortByStatus', "Sort by Status"); + + constructor(viewModel: ViewModel) { + super(SCMSortByStatusAction.ID, SCMSortByStatusAction.LABEL, viewModel, ViewModelSortKey.Status); } } export class RepositoryPane extends ViewPane { - private readonly defaultInputFontFamily = 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif'; + private readonly defaultInputFontFamily = DEFAULT_FONT_FAMILY; private cachedHeight: number | undefined = undefined; private cachedWidth: number | undefined = undefined; @@ -695,7 +819,6 @@ export class RepositoryPane extends ViewPane { private viewModel!: ViewModel; private listLabels!: ResourceLabels; private menus: SCMMenus; - private toggleViewModelModeAction: ToggleViewModeAction | undefined; protected contextKeyService: IContextKeyService; private commitTemplate = ''; @@ -863,6 +986,10 @@ export class RepositoryPane extends ViewPane { this._register(this.inputEditor.onDidChangeCursorPosition(triggerValidation)); + const opts = this.modelService.getCreationOptions(this.inputModel.getLanguageIdentifier().language, this.inputModel.uri, this.inputModel.isForSimpleWidget); + const onEnter = Event.filter(this.inputEditor.onKeyDown, e => e.keyCode === KeyCode.Enter); + this._register(onEnter(() => this.inputModel.detectIndentation(opts.insertSpaces, opts.tabSize))); + // Keep model in sync with API this.inputModel.setValue(this.repository.input.value); this._register(this.repository.input.onDidChange(value => { @@ -942,13 +1069,7 @@ export class RepositoryPane extends ViewPane { accessibilityProvider: this.instantiationService.createInstance(SCMAccessibilityProvider) }) as WorkbenchCompressibleObjectTree; - const navigator = this._register(new TreeResourceNavigator(this.tree, { openOnSelection: false })); - this._register(navigator.onDidOpenResource(this.open, this)); - - this._register(Event.chain(this.tree.onDidPin) - .map(e => e.elements[0]) - .filter(e => !!e && !isSCMResourceGroup(e) && !ResourceTree.isResourceNode(e)) - .on(this.pin, this)); + this._register(this.tree.onDidOpen(this.open, this)); this._register(this.tree.onContextMenu(this.onListContextMenu, this)); this._register(this.tree); @@ -965,7 +1086,7 @@ export class RepositoryPane extends ViewPane { } } - this.viewModel = this.instantiationService.createInstance(ViewModel, this.repository.provider.groups, this.tree, viewMode); + this.viewModel = this.instantiationService.createInstance(ViewModel, this.repository.provider.groups, this.tree, viewMode, ViewModelSortKey.Path); this._register(this.viewModel); addClass(this.listContainer, 'file-icon-themable-tree'); @@ -975,9 +1096,6 @@ export class RepositoryPane extends ViewPane { this._register(this.themeService.onDidFileIconThemeChange(this.updateIndentStyles, this)); this._register(this.viewModel.onDidChangeMode(this.onDidChangeMode, this)); - this.toggleViewModelModeAction = new ToggleViewModeAction(this.viewModel); - this._register(this.toggleViewModelModeAction); - this._register(this.onDidChangeBodyVisibility(this._onDidChangeVisibility, this)); this.updateActions(); @@ -986,7 +1104,7 @@ export class RepositoryPane extends ViewPane { private updateIndentStyles(theme: IFileIconTheme): void { toggleClass(this.listContainer, 'list-view-mode', this.viewModel.mode === ViewModelMode.List); toggleClass(this.listContainer, 'tree-view-mode', this.viewModel.mode === ViewModelMode.Tree); - toggleClass(this.listContainer, 'align-icons-and-twisties', this.viewModel.mode === ViewModelMode.Tree && theme.hasFileIcons && !theme.hasFolderIcons); + toggleClass(this.listContainer, 'align-icons-and-twisties', (this.viewModel.mode === ViewModelMode.List && theme.hasFileIcons) || (theme.hasFileIcons && !theme.hasFolderIcons)); toggleClass(this.listContainer, 'hide-arrows', this.viewModel.mode === ViewModelMode.Tree && theme.hidesExplorerArrows === true); } @@ -1060,19 +1178,22 @@ export class RepositoryPane extends ViewPane { } getActions(): IAction[] { - if (this.toggleViewModelModeAction) { - - return [ - this.toggleViewModelModeAction, - ...this.menus.getTitleActions() - ]; - } else { - return this.menus.getTitleActions(); - } + return this.menus.getTitleActions(); } getSecondaryActions(): IAction[] { - return this.menus.getTitleSecondaryActions(); + if (!this.viewModel) { + return []; + } + + const result: IAction[] = [new SCMViewSubMenuAction(this.viewModel)]; + const secondaryActions = this.menus.getTitleSecondaryActions(); + + if (secondaryActions.length > 0) { + result.push(new Separator(), ...secondaryActions); + } + + return result; } getActionViewItem(action: IAction): IActionViewItem | undefined { @@ -1087,19 +1208,19 @@ export class RepositoryPane extends ViewPane { return this.repository.provider; } - private open(e: IOpenEvent): void { + private async open(e: IOpenEvent): Promise { if (!e.element || isSCMResourceGroup(e.element) || ResourceTree.isResourceNode(e.element)) { return; } - e.element.open(!!e.editorOptions.preserveFocus); - } + await e.element.open(!!e.editorOptions.preserveFocus); - private pin(): void { - const activeEditorPane = this.editorService.activeEditorPane; + if (e.editorOptions.pinned) { + const activeEditorPane = this.editorService.activeEditorPane; - if (activeEditorPane) { - activeEditorPane.group.pinEditor(activeEditorPane.input); + if (activeEditorPane) { + activeEditorPane.group.pinEditor(activeEditorPane.input); + } } } diff --git a/src/vs/workbench/contrib/scm/common/scmService.ts b/src/vs/workbench/contrib/scm/common/scmService.ts index ea290e3cce..87f96651d2 100644 --- a/src/vs/workbench/contrib/scm/common/scmService.ts +++ b/src/vs/workbench/contrib/scm/common/scmService.ts @@ -113,7 +113,7 @@ class SCMRepository implements ISCMRepository { export class SCMService implements ISCMService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _providerIds = new Set(); private _repositories: ISCMRepository[] = []; diff --git a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts index aa8a3f7a6a..8e614a0fe2 100644 --- a/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts +++ b/src/vs/workbench/contrib/search/browser/anythingQuickAccess.ts @@ -491,22 +491,34 @@ export class AnythingQuickAccessProvider extends PickerQuickAccessProvider; if (absolutePathResult) { - fileMatches = [absolutePathResult]; + if (excludes.has(absolutePathResult)) { + return []; // excluded + } + + // Create a single result pick and make sure to apply full + // highlights to ensure the pick is displayed. Since a + // ~ might have been used for searching, our fuzzy scorer + // may otherwise not properly respect the pick as a result + const absolutePathPick = this.createAnythingPick(absolutePathResult, this.configuration); + absolutePathPick.highlights = { + label: [{ start: 0, end: absolutePathPick.label.length }], + description: absolutePathPick.description ? [{ start: 0, end: absolutePathPick.description.length }] : undefined + }; + + return [absolutePathPick]; } // Otherwise run the file search (with a delayer if cache is not ready yet) - else { - if (this.pickState.fileQueryCache?.isLoaded) { - fileMatches = await this.doFileSearch(query, token); - } else { - fileMatches = await this.fileQueryDelayer.trigger(async () => { - if (token.isCancellationRequested) { - return []; - } + if (this.pickState.fileQueryCache?.isLoaded) { + fileMatches = await this.doFileSearch(query, token); + } else { + fileMatches = await this.fileQueryDelayer.trigger(async () => { + if (token.isCancellationRequested) { + return []; + } - return this.doFileSearch(query, token); - }); - } + return this.doFileSearch(query, token); + }); } if (token.isCancellationRequested) { diff --git a/src/vs/workbench/contrib/search/browser/replaceService.ts b/src/vs/workbench/contrib/search/browser/replaceService.ts index 74ca9b4746..7c19d1bbe7 100644 --- a/src/vs/workbench/contrib/search/browser/replaceService.ts +++ b/src/vs/workbench/contrib/search/browser/replaceService.ts @@ -88,7 +88,7 @@ class ReplacePreviewModel extends Disposable { export class ReplaceService implements IReplaceService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ITextFileService private readonly textFileService: ITextFileService, diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index b0afddbbd0..8adad04439 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -559,6 +559,27 @@ const registry = Registry.as(ActionExtensions.Workbenc // Show Search 'when' is redundant but if the two conflict with exactly the same keybinding and 'when' clause, then they can show up as "unbound" - #51780 registry.registerWorkbenchAction(SyncActionDescriptor.from(OpenSearchViewletAction, { primary: KeyMod.CtrlCmd | KeyMod.Shift | KeyCode.KEY_F }, Constants.SearchViewVisibleKey.toNegated()), 'View: Show Search', nls.localize('view', "View")); KeybindingsRegistry.registerCommandAndKeybindingRule({ + description: { + description: nls.localize('findInFiles.description', "Open the search viewlet"), + args: [ + { + name: nls.localize('findInFiles.args', "A set of options for the search viewlet"), + schema: { + type: 'object', + properties: { + query: { 'type': 'string' }, + replace: { 'type': 'string' }, + triggerSearch: { 'type': 'boolean' }, + filesToInclude: { 'type': 'string' }, + filesToExclude: { 'type': 'string' }, + isRegex: { 'type': 'boolean' }, + isCaseSensitive: { 'type': 'boolean' }, + matchWholeWord: { 'type': 'boolean' }, + } + } + }, + ] + }, id: Constants.FindInFilesActionId, weight: KeybindingWeight.WorkbenchContrib, when: null, @@ -756,7 +777,7 @@ configurationRegistry.registerConfiguration({ enum: ['sidebar', 'panel'], default: 'sidebar', description: nls.localize('search.location', "Controls whether the search will be shown as a view in the sidebar or as a panel in the panel area for more horizontal space."), - deprecationMessage: nls.localize('search.location.deprecationMessage', "This setting is deprecated. Please use the search view's context menu instead.") + deprecationMessage: nls.localize('search.location.deprecationMessage', "This setting is deprecated. Please use drag and drop instead by dragging the search icon.") }, 'search.collapseResults': { type: 'string', @@ -831,21 +852,22 @@ configurationRegistry.registerConfiguration({ default: false, markdownDescription: nls.localize('search.searchEditor.reusePriorSearchConfiguration', "When enabled, new Search Editors will reuse the includes, excludes, and flags of the previously opened Search Editor") }, - 'search.searchEditor.defaultShowContextValue': { + 'search.searchEditor.defaultNumberOfContextLines': { type: ['number', 'null'], - default: null, + default: 1, + markdownDescription: nls.localize('search.searchEditor.defaultNumberOfContextLines', "The default number of surrounding context lines to use when creating new Search Editors. If using `#search.searchEditor.reusePriorSearchConfiguration#`, this can be set to `null` (empty) to use the prior Search Editor's configuration.") }, 'search.sortOrder': { 'type': 'string', 'enum': [SearchSortOrder.Default, SearchSortOrder.FileNames, SearchSortOrder.Type, SearchSortOrder.Modified, SearchSortOrder.CountDescending, SearchSortOrder.CountAscending], 'default': SearchSortOrder.Default, 'enumDescriptions': [ - nls.localize('searchSortOrder.default', 'Results are sorted by folder and file names, in alphabetical order.'), - nls.localize('searchSortOrder.filesOnly', 'Results are sorted by file names ignoring folder order, in alphabetical order.'), - nls.localize('searchSortOrder.type', 'Results are sorted by file extensions, in alphabetical order.'), - nls.localize('searchSortOrder.modified', 'Results are sorted by file last modified date, in descending order.'), - nls.localize('searchSortOrder.countDescending', 'Results are sorted by count per file, in descending order.'), - nls.localize('searchSortOrder.countAscending', 'Results are sorted by count per file, in ascending order.') + nls.localize('searchSortOrder.default', "Results are sorted by folder and file names, in alphabetical order."), + nls.localize('searchSortOrder.filesOnly', "Results are sorted by file names ignoring folder order, in alphabetical order."), + nls.localize('searchSortOrder.type', "Results are sorted by file extensions, in alphabetical order."), + nls.localize('searchSortOrder.modified', "Results are sorted by file last modified date, in descending order."), + nls.localize('searchSortOrder.countDescending', "Results are sorted by count per file, in descending order."), + nls.localize('searchSortOrder.countAscending', "Results are sorted by count per file, in ascending order.") ], 'description': nls.localize('search.sortOrder', "Controls sorting order of search results.") }, diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 018aadbeac..3f9b6276b8 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -31,7 +31,7 @@ import { IContextMenuService, IContextViewService } from 'vs/platform/contextvie import { IConfirmation, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { FileChangesEvent, FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TreeResourceNavigator, WorkbenchObjectTree, getSelectionKeyboardEvent } from 'vs/platform/list/browser/listService'; +import { WorkbenchObjectTree, getSelectionKeyboardEvent } from 'vs/platform/list/browser/listService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IProgressService, IProgressStep, IProgress } from 'vs/platform/progress/common/progress'; import { IPatternInfo, ISearchComplete, ISearchConfiguration, ISearchConfigurationProperties, ITextQuery, SearchSortOrder, SearchCompletionExitCode } from 'vs/workbench/services/search/common/search'; @@ -718,6 +718,7 @@ export class SearchView extends ViewPane { accessibilityProvider: this.treeAccessibilityProvider, dnd: this.instantiationService.createInstance(SearchDND), multipleSelectionSupport: false, + openOnFocus: true, overrideStyles: { listBackground: this.getBackgroundColor() } @@ -727,8 +728,7 @@ export class SearchView extends ViewPane { this.toggleCollapseStateDelayer.trigger(() => this.toggleCollapseAction.onTreeCollapseStateChange()) )); - const resourceNavigator = this._register(new TreeResourceNavigator(this.tree, { openOnFocus: true, openOnSelection: false })); - this._register(Event.debounce(resourceNavigator.onDidOpenResource, (last, event) => event, 75, true)(options => { + this._register(Event.debounce(this.tree.onDidOpen, (last, event) => event, 75, true)(options => { if (options.element instanceof Match) { const selectedMatch: Match = options.element; if (this.currentSelectedFileMatch) { diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index 7b494c10c8..c76c41cc72 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -355,7 +355,7 @@ export class SearchWidget extends Widget { if (options.showContextToggle) { this.contextLinesInput = new InputBox(searchInputContainer, this.contextViewService, { type: 'number' }); dom.addClass(this.contextLinesInput.element, 'context-lines-input'); - this.contextLinesInput.value = '2'; + this.contextLinesInput.value = '' + (this.configurationService.getValue('search').searchEditor.defaultNumberOfContextLines ?? 1); this._register(this.contextLinesInput.onDidChange(() => this.onContextLinesChanged())); this._register(attachInputBoxStyler(this.contextLinesInput, this.themeService)); dom.append(searchInputContainer, this.showContextCheckbox.domNode); diff --git a/src/vs/workbench/contrib/search/common/queryBuilder.ts b/src/vs/workbench/contrib/search/common/queryBuilder.ts index 1eb5e46f67..4538899530 100644 --- a/src/vs/workbench/contrib/search/common/queryBuilder.ts +++ b/src/vs/workbench/contrib/search/common/queryBuilder.ts @@ -7,7 +7,6 @@ import * as arrays from 'vs/base/common/arrays'; import * as collections from 'vs/base/common/collections'; import * as glob from 'vs/base/common/glob'; import { untildify } from 'vs/base/common/labels'; -import { values } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import * as path from 'vs/base/common/path'; import { isEqual } from 'vs/base/common/resources'; @@ -324,7 +323,7 @@ export class QueryBuilder { } }); - return values(searchPathPatternMap); + return Array.from(searchPathPatternMap.values()); } /** diff --git a/src/vs/workbench/contrib/search/common/replace.ts b/src/vs/workbench/contrib/search/common/replace.ts index 99cc2e1090..266876c23c 100644 --- a/src/vs/workbench/contrib/search/common/replace.ts +++ b/src/vs/workbench/contrib/search/common/replace.ts @@ -11,7 +11,7 @@ export const IReplaceService = createDecorator('replaceService' export interface IReplaceService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Replaces the given match in the file that match belongs to diff --git a/src/vs/workbench/contrib/search/common/searchHistoryService.ts b/src/vs/workbench/contrib/search/common/searchHistoryService.ts index aac13dafc8..4e5b50f5e2 100644 --- a/src/vs/workbench/contrib/search/common/searchHistoryService.ts +++ b/src/vs/workbench/contrib/search/common/searchHistoryService.ts @@ -9,7 +9,7 @@ import { isEmptyObject } from 'vs/base/common/types'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export interface ISearchHistoryService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidClearHistory: Event; clearHistory(): void; load(): ISearchHistoryValues; @@ -26,7 +26,7 @@ export interface ISearchHistoryValues { } export class SearchHistoryService implements ISearchHistoryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly SEARCH_HISTORY_KEY = 'workbench.search.history'; @@ -64,4 +64,4 @@ export class SearchHistoryService implements ISearchHistoryService { this.storageService.store(SearchHistoryService.SEARCH_HISTORY_KEY, JSON.stringify(history), StorageScope.WORKSPACE); } } -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index f116dd3f07..50eb5b28cb 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -9,7 +9,7 @@ import * as errors from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; import { getBaseLabel } from 'vs/base/common/labels'; import { Disposable, IDisposable, DisposableStore } from 'vs/base/common/lifecycle'; -import { ResourceMap, TernarySearchTree, values } from 'vs/base/common/map'; +import { ResourceMap, TernarySearchTree } from 'vs/base/common/map'; import * as objects from 'vs/base/common/objects'; import { lcut } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; @@ -293,7 +293,7 @@ export class FileMatch extends Disposable implements IFileMatch { endLineNumber: lineNumber, endColumn: this._model.getLineMaxColumn(lineNumber) }; - const oldMatches = values(this._matches).filter(match => match.range().startLineNumber === lineNumber); + const oldMatches = Array.from(this._matches.values()).filter(match => match.range().startLineNumber === lineNumber); oldMatches.forEach(match => this._matches.delete(match.id())); const wordSeparators = this._query.isWordMatch && this._query.wordSeparators ? this._query.wordSeparators : null; @@ -351,7 +351,7 @@ export class FileMatch extends Disposable implements IFileMatch { } matches(): Match[] { - return values(this._matches); + return Array.from(this._matches.values()); } remove(match: Match): void { @@ -1181,7 +1181,7 @@ export type RenderableMatch = FolderMatch | FolderMatchWithResource | FileMatch export class SearchWorkbenchService implements ISearchWorkbenchService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _searchModel: SearchModel | null = null; constructor(@IInstantiationService private readonly instantiationService: IInstantiationService) { @@ -1198,7 +1198,7 @@ export class SearchWorkbenchService implements ISearchWorkbenchService { export const ISearchWorkbenchService = createDecorator('searchWorkbenchService'); export interface ISearchWorkbenchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly searchModel: SearchModel; } diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts index c3a0f0a34e..29a9c74bec 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.contribution.ts @@ -5,7 +5,7 @@ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import * as objects from 'vs/base/common/objects'; -import { endsWith } from 'vs/base/common/strings'; +import { extname } 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'; @@ -30,7 +30,7 @@ import * as SearchConstants from 'vs/workbench/contrib/search/common/constants'; import * as SearchEditorConstants from 'vs/workbench/contrib/searchEditor/browser/constants'; import { SearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditor'; import { createEditorFromSearchResult, modifySearchEditorContextLinesCommand, openNewSearchEditor, selectAllSearchEditorMatchesCommand, toggleSearchEditorCaseSensitiveCommand, toggleSearchEditorContextLinesCommand, toggleSearchEditorRegexCommand, toggleSearchEditorWholeWordCommand } from 'vs/workbench/contrib/searchEditor/browser/searchEditorActions'; -import { getOrMakeSearchEditorInput, SearchConfiguration, SearchEditorInput } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; +import { getOrMakeSearchEditorInput, SearchConfiguration, SearchEditorInput, SEARCH_EDITOR_EXT } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; import { parseSavedSearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -79,11 +79,11 @@ class SearchEditorContribution implements IWorkbenchContribution { const resource = editor.resource; if (!resource) { return undefined; } - if (!endsWith(resource.path, '.code-search')) { + if (extname(resource) !== SEARCH_EDITOR_EXT) { return undefined; } - if (group.isOpened(editor) && editor instanceof SearchEditorInput) { + if (editor instanceof SearchEditorInput && group.isOpened(editor)) { return undefined; } @@ -93,7 +93,7 @@ class SearchEditorContribution implements IWorkbenchContribution { override: (async () => { const { config } = await instantiationService.invokeFunction(parseSavedSearchEditor, resource); const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { backingUri: resource, config }); - return editorService.openEditor(input, { ...options, ignoreOverrides: true }, group); + return editorService.openEditor(input, { ...options, override: false }, group); })() }; } @@ -109,7 +109,9 @@ workbenchContributionsRegistry.registerWorkbenchContribution(SearchEditorContrib type SerializedSearchEditor = { modelUri: string, dirty: boolean, config: SearchConfiguration, name: string, matchRanges: Range[], backingUri: string }; class SearchEditorInputFactory implements IEditorInputFactory { - canSerialize() { return true; } + canSerialize(input: SearchEditorInput) { + return !input.isDisposed(); + } serialize(input: SearchEditorInput) { let modelUri = undefined; @@ -211,6 +213,7 @@ CommandsRegistry.registerCommand( //#region Actions const category = localize('search', "Search Editor"); +export type OpenSearchEditorArgs = Partial; const openArgDescription = { description: 'Open a new search editor. Arguments passed can include variables like ${relativeFileDirname}.', args: [{ @@ -226,6 +229,8 @@ const openArgDescription = { regexp: { type: 'boolean' }, useIgnores: { type: 'boolean' }, showIncludesExcludes: { type: 'boolean' }, + triggerSearch: { type: 'boolean' }, + focusResults: { type: 'boolean' }, } } }] @@ -241,7 +246,7 @@ registerAction2(class extends Action2 { description: openArgDescription }); } - async run(accessor: ServicesAccessor, args: Partial) { + async run(accessor: ServicesAccessor, args: OpenSearchEditorArgs) { await accessor.get(IInstantiationService).invokeFunction(openNewSearchEditor, args); } }); @@ -256,7 +261,7 @@ registerAction2(class extends Action2 { description: openArgDescription }); } - async run(accessor: ServicesAccessor, args: Partial) { + async run(accessor: ServicesAccessor, args: OpenSearchEditorArgs) { await accessor.get(IInstantiationService).invokeFunction(openNewSearchEditor, args, true); } }); @@ -269,9 +274,12 @@ registerAction2(class extends Action2 { category, f1: true, keybinding: { - primary: KeyMod.CtrlCmd | KeyCode.Enter, + primary: KeyMod.Alt | KeyCode.Enter, when: ContextKeyExpr.and(SearchConstants.HasSearchResults, SearchConstants.SearchViewFocusedKey), - weight: KeybindingWeight.WorkbenchContrib + weight: KeybindingWeight.WorkbenchContrib, + mac: { + primary: KeyMod.CtrlCmd | KeyCode.Enter + } }, }); } diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts index f94f29afef..4cf5550336 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditor.ts @@ -90,7 +90,7 @@ export class SearchEditor extends BaseTextEditor { @IModelService private readonly modelService: IModelService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @ILabelService private readonly labelService: ILabelService, - @IInstantiationService readonly instantiationService: IInstantiationService, + @IInstantiationService instantiationService: IInstantiationService, @IContextViewService private readonly contextViewService: IContextViewService, @ICommandService private readonly commandService: ICommandService, @IContextKeyService readonly contextKeyService: IContextKeyService, @@ -410,7 +410,7 @@ export class SearchEditor extends BaseTextEditor { this.searchResultEditor.focus(); } - async triggerSearch(_options?: { resetCursor?: boolean; delay?: number; }) { + async triggerSearch(_options?: { resetCursor?: boolean; delay?: number; focusResults?: boolean }) { const options = { resetCursor: true, delay: 0, ..._options }; if (!this.pauseSearching) { @@ -421,6 +421,9 @@ export class SearchEditor extends BaseTextEditor { this.searchResultEditor.setPosition(new Position(1, 1)); this.searchResultEditor.setScrollPosition({ scrollTop: 0, scrollLeft: 0 }); } + if (options.focusResults) { + this.searchResultEditor.focus(); + } }, options.delay); } } diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts index b0679dc802..3eceee0d14 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorActions.ts @@ -14,7 +14,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; import { SearchEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditor'; -import { getOrMakeSearchEditorInput, SearchEditorInput, SearchConfiguration } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; +import { getOrMakeSearchEditorInput, SearchEditorInput } from 'vs/workbench/contrib/searchEditor/browser/searchEditorInput'; import { serializeSearchResultForEditor } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ISearchConfigurationProperties } from 'vs/workbench/services/search/common/search'; @@ -25,6 +25,7 @@ import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { Schemas } from 'vs/base/common/network'; import { withNullAsUndefined } from 'vs/base/common/types'; import { OpenNewEditorCommandId } from 'vs/workbench/contrib/searchEditor/browser/constants'; +import { OpenSearchEditorArgs } from 'vs/workbench/contrib/searchEditor/browser/searchEditor.contribution'; export const toggleSearchEditorCaseSensitiveCommand = (accessor: ServicesAccessor) => { const editorService = accessor.get(IEditorService); @@ -99,7 +100,7 @@ export class OpenSearchEditorAction extends Action { } export const openNewSearchEditor = - async (accessor: ServicesAccessor, args: Partial = {}, toSide = false) => { + async (accessor: ServicesAccessor, _args: OpenSearchEditorArgs = {}, toSide = false) => { const editorService = accessor.get(IEditorService); const telemetryService = accessor.get(ITelemetryService); const instantiationService = accessor.get(IInstantiationService); @@ -111,11 +112,6 @@ export const openNewSearchEditor = const activeWorkspaceRootUri = historyService.getLastActiveWorkspaceRoot(Schemas.file); const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? withNullAsUndefined(workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri)) : undefined; - const resolvedArgs: Record = {}; - Object.entries(args).forEach(([name, value]) => { - resolvedArgs[name as any] = (typeof value === 'string') ? configurationResolverService.resolve(lastActiveWorkspaceRoot, value) : value; - }); - const activeEditorControl = editorService.activeTextEditorControl; let activeModel: ICodeEditor | undefined; let selected = ''; @@ -140,11 +136,20 @@ export const openNewSearchEditor = telemetryService.publicLog2('searchEditor/openNewSearchEditor'); - const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { config: { query: selected, ...resolvedArgs }, text: '' }); + const args: Record = { query: selected }; + Object.entries(_args).forEach(([name, value]) => { + args[name as any] = (typeof value === 'string') ? configurationResolverService.resolve(lastActiveWorkspaceRoot, value) : value; + }); + + const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { config: args, text: '' }); const editor = await editorService.openEditor(input, { pinned: true }, toSide ? SIDE_GROUP : ACTIVE_GROUP) as SearchEditor; - if (selected && configurationService.getValue('search').searchOnType) { - editor.triggerSearch(); + const searchOnType = configurationService.getValue('search').searchOnType; + if ( + args.triggerSearch === true || + args.triggerSearch !== false && searchOnType && args.query + ) { + editor.triggerSearch({ focusResults: args.focusResults !== false }); } }; @@ -159,6 +164,7 @@ export const createEditorFromSearchResult = const telemetryService = accessor.get(ITelemetryService); const instantiationService = accessor.get(IInstantiationService); const labelService = accessor.get(ILabelService); + const configurationService = accessor.get(IConfigurationService); telemetryService.publicLog2('searchEditor/createEditorFromSearchResult'); @@ -166,8 +172,15 @@ export const createEditorFromSearchResult = const labelFormatter = (uri: URI): string => labelService.getUriLabel(uri, { relative: true }); const { text, matchRanges, config } = serializeSearchResultForEditor(searchResult, rawIncludePattern, rawExcludePattern, 0, labelFormatter); + const contextLines = configurationService.getValue('search').searchEditor.defaultNumberOfContextLines; - const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { text, config }); - await editorService.openEditor(input, { pinned: true }); - input.setMatchRanges(matchRanges); + if (searchResult.isDirty || contextLines === 0 || contextLines === null) { + const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { text, config }); + await editorService.openEditor(input, { pinned: true }); + input.setMatchRanges(matchRanges); + } else { + const input = instantiationService.invokeFunction(getOrMakeSearchEditorInput, { text: '', config: { ...config, contextLines } }); + const editor = await editorService.openEditor(input, { pinned: true }) as SearchEditor; + editor.triggerSearch({ focusResults: true }); + } }; diff --git a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts index f8f014df5a..63d8957dc8 100644 --- a/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts +++ b/src/vs/workbench/contrib/searchEditor/browser/searchEditorInput.ts @@ -3,6 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Registry } from 'vs/platform/registry/common/platform'; import { Emitter, Event } from 'vs/base/common/event'; import * as network from 'vs/base/common/network'; import { basename } from 'vs/base/common/path'; @@ -18,9 +19,8 @@ import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { EditorInput, GroupIdentifier, IEditorInput, IMoveResult, IRevertOptions, ISaveOptions } from 'vs/workbench/common/editor'; +import { EditorInput, GroupIdentifier, IEditorInput, IMoveResult, IRevertOptions, ISaveOptions, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; import { Memento } from 'vs/workbench/common/memento'; -import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { SearchEditorFindMatchClass, SearchEditorScheme } from 'vs/workbench/contrib/searchEditor/browser/constants'; import { SearchEditorModel } from 'vs/workbench/contrib/searchEditor/browser/searchEditorModel'; import { defaultSearchConfig, extractSearchQueryFromModel, parseSavedSearchEditor, serializeSearchConfiguration } from 'vs/workbench/contrib/searchEditor/browser/searchEditorSerialization'; @@ -43,7 +43,7 @@ export type SearchConfiguration = { showIncludesExcludes: boolean, }; -const SEARCH_EDITOR_EXT = '.code-search'; +export const SEARCH_EDITOR_EXT = '.code-search'; export class SearchEditorInput extends EditorInput { static readonly ID: string = 'workbench.editorinputs.searchEditorInput'; @@ -70,6 +70,8 @@ export class SearchEditorInput extends EditorInput { this._onDidChangeLabel.fire(); } + private readonly fileEditorInputFactory = Registry.as(EditorInputExtensions.EditorInputFactories).getFileEditorInputFactory(); + get resource() { return this.backingUri || this.modelUri; } @@ -178,10 +180,6 @@ export class SearchEditorInput extends EditorInput { return localize('searchTitle', "Search"); } - async resolve() { - return null; - } - setDirty(dirty: boolean) { this.dirty = dirty; this._onDidChangeDirty.fire(); @@ -215,7 +213,7 @@ export class SearchEditorInput extends EditorInput { return !this.backingUri; } - move(group: GroupIdentifier, target: URI): IMoveResult | undefined { + rename(group: GroupIdentifier, target: URI): IMoveResult | undefined { if (this._cachedModel && extname(target) === SEARCH_EDITOR_EXT) { return { editor: this.instantiationService.invokeFunction(getOrMakeSearchEditorInput, { config: this.config, text: this._cachedModel.getValue(), backingUri: target }) @@ -235,7 +233,7 @@ export class SearchEditorInput extends EditorInput { if (other instanceof SearchEditorInput) { return !!(other.modelUri.fragment && other.modelUri.fragment === this.modelUri.fragment); - } else if (other instanceof FileEditorInput) { + } else if (this.fileEditorInputFactory.isFileEditorInput(other)) { return other.resource?.toString() === this.backingUri?.toString(); } return false; @@ -302,15 +300,19 @@ export const getOrMakeSearchEditorInput = ( const searchEditorSettings = configurationService.getValue('search').searchEditor; const reuseOldSettings = searchEditorSettings.reusePriorSearchConfiguration; - const defaultShowContextValue = searchEditorSettings.defaultShowContextValue; + const defaultNumberOfContextLines = searchEditorSettings.defaultNumberOfContextLines; const priorConfig: SearchConfiguration = reuseOldSettings ? new Memento(SearchEditorInput.ID, storageService).getMemento(StorageScope.WORKSPACE).searchConfig : {}; const defaultConfig = defaultSearchConfig(); let config = { ...defaultConfig, ...priorConfig, ...existingData.config }; - if (defaultShowContextValue !== null && defaultShowContextValue !== undefined) { - config.contextLines = defaultShowContextValue; + if (defaultNumberOfContextLines !== null && defaultNumberOfContextLines !== undefined) { + config.contextLines = defaultNumberOfContextLines; + } + + if (existingData.text) { + config.contextLines = 0; } const modelUri = existingData.modelUri ?? URI.from({ scheme: SearchEditorScheme, fragment: `${Math.random()}` }); diff --git a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts index a05d14266c..023e8f227f 100644 --- a/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts +++ b/src/vs/workbench/contrib/snippets/browser/insertSnippet.ts @@ -80,20 +80,21 @@ class InsertSnippetAction extends EditorAction { }); } - run(accessor: ServicesAccessor, editor: ICodeEditor, arg: any): Promise | undefined { + async run(accessor: ServicesAccessor, editor: ICodeEditor, arg: any): Promise { const modeService = accessor.get(IModeService); const snippetService = accessor.get(ISnippetsService); if (!editor.hasModel()) { - return undefined; + return; } const clipboardService = accessor.get(IClipboardService); const quickInputService = accessor.get(IQuickInputService); - const { lineNumber, column } = editor.getPosition(); - let { snippet, name, langId } = Args.fromUser(arg); - return new Promise(async (resolve, reject) => { + const snippet = await new Promise(async (resolve, reject) => { + + const { lineNumber, column } = editor.getPosition(); + let { snippet, name, langId } = Args.fromUser(arg); if (snippet) { return resolve(new Snippet( @@ -167,16 +168,16 @@ class InsertSnippetAction extends EditorAction { } return quickInputService.pick(picks, { matchOnDetail: true }).then(pick => resolve(pick && pick.snippet), reject); } - }).then(async snippet => { - if (!snippet) { - return; - } - let clipboardText: string | undefined; - if (snippet.needsClipboard) { - clipboardText = await clipboardService.readText(); - } - SnippetController2.get(editor).insert(snippet.codeSnippet, { clipboardText }); }); + + 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/snippets.contribution.ts b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts index 1fc034cf85..89510c2d27 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippets.contribution.ts @@ -15,7 +15,7 @@ export const ISnippetsService = createDecorator('snippetServic export interface ISnippetsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getSnippetFiles(): Promise>; diff --git a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts index 5391d0c73d..1718f2ce42 100644 --- a/src/vs/workbench/contrib/snippets/browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/browser/snippetsService.ts @@ -174,12 +174,12 @@ class SnippetsService implements ISnippetsService { const languageIdentifier = this._modeService.getLanguageIdentifier(languageId); if (languageIdentifier) { const langName = languageIdentifier.language; - this._files.forEach(file => { + for (const file of this._files.values()) { promises.push(file.load() .then(file => file.select(langName, result)) .catch(err => this._logService.error(err, file.location.toString())) ); - }); + } } return Promise.all(promises).then(() => result); }); @@ -190,12 +190,12 @@ class SnippetsService implements ISnippetsService { const languageIdentifier = this._modeService.getLanguageIdentifier(languageId); if (languageIdentifier) { const langName = languageIdentifier.language; - this._files.forEach(file => { + for (const file of this._files.values()) { // kick off loading (which is a noop in case it's already loaded) // and optimistically collect snippets file.load().catch(err => { /*ignore*/ }); file.select(langName, result); - }); + } } return result; } @@ -205,11 +205,11 @@ class SnippetsService implements ISnippetsService { private _initExtensionSnippets(): void { snippetExt.point.setHandler(extensions => { - this._files.forEach((value, key) => { + for (let [key, value] of this._files) { if (value.source === SnippetSource.Extension) { this._files.delete(key); } - }); + } for (const extension of extensions) { for (const contribution of extension.value) { diff --git a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts index 6c8519c4c0..b0df0407ec 100644 --- a/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts +++ b/src/vs/workbench/contrib/snippets/browser/tabCompletion.ts @@ -19,6 +19,8 @@ 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'; export class TabCompletionController implements IEditorContribution { @@ -38,6 +40,7 @@ export class TabCompletionController implements IEditorContribution { constructor( private readonly _editor: ICodeEditor, @ISnippetsService private readonly _snippetService: ISnippetsService, + @IClipboardService private readonly _clipboardService: IClipboardService, @IContextKeyService contextKeyService: IContextKeyService, ) { this._hasSnippets = TabCompletionController.ContextKey.bindTo(contextKeyService); @@ -117,7 +120,7 @@ export class TabCompletionController implements IEditorContribution { this._hasSnippets.set(this._activeSnippets.length > 0); } - performSnippetCompletions(): void { + async performSnippetCompletions() { if (!this._editor.hasModel()) { return; } @@ -125,7 +128,22 @@ export class TabCompletionController implements IEditorContribution { if (this._activeSnippets.length === 1) { // one -> just insert const [snippet] = this._activeSnippets; - SnippetController2.get(this._editor).insert(snippet.codeSnippet, { overwriteBefore: snippet.prefix.length, overwriteAfter: 0 }); + + // async clipboard access might be required and in that case + // we need to check if the editor has changed in flight and then + // bail out (or be smarter than that) + let clipboardText: string | undefined; + if (snippet.needsClipboard) { + const state = new EditorState(this._editor, CodeEditorStateFlag.Value | CodeEditorStateFlag.Position); + clipboardText = await this._clipboardService.readText(); + if (!state.validate(this._editor)) { + return; + } + } + SnippetController2.get(this._editor).insert(snippet.codeSnippet, { + overwriteBefore: snippet.prefix.length, overwriteAfter: 0, + clipboardText + }); } else if (this._activeSnippets.length > 1) { // two or more -> show IntelliSense box 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 5085c9264b..3245b6cd89 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetFile.test.ts @@ -6,6 +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'; suite('Snippets', function () { @@ -70,6 +71,8 @@ suite('Snippets', function () { function assertNeedsClipboard(body: string, expected: boolean): void { let snippet = new Snippet(['foo'], 'FooSnippet1', 'foo', '', body, 'test', SnippetSource.User); assert.equal(snippet.needsClipboard, expected); + + assert.equal(SnippetParser.guessNeedsClipboard(body), expected); } assertNeedsClipboard('foo$CLIPBOARD', true); 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 f980ee2c32..c3affe15e2 100644 --- a/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts +++ b/src/vs/workbench/contrib/snippets/test/browser/snippetsService.test.ts @@ -15,7 +15,7 @@ import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageCo import { CompletionContext, CompletionTriggerKind } from 'vs/editor/common/modes'; class SimpleSnippetService implements ISnippetsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(readonly snippets: Snippet[]) { } getSnippets() { diff --git a/src/vs/workbench/contrib/tags/browser/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/browser/workspaceTagsService.ts index 3080b549e9..0d4fdb5e57 100644 --- a/src/vs/workbench/contrib/tags/browser/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/browser/workspaceTagsService.ts @@ -10,7 +10,7 @@ import { IWorkspaceTagsService, Tags } from 'vs/workbench/contrib/tags/common/wo export class NoOpWorkspaceTagsService implements IWorkspaceTagsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; getTags(): Promise { return Promise.resolve({}); diff --git a/src/vs/workbench/contrib/tags/common/workspaceTags.ts b/src/vs/workbench/contrib/tags/common/workspaceTags.ts index 74749bdd05..dfa87f949d 100644 --- a/src/vs/workbench/contrib/tags/common/workspaceTags.ts +++ b/src/vs/workbench/contrib/tags/common/workspaceTags.ts @@ -12,7 +12,7 @@ export type Tags = { [index: string]: boolean | number | string | undefined }; export const IWorkspaceTagsService = createDecorator('workspaceTagsService'); export interface IWorkspaceTagsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getTags(): Promise; diff --git a/src/vs/workbench/contrib/tags/electron-browser/workspaceTags.ts b/src/vs/workbench/contrib/tags/electron-browser/workspaceTags.ts index adf6d8528c..4c894e19f6 100644 --- a/src/vs/workbench/contrib/tags/electron-browser/workspaceTags.ts +++ b/src/vs/workbench/contrib/tags/electron-browser/workspaceTags.ts @@ -16,7 +16,7 @@ import { IWorkspaceTagsService, Tags } from 'vs/workbench/contrib/tags/common/wo import { IWorkspaceInformation } from 'vs/platform/diagnostics/common/diagnostics'; import { IRequestService } from 'vs/platform/request/common/request'; import { isWindows } from 'vs/base/common/platform'; -import { getRemotes, SecondLevelDomainWhitelist, getDomainsOfRemotes } from 'vs/platform/extensionManagement/common/configRemotes'; +import { getRemotes, AllowedSecondLevelDomains, getDomainsOfRemotes } from 'vs/platform/extensionManagement/common/configRemotes'; export function getHashedRemotesFromConfig(text: string, stripEndingDotGit: boolean = false): string[] { return getRemotes(text, stripEndingDotGit).map(r => { @@ -111,7 +111,7 @@ export class WorkspaceTags implements IWorkbenchContribution { return []; } return this.textFileService.read(uri, { acceptTextOnly: true }).then( - content => getDomainsOfRemotes(content.value, SecondLevelDomainWhitelist), + content => getDomainsOfRemotes(content.value, AllowedSecondLevelDomains), err => [] // ignore missing or binary file ); }); diff --git a/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService.ts b/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService.ts index bccf1fe93d..e941b17ac7 100644 --- a/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService.ts +++ b/src/vs/workbench/contrib/tags/electron-browser/workspaceTagsService.ts @@ -61,7 +61,13 @@ const ModulesToLookFor = [ '@microsoft/rush', 'lerna', 'just-task', - 'beachball' + 'beachball', + // Playwright packages + 'playwright', + 'playwright-core', + 'playwright-chromium', + 'playwright-firefox', + 'playwright-webkit' ]; const PyModulesToLookFor = [ 'azure', @@ -92,7 +98,7 @@ const PyModulesToLookFor = [ ]; export class WorkspaceTagsService implements IWorkspaceTagsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _tags: Tags | undefined; constructor( @@ -200,6 +206,11 @@ export class WorkspaceTagsService implements IWorkspaceTagsService { "workspace.npm.just-task" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.beachball" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.npm.electron" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "workspace.npm.playwright" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "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.bower" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.yeoman.code.ext" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, "workspace.cordova.high" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 7656598a97..82e7b564cd 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -81,6 +81,7 @@ import { find } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { IViewsService, IViewDescriptorService } from 'vs/workbench/common/views'; import { isWorkspaceFolder, TaskQuickPickEntry, QUICKOPEN_DETAIL_CONFIG, TaskQuickPick, QUICKOPEN_SKIP_CONFIG } from 'vs/workbench/contrib/tasks/browser/taskQuickPick'; +import { ILogService } from 'vs/platform/log/common/log'; const QUICKOPEN_HISTORY_LIMIT_CONFIG = 'task.quickOpen.history'; const PROBLEM_MATCHER_NEVER_CONFIG = 'task.problemMatchers.neverPrompt'; @@ -255,7 +256,8 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer @IPathService private readonly pathService: IPathService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IPreferencesService private readonly preferencesService: IPreferencesService, - @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService + @IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService, + @ILogService private readonly logService: ILogService ) { super(); @@ -554,6 +556,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } public async tryResolveTask(configuringTask: ConfiguringTask): Promise { + await Promise.all([this.extensionService.activateByEvent('onCommand:workbench.action.tasks.runTask'), this.extensionService.whenInstalledExtensionsRegistered()]); let matchingProvider: ITaskProvider | undefined; for (const [handle, provider] of this._providers) { if (configuringTask.type === this._providerTypes.get(handle)) { @@ -1051,7 +1054,29 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer return false; } - private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined): Promise { + private async formatTaskForJson(resource: URI, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask): Promise { + let reference: IReference | undefined; + let stringValue: string = ''; + try { + reference = await this.textModelResolverService.createModelReference(resource); + const model = reference.object.textEditorModel; + const { tabSize, insertSpaces } = model.getOptions(); + const eol = model.getEOL(); + const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces }); + let stringified = applyEdits(JSON.stringify(task), edits); + const regex = new RegExp(eol + '\\t', 'g'); + stringified = stringified.replace(regex, eol + '\t\t\t'); + const twoTabs = '\t\t'; + stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1); + } finally { + if (reference) { + reference.dispose(); + } + } + return stringValue; + } + + private openEditorAtTask(resource: URI | undefined, task: TaskConfig.CustomTask | TaskConfig.ConfiguringTask | string | undefined, configIndex: number = -1): Promise { if (resource === undefined) { return Promise.resolve(false); } @@ -1062,26 +1087,18 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } if (task) { const contentValue = content.toString(); - let stringValue: string; - if (typeof task === 'string') { - stringValue = task; - } else { - let reference: IReference | undefined; - try { - reference = await this.textModelResolverService.createModelReference(resource); - const model = reference.object.textEditorModel; - const { tabSize, insertSpaces } = model.getOptions(); - const eol = model.getEOL(); - const edits = format(JSON.stringify(task), undefined, { eol, tabSize, insertSpaces }); - let stringified = applyEdits(JSON.stringify(task), edits); - const regex = new RegExp(eol + '\\t', 'g'); - stringified = stringified.replace(regex, eol + '\t\t\t'); - const twoTabs = '\t\t'; - stringValue = twoTabs + stringified.slice(0, stringified.length - 1) + twoTabs + stringified.slice(stringified.length - 1); - } finally { - if (reference) { - reference.dispose(); - } + let stringValue: string | undefined; + if (configIndex !== -1) { + const json: TaskConfig.ExternalTaskRunnerConfiguration = JSON.parse(contentValue); + if (json.tasks && (json.tasks.length > configIndex)) { + stringValue = await this.formatTaskForJson(resource, json.tasks[configIndex]); + } + } + if (!stringValue) { + if (typeof task === 'string') { + stringValue = task; + } else { + stringValue = await this.formatTaskForJson(resource, task); } } @@ -1280,14 +1297,14 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer } } - public openConfig(task: CustomTask | ConfiguringTask | undefined): Promise { + public async openConfig(task: CustomTask | ConfiguringTask | undefined): Promise { let resource: URI | undefined; if (task) { resource = this.getResourceForTask(task); } else { resource = (this._workspaceFolders && (this._workspaceFolders.length > 0)) ? this._workspaceFolders[0].toResource('.vscode/tasks.json') : undefined; } - return this.openEditorAtTask(resource, task ? task._label : undefined); + return this.openEditorAtTask(resource, task ? task._label : undefined, task ? task._source.config.index : -1); } private createRunnableTask(tasks: TaskMap, group: TaskGroup): { task: Task; resolver: ITaskResolver } | undefined { @@ -1532,7 +1549,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer this.modelService, this.configurationResolverService, this.telemetryService, this.contextService, this.environmentService, AbstractTaskService.OutputChannelId, this.fileService, this.terminalInstanceService, - this.pathService, this.viewDescriptorService, + this.pathService, this.viewDescriptorService, this.logService, (workspaceFolder: IWorkspaceFolder) => { if (!workspaceFolder) { return undefined; diff --git a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts index 6b26819b48..bc87801e59 100644 --- a/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/browser/terminalTaskSystem.ts @@ -46,6 +46,7 @@ import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { env as processEnv, cwd as processCwd } from 'vs/base/common/process'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; +import { ILogService } from 'vs/platform/log/common/log'; interface TerminalData { terminal: ITerminalInstance; @@ -202,6 +203,7 @@ export class TerminalTaskSystem implements ITaskSystem { private terminalInstanceService: ITerminalInstanceService, private pathService: IPathService, private viewDescriptorService: IViewDescriptorService, + private logService: ILogService, taskSystemInfoResolver: TaskSystemInfoResolver, ) { @@ -722,7 +724,7 @@ export class TerminalTaskSystem implements ITaskSystem { processStartedSignaled = true; } }, (_error) => { - // The process never got ready. Need to think how to handle this. + this.logService.error('Task terminal process never got ready'); }); this._onDidStateChange.fire(TaskEvent.create(TaskEventKind.Start, task, terminal.id)); let skipLine: boolean = (!!task.command.presentation && task.command.presentation.echo); @@ -764,8 +766,13 @@ export class TerminalTaskSystem implements ITaskSystem { let reveal = task.command.presentation!.reveal; if ((reveal === RevealKind.Silent) && ((exitCode !== 0) || (watchingProblemMatcher.numberOfMatches > 0) && watchingProblemMatcher.maxMarkerSeverity && (watchingProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error))) { - this.terminalService.setActiveInstance(terminal!); - this.terminalService.showPanel(false); + try { + this.terminalService.setActiveInstance(terminal!); + this.terminalService.showPanel(false); + } catch (e) { + // If the terminal has already been disposed, then setting the active instance will fail. #99828 + // There is nothing else to do here. + } } watchingProblemMatcher.done(); watchingProblemMatcher.dispose(); @@ -843,8 +850,13 @@ export class TerminalTaskSystem implements ITaskSystem { this.viewsService.openView(Constants.MARKERS_VIEW_ID); } else if (terminal && (reveal === RevealKind.Silent) && ((exitCode !== 0) || (startStopProblemMatcher.numberOfMatches > 0) && startStopProblemMatcher.maxMarkerSeverity && (startStopProblemMatcher.maxMarkerSeverity >= MarkerSeverity.Error))) { - this.terminalService.setActiveInstance(terminal); - this.terminalService.showPanel(false); + try { + this.terminalService.setActiveInstance(terminal); + this.terminalService.showPanel(false); + } catch (e) { + // If the terminal has already been disposed, then setting the active instance will fail. #99828 + // There is nothing else to do here. + } } // Hack to work around #92868 until terminal is fixed. setTimeout(() => { @@ -1274,7 +1286,7 @@ export class TerminalTaskSystem implements ITaskSystem { if (platform === Platform.Platform.Windows) { if (basename === 'cmd' && commandQuoted && argQuoted) { commandLine = '"' + commandLine + '"'; - } else if (basename === 'powershell' && commandQuoted) { + } else if ((basename === 'powershell' || basename === 'pwsh') && commandQuoted) { commandLine = '& ' + commandLine; } } diff --git a/src/vs/workbench/contrib/tasks/common/problemMatcher.ts b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts index 9c2c5953ec..20435ff1f9 100644 --- a/src/vs/workbench/contrib/tasks/common/problemMatcher.ts +++ b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts @@ -1614,7 +1614,7 @@ export namespace Schemas { } } ], - description: localize('ProblemMatcherSchema.fileLocation', 'Defines how file names reported in a problem pattern should be interpreted.') + description: localize('ProblemMatcherSchema.fileLocation', 'Defines how file names reported in a problem pattern should be interpreted. A relative fileLocation may be an array, where the second element of the array is the path the relative file location.') }, background: { type: 'object', diff --git a/src/vs/workbench/contrib/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts index 750a3055e8..2c57dce062 100644 --- a/src/vs/workbench/contrib/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -53,7 +53,7 @@ export interface WorkspaceFolderTaskResult extends WorkspaceTaskResult { export const USER_TASKS_GROUP_KEY = 'settings'; export interface ITaskService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidStateChange: Event; supportsMultipleTaskExecutions: boolean; diff --git a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts index ca5d743791..898366ad19 100644 --- a/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts +++ b/src/vs/workbench/contrib/terminal/browser/links/terminalLink.ts @@ -68,20 +68,24 @@ export class TerminalLink extends DisposableStore implements ILink { } })); - const timeout = this._configurationService.getValue('editor.hover.delay'); - this._tooltipScheduler = new RunOnceScheduler(() => { - this._tooltipCallback( - this, - convertBufferRangeToViewport(this.range, this._viewportY), - this._isHighConfidenceLink ? () => this._enableDecorations() : undefined, - this._isHighConfidenceLink ? () => this._disableDecorations() : undefined - ); - // Clear out scheduler until next hover event - this._tooltipScheduler?.dispose(); - this._tooltipScheduler = undefined; - }, timeout); - this.add(this._tooltipScheduler); - this._tooltipScheduler.schedule(); + // Only show the tooltip and highlight for high confidence links (not word/search workspace + // links). Feedback was that this makes using the terminal overly noisy. + if (this._isHighConfidenceLink) { + const timeout = this._configurationService.getValue('editor.hover.delay'); + this._tooltipScheduler = new RunOnceScheduler(() => { + this._tooltipCallback( + this, + convertBufferRangeToViewport(this.range, this._viewportY), + this._isHighConfidenceLink ? () => this._enableDecorations() : undefined, + this._isHighConfidenceLink ? () => this._disableDecorations() : undefined + ); + // Clear out scheduler until next hover event + this._tooltipScheduler?.dispose(); + this._tooltipScheduler = undefined; + }, timeout); + this.add(this._tooltipScheduler); + this._tooltipScheduler.schedule(); + } const origin = { x: event.pageX, y: event.pageY }; this._hoverListeners = new DisposableStore(); diff --git a/src/vs/workbench/contrib/terminal/browser/media/widgets.css b/src/vs/workbench/contrib/terminal/browser/media/widgets.css index 1f282dac8d..b4e9a1804d 100644 --- a/src/vs/workbench/contrib/terminal/browser/media/widgets.css +++ b/src/vs/workbench/contrib/terminal/browser/media/widgets.css @@ -12,29 +12,6 @@ overflow: visible; } -.monaco-workbench .terminal-hover-widget { - position: fixed; - font-size: 14px; - line-height: 19px; - animation: fadein 100ms linear; - /* Must be higher than sash's z-index and terminal canvases */ - z-index: 40; - overflow: hidden; -} - -.monaco-workbench .terminal-hover-widget a { - color: #3794ff; -} - -.monaco-workbench .terminal-hover-widget.right-aligned .hover-row.status-bar .actions { - flex-direction: row-reverse; -} - -.monaco-workbench .terminal-hover-widget.right-aligned .hover-row.status-bar .actions .action-container { - margin-right: 0; - margin-left: 16px; -} - .monaco-workbench .terminal-overlay-widget { position: absolute; left: 0; @@ -58,15 +35,16 @@ opacity: 0.5; } +.monaco-workbench .terminal-env-var-info:hover, +.monaco-workbench .terminal-env-var-info.requires-action { + opacity: 1; +} + .monaco-workbench .pane-body.integrated-terminal .monaco-split-view2.horizontal .split-view-view:last-child .terminal-env-var-info { /* Adjust for reduced margin in splits */ right: -8px; } -.monaco-workbench .terminal-env-var-info:hover { - opacity: 1; -} - .monaco-workbench .terminal-env-var-info.codicon { line-height: 28px; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 0d55044cc9..7a1930722c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -7,7 +7,7 @@ import { Terminal as XTermTerminal } from 'xterm'; import { SearchAddon as XTermSearchAddon } from 'xterm-addon-search'; import { Unicode11Addon as XTermUnicode11Addon } from 'xterm-addon-unicode11'; import { WebglAddon as XTermWebglAddon } from 'xterm-addon-webgl'; -import { IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IWindowsShellHelper, ITerminalConfigHelper, ITerminalChildProcess, IShellLaunchConfig, IDefaultShellAndArgsRequest, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, ITerminalProcessExtHostProxy, ICommandTracker, INavigationMode, TitleEventSource, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProcessEnvironment, Platform } from 'vs/base/common/platform'; import { Event } from 'vs/base/common/event'; @@ -24,7 +24,7 @@ export const ITerminalInstanceService = createDecorator; @@ -70,7 +70,7 @@ export interface ITerminalTab { } export interface ITerminalService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; activeTabIndex: number; configHelper: ITerminalConfigHelper; @@ -161,8 +161,8 @@ export interface ITerminalService { preparePathForTerminalAsync(path: string, executable: string | undefined, title: string, shellType: TerminalShellType): Promise; extHostReady(remoteAuthority: string): void; - requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): void; - requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): void; + requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise; + requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): Promise; } export interface ISearchOptions { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 645dd151df..748b4ac118 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -37,6 +37,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { localize } from 'vs/nls'; import { CONTEXT_ACCESSIBILITY_MODE_ENABLED } from 'vs/platform/accessibility/common/accessibility'; +import { IOpenerService } from 'vs/platform/opener/common/opener'; async function getCwdForSplit(configHelper: ITerminalConfigHelper, instance: ITerminalInstance, folders?: IWorkspaceFolder[], commandService?: ICommandService): Promise { switch (configHelper.config.splitCwd) { @@ -392,6 +393,19 @@ export class ClearTerminalAction extends Action { } } +export class TerminalLaunchTroubleshootAction extends Action { + + constructor( + @IOpenerService private readonly _openerService: IOpenerService + ) { + super('workbench.action.terminal.launchHelp', localize('terminalLaunchTroubleshoot', "Troubleshoot")); + } + + async run(): Promise { + this._openerService.open('https://aka.ms/vscode-troubleshoot-terminal-launch'); + } +} + export function registerTerminalActions() { const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' }; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index e90a27262b..98b56e5bd2 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -25,7 +25,7 @@ import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderB import { ICssStyleCollector, IColorTheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND, SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/widgets/widgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, LEGACY_CONSOLE_MODE_EXIT_CODE, DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_VIEW_ID, IWindowsShellHelper, KEYBINDING_CONTEXT_TERMINAL_A11Y_TREE_FOCUS, INavigationMode, TitleEventSource, DEFAULT_COMMANDS_TO_SKIP_SHELL, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/browser/terminalConfigHelper'; import { TerminalLinkManager } from 'vs/workbench/contrib/terminal/browser/links/terminalLinkManager'; @@ -42,6 +42,7 @@ import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs/workbench/common/views'; import { EnvironmentVariableInfoWidget } from 'vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; +import { TerminalLaunchTroubleshootAction } from 'vs/workbench/contrib/terminal/browser/terminalActions'; // How long in milliseconds should an average frame take to render for a notification to appear // which suggests the fallback DOM-based renderer @@ -103,6 +104,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { private _commandTrackerAddon: CommandTrackerAddon | undefined; private _navigationModeAddon: INavigationMode & ITerminalAddon | undefined; + private _timeoutDimension: dom.Dimension | undefined; + public disableLayout: boolean; public get id(): number { return this._id; } public get cols(): number { @@ -483,8 +486,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { throw new Error('xterm elements not set after open'); } + // Check if custom Terminal title exists and set same + if (this._title.length > 0) { + xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabelNumberAndTitle', "Terminal {0}, {1}", this._id, this._title)); + } else { + xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabel', "Terminal {0}", this._id)); + } - xterm.textarea.setAttribute('aria-label', nls.localize('terminalTextBoxAriaLabel', "Terminal {0}", this._id)); xterm.textarea.addEventListener('focus', () => this._onFocus.fire(this)); xterm.attachCustomKeyEventHandler((event: KeyboardEvent): boolean => { // Disable all input if the terminal is exiting @@ -821,7 +829,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // HACK: Trigger another async layout to ensure xterm's CharMeasure is ready to use, // this hack can be removed when https://github.com/xtermjs/xterm.js/issues/702 is // supported. - setTimeout(() => this.layout(new dom.Dimension(width, height)), 0); + this._timeoutDimension = new dom.Dimension(width, height); + setTimeout(() => this.layout(this._timeoutDimension!), 0); } } } @@ -897,7 +906,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { this._windowsShellHelper = this._terminalInstanceService.createWindowsShellHelper(this._processManager.shellProcessId, xterm); this._windowsShellHelper.onShellNameChange(title => { this.setShellType(this.getShellType(title)); - if (this.isTitleSetByProcess) { + if (this.isTitleSetByProcess && !this._configHelper.config.experimentalUseTitleEvent) { this.setTitle(title, TitleEventSource.Process); } }); @@ -906,11 +915,13 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { }); } - // Create the process asynchronously to allow the terminal's container - // to be created so dimensions are accurate - setTimeout(() => { - this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows, this._accessibilityService.isScreenReaderOptimized()); - }, 0); + // Create the process asynchronously to allow the terminal's container to be created so + // dimensions are accurate + this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows, this._accessibilityService.isScreenReaderOptimized()).then(error => { + if (error) { + this._onProcessExit(error); + } + }); } private getShellType(executable: string): TerminalShellType { @@ -945,48 +956,54 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { * @param exitCode The exit code of the process, this is undefined when the terminal was exited * through user action. */ - private _onProcessExit(exitCode?: number): void { + private _onProcessExit(exitCodeOrError?: number | ITerminalLaunchError): void { // Prevent dispose functions being triggered multiple times if (this._isExiting) { return; } - this._logService.debug(`Terminal process exit (id: ${this.id}) with code ${exitCode}`); + this._logService.debug(`Terminal process exit (id: ${this.id}) with code ${this._exitCode}`); - this._exitCode = exitCode; this._isExiting = true; let exitCodeMessage: string | undefined; // Create exit code message - if (exitCode) { - if (exitCode === SHELL_PATH_INVALID_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPath', 'The terminal shell path "{0}" does not exist', this._shellLaunchConfig.executable); - } else if (exitCode === SHELL_PATH_DIRECTORY_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidPathDirectory', 'The terminal shell path "{0}" is a directory', this._shellLaunchConfig.executable); - } else if (exitCode === SHELL_CWD_INVALID_EXIT_CODE && this._shellLaunchConfig.cwd) { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithInvalidCWD', 'The terminal shell CWD "{0}" does not exist', this._shellLaunchConfig.cwd.toString()); - } else if (exitCode === LEGACY_CONSOLE_MODE_EXIT_CODE) { - exitCodeMessage = nls.localize('terminal.integrated.legacyConsoleModeError', 'The terminal failed to launch properly because your system has legacy console mode enabled, uncheck "Use legacy console" cmd.exe\'s properties to fix this.'); - } else if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { - let args = ''; - if (typeof this._shellLaunchConfig.args === 'string') { - args = ` ${this._shellLaunchConfig.args}`; - } else if (this._shellLaunchConfig.args && this._shellLaunchConfig.args.length) { - args = ' ' + this._shellLaunchConfig.args.map(a => { - if (typeof a === 'string' && a.indexOf(' ') !== -1) { - return `'${a}'`; - } - return a; - }).join(' '); + switch (typeof exitCodeOrError) { + case 'number': + // Only show the error if the exit code is non-zero + this._exitCode = exitCodeOrError; + if (this._exitCode === 0) { + break; } + + let commandLine: string | undefined = undefined; if (this._shellLaunchConfig.executable) { - exitCodeMessage = nls.localize('terminal.integrated.launchFailed', 'The terminal process command \'{0}{1}\' failed to launch (exit code: {2})', this._shellLaunchConfig.executable, args, exitCode); - } else { - exitCodeMessage = nls.localize('terminal.integrated.launchFailedExtHost', 'The terminal process failed to launch (exit code: {0})', exitCode); + commandLine = this._shellLaunchConfig.executable; + if (typeof this._shellLaunchConfig.args === 'string') { + commandLine += ` ${this._shellLaunchConfig.args}`; + } else if (this._shellLaunchConfig.args && this._shellLaunchConfig.args.length) { + commandLine += this._shellLaunchConfig.args.map(a => ` '${a}'`).join(); + } } - } else { - exitCodeMessage = nls.localize('terminal.integrated.exitedWithCode', 'The terminal process terminated with exit code: {0}', exitCode); - } + + if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { + if (commandLine) { + exitCodeMessage = nls.localize('launchFailed.exitCodeAndCommandLine', "The terminal process \"{0}\" failed to launch (exit code: {1})", commandLine, this._exitCode); + break; + } + exitCodeMessage = nls.localize('launchFailed.exitCodeOnly', "The terminal process failed to launch (exit code: {0})", this._exitCode); + break; + } + if (commandLine) { + exitCodeMessage = nls.localize('terminated.exitCodeAndCommandLine', "The terminal process \"{0}\" terminated with exit code: {1}", commandLine, this._exitCode); + break; + } + exitCodeMessage = nls.localize('terminated.exitCodeOnly', "The terminal process terminated with exit code: {0}", this._exitCode); + break; + case 'object': + this._exitCode = exitCodeOrError.code; + exitCodeMessage = nls.localize('launchFailed.errorMessage', "The terminal process failed to launch: {0}", exitCodeOrError.message); + break; } this._logService.debug(`Terminal process exit (id: ${this.id}) state ${this._processManager.processState}`); @@ -1013,19 +1030,23 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } else { this.dispose(); if (exitCodeMessage) { - if (this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH) { - this._notificationService.error(exitCodeMessage); + const failedDuringLaunch = this._processManager.processState === ProcessState.KILLED_DURING_LAUNCH; + if (failedDuringLaunch || this._configHelper.config.showExitAlert) { + // Always show launch failures + this._notificationService.notify({ + message: exitCodeMessage, + severity: Severity.Error, + actions: { primary: [this._instantiationService.createInstance(TerminalLaunchTroubleshootAction)] } + }); } else { - if (this._configHelper.config.showExitAlert) { - this._notificationService.error(exitCodeMessage); - } else { - console.warn(exitCodeMessage); - } + // Log to help surface the error in case users report issues with showExitAlert + // disabled + this._logService.warn(exitCodeMessage); } } } - this._onExit.fire(exitCode); + this._onExit.fire(this._exitCode); } private _attachPressAnyKeyToCloseListener(xterm: XTermTerminal) { @@ -1269,6 +1290,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { return; } + this._timeoutDimension = new dom.Dimension(dimension.width, dimension.height); + if (this._xterm && this._xterm.element) { this._xterm.element.style.width = terminalWidth + 'px'; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts index 2d18b3c91c..ef20cca47a 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalProcessExtHostProxy, IShellLaunchConfig, ITerminalChildProcess, ITerminalConfigHelper, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import * as nls from 'vs/nls'; import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; -let hasReceivedResponse: boolean = false; +let hasReceivedResponseFromRemoteExtHost: boolean = false; export class TerminalProcessExtHostProxy extends Disposable implements ITerminalChildProcess, ITerminalProcessExtHostProxy { @@ -28,6 +28,8 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal private readonly _onProcessResolvedShellLaunchConfig = this._register(new Emitter()); public get onProcessResolvedShellLaunchConfig(): Event { return this._onProcessResolvedShellLaunchConfig.event; } + private readonly _onStart = this._register(new Emitter()); + public readonly onStart: Event = this._onStart.event; private readonly _onInput = this._register(new Emitter()); public readonly onInput: Event = this._onInput.event; private readonly _onResize: Emitter<{ cols: number, rows: number }> = this._register(new Emitter<{ cols: number, rows: number }>()); @@ -47,31 +49,15 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal constructor( public terminalId: number, - shellLaunchConfig: IShellLaunchConfig, - activeWorkspaceRootUri: URI | undefined, - cols: number, - rows: number, - configHelper: ITerminalConfigHelper, + private _shellLaunchConfig: IShellLaunchConfig, + private _activeWorkspaceRootUri: URI | undefined, + private _cols: number, + private _rows: number, + private _configHelper: ITerminalConfigHelper, @ITerminalService private readonly _terminalService: ITerminalService, - @IRemoteAgentService readonly remoteAgentService: IRemoteAgentService + @IRemoteAgentService private readonly _remoteAgentService: IRemoteAgentService ) { super(); - - // Request a process if needed, if this is a virtual process this step can be skipped as - // there is no real "process" and we know it's ready on the ext host already. - if (shellLaunchConfig.isExtensionTerminal) { - this._terminalService.requestStartExtensionTerminal(this, cols, rows); - } else { - remoteAgentService.getEnvironment().then(env => { - if (!env) { - throw new Error('Could not fetch environment'); - } - this._terminalService.requestSpawnExtHostProcess(this, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, configHelper.checkWorkspaceShellPermissions(env.os)); - }); - if (!hasReceivedResponse) { - setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); - } - } } public emitData(data: string): void { @@ -79,7 +65,7 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal } public emitTitle(title: string): void { - hasReceivedResponse = true; + hasReceivedResponseFromRemoteExtHost = true; this._onProcessTitleChanged.fire(title); } @@ -118,6 +104,29 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal } } + public async start(): Promise { + // Request a process if needed, if this is a virtual process this step can be skipped as + // there is no real "process" and we know it's ready on the ext host already. + if (this._shellLaunchConfig.isExtensionTerminal) { + return this._terminalService.requestStartExtensionTerminal(this, this._cols, this._rows); + } + + // Add a loading title if the extension host has not started yet as there could be a + // decent wait for the user + if (!hasReceivedResponseFromRemoteExtHost) { + setTimeout(() => this._onProcessTitleChanged.fire(nls.localize('terminal.integrated.starting', "Starting...")), 0); + } + + // Fetch the environment to check shell permissions + const env = await this._remoteAgentService.getEnvironment(); + if (!env) { + // Extension host processes are only allowed in remote extension hosts currently + throw new Error('Could not fetch remote environment'); + } + + return this._terminalService.requestSpawnExtHostProcess(this, this._shellLaunchConfig, this._activeWorkspaceRootUri, this._cols, this._rows, this._configHelper.checkWorkspaceShellPermissions(env.os)); + } + public shutdown(immediate: boolean): void { this._onShutdown.fire(immediate); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index a0694b5a07..7c6cc8f133 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -6,7 +6,7 @@ import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { env as processEnv } from 'vs/base/common/process'; -import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment, ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper, ITerminalChildProcess, IBeforeProcessDataEvent, ITerminalEnvironment, ITerminalDimensions, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; @@ -45,8 +45,8 @@ enum ProcessType { * * Internal definitions: * - Process: The process launched with the terminalProcess.ts file, or the pty as a whole - * - Pty Process: The pseudoterminal master process (or the winpty agent process) - * - Shell Process: The pseudoterminal slave process (ie. the shell) + * - Pty Process: The pseudoterminal parent process (or the conpty/winpty agent process) + * - Shell Process: The pseudoterminal child process (ie. the shell) */ export class TerminalProcessManager extends Disposable implements ITerminalProcessManager { public processState: ProcessState = ProcessState.UNINITIALIZED; @@ -127,7 +127,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce cols: number, rows: number, isScreenReaderModeEnabled: boolean - ): Promise { + ): Promise { if (shellLaunchConfig.isExtensionTerminal) { this._processType = ProcessType.ExtensionTerminal; this._process = this._instantiationService.createInstance(TerminalProcessExtHostProxy, this._terminalId, shellLaunchConfig, undefined, cols, rows, this._configHelper); @@ -162,6 +162,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this._process = await this._launchProcess(shellLaunchConfig, cols, rows, this.userHome, isScreenReaderModeEnabled); } } + this.processState = ProcessState.LAUNCHING; this._process.onProcessData(data => { @@ -198,6 +199,13 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce this.processState = ProcessState.RUNNING; } }, LAUNCHING_DURATION); + + const error = await this._process.start(); + if (error) { + return error; + } + + return undefined; } private async _launchProcess( diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index b763389c3d..4acce3be1b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ITerminalNativeService, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TERMINAL_VIEW_ID, IShellLaunchConfig, ITerminalConfigHelper, ITerminalNativeService, ISpawnExtHostProcessRequest, IStartExtensionTerminalRequest, IAvailableShellsRequest, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_VISIBLE, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN, ITerminalProcessExtHostProxy, IShellDefinition, LinuxDistro, KEYBINDING_CONTEXT_TERMINAL_SHELL_TYPE, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; @@ -147,18 +147,23 @@ export class TerminalService implements ITerminalService { return activeInstance ? activeInstance : this.createTerminal(undefined); } - public async requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { + public async requestSpawnExtHostProcess(proxy: ITerminalProcessExtHostProxy, shellLaunchConfig: IShellLaunchConfig, activeWorkspaceRootUri: URI | undefined, cols: number, rows: number, isWorkspaceShellAllowed: boolean): Promise { await this._extensionService.whenInstalledExtensionsRegistered(); // Wait for the remoteAuthority to be ready (and listening for events) before firing // the event to spawn the ext host process const conn = this._remoteAgentService.getConnection(); const remoteAuthority = conn ? conn.remoteAuthority : 'null'; await this._whenExtHostReady(remoteAuthority); - this._onInstanceRequestSpawnExtHostProcess.fire({ proxy, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, isWorkspaceShellAllowed }); + return new Promise(callback => { + this._onInstanceRequestSpawnExtHostProcess.fire({ proxy, shellLaunchConfig, activeWorkspaceRootUri, cols, rows, isWorkspaceShellAllowed, callback }); + }); } - public requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): void { - this._onInstanceRequestStartExtensionTerminal.fire({ proxy, cols, rows }); + public requestStartExtensionTerminal(proxy: ITerminalProcessExtHostProxy, cols: number, rows: number): Promise { + // The initial request came from the extension host, no need to wait for it + return new Promise(callback => { + this._onInstanceRequestStartExtensionTerminal.fire({ proxy, cols, rows, callback }); + }); } public async extHostReady(remoteAuthority: string): Promise { diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts index dc55f48f4c..5f353ebc84 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/environmentVariableInfoWidget.ts @@ -6,28 +6,27 @@ import { Widget } from 'vs/base/browser/ui/widget'; import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { ITerminalWidget, IHoverTarget, IHoverAnchor, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { HoverWidget } from 'vs/workbench/contrib/terminal/browser/widgets/hoverWidget'; +import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import * as dom from 'vs/base/browser/dom'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { IHoverService, IHoverOptions } from 'vs/workbench/contrib/hover/browser/hover'; export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWidget { readonly id = 'env-var-info'; private _domNode: HTMLElement | undefined; private _container: HTMLElement | undefined; - private _hoverWidget: HoverWidget | undefined; private _mouseMoveListener: IDisposable | undefined; + private _hoverOptions: IHoverOptions | undefined; get requiresAction() { return this._info.requiresAction; } constructor( private _info: IEnvironmentVariableInfo, - @IInstantiationService private readonly _instantiationService: IInstantiationService, - @IConfigurationService private readonly _configurationService: IConfigurationService + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IHoverService private readonly _hoverService: IHoverService ) { super(); } @@ -36,9 +35,11 @@ export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWi this._container = container; this._domNode = document.createElement('div'); this._domNode.classList.add('terminal-env-var-info', 'codicon', `codicon-${this._info.getIcon()}`); + if (this.requiresAction) { + this._domNode.classList.add('requires-action'); + } container.appendChild(this._domNode); - const timeout = this._configurationService.getValue('editor.hover.delay'); const scheduler: RunOnceScheduler = new RunOnceScheduler(() => this._showHover(), timeout); this._register(scheduler); @@ -71,42 +72,21 @@ export class EnvironmentVariableInfoWidget extends Widget implements ITerminalWi } focus() { - this._showHover(); - this._hoverWidget?.focus(); + this._showHover(true); } - private _showHover() { - if (!this._domNode || !this._container || this._hoverWidget) { + private _showHover(focus?: boolean) { + if (!this._domNode || !this._container) { return; } - const target = new ElementHoverTarget(this._domNode); - const actions = this._info.getActions ? this._info.getActions() : undefined; - this._hoverWidget = this._instantiationService.createInstance(HoverWidget, this._container, target, new MarkdownString(this._info.getInfo()), () => { }, actions); - this._register(this._hoverWidget); - this._register(this._hoverWidget.onDispose(() => this._hoverWidget = undefined)); - } -} - -class ElementHoverTarget implements IHoverTarget { - readonly targetElements: readonly HTMLElement[]; - - constructor( - private _element: HTMLElement - ) { - this.targetElements = [this._element]; - } - - get anchor(): IHoverAnchor { - const position = dom.getDomNodePagePosition(this._element); - return { - x: position.left, - horizontalAnchorSide: HorizontalAnchorSide.Left, - y: document.documentElement.clientHeight - position.top - 1, - verticalAnchorSide: VerticalAnchorSide.Bottom, - fallbackY: position.top + position.height - }; - } - - dispose(): void { + if (!this._hoverOptions) { + const actions = this._info.getActions ? this._info.getActions() : undefined; + this._hoverOptions = { + target: this._domNode, + text: new MarkdownString(this._info.getInfo()), + actions + }; + } + this._hoverService.showHover(this._hoverOptions, focus); } } diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts index ebdde18852..c8c9ce241f 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/terminalHoverWidget.ts @@ -6,11 +6,12 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { Widget } from 'vs/base/browser/ui/widget'; -import { ITerminalWidget, IHoverAnchor, IHoverTarget, HorizontalAnchorSide, VerticalAnchorSide } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; -import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { HoverWidget } from 'vs/workbench/contrib/terminal/browser/widgets/hoverWidget'; +import { ITerminalWidget } from 'vs/workbench/contrib/terminal/browser/widgets/widgets'; import * as dom from 'vs/base/browser/dom'; import { IViewportRange } from 'xterm'; +import { IHoverTarget, IHoverService } from 'vs/workbench/contrib/hover/browser/hover'; +import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; +import { editorHoverHighlight } from 'vs/platform/theme/common/colorRegistry'; const $ = dom.$; @@ -28,8 +29,8 @@ export class TerminalHover extends Disposable implements ITerminalWidget { constructor( private readonly _targetOptions: ILinkHoverTargetOptions, private readonly _text: IMarkdownString, - private readonly _linkHandler: (url: string) => void, - @IInstantiationService private readonly _instantiationService: IInstantiationService + private readonly _linkHandler: (url: string) => any, + @IHoverService private readonly _hoverService: IHoverService ) { super(); } @@ -40,92 +41,91 @@ export class TerminalHover extends Disposable implements ITerminalWidget { attach(container: HTMLElement): void { const target = new CellHoverTarget(container, this._targetOptions); - this._register(this._instantiationService.createInstance(HoverWidget, container, target, this._text, this._linkHandler, [])); + this._hoverService.showHover({ + target, + text: this._text, + linkHandler: this._linkHandler, + // .xterm-hover lets xterm know that the hover is part of a link + additionalClasses: ['xterm-hover'] + }); } } class CellHoverTarget extends Widget implements IHoverTarget { - private _domNode: HTMLElement; - private _isDisposed: boolean = false; + private _domNode: HTMLElement | undefined; + private readonly _targetElements: HTMLElement[] = []; - readonly targetElements: readonly HTMLElement[]; + get targetElements(): readonly HTMLElement[] { return this._targetElements; } constructor( - private readonly _container: HTMLElement, - o: ILinkHoverTargetOptions + container: HTMLElement, + private readonly _options: ILinkHoverTargetOptions ) { super(); - this._domNode = $('div.terminal-hover-targets'); - const targets: HTMLElement[] = []; - const rowCount = o.viewportRange.end.y - o.viewportRange.start.y + 1; + this._domNode = $('div.terminal-hover-targets.xterm-hover'); + const rowCount = this._options.viewportRange.end.y - this._options.viewportRange.start.y + 1; // Add top target row - const width = (o.viewportRange.end.y > o.viewportRange.start.y ? o.terminalDimensions.width - o.viewportRange.start.x : o.viewportRange.end.x - o.viewportRange.start.x + 1) * o.cellDimensions.width; + const width = (this._options.viewportRange.end.y > this._options.viewportRange.start.y ? this._options.terminalDimensions.width - this._options.viewportRange.start.x : this._options.viewportRange.end.x - this._options.viewportRange.start.x + 1) * this._options.cellDimensions.width; const topTarget = $('div.terminal-hover-target.hoverHighlight'); - topTarget.style.left = `${o.viewportRange.start.x * o.cellDimensions.width}px`; - topTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.start.y - 1) * o.cellDimensions.height}px`; + topTarget.style.left = `${this._options.viewportRange.start.x * this._options.cellDimensions.width}px`; + topTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.start.y - 1) * this._options.cellDimensions.height}px`; topTarget.style.width = `${width}px`; - topTarget.style.height = `${o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(topTarget)); + topTarget.style.height = `${this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(topTarget)); // Add middle target rows if (rowCount > 2) { const middleTarget = $('div.terminal-hover-target.hoverHighlight'); middleTarget.style.left = `0px`; - middleTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.start.y - 1 - (rowCount - 2)) * o.cellDimensions.height}px`; - middleTarget.style.width = `${o.terminalDimensions.width * o.cellDimensions.width}px`; - middleTarget.style.height = `${(rowCount - 2) * o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(middleTarget)); + middleTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.start.y - 1 - (rowCount - 2)) * this._options.cellDimensions.height}px`; + middleTarget.style.width = `${this._options.terminalDimensions.width * this._options.cellDimensions.width}px`; + middleTarget.style.height = `${(rowCount - 2) * this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(middleTarget)); } // Add bottom target row if (rowCount > 1) { const bottomTarget = $('div.terminal-hover-target.hoverHighlight'); bottomTarget.style.left = `0px`; - bottomTarget.style.bottom = `${(o.terminalDimensions.height - o.viewportRange.end.y - 1) * o.cellDimensions.height}px`; - bottomTarget.style.width = `${(o.viewportRange.end.x + 1) * o.cellDimensions.width}px`; - bottomTarget.style.height = `${o.cellDimensions.height}px`; - targets.push(this._domNode.appendChild(bottomTarget)); + bottomTarget.style.bottom = `${(this._options.terminalDimensions.height - this._options.viewportRange.end.y - 1) * this._options.cellDimensions.height}px`; + bottomTarget.style.width = `${(this._options.viewportRange.end.x + 1) * this._options.cellDimensions.width}px`; + bottomTarget.style.height = `${this._options.cellDimensions.height}px`; + this._targetElements.push(this._domNode.appendChild(bottomTarget)); } - this.targetElements = targets; - - if (o.modifierDownCallback && o.modifierUpCallback) { + if (this._options.modifierDownCallback && this._options.modifierUpCallback) { let down = false; this._register(dom.addDisposableListener(document, 'keydown', e => { if (e.ctrlKey && !down) { down = true; - o.modifierDownCallback!(); + this._options.modifierDownCallback!(); } })); this._register(dom.addDisposableListener(document, 'keyup', e => { if (!e.ctrlKey) { down = false; - o.modifierUpCallback!(); + this._options.modifierUpCallback!(); } })); } - this._container.appendChild(this._domNode); + container.appendChild(this._domNode); } dispose(): void { - if (!this._isDisposed) { - this._container.removeChild(this._domNode); - } - this._isDisposed = true; + this._domNode?.parentElement?.removeChild(this._domNode); super.dispose(); } - - get anchor(): IHoverAnchor { - const firstPosition = dom.getDomNodePagePosition(this.targetElements[0]); - return { - x: firstPosition.left, - horizontalAnchorSide: HorizontalAnchorSide.Left, - y: document.documentElement.clientHeight - firstPosition.top - 1, - verticalAnchorSide: VerticalAnchorSide.Bottom, - fallbackY: firstPosition.top + firstPosition.height - 1 - }; - } } + +registerThemingParticipant((theme, collector) => { + let editorHoverHighlightColor = theme.getColor(editorHoverHighlight); + if (editorHoverHighlightColor) { + if (editorHoverHighlightColor.isOpaque()) { + editorHoverHighlightColor = editorHoverHighlightColor.transparent(0.5); + } + collector.addRule(`.integrated-terminal .hoverHighlight { background-color: ${editorHoverHighlightColor}; }`); + } +}); diff --git a/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts b/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts index 3e8c8a3f64..e22ce44258 100644 --- a/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts +++ b/src/vs/workbench/contrib/terminal/browser/widgets/widgets.ts @@ -12,32 +12,3 @@ export interface ITerminalWidget extends IDisposable { id: string; attach(container: HTMLElement): void; } - -export enum HorizontalAnchorSide { - Left, - Right -} - -export enum VerticalAnchorSide { - Top, - Bottom -} - -export interface IHoverAnchor { - x: number; - y: number; - horizontalAnchorSide: HorizontalAnchorSide; - verticalAnchorSide: VerticalAnchorSide; - /** - * Fallback Y value to try with opposite VerticalAlignment if the hover does not fit vertically. - */ - fallbackY: number; -} - -/** - * A target for a hover which can know about domain-specific locations. - */ -export interface IHoverTarget extends IDisposable { - readonly targetElements: readonly HTMLElement[]; - readonly anchor: IHoverAnchor; -} diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariable.ts b/src/vs/workbench/contrib/terminal/common/environmentVariable.ts index 62b1ed8c36..c28e48d31b 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariable.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariable.ts @@ -61,7 +61,7 @@ export interface IMergedEnvironmentVariableCollection { * Tracks and persists environment variable collections as defined by extensions. */ export interface IEnvironmentVariableService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Gets a single collection constructed by merging all environment variable collections into diff --git a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts index 60ac0a4f4f..bdff26b311 100644 --- a/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts +++ b/src/vs/workbench/contrib/terminal/common/environmentVariableService.ts @@ -22,7 +22,7 @@ interface ISerializableExtensionEnvironmentVariableCollection { * Tracks and persists environment variable collections as defined by extensions. */ export class EnvironmentVariableService implements IEnvironmentVariableService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; collections: Map = new Map(); mergedCollection: IMergedEnvironmentVariableCollection; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index 03d3266422..238c176d8f 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -70,10 +70,6 @@ export const TERMINAL_ACTION_CATEGORY = nls.localize('terminalCategory', "Termin export const DEFAULT_LETTER_SPACING = 0; export const MINIMUM_LETTER_SPACING = -5; export const DEFAULT_LINE_HEIGHT = 1; -export const SHELL_PATH_INVALID_EXIT_CODE = -1; -export const SHELL_PATH_DIRECTORY_EXIT_CODE = -2; -export const SHELL_CWD_INVALID_EXIT_CODE = -3; -export const LEGACY_CONSOLE_MODE_EXIT_CODE = 3221225786; // microsoft/vscode#73790 export type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900'; @@ -237,7 +233,7 @@ export interface IShellLaunchConfig { * Provides access to native or electron APIs to other terminal services. */ export interface ITerminalNativeService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly linuxDistro: LinuxDistro; @@ -308,7 +304,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onEnvironmentVariableInfoChanged: Event; dispose(immediate?: boolean): void; - createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; + createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; write(data: string): void; setDimensions(cols: number, rows: number): void; @@ -364,12 +360,14 @@ export interface ISpawnExtHostProcessRequest { cols: number; rows: number; isWorkspaceShellAllowed: boolean; + callback: (error: ITerminalLaunchError | undefined) => void; } export interface IStartExtensionTerminalRequest { proxy: ITerminalProcessExtHostProxy; cols: number; rows: number; + callback: (error: ITerminalLaunchError | undefined) => void; } export interface IAvailableShellsRequest { @@ -402,6 +400,11 @@ export interface IWindowsShellHelper extends IDisposable { getShellName(): Promise; } +export interface ITerminalLaunchError { + message: string; + code?: number; +} + /** * An interface representing a raw terminal child process, this contains a subset of the * child_process.ChildProcess node.js interface. @@ -414,6 +417,14 @@ export interface ITerminalChildProcess { onProcessOverrideDimensions?: Event; onProcessResolvedShellLaunchConfig?: Event; + /** + * Starts the process. + * + * @returns undefined when the process was successfully started, otherwise an object containing + * information on what went wrong. + */ + start(): Promise; + /** * Shutdown the terminal process. * diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts index 46e2a538f5..e820617abf 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalNativeService.ts @@ -15,24 +15,29 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { registerRemoteContributions } from 'vs/workbench/contrib/terminal/electron-browser/terminalRemote'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; +import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; +import { Disposable } from 'vs/base/common/lifecycle'; -export class TerminalNativeService implements ITerminalNativeService { +export class TerminalNativeService extends Disposable implements ITerminalNativeService { public _serviceBrand: undefined; public get linuxDistro(): LinuxDistro { return linuxDistro; } - private readonly _onOpenFileRequest = new Emitter(); + private readonly _onOpenFileRequest = this._register(new Emitter()); public get onOpenFileRequest(): Event { return this._onOpenFileRequest.event; } - private readonly _onOsResume = new Emitter(); + private readonly _onOsResume = this._register(new Emitter()); public get onOsResume(): Event { return this._onOsResume.event; } constructor( @IFileService private readonly _fileService: IFileService, @IInstantiationService readonly instantiationService: IInstantiationService, - @IRemoteAgentService remoteAgentService: IRemoteAgentService + @IRemoteAgentService remoteAgentService: IRemoteAgentService, + @IElectronService electronService: IElectronService ) { + super(); + ipcRenderer.on('vscode:openFiles', (event: unknown, request: IOpenFileRequest) => this._onOpenFileRequest.fire(request)); - ipcRenderer.on('vscode:osResume', () => this._onOsResume.fire()); + this._register(electronService.onOSResume(() => this._onOsResume.fire())); const connection = remoteAgentService.getConnection(); if (connection && connection.remoteAuthority) { diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 636f1ff98f..7ab10d76b7 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -11,22 +11,27 @@ import * as fs from 'fs'; import { Event, Emitter } from 'vs/base/common/event'; import { getWindowsBuildNumber } from 'vs/workbench/contrib/terminal/node/terminal'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalChildProcess, SHELL_PATH_INVALID_EXIT_CODE, SHELL_PATH_DIRECTORY_EXIT_CODE, SHELL_CWD_INVALID_EXIT_CODE } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalChildProcess, ITerminalLaunchError } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; import { ILogService } from 'vs/platform/log/common/log'; import { stat } from 'vs/base/node/pfs'; import { findExecutable } from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { URI } from 'vs/base/common/uri'; +import { localize } from 'vs/nls'; export class TerminalProcess extends Disposable implements ITerminalChildProcess { private _exitCode: number | undefined; + private _exitMessage: string | undefined; private _closeTimeout: any; private _ptyProcess: pty.IPty | undefined; private _currentTitle: string = ''; private _processStartupComplete: Promise | undefined; private _isDisposed: boolean = false; private _titleInterval: NodeJS.Timer | null = null; - private _initialCwd: string; + private readonly _initialCwd: string; + private readonly _ptyOptions: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions; + + public get exitMessage(): string | undefined { return this._exitMessage; } private readonly _onProcessData = this._register(new Emitter()); public get onProcessData(): Event { return this._onProcessData.event; } @@ -38,7 +43,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess public get onProcessTitleChanged(): Event { return this._onProcessTitleChanged.event; } constructor( - shellLaunchConfig: IShellLaunchConfig, + private readonly _shellLaunchConfig: IShellLaunchConfig, cwd: string, cols: number, rows: number, @@ -47,73 +52,80 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess @ILogService private readonly _logService: ILogService ) { super(); - let shellName: string; + let name: string; if (os.platform() === 'win32') { - shellName = path.basename(shellLaunchConfig.executable || ''); + name = path.basename(this._shellLaunchConfig.executable || ''); } else { // Using 'xterm-256color' here helps ensure that the majority of Linux distributions will use a // color prompt as defined in the default ~/.bashrc file. - shellName = 'xterm-256color'; + name = 'xterm-256color'; } - this._initialCwd = cwd; - const useConpty = windowsEnableConpty && process.platform === 'win32' && getWindowsBuildNumber() >= 18309; - const options: pty.IPtyForkOptions | pty.IWindowsPtyForkOptions = { - name: shellName, + this._ptyOptions = { + name, cwd, env, cols, rows, useConpty, // This option will force conpty to not redraw the whole viewport on launch - conptyInheritCursor: useConpty && !!shellLaunchConfig.initialText + conptyInheritCursor: useConpty && !!_shellLaunchConfig.initialText }; - - // TODO: Pull verification out into its own function - const cwdVerification = stat(cwd).then(async stat => { - if (!stat.isDirectory()) { - return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); - } - return undefined; - }, async err => { - if (err && err.code === 'ENOENT') { - // So we can include in the error message the specified CWD - shellLaunchConfig.cwd = cwd; - return Promise.reject(SHELL_CWD_INVALID_EXIT_CODE); - } - return undefined; - }); - - const executableVerification = stat(shellLaunchConfig.executable!).then(async stat => { - if (!stat.isFile() && !stat.isSymbolicLink()) { - return Promise.reject(stat.isDirectory() ? SHELL_PATH_DIRECTORY_EXIT_CODE : SHELL_PATH_INVALID_EXIT_CODE); - } - return undefined; - }, async (err) => { - if (err && err.code === 'ENOENT') { - let cwd = shellLaunchConfig.cwd instanceof URI ? shellLaunchConfig.cwd.path : shellLaunchConfig.cwd!; - // Try to get path - const envPaths: string[] | undefined = (shellLaunchConfig.env && shellLaunchConfig.env.PATH) ? shellLaunchConfig.env.PATH.split(path.delimiter) : undefined; - const executable = await findExecutable(shellLaunchConfig.executable!, cwd, envPaths); - if (!executable) { - return Promise.reject(SHELL_PATH_INVALID_EXIT_CODE); - } - } - return undefined; - }); - - Promise.all([cwdVerification, executableVerification]).then(() => { - this.setupPtyProcess(shellLaunchConfig, options); - }).catch((exitCode: number) => { - return this._launchFailed(exitCode); - }); } - private _launchFailed(exitCode: number): void { - this._exitCode = exitCode; - this._queueProcessExit(); - this._processStartupComplete = Promise.resolve(undefined); + public async start(): Promise { + const results = await Promise.all([this._validateCwd(), this._validateExecutable()]); + const firstError = results.find(r => r !== undefined); + if (firstError) { + return firstError; + } + + try { + this.setupPtyProcess(this._shellLaunchConfig, this._ptyOptions); + return undefined; + } catch (err) { + this._logService.trace('IPty#spawn native exception', err); + return { message: `A native exception occurred during launch (${err.message})` }; + } + } + + private async _validateCwd(): Promise { + try { + const result = await stat(this._initialCwd); + if (!result.isDirectory()) { + return { message: localize('launchFail.cwdNotDirectory', "Starting directory (cwd) \"{0}\" is not a directory", this._initialCwd.toString()) }; + } + } catch (err) { + if (err?.code === 'ENOENT') { + return { message: localize('launchFail.cwdDoesNotExist', "Starting directory (cwd) \"{0}\" does not exist", this._initialCwd.toString()) }; + } + } + return undefined; + } + + private async _validateExecutable(): Promise { + const slc = this._shellLaunchConfig; + if (!slc.executable) { + throw new Error('IShellLaunchConfig.executable not set'); + } + try { + const result = await stat(slc.executable); + if (!result.isFile() && !result.isSymbolicLink()) { + return { message: localize('launchFail.executableIsNotFileOrSymlink', "Shell path \"{0}\" is not a file of a symlink", slc.executable) }; + } + } catch (err) { + if (err?.code === 'ENOENT') { + // The executable isn't an absolute path, try find it on the PATH or CWD + let cwd = slc.cwd instanceof URI ? slc.cwd.path : slc.cwd!; + const envPaths: string[] | undefined = (slc.env && slc.env.PATH) ? slc.env.PATH.split(path.delimiter) : undefined; + const executable = await findExecutable(slc.executable!, cwd, envPaths); + if (!executable) { + return { message: localize('launchFail.executableDoesNotExist', "Shell path \"{0}\" does not exist", slc.executable) }; + } + } + } + return undefined; } private setupPtyProcess(shellLaunchConfig: IShellLaunchConfig, options: pty.IPtyForkOptions): void { @@ -124,22 +136,19 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess this._processStartupComplete = new Promise(c => { this.onProcessReady(() => c()); }); - ptyProcess.on('data', data => { + ptyProcess.onData(data => { this._onProcessData.fire(data); if (this._closeTimeout) { clearTimeout(this._closeTimeout); this._queueProcessExit(); } }); - ptyProcess.on('exit', code => { - this._exitCode = code; + ptyProcess.onExit(e => { + this._exitCode = e.exitCode; this._queueProcessExit(); }); this._setupTitlePolling(ptyProcess); - // TODO: We should no longer need to delay this since pty.spawn is sync - setTimeout(() => { - this._sendProcessId(ptyProcess); - }, 500); + this._sendProcessId(ptyProcess.pid); } public dispose(): void { @@ -200,8 +209,8 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess this.dispose(); } - private _sendProcessId(ptyProcess: pty.IPty) { - this._onProcessReady.fire({ pid: ptyProcess.pid, cwd: this._initialCwd }); + private _sendProcessId(pid: number) { + this._onProcessReady.fire({ pid, cwd: this._initialCwd }); } private _sendProcessTitle(ptyProcess: pty.IPty): void { 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 index fb4a0958c4..3304ccf659 100644 --- a/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts +++ b/src/vs/workbench/contrib/terminal/test/browser/links/terminalLinkManager.test.ts @@ -37,7 +37,7 @@ class MockTerminalInstanceService implements ITerminalInstanceService { getDefaultShellAndArgs(): Promise<{ shell: string; args: string | string[] | undefined; }> { throw new Error('Method not implemented.'); } - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; getXtermConstructor(): Promise { throw new Error('Method not implemented.'); } diff --git a/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts b/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts index 74656464cd..b979d56f6f 100644 --- a/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts +++ b/src/vs/workbench/contrib/timeline/browser/timeline.contribution.ts @@ -43,19 +43,22 @@ configurationRegistry.registerConfiguration({ type: 'object', properties: { 'timeline.excludeSources': { - type: 'array', + type: [ + 'array', + 'null' + ], + default: null, description: localize('timeline.excludeSources', "An array of Timeline sources that should be excluded from the Timeline view"), - default: null }, 'timeline.pageSize': { - type: 'number', + type: ['number', 'null'], + default: null, markdownDescription: localize('timeline.pageSize', "The number of items to show in the Timeline view by default and when loading more items. Setting to `null` (the default) will automatically choose a page size based on the visible area of the Timeline view"), - default: null }, 'timeline.pageOnScroll': { type: 'boolean', + default: false, description: localize('timeline.pageOnScroll', "Experimental. Controls whether the Timeline view will load the next page of items when you scroll to the end of the list"), - default: false }, } }); diff --git a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts index 626a138ff6..e594472cd6 100644 --- a/src/vs/workbench/contrib/timeline/browser/timelinePane.ts +++ b/src/vs/workbench/contrib/timeline/browser/timelinePane.ts @@ -22,7 +22,7 @@ import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IListVirtualDelegate, IIdentityProvider, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; import { ITreeNode, ITreeRenderer, ITreeContextMenuEvent, ITreeElement } from 'vs/base/browser/ui/tree/tree'; import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/viewPaneContainer'; -import { TreeResourceNavigator, WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { ContextKeyExpr, IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; @@ -892,37 +892,31 @@ export class TimelinePane extends ViewPane { keyboardNavigationLabelProvider: new TimelineKeyboardNavigationLabelProvider(), overrideStyles: { listBackground: this.getBackgroundColor(), - } }); - const customTreeNavigator = new TreeResourceNavigator(this.tree, { openOnFocus: false, openOnSelection: false }); - this._register(customTreeNavigator); this._register(this.tree.onContextMenu(e => this.onContextMenu(this.commands, e))); this._register(this.tree.onDidChangeSelection(e => this.ensureValidItems())); - this._register( - customTreeNavigator.onDidOpenResource(e => { - if (!e.browserEvent || !this.ensureValidItems()) { - return; - } + this._register(this.tree.onDidOpen(e => { + if (!e.browserEvent || !this.ensureValidItems()) { + return; + } - const selection = this.tree.getSelection(); - const item = selection.length === 1 ? selection[0] : undefined; - // eslint-disable-next-line eqeqeq - if (item == null) { - return; - } + const item = e.element; + // eslint-disable-next-line eqeqeq + if (item == null) { + return; + } - if (isTimelineItem(item)) { - if (item.command) { - this.commandService.executeCommand(item.command.id, ...(item.command.arguments || [])); - } + if (isTimelineItem(item)) { + if (item.command) { + this.commandService.executeCommand(item.command.id, ...(item.command.arguments || [])); } - else if (isLoadMoreCommand(item)) { - this.loadMore(item); - } - }) - ); + } + else if (isLoadMoreCommand(item)) { + this.loadMore(item); + } + })); } private loadMore(item: LoadMoreCommand) { diff --git a/src/vs/workbench/contrib/timeline/common/timelineService.ts b/src/vs/workbench/contrib/timeline/common/timelineService.ts index b67c6a0eb4..85b43057e2 100644 --- a/src/vs/workbench/contrib/timeline/common/timelineService.ts +++ b/src/vs/workbench/contrib/timeline/common/timelineService.ts @@ -13,7 +13,7 @@ import { ITimelineService, TimelineChangeEvent, TimelineOptions, TimelineProvide import { IViewsService } from 'vs/workbench/common/views'; export class TimelineService implements ITimelineService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeProviders = new Emitter(); readonly onDidChangeProviders: Event = this._onDidChangeProviders.event; diff --git a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts index e42aebfb8c..332767dbc4 100644 --- a/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/browser/releaseNotesEditor.ts @@ -257,8 +257,9 @@ export class ReleaseNotesManager { } code { - font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; - font-size: 14px; + font-family: var(--vscode-editor-font-family); + font-weight: var(--vscode-editor-font-weight); + font-size: var(--vscode-editor-font-size); line-height: 19px; } diff --git a/src/vs/workbench/contrib/url/browser/trustedDomains.ts b/src/vs/workbench/contrib/url/browser/trustedDomains.ts index 20b9a47e76..8b3e4bc410 100644 --- a/src/vs/workbench/contrib/url/browser/trustedDomains.ts +++ b/src/vs/workbench/contrib/url/browser/trustedDomains.ts @@ -127,28 +127,35 @@ export async function configureOpenerTrustedDomainsHandler( return []; } +// Exported for testing. +export function extractGitHubRemotesFromGitConfig(gitConfig: string): string[] { + const domains = new Set(); + let match: RegExpExecArray | null; + + const RemoteMatcher = /^\s*url\s*=\s*(?:git@|https:\/\/)github\.com(?::|\/)(\S*)\s*$/mg; + while (match = RemoteMatcher.exec(gitConfig)) { + const repo = match[1].replace(/\.git$/, ''); + if (repo) { + domains.add(`https://github.com/${repo}/`); + } + } + return [...domains]; +} + async function getRemotes(fileService: IFileService, textFileService: ITextFileService, contextService: IWorkspaceContextService): Promise { const workspaceUris = contextService.getWorkspace().folders.map(folder => folder.uri); - const domains = await Promise.all(workspaceUris.map(async workspaceUri => { - const path = workspaceUri.path; - const uri = workspaceUri.with({ path: `${path !== '/' ? path : ''}/.git/config` }); - const exists = await fileService.exists(uri); - if (!exists) { - return []; - } - const content = (await (textFileService.read(uri, { acceptTextOnly: true }).catch(() => ({ value: '' })))).value; - const domains = new Set(); - let match: RegExpExecArray | null; - - const RemoteMatcher = /^\s*url\s*=\s*(?:git@|https:\/\/)github\.com(?::|\/)([^.]*)\.git\s*$/mg; - while (match = RemoteMatcher.exec(content)) { - const repo = match[1]; - if (repo) { - domains.add(`https://github.com/${repo}/`); + const domains = await Promise.race([ + new Promise(resolve => setTimeout(() => resolve([]), 2000)), + Promise.all(workspaceUris.map(async workspaceUri => { + const path = workspaceUri.path; + const uri = workspaceUri.with({ path: `${path !== '/' ? path : ''}/.git/config` }); + const exists = await fileService.exists(uri); + if (!exists) { + return []; } - } - return [...domains]; - })); + const gitConfig = (await (textFileService.read(uri, { acceptTextOnly: true }).catch(() => ({ value: '' })))).value; + return extractGitHubRemotesFromGitConfig(gitConfig); + }))]); const set = domains.reduce((set, list) => list.reduce((set, item) => set.add(item), set), new Set()); return [...set]; @@ -175,10 +182,13 @@ export async function readTrustedDomains(accessor: ServicesAccessor) { } } catch (err) { } - const userDomains = ((await authenticationService.getSessions('github')) ?? []) - .map(session => session.account.displayName) - .filter((v, i, a) => a.indexOf(v) === i) - .map(username => `https://github.com/${username}/`); + const userDomains = + authenticationService.isAuthenticationProviderRegistered('github') + ? ((await authenticationService.getSessions('github')) ?? []) + .map(session => session.account.displayName) + .filter((v, i, a) => a.indexOf(v) === i) + .map(username => `https://github.com/${username}/`) + : []; const workspaceDomains = await getRemotes(fileService, textFileService, workspaceContextService); diff --git a/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts b/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts index 3949932041..8f769a01e2 100644 --- a/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts +++ b/src/vs/workbench/contrib/url/browser/trustedDomainsValidator.ts @@ -157,15 +157,33 @@ function isLocalhostAuthority(authority: string) { return rLocalhost.test(authority) || r127.test(authority); } +/** + * Case-normalize some case-insinsitive URLs, such as github. + */ +function normalizeURL(url: string | URI): string { + const caseInsensitiveAuthorities = ['github.com']; + try { + const parsed = typeof url === 'string' ? URI.parse(url, true) : url; + if (caseInsensitiveAuthorities.includes(parsed.authority)) { + return parsed.with({ path: parsed.path.toLowerCase() }).toString(true); + } else { + return parsed.toString(true); + } + } catch { return url.toString(); } +} + /** * Check whether a domain like https://www.microsoft.com matches * the list of trusted domains. * * - Schemes must match - * - There's no subdomain matching. For example https://microsoft.com doesn't match https://www.microsoft.com + * - There's no subdomsain matching. For example https://microsoft.com doesn't match https://www.microsoft.com * - Star matches all subdomains. For example https://*.microsoft.com matches https://www.microsoft.com and https://foo.bar.microsoft.com */ export function isURLDomainTrusted(url: URI, trustedDomains: string[]) { + url = URI.parse(normalizeURL(url)); + trustedDomains = trustedDomains.map(normalizeURL); + if (isLocalhostAuthority(url.authority)) { return true; } diff --git a/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts b/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts index ccd57118f3..83292de0e5 100644 --- a/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts +++ b/src/vs/workbench/contrib/url/test/browser/trustedDomains.test.ts @@ -7,6 +7,7 @@ import * as assert from 'assert'; import { isURLDomainTrusted } from 'vs/workbench/contrib/url/browser/trustedDomainsValidator'; import { URI } from 'vs/base/common/uri'; +import { extractGitHubRemotesFromGitConfig } from 'vs/workbench/contrib/url/browser/trustedDomains'; function linkAllowedByRules(link: string, rules: string[]) { assert.ok(isURLDomainTrusted(URI.parse(link), rules), `Link\n${link}\n should be protected by rules\n${JSON.stringify(rules)}`); @@ -15,6 +16,28 @@ function linkNotAllowedByRules(link: string, rules: string[]) { assert.ok(!isURLDomainTrusted(URI.parse(link), rules), `Link\n${link}\n should NOT be protected by rules\n${JSON.stringify(rules)}`); } +suite('GitHub remote extraction', () => { + test('All known formats', () => { + assert.deepEqual( + extractGitHubRemotesFromGitConfig( + ` +[remote "1"] + url = git@github.com:sshgit/vscode.git +[remote "2"] + url = git@github.com:ssh/vscode +[remote "3"] + url = https://github.com/httpsgit/vscode.git +[remote "4"] + url = https://github.com/https/vscode`), + [ + 'https://github.com/sshgit/vscode/', + 'https://github.com/ssh/vscode/', + 'https://github.com/httpsgit/vscode/', + 'https://github.com/https/vscode/' + ]); + }); +}); + suite('Link protection domain matching', () => { test('simple', () => { linkNotAllowedByRules('https://x.org', []); @@ -78,4 +101,10 @@ suite('Link protection domain matching', () => { linkAllowedByRules('https://github.com', ['https://github.com/foo/bar', 'https://github.com']); }); + + test('case normalization', () => { + // https://github.com/microsoft/vscode/issues/99294 + linkAllowedByRules('https://github.com/Microsoft/vscode/issues/new', ['https://github.com/microsoft']); + linkAllowedByRules('https://github.com/microsoft/vscode/issues/new', ['https://github.com/Microsoft']); + }); }); diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts index 7fe45d94ff..801afa11f9 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService.ts @@ -3,37 +3,39 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IUserDataSyncLogService, IUserDataSyncResourceEnablementService, IUserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { Event } from 'vs/base/common/event'; import { UserDataAutoSyncService as BaseUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IHostService } from 'vs/workbench/services/host/browser/host'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { UserDataSyncTrigger } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger'; -import { IProductService } from 'vs/platform/product/common/productService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; export class UserDataAutoSyncService extends BaseUserDataAutoSyncService { constructor( - @IUserDataSyncEnablementService userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncStoreService userDataSyncStoreService: IUserDataSyncStoreService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService userDataSyncService: IUserDataSyncService, @IUserDataSyncLogService logService: IUserDataSyncLogService, - @IAuthenticationTokenService authTokenService: IAuthenticationTokenService, + @IUserDataSyncAccountService authTokenService: IUserDataSyncAccountService, @IInstantiationService instantiationService: IInstantiationService, @IHostService hostService: IHostService, @ITelemetryService telemetryService: ITelemetryService, - @IProductService productService: IProductService, - @IConfigurationService configurationService: IConfigurationService, + @IUserDataSyncMachinesService userDataSyncMachinesService: IUserDataSyncMachinesService, + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, ) { - super(userDataSyncEnablementService, userDataSyncService, logService, authTokenService, telemetryService, productService, configurationService); + super(userDataSyncStoreService, userDataSyncResourceEnablementService, userDataSyncService, logService, authTokenService, telemetryService, userDataSyncMachinesService, storageService, environmentService); this._register(Event.debounce(Event.any( Event.map(hostService.onDidChangeFocus, () => 'windowFocus'), instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync, - userDataSyncService.onDidChangeLocal, - ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerAutoSync(sources))); + ), (last, source) => last ? [...last, source] : [source], 1000)(sources => this.triggerSync(sources, true))); } } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts index 1cd40736bd..5719d157df 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.contribution.ts @@ -26,6 +26,7 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.TooManyRequests: this.notificationService.notify({ severity: Severity.Error, message: localize('too many requests', "Turned off syncing preferences on this device because it is making too many requests."), diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts index 17595f7d2b..2015d0dc1a 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts @@ -29,7 +29,7 @@ import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from 'vs/plat import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUserDataAutoSyncService, IUserDataSyncService, registerConfiguration, - SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncEnablementService, + SyncResource, SyncStatus, UserDataSyncError, UserDataSyncErrorCode, USER_DATA_SYNC_SCHEME, IUserDataSyncResourceEnablementService, SyncResourceConflicts, Conflict, getSyncResourceFromLocalPreview } from 'vs/platform/userDataSync/common/userDataSync'; import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets'; @@ -42,7 +42,7 @@ import { IActivityService, IBadge, NumberBadge, ProgressBadge } from 'vs/workben import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { fromNow } from 'vs/base/common/date'; import { IProductService } from 'vs/platform/product/common/productService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; @@ -93,10 +93,11 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private readonly conflictsSources: IContextKey; private readonly viewsEnablementContext: IContextKey; - private readonly badgeDisposable = this._register(new MutableDisposable()); + private readonly globalActivityBadgeDisposable = this._register(new MutableDisposable()); + private readonly accountBadgeDisposable = this._register(new MutableDisposable()); constructor( - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, @IContextKeyService contextKeyService: IContextKeyService, @@ -108,8 +109,8 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo @IQuickInputService private readonly quickInputService: IQuickInputService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IOutputService private readonly outputService: IOutputService, - @IAuthenticationTokenService readonly authTokenService: IAuthenticationTokenService, - @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataSyncAccountService readonly authTokenService: IUserDataSyncAccountService, + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, @ITextModelService private readonly textModelResolverService: ITextModelService, @IPreferencesService private readonly preferencesService: IPreferencesService, @ITelemetryService private readonly telemetryService: ITelemetryService, @@ -127,14 +128,18 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo if (this.userDataSyncWorkbenchService.authenticationProviders.length) { registerConfiguration(); - this.updateBadge(); + this.updateAccountBadge(); + this.updateGlobalActivityBadge(); this.onDidChangeConflicts(this.userDataSyncService.conflicts); this._register(Event.any( Event.debounce(userDataSyncService.onDidChangeStatus, () => undefined, 500), - this.userDataSyncEnablementService.onDidChangeEnablement, + this.userDataAutoSyncService.onDidChangeEnablement, this.userDataSyncWorkbenchService.onDidChangeAccountStatus - )(() => this.updateBadge())); + )(() => { + this.updateAccountBadge(); + this.updateGlobalActivityBadge(); + })); this._register(userDataSyncService.onDidChangeConflicts(() => this.onDidChangeConflicts(this.userDataSyncService.conflicts))); this._register(userDataSyncService.onSyncErrors(errors => this.onSynchronizerErrors(errors))); this._register(userDataAutoSyncService.onError(error => this.onAutoSyncError(error))); @@ -149,7 +154,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private readonly conflictsDisposables = new Map(); private onDidChangeConflicts(conflicts: SyncResourceConflicts[]) { - this.updateBadge(); + this.updateGlobalActivityBadge(); if (conflicts.length) { const conflictsSources: SyncResource[] = conflicts.map(conflict => conflict.syncResource); this.conflictsSources.set(conflictsSources.join(',')); @@ -261,7 +266,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } } - private onAutoSyncError(error: UserDataSyncError): boolean { + private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { case UserDataSyncErrorCode.TurnedOff: case UserDataSyncErrorCode.SessionExpired: @@ -272,31 +277,35 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo primary: [new Action('turn on sync', localize('turn on sync', "Turn on Preferences Sync..."), undefined, true, () => this.turnOn())] } }); - return true; + break; case UserDataSyncErrorCode.TooLarge: if (error.resource === SyncResource.Keybindings || error.resource === SyncResource.Settings) { this.disableSync(error.resource); const sourceArea = getSyncAreaLabel(error.resource); - this.notificationService.notify({ - severity: Severity.Error, - message: 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'), - actions: { - primary: [new Action('open sync file', localize('open file', "Open {0} File", sourceArea), undefined, true, - () => error.resource === SyncResource.Settings ? this.preferencesService.openGlobalSettings(true) : this.preferencesService.openGlobalKeybindingSettings(true))] - } - }); + 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')); } - return true; + break; case UserDataSyncErrorCode.Incompatible: + case UserDataSyncErrorCode.Gone: case UserDataSyncErrorCode.UpgradeRequired: - this.disableSync(); + this.userDataSyncWorkbenchService.turnoff(false); this.notificationService.notify({ severity: Severity.Error, - message: localize('error upgrade required', "Turned off sync because the current version ({0}, {1}) of {2} is not compatible with the Preferences Sync Service. Please update and turn on sync to continue syncing.", this.productService.version, this.productService.commit, this.productService.nameLong), + message: localize('error upgrade required', "Preferences sync is disabled because the current version ({0}, {1}) is not compatible with the sync service. Please update before turning on sync.", this.productService.version, this.productService.commit), }); - return true; + break; } - return false; + } + + private handleTooLargeError(resource: SyncResource, message: string): void { + this.notificationService.notify({ + severity: Severity.Error, + message, + actions: { + primary: [new Action('open sync file', localize('open file', "Open {0} File", getSyncAreaLabel(resource)), undefined, true, + () => resource === SyncResource.Settings ? this.preferencesService.openGlobalSettings(true) : this.preferencesService.openGlobalKeybindingSettings(true))] + } + }); } private readonly invalidContentErrorDisposables = new Map(); @@ -336,7 +345,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo const errorArea = getSyncAreaLabel(source); const handle = this.notificationService.notify({ severity: Severity.Error, - message: localize('errorInvalidConfiguration', "Unable to sync {0} because there are some errors/warnings in the file. Please open the file to correct errors/warnings in it.", errorArea.toLowerCase()), + message: localize('errorInvalidConfiguration', "Unable to sync {0} because the content in the file is not valid. Please open the file and correct it.", errorArea.toLowerCase()), actions: { primary: [new Action('open sync file', localize('open file', "Open {0} File", errorArea), undefined, true, () => source === SyncResource.Settings ? this.preferencesService.openGlobalSettings(true) : this.preferencesService.openGlobalKeybindingSettings(true))] @@ -349,16 +358,14 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo })); } - private async updateBadge(): Promise { - this.badgeDisposable.clear(); + private async updateGlobalActivityBadge(): Promise { + this.globalActivityBadgeDisposable.clear(); let badge: IBadge | undefined = undefined; let clazz: string | undefined; let priority: number | undefined = undefined; - if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataSyncEnablementService.isEnabled() && this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Unavailable) { - badge = new NumberBadge(1, () => localize('sign in to sync preferences', "Sign in to Sync Preferences")); - } else if (this.userDataSyncService.conflicts.length) { + if (this.userDataSyncService.conflicts.length) { badge = new NumberBadge(this.userDataSyncService.conflicts.reduce((result, syncResourceConflict) => { return result + syncResourceConflict.conflicts.length; }, 0), () => localize('has conflicts', "Preferences Sync: Conflicts Detected")); } else if (this.turningOnSync) { badge = new ProgressBadge(() => localize('turning on syncing', "Turning on Preferences Sync...")); @@ -367,7 +374,21 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } if (badge) { - this.badgeDisposable.value = this.activityService.showGlobalActivity({ badge, clazz, priority }); + this.globalActivityBadgeDisposable.value = this.activityService.showGlobalActivity({ badge, clazz, priority }); + } + } + + private async updateAccountBadge(): Promise { + this.accountBadgeDisposable.clear(); + + let badge: IBadge | undefined = undefined; + + if (this.userDataSyncService.status !== SyncStatus.Uninitialized && this.userDataAutoSyncService.isEnabled() && this.userDataSyncWorkbenchService.accountStatus === AccountStatus.Unavailable) { + badge = new NumberBadge(1, () => localize('sign in to sync preferences', "Sign in to Sync Preferences")); + } + + if (badge) { + this.accountBadgeDisposable.value = this.activityService.showAccountsActivity({ badge, clazz: undefined, priority: undefined }); } } @@ -377,7 +398,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private set turningOnSync(turningOn: boolean) { this.turningOnSyncContext.set(turningOn); - this.updateBadge(); + this.updateGlobalActivityBadge(); } private async turnOn(): Promise { @@ -398,8 +419,23 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo if (isPromiseCanceledError(e)) { return; } - if (e instanceof UserDataSyncError && this.onAutoSyncError(e)) { - return; + if (e instanceof UserDataSyncError) { + switch (e.code) { + case UserDataSyncErrorCode.TooLarge: + if (e.resource === SyncResource.Keybindings || e.resource === SyncResource.Settings) { + this.handleTooLargeError(e.resource, localize('too large while starting sync', "Preferences 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')); + return; + } + break; + case UserDataSyncErrorCode.Incompatible: + case UserDataSyncErrorCode.Gone: + case UserDataSyncErrorCode.UpgradeRequired: + this.notificationService.notify({ + severity: Severity.Error, + message: localize('error upgrade required while starting sync', "Preferences sync cannot be turned on because the current version ({0}, {1}) is not compatible with the sync service. Please update before turning on sync.", this.productService.version, this.productService.commit), + }); + return; + } } this.notificationService.error(localize('turn on failed', "Error while starting Sync: {0}", toErrorMessage(e))); } finally { @@ -450,7 +486,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo quickPick.ignoreFocusOut = true; const items = this.getConfigureSyncQuickPickItems(); quickPick.items = items; - quickPick.selectedItems = items.filter(item => this.userDataSyncEnablementService.isResourceEnabled(item.id)); + quickPick.selectedItems = items.filter(item => this.userDataSyncResourceEnablementService.isResourceEnabled(item.id)); let accepted: boolean = false; disposables.add(Event.any(quickPick.onDidAccept, quickPick.onDidCustom)(() => { accepted = true; @@ -493,10 +529,10 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo private updateConfiguration(items: ConfigureSyncQuickPickItem[], selectedItems: ReadonlyArray): void { for (const item of items) { - const wasEnabled = this.userDataSyncEnablementService.isResourceEnabled(item.id); + const wasEnabled = this.userDataSyncResourceEnablementService.isResourceEnabled(item.id); const isEnabled = !!selectedItems.filter(selected => selected.id === item.id)[0]; if (wasEnabled !== isEnabled) { - this.userDataSyncEnablementService.setResourceEnablement(item.id!, isEnabled); + this.userDataSyncResourceEnablementService.setResourceEnablement(item.id!, isEnabled); } } } @@ -513,7 +549,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo quickPick.ok = true; const items = this.getConfigureSyncQuickPickItems(); quickPick.items = items; - quickPick.selectedItems = items.filter(item => this.userDataSyncEnablementService.isResourceEnabled(item.id)); + quickPick.selectedItems = items.filter(item => this.userDataSyncResourceEnablementService.isResourceEnabled(item.id)); disposables.add(quickPick.onDidAccept(async () => { if (quickPick.selectedItems.length) { this.updateConfiguration(items, quickPick.selectedItems); @@ -543,17 +579,13 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } } - private disableSync(source?: SyncResource): void { - if (source === undefined) { - this.userDataSyncEnablementService.setEnablement(false); - } else { - switch (source) { - 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.Extensions: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.Extensions, false); - case SyncResource.GlobalState: return this.userDataSyncEnablementService.setResourceEnablement(SyncResource.GlobalState, false); - } + private disableSync(source: SyncResource): void { + switch (source) { + case SyncResource.Settings: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Settings, false); + case SyncResource.Keybindings: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Keybindings, false); + case SyncResource.Snippets: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Snippets, false); + case SyncResource.Extensions: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.Extensions, false); + case SyncResource.GlobalState: return this.userDataSyncResourceEnablementService.setResourceEnablement(SyncResource.GlobalState, false); } } @@ -606,7 +638,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } private registerActions(): void { - if (this.userDataSyncEnablementService.canToggleEnablement()) { + if (this.userDataAutoSyncService.canToggleEnablement()) { this.registerTurnOnSyncAction(); this.registerTurnOffSyncAction(); } @@ -690,7 +722,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo constructor() { super({ id: 'workbench.userData.actions.signin', - title: localize('sign in global', "Sign in to Sync Preferences(1)"), + title: localize('sign in global', "Sign in to Sync Preferences"), menu: { group: '5_sync', id: MenuId.GlobalActivity, @@ -701,7 +733,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo } async run(): Promise { try { - await that.userDataSyncWorkbenchService.pickAccount(); + await that.userDataSyncWorkbenchService.signIn(); } catch (e) { that.notificationService.error(e); } @@ -711,7 +743,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo group: '1_sync', command: { id, - title: localize('sign in accounts', "Sign in to Sync Preferences"), + title: localize('sign in accounts', "Sign in to Sync Preferences (1)"), }, when })); @@ -857,7 +889,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo items.push({ id: configureSyncCommand.id, label: configureSyncCommand.title }); items.push({ type: 'separator' }); items.push({ id: syncNowCommand.id, label: syncNowCommand.title, description: syncNowCommand.description(that.userDataSyncService) }); - if (that.userDataSyncEnablementService.canToggleEnablement()) { + if (that.userDataAutoSyncService.canToggleEnablement()) { const account = that.userDataSyncWorkbenchService.current; items.push({ id: turnOffSyncCommand.id, label: turnOffSyncCommand.title, description: account ? `${account.accountName} (${that.authenticationService.getDisplayName(account.authenticationProviderId)})` : undefined }); } @@ -909,8 +941,7 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo }); } run(accessor: ServicesAccessor): Promise { - accessor.get(ITelemetryService).publicLog2(`sync/actions/${syncNowCommand.id}`); - return that.userDataSyncService.sync(); + return that.userDataAutoSyncService.triggerSync([syncNowCommand.id], false); } })); } diff --git a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts index 7bd965db8e..e4917aa5c9 100644 --- a/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts +++ b/src/vs/workbench/contrib/userDataSync/browser/userDataSyncViews.ts @@ -9,7 +9,7 @@ import { localize } from 'vs/nls'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { TreeViewPane, TreeView } from 'vs/workbench/browser/parts/views/treeView'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle, SyncStatus, IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { ALL_SYNC_RESOURCES, SyncResource, IUserDataSyncService, ISyncResourceHandle, SyncStatus, IUserDataSyncResourceEnablementService, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { registerAction2, Action2, MenuId } from 'vs/platform/actions/common/actions'; import { ContextKeyExpr, ContextKeyEqualsExpr, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; @@ -19,7 +19,7 @@ import { fromNow } from 'vs/base/common/date'; import { pad } from 'vs/base/common/strings'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { Event } from 'vs/base/common/event'; -import { Disposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -31,9 +31,11 @@ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IAction, Action } from 'vs/base/common/actions'; -import { IUserDataSyncWorkbenchService, CONTEXT_SYNC_STATE, getSyncAreaLabel, CONTEXT_ACCOUNT_STATE, AccountStatus, CONTEXT_ENABLE_VIEWS, SHOW_SYNC_LOG_COMMAND_ID, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; +import { IUserDataSyncWorkbenchService, CONTEXT_SYNC_STATE, getSyncAreaLabel, CONTEXT_ACCOUNT_STATE, AccountStatus, CONTEXT_ENABLE_VIEWS, SHOW_SYNC_LOG_COMMAND_ID, CONFIGURE_SYNC_COMMAND_ID, ENABLE_SYNC_VIEWS_COMMAND_ID, SHOW_SYNCED_DATA_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/userDataSync/common/userDataSyncMachines'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; +import { INotificationService } from 'vs/platform/notification/common/notification'; +import { generateUuid } from 'vs/base/common/uuid'; export class UserDataSyncViewPaneContainer extends ViewPaneContainer { @@ -68,10 +70,9 @@ export class UserDataSyncDataViews extends Disposable { constructor( container: ViewContainer, @IInstantiationService private readonly instantiationService: IInstantiationService, - @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, @IContextKeyService private readonly contextKeyService: IContextKeyService, - @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, ) { super(); this.registerViews(container); @@ -96,11 +97,11 @@ export class UserDataSyncDataViews extends Disposable { const disposable = treeView.onDidChangeVisibility(visible => { if (visible && !treeView.dataProvider) { disposable.dispose(); - treeView.dataProvider = remote ? new RemoteUserDataSyncHistoryViewDataProvider(this.userDataSyncService, this.userDataSyncEnablementService, this.userDataSyncMachinesService) - : new LocalUserDataSyncHistoryViewDataProvider(this.userDataSyncService, this.userDataSyncEnablementService); + treeView.dataProvider = remote ? this.instantiationService.createInstance(RemoteUserDataSyncHistoryViewDataProvider) + : this.instantiationService.createInstance(LocalUserDataSyncHistoryViewDataProvider); } }); - this._register(Event.any(this.userDataSyncEnablementService.onDidChangeResourceEnablement, this.userDataSyncEnablementService.onDidChangeEnablement)(() => treeView.refresh())); + this._register(Event.any(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, this.userDataAutoSyncService.onDidChangeEnablement)(() => treeView.refresh())); const viewsRegistry = Registry.as(Extensions.ViewsRegistry); viewsRegistry.registerViews([{ id, @@ -117,7 +118,7 @@ export class UserDataSyncDataViews extends Disposable { registerAction2(class extends Action2 { constructor() { super({ - id: `workbench.actions.showSync${remote ? 'Remote' : 'Local'}DataView`, + id: remote ? SHOW_SYNCED_DATA_COMMAND_ID : 'workbench.userDataSync.actions.showLocalBackupData', title: remote ? { value: localize('workbench.action.showSyncRemoteBackup', "Show Synced Data"), original: `Show Synced Data` } : { value: localize('workbench.action.showSyncLocalBackup', "Show Local Backup"), original: `Show Local Backup` }, @@ -158,18 +159,18 @@ export class UserDataSyncDataViews extends Disposable { } private registerMachinesView(container: ViewContainer): void { - const that = this; const id = `workbench.views.sync.machines`; const name = localize('synced machines', "Synced Machines"); const treeView = this.instantiationService.createInstance(TreeView, id, name); + const dataProvider = this.instantiationService.createInstance(UserDataSyncMachinesViewDataProvider, treeView); treeView.showRefreshAction = true; const disposable = treeView.onDidChangeVisibility(visible => { if (visible && !treeView.dataProvider) { disposable.dispose(); - treeView.dataProvider = new UserDataSyncMachinesViewDataProvider(treeView, this.userDataSyncMachinesService); + treeView.dataProvider = dataProvider; } }); - this._register(Event.any(this.userDataSyncEnablementService.onDidChangeResourceEnablement, this.userDataSyncEnablementService.onDidChangeEnablement)(() => treeView.refresh())); + this._register(Event.any(this.userDataSyncResourceEnablementService.onDidChangeResourceEnablement, this.userDataAutoSyncService.onDidChangeEnablement)(() => treeView.refresh())); const viewsRegistry = Registry.as(Extensions.ViewsRegistry); viewsRegistry.registerViews([{ id, @@ -186,39 +187,42 @@ export class UserDataSyncDataViews extends Disposable { registerAction2(class extends Action2 { constructor() { super({ - id: `workbench.actions.sync.editCurrentMachineName`, - title: localize('workbench.actions.sync.editCurrentMachineName', "Edit Name"), + id: `workbench.actions.sync.editMachineName`, + title: localize('workbench.actions.sync.editMachineName', "Edit Name"), icon: Codicon.edit, menu: { id: MenuId.ViewItemContext, - when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id), ContextKeyEqualsExpr.create('viewItem', 'sync-machine')), + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id)), group: 'inline', }, }); } async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { - const quickInputService = accessor.get(IQuickInputService); - const inputBox = quickInputService.createInputBox(); - inputBox.placeholder = localize('placeholder', "Enter the name of the machine"); - inputBox.show(); - return new Promise((c, e) => { - inputBox.onDidAccept(async () => { - const name = inputBox.value; - inputBox.dispose(); - if (name) { - try { - await that.userDataSyncMachinesService.renameMachine(handle.$treeItemHandle, name); - await treeView.refresh(); - c(); - } catch (error) { - e(error); - return; - } - } - }); - }); + const changed = await dataProvider.rename(handle.$treeItemHandle); + if (changed) { + await treeView.refresh(); + } } }); + + registerAction2(class extends Action2 { + constructor() { + super({ + id: `workbench.actions.sync.turnOffSyncOnMachine`, + title: localize('workbench.actions.sync.turnOffSyncOnMachine', "Turn off Preferences Sync"), + menu: { + id: MenuId.ViewItemContext, + when: ContextKeyExpr.and(ContextKeyEqualsExpr.create('view', id), ContextKeyEqualsExpr.create('viewItem', 'sync-machine')), + }, + }); + } + async run(accessor: ServicesAccessor, handle: TreeViewItemHandleArg): Promise { + if (await dataProvider.disable(handle.$treeItemHandle)) { + await treeView.refresh(); + } + } + }); + } private registerDataViewActions(viewId: string) { @@ -244,7 +248,7 @@ export class UserDataSyncDataViews extends Disposable { constructor() { super({ id: `workbench.actions.sync.replaceCurrent`, - title: localize('workbench.actions.sync.replaceCurrent', "Download..."), + title: localize('workbench.actions.sync.replaceCurrent', "Restore"), icon: { id: 'codicon/cloud-download' }, menu: { id: MenuId.ViewItemContext, @@ -336,22 +340,29 @@ interface SyncResourceTreeItem extends ITreeItem { abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvider { constructor( - protected readonly userDataSyncService: IUserDataSyncService, - private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataSyncService protected readonly userDataSyncService: IUserDataSyncService, + @IUserDataAutoSyncService protected readonly userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataSyncResourceEnablementService private readonly userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, + @INotificationService private readonly notificationService: INotificationService, ) { } async getChildren(element?: ITreeItem): Promise { - if (!element) { - return this.getRoots(); + try { + if (!element) { + return await this.getRoots(); + } + const syncResource = ALL_SYNC_RESOURCES.filter(key => key === element.handle)[0] as SyncResource; + if (syncResource) { + return await this.getChildrenForSyncResource(syncResource); + } + if ((element).resourceHandle) { + return await this.getChildrenForSyncResourceTreeItem(element); + } + return []; + } catch (error) { + this.notificationService.error(error); + throw error; } - const syncResource = ALL_SYNC_RESOURCES.filter(key => key === element.handle)[0] as SyncResource; - if (syncResource) { - return this.getChildrenForSyncResource(syncResource); - } - if ((element).resourceHandle) { - return this.getChildrenForSyncResourceTreeItem(element); - } - return []; } protected async getRoots(): Promise { @@ -359,7 +370,7 @@ abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvi handle: resourceKey, collapsibleState: TreeItemCollapsibleState.Collapsed, label: { label: getSyncAreaLabel(resourceKey) }, - description: !this.userDataSyncEnablementService.isEnabled() || this.userDataSyncEnablementService.isResourceEnabled(resourceKey) ? undefined : localize('not syncing', "Not syncing"), + description: !this.userDataAutoSyncService.isEnabled() || this.userDataSyncResourceEnablementService.isResourceEnabled(resourceKey) ? undefined : localize('not syncing', "Not syncing"), themeIcon: FolderThemeIcon, contextValue: resourceKey })); @@ -367,19 +378,27 @@ abstract class UserDataSyncHistoryViewDataProvider implements ITreeViewDataProvi protected async getChildrenForSyncResource(syncResource: SyncResource): Promise { const refHandles = await this.getSyncResourceHandles(syncResource); - return refHandles.map(({ uri, created }) => { - const handle = JSON.stringify({ resource: uri.toString(), syncResource }); - return { - handle, - collapsibleState: TreeItemCollapsibleState.Collapsed, - label: { label: label(new Date(created)) }, - description: fromNow(created, true), - resourceUri: uri, - resource: syncResource, - resourceHandle: { uri, created }, - contextValue: `sync-resource-${syncResource}` - }; - }); + if (refHandles.length) { + return refHandles.map(({ uri, created }) => { + const handle = JSON.stringify({ resource: uri.toString(), syncResource }); + return { + handle, + collapsibleState: TreeItemCollapsibleState.Collapsed, + label: { label: label(new Date(created)) }, + description: fromNow(created, true), + resourceUri: uri, + resource: syncResource, + resourceHandle: { uri, created }, + contextValue: `sync-resource-${syncResource}` + }; + }); + } else { + return [{ + handle: generateUuid(), + collapsibleState: TreeItemCollapsibleState.None, + label: { label: localize('no data', "No Data") }, + }]; + } } protected async getChildrenForSyncResourceTreeItem(element: SyncResourceTreeItem): Promise { @@ -411,11 +430,13 @@ class RemoteUserDataSyncHistoryViewDataProvider extends UserDataSyncHistoryViewD private machinesPromise: Promise | undefined; constructor( - userDataSyncService: IUserDataSyncService, - userDataSyncEnablementService: IUserDataSyncEnablementService, - private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, + @IUserDataSyncService userDataSyncService: IUserDataSyncService, + @IUserDataAutoSyncService userDataAutoSyncService: IUserDataAutoSyncService, + @IUserDataSyncResourceEnablementService userDataSyncResourceEnablementService: IUserDataSyncResourceEnablementService, + @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, + @INotificationService notificationService: INotificationService, ) { - super(userDataSyncService, userDataSyncEnablementService); + super(userDataSyncService, userDataAutoSyncService, userDataSyncResourceEnablementService, notificationService); } async getChildren(element?: ITreeItem): Promise { @@ -455,23 +476,110 @@ class RemoteUserDataSyncHistoryViewDataProvider extends UserDataSyncHistoryViewD class UserDataSyncMachinesViewDataProvider implements ITreeViewDataProvider { + private machinesPromise: Promise | undefined; + constructor( private readonly treeView: TreeView, - private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, - ) { } + @IUserDataSyncMachinesService private readonly userDataSyncMachinesService: IUserDataSyncMachinesService, + @IQuickInputService private readonly quickInputService: IQuickInputService, + @INotificationService private readonly notificationService: INotificationService, + @IDialogService private readonly dialogService: IDialogService, + @IUserDataSyncWorkbenchService private readonly userDataSyncWorkbenchService: IUserDataSyncWorkbenchService, + ) { + } - async getChildren(): Promise { - let machines = await this.userDataSyncMachinesService.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 }) => ({ - handle: id, - collapsibleState: TreeItemCollapsibleState.None, - label: { label: name }, - description: isCurrent ? localize({ key: 'current', comment: ['Current machine'] }, "Current") : undefined, - themeIcon: Codicon.vm, - contextValue: 'sync-machine' - })); + async getChildren(element?: ITreeItem): Promise { + if (!element) { + this.machinesPromise = undefined; + } + try { + 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 }) => ({ + handle: id, + collapsibleState: TreeItemCollapsibleState.None, + label: { label: name }, + description: isCurrent ? localize({ key: 'current', comment: ['Current machine'] }, "Current") : undefined, + themeIcon: Codicon.vm, + contextValue: 'sync-machine' + })); + } catch (error) { + this.notificationService.error(error); + return []; + } + } + + private getMachines(): Promise { + if (this.machinesPromise === undefined) { + this.machinesPromise = this.userDataSyncMachinesService.getMachines(); + } + return this.machinesPromise; + } + + async disable(machineId: 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 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), + primaryButton: localize('turn off', "Turn off"), + }); + + if (!result.confirmed) { + return false; + } + + if (machine.isCurrent) { + await this.userDataSyncWorkbenchService.turnoff(false); + } else { + await this.userDataSyncMachinesService.setEnablement(machineId, false); + } + + return true; + } + + async rename(machineId: string): Promise { + const disposableStore = new DisposableStore(); + const inputBox = disposableStore.add(this.quickInputService.createInputBox()); + inputBox.placeholder = localize('placeholder', "Enter the name of the machine"); + inputBox.busy = true; + inputBox.show(); + const machines = await this.getMachines(); + const machine = machines.find(({ id }) => id === machineId); + if (!machine) { + inputBox.hide(); + disposableStore.dispose(); + throw new Error(localize('not found', "machine not found with id: {0}", machineId)); + } + inputBox.busy = false; + inputBox.value = machine.name; + const validateMachineName = (machineName: string): string | null => { + machineName = machineName.trim(); + return machineName && !machines.some(m => m.id !== machineId && m.name === machineName) ? machineName : null; + }; + disposableStore.add(inputBox.onDidChangeValue(() => + inputBox.validationMessage = validateMachineName(inputBox.value) ? '' : localize('valid message', "Machine name should be unique and not empty"))); + return new Promise((c, e) => { + disposableStore.add(inputBox.onDidAccept(async () => { + const machineName = validateMachineName(inputBox.value); + disposableStore.dispose(); + if (machineName && machineName !== machine.name) { + try { + await this.userDataSyncMachinesService.renameMachine(machineId, machineName); + c(true); + } catch (error) { + e(error); + } + } else { + c(false); + } + })); + }); } } diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts index 4591e6f20d..3964f65c5e 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService.ts @@ -5,31 +5,42 @@ import { IUserDataAutoSyncService, UserDataSyncError } from 'vs/platform/userDataSync/common/userDataSync'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { Disposable } from 'vs/base/common/lifecycle'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { Event } from 'vs/base/common/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { UserDataSyncTrigger } from 'vs/workbench/contrib/userDataSync/browser/userDataSyncTrigger'; +import { UserDataAutoSyncEnablementService } from 'vs/platform/userDataSync/common/userDataAutoSyncService'; +import { IStorageService } from 'vs/platform/storage/common/storage'; +import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -export class UserDataAutoSyncService extends Disposable implements IUserDataAutoSyncService { +export class UserDataAutoSyncService extends UserDataAutoSyncEnablementService implements IUserDataAutoSyncService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly channel: IChannel; get onError(): Event { return Event.map(this.channel.listen('onError'), e => UserDataSyncError.toUserDataSyncError(e)); } constructor( + @IStorageService storageService: IStorageService, + @IEnvironmentService environmentService: IEnvironmentService, @IInstantiationService instantiationService: IInstantiationService, - @ISharedProcessService sharedProcessService: ISharedProcessService + @ISharedProcessService sharedProcessService: ISharedProcessService, ) { - super(); + super(storageService, environmentService); this.channel = sharedProcessService.getChannel('userDataAutoSync'); - this._register(instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync(source => this.triggerAutoSync([source]))); + this._register(instantiationService.createInstance(UserDataSyncTrigger).onDidTriggerSync(source => this.triggerSync([source], true))); } - triggerAutoSync(sources: string[]): Promise { + triggerSync(sources: string[], hasToLimitSync: boolean): Promise { + return this.channel.call('triggerSync', [sources, hasToLimitSync]); + } - return this.channel.call('triggerAutoSync', [sources]); + turnOn(pullFirst: boolean): Promise { + return this.channel.call('turnOn', [pullFirst]); + } + + turnOff(everywhere: boolean): Promise { + return this.channel.call('turnOff', [everywhere]); } } diff --git a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts index dbbe1ae06a..fe1b9c4a73 100644 --- a/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts +++ b/src/vs/workbench/contrib/userDataSync/electron-browser/userDataSync.contribution.ts @@ -47,6 +47,7 @@ class UserDataSyncReportIssueContribution extends Disposable implements IWorkben private onAutoSyncError(error: UserDataSyncError): void { switch (error.code) { case UserDataSyncErrorCode.LocalTooManyRequests: + case UserDataSyncErrorCode.TooManyRequests: this.notificationService.notify({ severity: Severity.Error, message: localize('too many requests', "Turned off syncing preferences on this device because it is making too many requests. Please report an issue by providing the sync logs."), diff --git a/src/vs/workbench/contrib/watermark/browser/watermark.ts b/src/vs/workbench/contrib/watermark/browser/watermark.ts index 24b6bb13da..152678226e 100644 --- a/src/vs/workbench/contrib/watermark/browser/watermark.ts +++ b/src/vs/workbench/contrib/watermark/browser/watermark.ts @@ -15,7 +15,6 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { GlobalNewUntitledFileAction } from 'vs/workbench/contrib/files/browser/fileActions'; // import { OpenFolderAction, OpenFileFolderAction, OpenFileAction } from 'vs/workbench/browser/actions/workspaceActions'; // import { ShowAllCommandsAction } from 'vs/workbench/contrib/quickaccess/browser/commandsQuickAccess'; import { Parts, IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; @@ -27,6 +26,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { assertIsDefined } from 'vs/base/common/types'; import { workbenchConfigurationNodeBase } from 'vs/workbench/common/configuration'; +import { NEW_UNTITLED_FILE_COMMAND_ID } from 'vs/workbench/contrib/files/browser/fileCommands'; // {{SQL CARBON EDIT}} import { NewNotebookAction } from 'sql/workbench/contrib/notebook/browser/notebookActions'; @@ -42,7 +42,7 @@ interface WatermarkEntry { // {{SQL CARBON EDIT}} const showServers: WatermarkEntry = { text: nls.localize('watermark.showServers', "Show Servers"), id: OpenDataExplorerViewletAction.ID }; -const newSqlFile: WatermarkEntry = { text: nls.localize('watermark.newSqlFile', "New SQL File"), id: GlobalNewUntitledFileAction.ID }; +const newSqlFile: WatermarkEntry = { text: nls.localize('watermark.newSqlFile', "New SQL File"), id: NEW_UNTITLED_FILE_COMMAND_ID }; const newNotebook: WatermarkEntry = { text: nls.localize('watermark.newNotebook', "New Notebook"), id: NewNotebookAction.ID }; /*const showCommands: WatermarkEntry = { text: nls.localize('watermark.showCommands', "Show All Commands"), id: ShowAllCommandsAction.ID }; @@ -51,7 +51,7 @@ const openFileNonMacOnly: WatermarkEntry = { text: nls.localize('watermark.openF const openFolderNonMacOnly: WatermarkEntry = { text: nls.localize('watermark.openFolder', "Open Folder"), id: OpenFolderAction.ID, mac: false }; const openFileOrFolderMacOnly: WatermarkEntry = { text: nls.localize('watermark.openFileFolder', "Open File or Folder"), id: OpenFileFolderAction.ID, mac: true }; const openRecent: WatermarkEntry = { text: nls.localize('watermark.openRecent', "Open Recent"), id: 'workbench.action.openRecent' }; -const newUntitledFile: WatermarkEntry = { text: nls.localize('watermark.newUntitledFile', "New Untitled File"), id: GlobalNewUntitledFileAction.ID }; +const newUntitledFile: WatermarkEntry = { text: nls.localize('watermark.newUntitledFile', "New Untitled File"), id: NEW_UNTITLED_FILE_COMMAND_ID }; const newUntitledFileMacOnly: WatermarkEntry = assign({ mac: true }, newUntitledFile); const toggleTerminal: WatermarkEntry = { text: nls.localize({ key: 'watermark.toggleTerminal', comment: ['toggle is a verb here'] }, "Toggle Terminal"), id: TERMINAL_COMMAND_ID.TOGGLE };*/ const findInFiles: WatermarkEntry = { text: nls.localize('watermark.findInFiles', "Find in Files"), id: FindInFilesActionId }; diff --git a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts index 9054a04792..18f3791c1f 100644 --- a/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/baseWebviewElement.ts @@ -13,8 +13,9 @@ import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; import { areWebviewInputOptionsEqual } from 'vs/workbench/contrib/webview/browser/webviewWorkbenchService'; -import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; +import { ILogService } from 'vs/platform/log/common/log'; export const enum WebviewMessageChannels { onmessage = 'onmessage', @@ -48,6 +49,22 @@ interface WebviewContent { readonly state: string | undefined; } +namespace WebviewState { + export const enum Type { Initializing, Ready } + + export class Initializing { + readonly type = Type.Initializing; + + constructor( + public readonly pendingMessages: Array<{ readonly channel: string, readonly data?: any }> + ) { } + } + + export const Ready = { type: Type.Ready } as const; + + export type State = typeof Ready | Initializing; +} + export abstract class BaseWebview extends Disposable { private _element: T | undefined; @@ -56,11 +73,10 @@ export abstract class BaseWebview extends Disposable { private _focused: boolean | undefined; protected get focused(): boolean { return !!this._focused; } - private readonly _ready: Promise; + private _state: WebviewState.State = new WebviewState.Initializing([]); protected content: WebviewContent; - constructor( // TODO: matb, this should not be protected. The only reason it needs to be is that the base class ends up using it in the call to createElement protected readonly id: string, @@ -68,6 +84,7 @@ export abstract class BaseWebview extends Disposable { contentOptions: WebviewContentOptions, public readonly extension: WebviewExtensionDescription | undefined, private readonly webviewThemeDataProvider: WebviewThemeDataProvider, + @ILogService private readonly _logService: ILogService, @ITelemetryService private readonly _telemetryService: ITelemetryService, @IEnvironmentService private readonly _environementService: IEnvironmentService, @IWorkbenchEnvironmentService protected readonly workbenchEnvironmentService: IWorkbenchEnvironmentService, @@ -82,15 +99,20 @@ export abstract class BaseWebview extends Disposable { this._element = this.createElement(options, contentOptions); - this._ready = new Promise(resolve => { - const subscription = this._register(this.on(WebviewMessageChannels.webviewReady, () => { - if (this.element) { - addClass(this.element, 'ready'); - } - subscription.dispose(); - resolve(); - })); - }); + const subscription = this._register(this.on(WebviewMessageChannels.webviewReady, () => { + this._logService.debug(`Webview(${this.id}): webview ready`); + + if (this.element) { + addClass(this.element, 'ready'); + } + + if (this._state.type === WebviewState.Type.Initializing) { + this._state.pendingMessages.forEach(({ channel, data }) => this.doPostMessage(channel, data)); + } + this._state = WebviewState.Ready; + + subscription.dispose(); + })); this._register(this.on('no-csp-found', () => { this.handleNoCspFound(); @@ -176,14 +198,16 @@ export abstract class BaseWebview extends Disposable { private readonly _onDidBlur = this._register(new Emitter()); public readonly onDidBlur = this._onDidBlur.event; - public sendMessage(data: any): void { + public postMessage(data: any): void { this._send('message', data); } protected _send(channel: string, data?: any): void { - this._ready - .then(() => this.postMessage(channel, data)) - .catch(err => console.error(err)); + if (this._state.type === WebviewState.Type.Initializing) { + this._state.pendingMessages.push({ channel, data }); + } else { + this.doPostMessage(channel, data); + } } protected abstract readonly extraContentOptions: { readonly [key: string]: string }; @@ -192,7 +216,7 @@ export abstract class BaseWebview extends Disposable { protected abstract on(channel: string, handler: (data: T) => void): IDisposable; - protected abstract postMessage(channel: string, data?: any): void; + protected abstract doPostMessage(channel: string, data?: any): void; private _hasAlertedAboutMissingCsp = false; private handleNoCspFound(): void { @@ -220,7 +244,8 @@ export abstract class BaseWebview extends Disposable { } public reload(): void { - this.doUpdateContent(); + this.doUpdateContent(this.content); + const subscription = this._register(this.on(WebviewMessageChannels.didLoad, () => { this._onDidReload.fire(); subscription.dispose(); @@ -228,25 +253,26 @@ export abstract class BaseWebview extends Disposable { } public set html(value: string) { - this.content = { + this.doUpdateContent({ html: value, options: this.content.options, state: this.content.state, - }; - this.doUpdateContent(); + }); } public set contentOptions(options: WebviewContentOptions) { + this._logService.debug(`Webview(${this.id}): will update content options`); + if (areWebviewInputOptionsEqual(options, this.content.options)) { + this._logService.debug(`Webview(${this.id}): skipping content options update`); return; } - this.content = { + this.doUpdateContent({ html: this.content.html, options: options, state: this.content.state, - }; - this.doUpdateContent(); + }); } public set localResourcesRoot(resources: URI[]) { @@ -265,7 +291,11 @@ export abstract class BaseWebview extends Disposable { this._send('initial-scroll-position', value); } - private doUpdateContent() { + private doUpdateContent(newContent: WebviewContent) { + this._logService.debug(`Webview(${this.id}): will update content`); + + this.content = newContent; + this._send('content', { contents: this.content.html, options: this.content.options, diff --git a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts index 4bdd8f4f1d..d25167da1f 100644 --- a/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts +++ b/src/vs/workbench/contrib/webview/browser/dynamicWebviewEditorOverlay.ts @@ -113,7 +113,11 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv const webview = this._webviewService.createWebviewElement(this.id, this._options, this._contentOptions, this.extension); this._webview.value = webview; webview.state = this._state; - webview.html = this._html; + + if (this._html) { + webview.html = this._html; + } + if (this._options.tryRestoreScrollPosition) { webview.initialScrollProgress = this._initialScrollProgress; } @@ -142,7 +146,7 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv this._onDidUpdateState.fire(state); })); - this._pendingMessages.forEach(msg => webview.sendMessage(msg)); + this._pendingMessages.forEach(msg => webview.postMessage(msg)); this._pendingMessages.clear(); } this.container.style.visibility = 'visible'; @@ -203,9 +207,9 @@ export class DynamicWebviewEditorOverlay extends Disposable implements WebviewOv private readonly _onMissingCsp = this._register(new Emitter()); public readonly onMissingCsp: Event = this._onMissingCsp.event; - sendMessage(data: any): void { + postMessage(data: any): void { if (this._webview.value) { - this._webview.value.sendMessage(data); + this._webview.value.postMessage(data); } else { this._pendingMessages.add(data); } diff --git a/src/vs/workbench/contrib/webview/browser/pre/host.js b/src/vs/workbench/contrib/webview/browser/pre/host.js index 6d315d6b20..341733dcec 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/host.js +++ b/src/vs/workbench/contrib/webview/browser/pre/host.js @@ -90,7 +90,7 @@ } } - window.createWebviewManager({ + (/** @type {any} */ (window)).createWebviewManager({ postMessage: hostMessaging.postMessage.bind(hostMessaging), onMessage: hostMessaging.onMessage.bind(hostMessaging), ready: workerReady, diff --git a/src/vs/workbench/contrib/webview/browser/pre/main.js b/src/vs/workbench/contrib/webview/browser/pre/main.js index 2e1730ebed..c87970aa63 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/main.js +++ b/src/vs/workbench/contrib/webview/browser/pre/main.js @@ -11,7 +11,7 @@ * focusIframeOnCreate?: boolean, * ready?: Promise, * onIframeLoaded?: (iframe: HTMLIFrameElement) => void, - * fakeLoad: boolean, + * fakeLoad?: boolean, * rewriteCSP: (existingCSP: string, endpoint?: string) => string, * }} WebviewHost */ @@ -605,6 +605,6 @@ if (typeof module !== 'undefined') { module.exports = createWebviewManager; } else { - window.createWebviewManager = createWebviewManager; + (/** @type {any} */ (window)).createWebviewManager = createWebviewManager; } }()); diff --git a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js index 4bb23b031a..4026f46916 100644 --- a/src/vs/workbench/contrib/webview/browser/pre/service-worker.js +++ b/src/vs/workbench/contrib/webview/browser/pre/service-worker.js @@ -2,6 +2,8 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +/// + const VERSION = 1; const rootPath = self.location.pathname.replace(/\/service-worker.js$/, ''); @@ -273,4 +275,4 @@ async function getOuterIframeClient(webviewId) { const clientUrl = new URL(client.url); return (clientUrl.pathname === `${rootPath}/` || clientUrl.pathname === `${rootPath}/index.html`) && clientUrl.search.match(new RegExp('\\bid=' + webviewId)); }); -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/webview/common/themeing.ts b/src/vs/workbench/contrib/webview/browser/themeing.ts similarity index 96% rename from src/vs/workbench/contrib/webview/common/themeing.ts rename to src/vs/workbench/contrib/webview/browser/themeing.ts index 21878611c3..8edc3f5dab 100644 --- a/src/vs/workbench/contrib/webview/common/themeing.ts +++ b/src/vs/workbench/contrib/webview/browser/themeing.ts @@ -10,6 +10,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; import { DARK, IColorTheme, IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; import { Emitter } from 'vs/base/common/event'; +import { DEFAULT_FONT_FAMILY } from 'vs/workbench/browser/style'; interface WebviewThemeData { readonly activeTheme: string; @@ -64,7 +65,7 @@ export class WebviewThemeDataProvider extends Disposable { }, {} as { [key: string]: string; }); const styles = { - 'vscode-font-family': 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif', + 'vscode-font-family': DEFAULT_FONT_FAMILY, 'vscode-font-weight': 'normal', 'vscode-font-size': '13px', 'vscode-editor-font-family': editorFontFamily, diff --git a/src/vs/workbench/contrib/webview/browser/webview.ts b/src/vs/workbench/contrib/webview/browser/webview.ts index 0318cd2a4b..5f3d58f580 100644 --- a/src/vs/workbench/contrib/webview/browser/webview.ts +++ b/src/vs/workbench/contrib/webview/browser/webview.ts @@ -34,7 +34,7 @@ export interface WebviewIcons { * Handles the creation of webview elements. */ export interface IWebviewService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createWebviewElement( id: string, @@ -96,7 +96,7 @@ export interface Webview extends IDisposable { readonly onMessage: Event; readonly onMissingCsp: Event; - sendMessage(data: any): void; + postMessage(data: any): void; focus(): void; reload(): void; diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts index 5f062b6ee0..cbc9f7941b 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditorInput.ts @@ -99,10 +99,6 @@ export class WebviewInput extends EditorInput { this._group = group; } - public async resolve(): Promise { - return null; - } - public supportsSplitEditor() { return false; } diff --git a/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory.ts b/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory.ts index 33a37f6267..276f3c0041 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewEditorInputFactory.ts @@ -126,6 +126,8 @@ function reviveIconPath(data: SerializedIconPath | undefined) { return light && dark ? { light, dark } : undefined; } +function reviveUri(data: string | UriComponents): URI; +function reviveUri(data: string | UriComponents | undefined): URI | undefined; function reviveUri(data: string | UriComponents | undefined): URI | undefined { if (!data) { return undefined; @@ -148,6 +150,6 @@ function reviveState(state: unknown | undefined): undefined | string { function reviveOptions(options: WebviewInputOptions): WebviewInputOptions { return { ...options, - localResourceRoots: options.localResourceRoots?.map(components => URI.from(components)), + localResourceRoots: options.localResourceRoots?.map(uri => reviveUri(uri)), }; } diff --git a/src/vs/workbench/contrib/webview/browser/webviewElement.ts b/src/vs/workbench/contrib/webview/browser/webviewElement.ts index cf12b9bf7e..196c782aa3 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewElement.ts @@ -5,19 +5,21 @@ import { addDisposableListener } from 'vs/base/browser/dom'; import { IDisposable } from 'vs/base/common/lifecycle'; +import { isWeb } from 'vs/base/common/platform'; 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 { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { loadLocalResource, WebviewResourceResponse } from 'vs/platform/webview/common/resourceLoader'; +import { WebviewPortMappingManager } from 'vs/platform/webview/common/webviewPortMapping'; import { BaseWebview, WebviewMessageChannels } from 'vs/workbench/contrib/webview/browser/baseWebviewElement'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; -import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; -import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { isWeb } from 'vs/base/common/platform'; export class IFrameWebview extends BaseWebview implements Webview { private readonly _portMappingManager: WebviewPortMappingManager; @@ -32,17 +34,19 @@ export class IFrameWebview extends BaseWebview implements Web @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly _configurationService: IConfigurationService, @ITelemetryService telemetryService: ITelemetryService, - @IEnvironmentService environementService: IEnvironmentService, - @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IEnvironmentService environmentService: IEnvironmentService, + @IWorkbenchEnvironmentService private readonly _workbenchEnvironmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @ILogService logService: ILogService, ) { - super(id, options, contentOptions, extension, webviewThemeDataProvider, telemetryService, environementService, workbenchEnvironmentService); + super(id, options, contentOptions, extension, webviewThemeDataProvider, logService, telemetryService, environmentService, _workbenchEnvironmentService); - if (!this.useExternalEndpoint && (!workbenchEnvironmentService.options || typeof workbenchEnvironmentService.webviewExternalEndpoint !== 'string')) { + if (!this.useExternalEndpoint && (!_workbenchEnvironmentService.options || typeof _workbenchEnvironmentService.webviewExternalEndpoint !== 'string')) { throw new Error('To use iframe based webviews, you must configure `environmentService.webviewExternalEndpoint`'); } this._portMappingManager = this._register(new WebviewPortMappingManager( - () => this.extension ? this.extension.location : undefined, + () => this.extension?.location, () => this.content.options.portMapping || [], tunnelService )); @@ -57,13 +61,16 @@ export class IFrameWebview extends BaseWebview implements Web this._register(this.on(WebviewMessageChannels.loadLocalhost, (entry: any) => { this.localLocalhost(entry.origin); })); + + this.element!.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.id}`); } - protected createElement(options: WebviewOptions, contentOptions: WebviewContentOptions) { + protected createElement(options: WebviewOptions, _contentOptions: WebviewContentOptions) { + // Do not start loading the webview yet. + // Wait the end of the ctor when all listeners have been hooked up. const element = document.createElement('iframe'); element.className = `webview ${options.customClasses || ''}`; element.sandbox.add('allow-scripts', 'allow-same-origin', 'allow-forms'); - element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.id}`); element.style.border = 'none'; element.style.width = '100%'; element.style.height = '100%'; @@ -156,14 +163,16 @@ export class IFrameWebview extends BaseWebview implements Web } private async localLocalhost(origin: string) { - const redirect = await this._portMappingManager.getRedirect(origin); + const authority = this._workbenchEnvironmentService.configuration.remoteAuthority; + const resolveAuthority = authority ? await this._remoteAuthorityResolverService.resolveAuthority(authority) : undefined; + const redirect = resolveAuthority ? await this._portMappingManager.getRedirect(resolveAuthority.authority, origin) : undefined; return this._send('did-load-localhost', { origin, location: redirect }); } - protected postMessage(channel: string, data?: any): void { + protected doPostMessage(channel: string, data?: any): void { if (this.element) { this.element.contentWindow!.postMessage({ channel, args: data }, '*'); } diff --git a/src/vs/workbench/contrib/webview/browser/webviewService.ts b/src/vs/workbench/contrib/webview/browser/webviewService.ts index 417aaf206a..ce4b148b42 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewService.ts @@ -7,12 +7,12 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IWebviewService, WebviewContentOptions, WebviewOverlay, WebviewElement, WebviewIcons, WebviewOptions, WebviewExtensionDescription } from 'vs/workbench/contrib/webview/browser/webview'; import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement'; -import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { DynamicWebviewEditorOverlay } from './dynamicWebviewEditorOverlay'; import { WebviewIconManager } from './webviewIconManager'; export class WebviewService implements IWebviewService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _webviewThemeDataProvider: WebviewThemeDataProvider; private readonly _iconManager: WebviewIconManager; diff --git a/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService.ts b/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService.ts index d32f57d181..19c0c3491d 100644 --- a/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService.ts +++ b/src/vs/workbench/contrib/webview/browser/webviewWorkbenchService.ts @@ -46,7 +46,7 @@ export function areWebviewInputOptionsEqual(a: WebviewInputOptions, b: WebviewIn } export interface IWebviewWorkbenchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createWebview( id: string, @@ -173,7 +173,7 @@ class RevivalPool { export class WebviewEditorService implements IWebviewWorkbenchService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _revivers = new Set(); private readonly _revivalPool = new RevivalPool(); diff --git a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js index aa4bbfd16f..45f1533e92 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js +++ b/src/vs/workbench/contrib/webview/electron-browser/pre/electron-index.js @@ -16,7 +16,6 @@ }; }()); - // @ts-ignore const ipcRenderer = require('electron').ipcRenderer; let isInDevelopmentMode = false; diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index cfb2875267..931f2f29bd 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FindInPageOptions, OnBeforeRequestListenerDetails, OnHeadersReceivedListenerDetails, Response, WebContents, WebviewTag } from 'electron'; +import { FindInPageOptions, WebviewTag } from 'electron'; import { addDisposableListener } from 'vs/base/browser/dom'; import { equals } from 'vs/base/common/arrays'; import { ThrottledDelayer } from 'vs/base/common/async'; @@ -17,137 +17,103 @@ import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import * as modes from 'vs/editor/common/modes'; 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 { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { webviewPartitionId } from 'vs/platform/webview/common/resourceLoader'; import { IWebviewManagerService } from 'vs/platform/webview/common/webviewManagerService'; import { BaseWebview, WebviewMessageChannels } from 'vs/workbench/contrib/webview/browser/baseWebviewElement'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { Webview, WebviewContentOptions, WebviewExtensionDescription, WebviewOptions } from 'vs/workbench/contrib/webview/browser/webview'; -import { WebviewPortMappingManager } from 'vs/workbench/contrib/webview/common/portMapping'; -import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { WebviewFindDelegate, WebviewFindWidget } from '../browser/webviewFindWidget'; -class WebviewTagHandle extends Disposable { +class WebviewResourceRequestManager extends Disposable { - private _webContents: undefined | WebContents | 'destroyed'; - - public constructor( - public readonly webview: WebviewTag, - ) { - super(); - - this._register(addDisposableListener(this.webview, 'destroyed', () => { - this._webContents = 'destroyed'; - })); - - this._register(addDisposableListener(this.webview, 'did-start-loading', once(() => { - const contents = this.webContents; - if (contents) { - this._onFirstLoad.fire(contents); - this._register(toDisposable(() => { - contents.removeAllListeners(); - })); - } - }))); - } - - private readonly _onFirstLoad = this._register(new Emitter()); - public readonly onFirstLoad = this._onFirstLoad.event; - - public get webContents(): WebContents | undefined { - if (this._webContents === 'destroyed') { - return undefined; - } - if (this._webContents) { - return this._webContents; - } - this._webContents = this.webview.getWebContents(); - return this._webContents; - } -} - -type OnBeforeRequestDelegate = (details: OnBeforeRequestListenerDetails) => Promise; -type OnHeadersReceivedDelegate = (details: OnHeadersReceivedListenerDetails) => { cancel: boolean; } | undefined; - -class WebviewSession extends Disposable { - - private readonly _onBeforeRequestDelegates: Array = []; - private readonly _onHeadersReceivedDelegates: Array = []; - - public constructor( - webviewHandle: WebviewTagHandle, - ) { - super(); - - this._register(webviewHandle.onFirstLoad(contents => { - contents.session.webRequest.onBeforeRequest(async (details, callback) => { - for (const delegate of this._onBeforeRequestDelegates) { - const result = await delegate(details); - if (typeof result !== 'undefined') { - callback(result); - return; - } - } - callback({}); - }); - - contents.session.webRequest.onHeadersReceived((details, callback) => { - for (const delegate of this._onHeadersReceivedDelegates) { - const result = delegate(details); - if (typeof result !== 'undefined') { - callback(result); - return; - } - } - callback({ cancel: false }); - }); - })); - } - - public onBeforeRequest(delegate: OnBeforeRequestDelegate) { - this._onBeforeRequestDelegates.push(delegate); - } - - public onHeadersReceived(delegate: OnHeadersReceivedDelegate) { - this._onHeadersReceivedDelegates.push(delegate); - } -} - -class WebviewProtocolProvider extends Disposable { - - private _ready?: Promise; + private readonly _webviewManagerService: IWebviewManagerService; private _localResourceRoots: ReadonlyArray; + private _portMappings: ReadonlyArray; + + private _ready?: Promise; constructor( private readonly id: string, private readonly extension: WebviewExtensionDescription | undefined, - initialLocalResourceRoots: ReadonlyArray, - private readonly _webviewManagerService: IWebviewManagerService, + webview: WebviewTag, + initialContentOptions: WebviewContentOptions, + @ILogService private readonly _logService: ILogService, + @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IMainProcessService mainProcessService: IMainProcessService, ) { super(); - this._localResourceRoots = initialLocalResourceRoots; + this._logService.debug(`WebviewResourceRequestManager(${this.id}): init`); - this._ready = _webviewManagerService.registerWebview(this.id, { - extensionLocation: this.extension?.location.toJSON(), - localResourceRoots: initialLocalResourceRoots.map(x => x.toJSON()), + this._webviewManagerService = createChannelSender(mainProcessService.getChannel('webview')); + + this._localResourceRoots = initialContentOptions.localResourceRoots || []; + this._portMappings = initialContentOptions.portMapping || []; + + const remoteAuthority = environmentService.configuration.remoteAuthority; + const remoteConnectionData = remoteAuthority ? remoteAuthorityResolverService.getConnectionData(remoteAuthority) : null; + + this._ready = new Promise(resolve => { + this._register(addDisposableListener(webview!, 'did-start-loading', once(() => { + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did-start-loading`); + + const webContentsId = webview.getWebContentsId(); + + this._webviewManagerService.registerWebview(this.id, webContentsId, { + extensionLocation: this.extension?.location.toJSON(), + localResourceRoots: this._localResourceRoots.map(x => x.toJSON()), + remoteConnectionData: remoteConnectionData, + portMappings: this._portMappings, + }).then(() => { + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did register`); + }).finally(() => resolve()); + }))); }); + if (remoteAuthority) { + this._register(remoteAuthorityResolverService.onDidChangeConnectionData(() => { + const update = this._webviewManagerService.updateWebviewMetadata(this.id, { + remoteConnectionData: remoteAuthority ? remoteAuthorityResolverService.getConnectionData(remoteAuthority) : null, + }); + this._ready = this._ready?.then(() => update); + })); + } + this._register(toDisposable(() => this._webviewManagerService.unregisterWebview(this.id))); } - public update(localResourceRoots: ReadonlyArray) { - if (equals(this._localResourceRoots, localResourceRoots, (a, b) => a.toString() === b.toString())) { + public update(options: WebviewContentOptions) { + const localResourceRoots = options.localResourceRoots || []; + const portMappings = options.portMapping || []; + + if ( + equals(this._localResourceRoots, localResourceRoots, (a, b) => a.toString() === b.toString()) + && equals(this._portMappings, portMappings, (a, b) => a.extensionHostPort === b.extensionHostPort && a.webviewPort === b.webviewPort) + ) { return; } this._localResourceRoots = localResourceRoots; + this._portMappings = portMappings; - this._ready = this._webviewManagerService.updateLocalResourceRoots(this.id, localResourceRoots.map(x => x.toJSON())); + this._logService.debug(`WebviewResourceRequestManager(${this.id}): will update`); + + const update = this._webviewManagerService.updateWebviewMetadata(this.id, { + localResourceRoots: localResourceRoots.map(x => x.toJSON()), + portMappings: portMappings, + }).then(() => { + this._logService.debug(`WebviewResourceRequestManager(${this.id}): did update`); + }); + + this._ready = this._ready?.then(() => update); } async synchronize(): Promise { @@ -155,24 +121,6 @@ class WebviewProtocolProvider extends Disposable { } } -class WebviewPortMappingProvider extends Disposable { - - constructor( - session: WebviewSession, - getExtensionLocation: () => URI | undefined, - mappings: () => ReadonlyArray, - tunnelService: ITunnelService, - ) { - super(); - const manager = this._register(new WebviewPortMappingManager(getExtensionLocation, mappings, tunnelService)); - - session.onBeforeRequest(async details => { - const redirect = await manager.getRedirect(details.url); - return redirect ? { redirectURL: redirect } : undefined; - }); - } -} - class WebviewKeyboardHandler { private readonly _webviews = new Set(); @@ -250,10 +198,9 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme private _webviewFindWidget: WebviewFindWidget | undefined; private _findStarted: boolean = false; - public readonly extension: WebviewExtensionDescription | undefined; - private readonly _protocolProvider: WebviewProtocolProvider; + private readonly _resourceRequestManager: WebviewResourceRequestManager; + private _messagePromise = Promise.resolve(); - private readonly _domReady: Promise; private readonly _focusDelayer = this._register(new ThrottledDelayer(10)); private _elementFocusImpl!: (options?: FocusOptions | undefined) => void; @@ -263,52 +210,38 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme contentOptions: WebviewContentOptions, extension: WebviewExtensionDescription | undefined, private readonly _webviewThemeDataProvider: WebviewThemeDataProvider, + @ILogService private readonly _myLogService: ILogService, @IInstantiationService instantiationService: IInstantiationService, - @IFileService fileService: IFileService, - @ITunnelService tunnelService: ITunnelService, @ITelemetryService telemetryService: ITelemetryService, - @IEnvironmentService environementService: IEnvironmentService, + @IEnvironmentService environmentService: IEnvironmentService, @IWorkbenchEnvironmentService workbenchEnvironmentService: IWorkbenchEnvironmentService, @IConfigurationService configurationService: IConfigurationService, @IMainProcessService mainProcessService: IMainProcessService, ) { - super(id, options, contentOptions, extension, _webviewThemeDataProvider, telemetryService, environementService, workbenchEnvironmentService); + super(id, options, contentOptions, extension, _webviewThemeDataProvider, _myLogService, telemetryService, environmentService, workbenchEnvironmentService); - const webviewManagerService = createChannelSender(mainProcessService.getChannel('webview')); + this._myLogService.debug(`Webview(${this.id}): init`); - const webviewAndContents = this._register(new WebviewTagHandle(this.element!)); - const session = this._register(new WebviewSession(webviewAndContents)); - - this._protocolProvider = this._register(new WebviewProtocolProvider(id, extension, this.content.options.localResourceRoots || [], webviewManagerService)); - - this._register(new WebviewPortMappingProvider( - session, - () => this.extension ? this.extension.location : undefined, - () => (this.content.options.portMapping || []), - tunnelService, - )); + this._resourceRequestManager = this._register(instantiationService.createInstance(WebviewResourceRequestManager, id, extension, this.element!, this.content.options)); this._register(addDisposableListener(this.element!, 'did-start-loading', once(() => { this._register(ElectronWebviewBasedWebview.getWebviewKeyboardHandler(configurationService, mainProcessService).add(this.element!)); }))); - this._domReady = new Promise(resolve => { - const subscription = this._register(this.on(WebviewMessageChannels.webviewReady, () => { - subscription.dispose(); - resolve(); - })); - }); - this._register(addDisposableListener(this.element!, 'console-message', function (e: { level: number; message: string; line: number; sourceId: string; }) { console.log(`[Embedded Page] ${e.message}`); })); + this._register(addDisposableListener(this.element!, 'dom-ready', () => { + this._myLogService.debug(`Webview(${this.id}): dom-ready`); + // Workaround for https://github.com/electron/electron/issues/14474 if (this.element && (this.focused || document.activeElement === this.element)) { this.element.blur(); this.element.focus(); } })); + this._register(addDisposableListener(this.element!, 'crashed', () => { console.error('embedded page crashed'); })); @@ -332,6 +265,8 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme })); this._register(this.on('did-set-content', () => { + this._myLogService.debug(`Webview(${this.id}): did-set-content`); + if (this.element) { this.element.style.flex = ''; this.element.style.width = '100%'; @@ -352,15 +287,21 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme this.styledFindWidget(); } + + this.element!.preload = require.toUrl('./pre/electron-index.js'); + this.element!.src = 'data:text/html;charset=utf-8,%3C%21DOCTYPE%20html%3E%0D%0A%3Chtml%20lang%3D%22en%22%20style%3D%22width%3A%20100%25%3B%20height%3A%20100%25%22%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3EVirtual%20Document%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%20style%3D%22margin%3A%200%3B%20overflow%3A%20hidden%3B%20width%3A%20100%25%3B%20height%3A%20100%25%22%20role%3D%22document%22%3E%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E'; } protected createElement(options: WebviewOptions) { + // Do not start loading the webview yet. + // Wait the end of the ctor when all listeners have been hooked up. const element = document.createElement('webview'); this._elementFocusImpl = element.focus.bind(element); element.focus = () => { this.doFocus(); }; + element.setAttribute('partition', webviewPartitionId); element.setAttribute('webpreferences', 'contextIsolation=yes'); element.className = `webview ${options.customClasses || ''}`; @@ -369,25 +310,28 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme element.style.height = '0'; element.style.outline = '0'; - element.preload = require.toUrl('./pre/electron-index.js'); - element.src = 'data:text/html;charset=utf-8,%3C%21DOCTYPE%20html%3E%0D%0A%3Chtml%20lang%3D%22en%22%20style%3D%22width%3A%20100%25%3B%20height%3A%20100%25%22%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3EVirtual%20Document%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%20style%3D%22margin%3A%200%3B%20overflow%3A%20hidden%3B%20width%3A%20100%25%3B%20height%3A%20100%25%22%20role%3D%22document%22%3E%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E'; - return element; } public set contentOptions(options: WebviewContentOptions) { - this._protocolProvider.update(options.localResourceRoots || []); + this._myLogService.debug(`Webview(${this.id}): will set content options`); + this._resourceRequestManager.update(options); super.contentOptions = options; } public set localResourcesRoot(resources: URI[]) { - this._protocolProvider.update(resources || []); + this._resourceRequestManager.update({ + ...this.contentOptions, + localResourceRoots: resources, + }); super.localResourcesRoot = resources; } protected readonly extraContentOptions = {}; public set html(value: string) { + this._myLogService.debug(`Webview(${this.id}): will set html`); + super.html = this.preprocessHtml(value); } @@ -417,12 +361,15 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme parent.appendChild(this.element); } - protected async postMessage(channel: string, data?: any): Promise { - await Promise.all([ - this._protocolProvider.synchronize(), - this._domReady, - ]); - this.element?.send(channel, data); + protected async doPostMessage(channel: string, data?: any): Promise { + this._myLogService.debug(`Webview(${this.id}): will post message on '${channel}'`); + + this._messagePromise = this._messagePromise + .then(() => this._resourceRequestManager.synchronize()) + .then(() => { + this._myLogService.debug(`Webview(${this.id}): did post message on '${channel}'`); + return this.element?.send(channel, data); + }); } public focus(): void { @@ -446,7 +393,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme // We end up focusing the webview after showing the quick pick, which causes // the quick pick to instantly dismiss. // - // Workarount this by debouncing the focus and making sure we are not focused on an input + // Workaround this by debouncing the focus and making sure we are not focused on an input // when we try to re-focus. this._focusDelayer.trigger(async () => { if (!this.focused || !this.element) { @@ -570,7 +517,7 @@ export class ElectronWebviewBasedWebview extends BaseWebview impleme protected on(channel: WebviewMessageChannels | string, handler: (data: T) => void): IDisposable { if (!this.element) { - return Disposable.None; + throw new Error('Cannot add event listener. No webview element found.'); } return addDisposableListener(this.element, 'ipc-message', (event) => { if (!this.element) { diff --git a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts index c754668b0c..fa4e249238 100644 --- a/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewService.ts @@ -9,11 +9,11 @@ import { DynamicWebviewEditorOverlay } from 'vs/workbench/contrib/webview/browse import { IWebviewService, WebviewContentOptions, WebviewElement, WebviewExtensionDescription, WebviewIcons, WebviewOptions, WebviewOverlay } from 'vs/workbench/contrib/webview/browser/webview'; import { IFrameWebview } from 'vs/workbench/contrib/webview/browser/webviewElement'; import { WebviewIconManager } from 'vs/workbench/contrib/webview/browser/webviewIconManager'; -import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/common/themeing'; +import { WebviewThemeDataProvider } from 'vs/workbench/contrib/webview/browser/themeing'; import { ElectronWebviewBasedWebview } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; export class ElectronWebviewService implements IWebviewService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _webviewThemeDataProvider: WebviewThemeDataProvider; private readonly _iconManager: WebviewIconManager; diff --git a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts index 65e2d865c4..2adf5fbe3d 100644 --- a/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts @@ -214,7 +214,7 @@ class WelcomeOverlay extends Disposable { } private updateProblemsKey() { - const problems = document.querySelector(`div[id="workbench.parts.statusbar"] .statusbar-item.left ${Codicon.warning.cssSelector}`); + const problems = document.querySelector(`footer[id="workbench.parts.statusbar"] .statusbar-item.left ${Codicon.warning.cssSelector}`); const key = this._overlay.querySelector('.key.problems') as HTMLElement; if (problems instanceof HTMLElement) { const target = problems.getBoundingClientRect(); diff --git a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts index c6158dbb6f..18aae9d64c 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/vs_code_welcome_page.ts @@ -50,11 +50,11 @@ export default () => `

${escape(localize('welcomePage.customize', "Customize"))}

-
-
diff --git a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts index 646ff229ee..19a653a860 100644 --- a/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/browser/walkThroughPart.ts @@ -309,7 +309,7 @@ export class WalkThroughPart extends BaseEditor { model.snippets.forEach((snippet, i) => { const model = snippet.textEditorModel; const id = `snippet-${model.uri.fragment}`; - const div = innerContent.querySelector(`#${id.replace(/\./g, '\\.')}`) as HTMLElement; + const div = innerContent.querySelector(`#${id.replace(/[\\.]/g, '\\$&')}`) as HTMLElement; const options = this.getEditorOptions(snippet.textEditorModel.getModeId()); const telemetryData = { diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 61d9b39132..9b201bdbf1 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -178,7 +178,8 @@ class DesktopMain extends Disposable { serviceCollection.set(IWorkbenchEnvironmentService, this.environmentService); // Product - serviceCollection.set(IProductService, { _serviceBrand: undefined, ...product }); + const productService: IProductService = { _serviceBrand: undefined, ...product }; + serviceCollection.set(IProductService, productService); // Log const logService = this._register(new DesktopLogService(this.configuration.windowId, mainProcessService, this.environmentService)); @@ -193,7 +194,7 @@ class DesktopMain extends Disposable { serviceCollection.set(ISignService, signService); // Remote Agent - const remoteAgentService = this._register(new RemoteAgentService(this.environmentService, remoteAuthorityResolverService, signService, logService)); + const remoteAgentService = this._register(new RemoteAgentService(this.environmentService, remoteAuthorityResolverService, signService, logService, productService)); serviceCollection.set(IRemoteAgentService, remoteAgentService); // Electron diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 133fcb9fbd..36d8fcaff7 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -34,7 +34,7 @@ import { LifecyclePhase, ILifecycleService } from 'vs/platform/lifecycle/common/ import { IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IIntegrityService } from 'vs/workbench/services/integrity/common/integrity'; import { isRootUser, isWindows, isMacintosh, isLinux } from 'vs/base/common/platform'; -import product from 'vs/platform/product/common/product'; +import { IProductService, IAppCenterConfiguration } from 'vs/platform/product/common/productService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -64,6 +64,7 @@ import { AutoSaveMode, IFilesConfigurationService } from 'vs/workbench/services/ import { Event } from 'vs/base/common/event'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { clearAllFontInfos } from 'vs/editor/browser/config/configuration'; +import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; export class NativeWindow extends Disposable { @@ -107,6 +108,8 @@ export class NativeWindow extends Disposable { @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, @IFilesConfigurationService private readonly filesConfigurationService: IFilesConfigurationService, @IStorageService private readonly storageService: IStorageService, + @IProductService private readonly productService: IProductService, + @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { super(); @@ -182,6 +185,7 @@ export class NativeWindow extends Disposable { this.notificationService.info(message); }); + // Display change events ipcRenderer.on('vscode:displayChanged', () => { clearAllFontInfos(); }); @@ -395,8 +399,8 @@ export class NativeWindow extends Disposable { // Handle open calls this.setupOpenHandlers(); - // Emit event when vscode is ready - this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.electronService.windowId)); + // Notify main side when window ready + this.lifecycleService.when(LifecyclePhase.Ready).then(() => this.electronService.notifyReady()); // Integrity warning this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure })); @@ -415,7 +419,7 @@ export class NativeWindow extends Disposable { // Show warning message (unix only) if (isAdmin && !isWindows) { - this.notificationService.warn(nls.localize('runningAsRoot', "It is not recommended to run {0} as root user.", product.nameShort)); + this.notificationService.warn(nls.localize('runningAsRoot', "It is not recommended to run {0} as root user.", this.productService.nameShort)); } }); @@ -424,8 +428,8 @@ export class NativeWindow extends Disposable { // Crash reporter (if enabled) if (!this.environmentService.disableCrashReporter && this.configurationService.getValue('telemetry.enableCrashReporter')) { - const companyName = product.crashReporter?.companyName || 'Microsoft'; - const productName = product.crashReporter?.productName || product.nameShort; + const companyName = this.productService.crashReporter?.companyName || 'Microsoft'; + const productName = this.productService.crashReporter?.productName || this.productService.nameShort; // With a provided crash reporter directory, crashes // will be stored only locally in that folder @@ -434,8 +438,8 @@ export class NativeWindow extends Disposable { } // With appCenter enabled, crashes will be uploaded - else if (product.appCenter) { - this.setupCrashReporter(companyName, productName, product.appCenter, undefined); + else if (this.productService.appCenter) { + this.setupCrashReporter(companyName, productName, this.productService.appCenter, undefined); } } } @@ -469,7 +473,8 @@ export class NativeWindow extends Disposable { if (options?.allowTunneling) { const portMappingRequest = extractLocalHostUriMetaDataForPortMapping(uri); if (portMappingRequest) { - const tunnel = await this.tunnelService.openTunnel(undefined, portMappingRequest.port); + const resolvedRemote = this.environmentService.configuration.remoteAuthority ? await this.remoteAuthorityResolverService.resolveAuthority(this.environmentService.configuration.remoteAuthority) : undefined; + const tunnel = await this.tunnelService.openTunnel(resolvedRemote?.authority, undefined, portMappingRequest.port); if (tunnel) { return { resolved: uri.with({ authority: `127.0.0.1:${tunnel.tunnelLocalPort}` }), @@ -549,9 +554,9 @@ export class NativeWindow extends Disposable { } } - private async setupCrashReporter(companyName: string, productName: string, appCenter: typeof product.appCenter, crashesDirectory: undefined): Promise; + private async setupCrashReporter(companyName: string, productName: string, appCenter: IAppCenterConfiguration, crashesDirectory: undefined): Promise; private async setupCrashReporter(companyName: string, productName: string, appCenter: undefined, crashesDirectory: string): Promise; - private async setupCrashReporter(companyName: string, productName: string, appCenter: typeof product.appCenter | undefined, crashesDirectory: string | undefined): Promise { + private async setupCrashReporter(companyName: string, productName: string, appCenter: IAppCenterConfiguration | undefined, crashesDirectory: string | undefined): Promise { let submitURL: string | undefined = undefined; if (appCenter) { submitURL = isWindows ? appCenter[process.arch === 'ia32' ? 'win32-ia32' : 'win32-x64'] : isLinux ? appCenter[`linux-x64`] : appCenter.darwin; @@ -566,8 +571,8 @@ export class NativeWindow extends Disposable { productName, submitURL: (submitURL?.concat('&uid=', crashReporterId, '&iid=', crashReporterId, '&sid=', info.sessionId)) || '', extra: { - vscode_version: product.version, - vscode_commit: product.commit || '' + vscode_version: this.productService.version, + vscode_commit: this.productService.commit || '' }, // If `crashesDirectory` is specified, we do not upload @@ -635,7 +640,7 @@ export class NativeWindow extends Disposable { private async trackClosedWaitFiles(waitMarkerFile: URI, resourcesToWaitFor: URI[]): Promise { // Wait for the resources to be closed in the editor... - await this.editorService.whenClosed(resourcesToWaitFor, { waitForSaved: true }); + await this.editorService.whenClosed(resourcesToWaitFor.map(resource => ({ resource })), { waitForSaved: true }); // ...before deleting the wait marker file await this.fileService.del(waitMarkerFile); diff --git a/src/vs/workbench/electron-sandbox/desktop.contribution.ts b/src/vs/workbench/electron-sandbox/desktop.contribution.ts index 8b69082fe3..238c7bfbaa 100644 --- a/src/vs/workbench/electron-sandbox/desktop.contribution.ts +++ b/src/vs/workbench/electron-sandbox/desktop.contribution.ts @@ -356,6 +356,13 @@ import { InstallVSIXAction } from 'vs/workbench/contrib/extensions/browser/exten 'force-color-profile': { type: 'string', markdownDescription: nls.localize('argv.forceColorProfile', 'Allows to override the color profile to use. If you experience colors appear badly, try to set this to `srgb` and restart.') + }, + 'enable-proposed-api': { + type: 'array', + description: nls.localize('argv.enebleProposedApi', "Enable proposed APIs for a list of extension ids (such as \`vscode.git\`). Proposed APIs are unstable and subject to breaking without warning at any time. This should only be set for extension development and testing purposes."), + items: { + type: 'string' + } } } }; diff --git a/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.ts b/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.ts index 6d9d3894c8..7e62ca11f1 100644 --- a/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.ts +++ b/src/vs/workbench/services/accessibility/electron-browser/accessibilityService.ts @@ -27,7 +27,7 @@ type AccessibilityMetricsClassification = { export class NativeAccessibilityService extends AccessibilityService implements IAccessibilityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private didSendTelemetry = false; @@ -81,7 +81,7 @@ class LinuxAccessibilityContribution implements IWorkbenchContribution { ) { const forceRendererAccessibility = () => { if (accessibilityService.isScreenReaderOptimized()) { - jsonEditingService.write(environmentService.argvResource, [{ key: 'force-renderer-accessibility', value: true }], true); + jsonEditingService.write(environmentService.argvResource, [{ path: ['force-renderer-accessibility'], value: true }], true); } }; forceRendererAccessibility(); diff --git a/src/vs/workbench/services/activity/common/activity.ts b/src/vs/workbench/services/activity/common/activity.ts index f56602dd76..275426336d 100644 --- a/src/vs/workbench/services/activity/common/activity.ts +++ b/src/vs/workbench/services/activity/common/activity.ts @@ -18,7 +18,7 @@ export const IActivityService = createDecorator('activityServi export interface IActivityService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Show activity for the given view container diff --git a/src/vs/workbench/services/activityBar/browser/activityBarService.ts b/src/vs/workbench/services/activityBar/browser/activityBarService.ts index 89cd1e7515..52da7294f4 100644 --- a/src/vs/workbench/services/activityBar/browser/activityBarService.ts +++ b/src/vs/workbench/services/activityBar/browser/activityBarService.ts @@ -10,7 +10,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; export const IActivityBarService = createDecorator('activityBarService'); export interface IActivityBarService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Show an activity in a viewlet. diff --git a/src/vs/workbench/services/authentication/browser/authenticationService.ts b/src/vs/workbench/services/authentication/browser/authenticationService.ts index 8f3f2fee05..5cf3eb26e5 100644 --- a/src/vs/workbench/services/authentication/browser/authenticationService.ts +++ b/src/vs/workbench/services/authentication/browser/authenticationService.ts @@ -19,7 +19,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag export const IAuthenticationService = createDecorator('IAuthenticationService'); export interface IAuthenticationService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; isAuthenticationProviderRegistered(id: string): boolean; getProviderIds(): string[]; @@ -37,6 +37,9 @@ export interface IAuthenticationService { supportsMultipleAccounts(providerId: string): boolean; login(providerId: string, scopes: string[]): Promise; logout(providerId: string, sessionId: string): Promise; + + manageTrustedExtensionsForAccount(providerId: string, accountName: string): Promise; + signOutOfAccount(providerId: string, accountName: string): Promise; } export interface AllowedExtension { @@ -66,7 +69,7 @@ export interface SessionRequestInfo { } export class AuthenticationService extends Disposable implements IAuthenticationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _placeholderMenuItem: IDisposable | undefined; private _noAccountsMenuItem: IDisposable | undefined; private _signInRequestItems = new Map(); @@ -330,6 +333,24 @@ export class AuthenticationService extends Disposable implements IAuthentication throw new Error(`No authentication provider '${id}' is currently registered.`); } } + + async manageTrustedExtensionsForAccount(id: string, accountName: string): Promise { + const authProvider = this._authenticationProviders.get(id); + if (authProvider) { + return authProvider.manageTrustedExtensions(accountName); + } else { + throw new Error(`No authentication provider '${id}' is currently registered.`); + } + } + + async signOutOfAccount(id: string, accountName: string): Promise { + const authProvider = this._authenticationProviders.get(id); + if (authProvider) { + return authProvider.signOut(accountName); + } else { + throw new Error(`No authentication provider '${id}' is currently registered.`); + } + } } registerSingleton(IAuthenticationService, AuthenticationService); diff --git a/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService.ts b/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService.ts deleted file mode 100644 index c2bf14f533..0000000000 --- a/src/vs/workbench/services/authentication/electron-browser/authenticationTokenService.ts +++ /dev/null @@ -1,45 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { Emitter, Event } from 'vs/base/common/event'; -import { IAuthenticationTokenService, IUserDataSyncAuthToken } from 'vs/platform/authentication/common/authentication'; - -export class AuthenticationTokenService extends Disposable implements IAuthenticationTokenService { - - _serviceBrand: undefined; - - private readonly channel: IChannel; - - private _token: IUserDataSyncAuthToken | undefined; - get token(): IUserDataSyncAuthToken | undefined { return this._token; } - private _onDidChangeToken = this._register(new Emitter()); - readonly onDidChangeToken = this._onDidChangeToken.event; - - private _onTokenFailed: Emitter = this._register(new Emitter()); - readonly onTokenFailed: Event = this._onTokenFailed.event; - - constructor( - @ISharedProcessService sharedProcessService: ISharedProcessService, - ) { - super(); - this.channel = sharedProcessService.getChannel('authToken'); - this._register(this.channel.listen('onTokenFailed')(_ => this.sendTokenFailed())); - } - - setToken(token: IUserDataSyncAuthToken | undefined): Promise { - this._token = token; - return this.channel.call('setToken', token); - } - - sendTokenFailed(): void { - this._onTokenFailed.fire(); - } -} - -registerSingleton(IAuthenticationTokenService, AuthenticationTokenService); diff --git a/src/vs/workbench/services/backup/common/backup.ts b/src/vs/workbench/services/backup/common/backup.ts index a829decdc2..d1288acc1b 100644 --- a/src/vs/workbench/services/backup/common/backup.ts +++ b/src/vs/workbench/services/backup/common/backup.ts @@ -19,7 +19,7 @@ export interface IResolvedBackup { */ export interface IBackupFileService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Finds out if there are any backups stored. diff --git a/src/vs/workbench/services/backup/common/backupFileService.ts b/src/vs/workbench/services/backup/common/backupFileService.ts index e354603e2a..b6e5e69dc9 100644 --- a/src/vs/workbench/services/backup/common/backupFileService.ts +++ b/src/vs/workbench/services/backup/common/backupFileService.ts @@ -109,7 +109,7 @@ export class BackupFilesModel implements IBackupFilesModel { export class BackupFileService implements IBackupFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private impl: BackupFileServiceImpl | InMemoryBackupFileService; @@ -188,7 +188,7 @@ class BackupFileServiceImpl extends Disposable implements IBackupFileService { private static readonly PREAMBLE_META_SEPARATOR = ' '; // using a character that is know to be escaped in a URI as separator private static readonly PREAMBLE_MAX_LENGTH = 10000; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private backupWorkspacePath!: URI; @@ -403,7 +403,7 @@ class BackupFileServiceImpl extends Disposable implements IBackupFileService { export class InMemoryBackupFileService implements IBackupFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private backups: Map = new Map(); diff --git a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts index eed26c32ac..0ccd031e7d 100644 --- a/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts +++ b/src/vs/workbench/services/bulkEdit/browser/bulkEditService.ts @@ -165,17 +165,11 @@ class BulkEditModel implements IDisposable { this._tasks = []; const promises: Promise[] = []; - this._edits.forEach((value, key) => { + for (let [key, value] of this._edits) { const promise = this._textModelResolverService.createModelReference(URI.parse(key)).then(async ref => { - const model = ref.object; - - if (!model || !model.textEditorModel) { - throw new Error(`Cannot load file ${key}`); - } - let task: ModelEditTask; let makeMinimal = false; - if (this._editor && this._editor.hasModel() && this._editor.getModel().uri.toString() === model.textEditorModel.uri.toString()) { + if (this._editor && this._editor.hasModel() && this._editor.getModel().uri.toString() === ref.object.textEditorModel.uri.toString()) { task = new EditorEditTask(ref, this._editor); makeMinimal = true; } else { @@ -201,7 +195,7 @@ class BulkEditModel implements IDisposable { this._progress.report(undefined); }); promises.push(promise); - }); + } await Promise.all(promises); @@ -383,7 +377,7 @@ class BulkEdit { export class BulkEditService implements IBulkEditService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _previewHandler?: IBulkEditPreviewHandler; diff --git a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts b/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts index c7096309cd..3bae716c79 100644 --- a/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts +++ b/src/vs/workbench/services/clipboard/electron-browser/clipboardService.ts @@ -14,7 +14,7 @@ export class NativeClipboardService implements IClipboardService { private static readonly FILE_FORMAT = 'code/file-list'; // Clipboard format for files - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IElectronService private readonly electronService: IElectronService @@ -78,11 +78,6 @@ export class NativeClipboardService implements IClipboardService { } } - /** @deprecated */ - readTextSync(): string { - return clipboard.readText(); - } - /** @deprecated */ readFindTextSync(): string { if (isMacintosh) { diff --git a/src/vs/workbench/services/commands/common/commandService.ts b/src/vs/workbench/services/commands/common/commandService.ts index 0b2024f284..4fbb1e469a 100644 --- a/src/vs/workbench/services/commands/common/commandService.ts +++ b/src/vs/workbench/services/commands/common/commandService.ts @@ -14,7 +14,7 @@ import { timeout } from 'vs/base/common/async'; export class CommandService extends Disposable implements ICommandService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _extensionHostIsReady: boolean = false; private _starActivation: Promise | null; diff --git a/src/vs/workbench/services/configuration/browser/configuration.ts b/src/vs/workbench/services/configuration/browser/configuration.ts index fc7603a7f1..8fc8a0d49c 100644 --- a/src/vs/workbench/services/configuration/browser/configuration.ts +++ b/src/vs/workbench/services/configuration/browser/configuration.ts @@ -437,7 +437,7 @@ export class WorkspaceConfiguration extends Disposable { setFolders(folders: IStoredWorkspaceFolder[], jsonEditingService: JSONEditingService): Promise { if (this._workspaceIdentifier) { - return jsonEditingService.write(this._workspaceIdentifier.configPath, [{ key: 'folders', value: folders }], true) + return jsonEditingService.write(this._workspaceIdentifier.configPath, [{ path: ['folders'], value: folders }], true) .then(() => this.reload()); } return Promise.resolve(); diff --git a/src/vs/workbench/services/configuration/browser/configurationService.ts b/src/vs/workbench/services/configuration/browser/configurationService.ts index 23f56a6e62..a0cd2f1583 100644 --- a/src/vs/workbench/services/configuration/browser/configurationService.ts +++ b/src/vs/workbench/services/configuration/browser/configurationService.ts @@ -503,10 +503,18 @@ export class WorkspaceService extends Disposable implements IConfigurationServic this._configuration.updateRemoteUserConfiguration(this.remoteUserConfiguration.reprocess()); } if (this.getWorkbenchState() === WorkbenchState.FOLDER) { - this._configuration.updateWorkspaceConfiguration(this.cachedFolderConfigs.get(this.workspace.folders[0].uri)!.reprocess()); + const folderConfiguration = this.cachedFolderConfigs.get(this.workspace.folders[0].uri); + if (folderConfiguration) { + this._configuration.updateWorkspaceConfiguration(folderConfiguration.reprocess()); + } } else { this._configuration.updateWorkspaceConfiguration(this.workspaceConfiguration.reprocessWorkspaceSettings()); - this.workspace.folders.forEach(folder => this._configuration.updateFolderConfiguration(folder.uri, this.cachedFolderConfigs.get(folder.uri)!.reprocess())); + for (const folder of this.workspace.folders) { + const folderConfiguration = this.cachedFolderConfigs.get(folder.uri); + if (folderConfiguration) { + this._configuration.updateFolderConfiguration(folder.uri, folderConfiguration.reprocess()); + } + } } this.triggerConfigurationChange(change, { data: previousData, workspace: this.workspace }, ConfigurationTarget.DEFAULT); } diff --git a/src/vs/workbench/services/configuration/common/jsonEditing.ts b/src/vs/workbench/services/configuration/common/jsonEditing.ts index e6994e1a35..8d57e4e572 100644 --- a/src/vs/workbench/services/configuration/common/jsonEditing.ts +++ b/src/vs/workbench/services/configuration/common/jsonEditing.ts @@ -5,6 +5,7 @@ import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { JSONPath } from 'vs/base/common/json'; export const IJSONEditingService = createDecorator('jsonEditingService'); @@ -28,13 +29,13 @@ export class JSONEditingError extends Error { } export interface IJSONValue { - key: string; + path: JSONPath; value: any; } export interface IJSONEditingService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; write(resource: URI, values: IJSONValue[], save: boolean): Promise; } diff --git a/src/vs/workbench/services/configuration/common/jsonEditingService.ts b/src/vs/workbench/services/configuration/common/jsonEditingService.ts index f7d4f2d1f5..146bf36028 100644 --- a/src/vs/workbench/services/configuration/common/jsonEditingService.ts +++ b/src/vs/workbench/services/configuration/common/jsonEditingService.ts @@ -75,10 +75,10 @@ export class JSONEditingService implements IJSONEditingService { private getEdits(model: ITextModel, configurationValue: IJSONValue): Edit[] { const { tabSize, insertSpaces } = model.getOptions(); const eol = model.getEOL(); - const { key, value } = configurationValue; + const { path, value } = configurationValue; - // Without key, the entire settings file is being replaced, so we just use JSON.stringify - if (!key) { + // With empty path the entire file is being replaced, so we just use JSON.stringify + if (!path.length) { const content = JSON.stringify(value, null, insertSpaces ? strings.repeat(' ', tabSize) : '\t'); return [{ content, @@ -87,7 +87,7 @@ export class JSONEditingService implements IJSONEditingService { }]; } - return setProperty(model.getValue(), [key], value, { tabSize, insertSpaces, eol }); + return setProperty(model.getValue(), path, value, { tabSize, insertSpaces, eol }); } private async resolveModelReference(resource: URI): Promise> { diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index eaac001e54..7e07eeeb88 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -49,6 +49,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { timeout } from 'vs/base/common/async'; import { VSBuffer } from 'vs/base/common/buffer'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import product from 'vs/platform/product/common/product'; class TestEnvironmentService extends NativeWorkbenchEnvironmentService { @@ -111,7 +112,7 @@ suite.skip('WorkspaceContextService - Folder', () => { // {{SQL CARBON EDIT}} sk const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, new DiskFileSystemProvider(new NullLogService()), environmentService, new NullLogService())); - workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService(environmentService, new RemoteAuthorityResolverService(), new SignService(undefined), new NullLogService())); + workspaceContextService = new WorkspaceService({ configurationCache: new ConfigurationCache(environmentService) }, environmentService, fileService, new RemoteAgentService(environmentService, new RemoteAuthorityResolverService(), new SignService(undefined), new NullLogService(), { _serviceBrand: undefined, ...product })); return (workspaceContextService).initialize(convertToWorkspacePayload(URI.file(folderDir))); }); }); @@ -1232,21 +1233,21 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED test('application settings are not read from workspace', () => { fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.applicationSetting": "userValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.applicationSetting': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => assert.equal(testObject.getValue('configurationService.workspace.applicationSetting'), 'userValue')); }); test('machine settings are not read from workspace', () => { fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.machineSetting": "userValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.machineSetting': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => assert.equal(testObject.getValue('configurationService.workspace.machineSetting'), 'userValue')); }); test('workspace settings override user settings after defaults are registered ', () => { fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.newSetting": "userValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.newSetting': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { configurationRegistry.registerConfiguration({ @@ -1265,7 +1266,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED test('workspace settings override user settings after defaults are registered for machine overridable settings ', () => { fs.writeFileSync(globalSettingsFile, '{ "configurationService.workspace.newMachineOverridableSetting": "userValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.newMachineOverridableSetting': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.newMachineOverridableSetting': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { configurationRegistry.registerConfiguration({ @@ -1339,7 +1340,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED test('resource setting in folder is read after it is registered later', () => { fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewResourceSetting2": "workspaceFolderValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.testNewResourceSetting2': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { configurationRegistry.registerConfiguration({ @@ -1359,7 +1360,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED test('resource language setting in folder is read after it is registered later', () => { fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewResourceLanguageSetting2": "workspaceFolderValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testNewResourceLanguageSetting2': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.testNewResourceLanguageSetting2': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { configurationRegistry.registerConfiguration({ @@ -1379,7 +1380,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED test('machine overridable setting in folder is read after it is registered later', () => { fs.writeFileSync(workspaceContextService.getWorkspace().folders[0].toResource('.vscode/settings.json').fsPath, '{ "configurationService.workspace.testNewMachineOverridableSetting2": "workspaceFolderValue" }'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testNewMachineOverridableSetting2': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.testNewMachineOverridableSetting2': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { configurationRegistry.registerConfiguration({ @@ -1422,7 +1423,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED assert.equal(actual.workspaceFolderValue, undefined); assert.equal(actual.value, 'userValue'); - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'settings', value: { 'configurationService.workspace.testResourceSetting': 'workspaceValue' } }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['settings'], value: { 'configurationService.workspace.testResourceSetting': 'workspaceValue' } }], true) .then(() => testObject.reloadConfiguration()) .then(() => { actual = testObject.inspect('configurationService.workspace.testResourceSetting'); @@ -1464,7 +1465,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED } ] }; - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'launch', value: expectedLaunchConfiguration }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['launch'], value: expectedLaunchConfiguration }], true) .then(() => testObject.reloadConfiguration()) .then(() => { const actual = testObject.getValue('launch'); @@ -1489,7 +1490,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED } ] }; - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'launch', value: expectedLaunchConfiguration }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['launch'], value: expectedLaunchConfiguration }], true) .then(() => testObject.reloadConfiguration()) .then(() => { const actual = testObject.inspect('launch').workspaceValue; @@ -1513,7 +1514,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED } ] }; - return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'tasks', value: expectedTasksConfiguration }], true) + return jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['tasks'], value: expectedTasksConfiguration }], true) .then(() => testObject.reloadConfiguration()) .then(() => { const actual = testObject.getValue('tasks'); @@ -1536,7 +1537,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED } ] }; - await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ key: 'tasks', value: expectedTasksConfiguration }], true); + await jsonEditingServce.write(workspaceContextService.getWorkspace().configuration!, [{ path: ['tasks'], value: expectedTasksConfiguration }], true); await testObject.reloadConfiguration(); const actual = testObject.inspect('tasks').workspaceValue; assert.deepEqual(actual, expectedTasksConfiguration); @@ -1660,7 +1661,7 @@ suite.skip('WorkspaceConfigurationService-Multiroot', () => { // {{SQL CARBON ED suite('WorkspaceConfigurationService - Remote Folder', () => { - let workspaceName = `testWorkspace${uuid.generateUuid()}`, parentResource: string, workspaceDir: string, testObject: WorkspaceService, globalSettingsFile: string, remoteSettingsFile: string, instantiationService: TestInstantiationService, resolveRemoteEnvironment: () => void; + let workspaceName = `testWorkspace${uuid.generateUuid()}`, parentResource: string, workspaceDir: string, testObject: WorkspaceService, globalSettingsFile: string, remoteSettingsFile: string, remoteSettingsResource: URI, instantiationService: TestInstantiationService, resolveRemoteEnvironment: () => void; const remoteAuthority = 'configuraiton-tests'; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); const diskFileSystemProvider = new DiskFileSystemProvider(new NullLogService()); @@ -1702,10 +1703,11 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { workspaceDir = folderDir; globalSettingsFile = path.join(parentDir, 'settings.json'); remoteSettingsFile = path.join(parentDir, 'remote-settings.json'); + remoteSettingsResource = URI.file(remoteSettingsFile).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority }); instantiationService = workbenchInstantiationService(); const environmentService = new TestEnvironmentService(URI.file(parentDir)); - const remoteEnvironmentPromise = new Promise>(c => resolveRemoteEnvironment = () => c({ settingsPath: URI.file(remoteSettingsFile).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority }) })); + const remoteEnvironmentPromise = new Promise>(c => resolveRemoteEnvironment = () => c({ settingsPath: remoteSettingsResource })); const remoteAgentService = instantiationService.stub(IRemoteAgentService, >{ getEnvironment: () => remoteEnvironmentPromise }); const fileService = new FileService(new NullLogService()); fileService.registerProvider(Schemas.file, diskFileSystemProvider); @@ -1805,26 +1807,26 @@ suite('WorkspaceConfigurationService - Remote Folder', () => { return promise; }); - // test('update remote settings', async () => { - // registerRemoteFileSystemProvider(); - // resolveRemoteEnvironment(); - // await initialize(); - // assert.equal(testObject.getValue('configurationService.remote.machineSetting'), 'isSet'); - // const promise = new Promise((c, e) => { - // testObject.onDidChangeConfiguration(event => { - // try { - // assert.equal(event.source, ConfigurationTarget.USER); - // assert.deepEqual(event.affectedKeys, ['configurationService.remote.machineSetting']); - // assert.equal(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue'); - // c(); - // } catch (error) { - // e(error); - // } - // }); - // }); - // fs.writeFileSync(remoteSettingsFile, '{ "configurationService.remote.machineSetting": "remoteValue" }'); - // return promise; - // }); + test('update remote settings', async () => { + registerRemoteFileSystemProvider(); + resolveRemoteEnvironment(); + await initialize(); + assert.equal(testObject.getValue('configurationService.remote.machineSetting'), 'isSet'); + const promise = new Promise((c, e) => { + testObject.onDidChangeConfiguration(event => { + try { + assert.equal(event.source, ConfigurationTarget.USER); + assert.deepEqual(event.affectedKeys, ['configurationService.remote.machineSetting']); + assert.equal(testObject.getValue('configurationService.remote.machineSetting'), 'remoteValue'); + c(); + } catch (error) { + e(error); + } + }); + }); + await instantiationService.get(IFileService).writeFile(remoteSettingsResource, VSBuffer.fromString('{ "configurationService.remote.machineSetting": "remoteValue" }')); + return promise; + }); test('machine settings in local user settings does not override defaults', async () => { fs.writeFileSync(globalSettingsFile, '{ "configurationService.remote.machineSetting": "globalValue" }'); diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index b691f97d8a..8f5195eca5 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -11,7 +11,7 @@ import { ConfigurationTarget } from 'vs/platform/configuration/common/configurat export const IConfigurationResolverService = createDecorator('configurationResolverService'); export interface IConfigurationResolverService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; resolve(folder: IWorkspaceFolder | undefined, value: string): string; resolve(folder: IWorkspaceFolder | undefined, value: string[]): string[]; diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 1912876413..753e3ba18e 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -28,16 +28,15 @@ export interface IVariableResolveContext { export class AbstractVariableResolverService implements IConfigurationResolverService { static readonly VARIABLE_REGEXP = /\$\{(.*?)\}/g; - static readonly VARIABLE_REGEXP_SINGLE = /\$\{(.*?)\}/; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _context: IVariableResolveContext; private _envVariables?: IProcessEnvironment; protected _contributedVariables: Map Promise> = new Map(); - constructor(_context: IVariableResolveContext, _envVariables?: IProcessEnvironment) { + constructor(_context: IVariableResolveContext, _envVariables?: IProcessEnvironment, private _ignoreEditorVariables = false) { this._context = _context; if (_envVariables) { if (isWindows) { @@ -232,6 +231,9 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return paths.basename(getFolderUri().fsPath); case 'lineNumber': + if (this._ignoreEditorVariables) { + return match; + } const lineNumber = this._context.getLineNumber(); if (lineNumber) { return lineNumber; @@ -239,6 +241,9 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe throw new Error(localize('canNotResolveLineNumber', "'{0}' can not be resolved. Make sure to have a line selected in the active editor.", match)); case 'selectedText': + if (this._ignoreEditorVariables) { + return match; + } const selectedText = this._context.getSelectedText(); if (selectedText) { return selectedText; @@ -246,15 +251,24 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe throw new Error(localize('canNotResolveSelectedText', "'{0}' can not be resolved. Make sure to have some text selected in the active editor.", match)); case 'file': + if (this._ignoreEditorVariables) { + return match; + } return getFilePath(); case 'relativeFile': + if (this._ignoreEditorVariables) { + return match; + } if (folderUri || argument) { return paths.normalize(paths.relative(getFolderUri().fsPath, getFilePath())); } return getFilePath(); case 'relativeFileDirname': + if (this._ignoreEditorVariables) { + return match; + } const dirname = paths.dirname(getFilePath()); if (folderUri || argument) { return paths.normalize(paths.relative(getFolderUri().fsPath, dirname)); @@ -262,15 +276,27 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return dirname; case 'fileDirname': + if (this._ignoreEditorVariables) { + return match; + } return paths.dirname(getFilePath()); case 'fileExtname': + if (this._ignoreEditorVariables) { + return match; + } return paths.extname(getFilePath()); case 'fileBasename': + if (this._ignoreEditorVariables) { + return match; + } return paths.basename(getFilePath()); case 'fileBasenameNoExtension': + if (this._ignoreEditorVariables) { + return match; + } const basename = paths.basename(getFilePath()); return (basename.slice(0, basename.length - paths.extname(basename).length)); 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 541e228c5b..94da9fc5d2 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 @@ -591,7 +591,7 @@ class MockCommandService implements ICommandService { } class MockQuickInputService implements IQuickInputService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly onShow = Event.None; readonly onHide = Event.None; diff --git a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts index 8b8617c5db..14e872e306 100644 --- a/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts +++ b/src/vs/workbench/services/contextmenu/electron-sandbox/contextmenuService.ts @@ -29,7 +29,7 @@ import { stripCodicons } from 'vs/base/common/codicons'; export class ContextMenuService extends Disposable implements IContextMenuService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; get onDidContextMenu(): Event { return this.impl.onDidContextMenu; } @@ -64,7 +64,7 @@ export class ContextMenuService extends Disposable implements IContextMenuServic class NativeContextMenuService extends Disposable implements IContextMenuService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _onDidContextMenu = this._register(new Emitter()); readonly onDidContextMenu: Event = this._onDidContextMenu.event; diff --git a/src/vs/workbench/services/credentials/browser/credentialsService.ts b/src/vs/workbench/services/credentials/browser/credentialsService.ts index bf6bc617c3..df9db8ec15 100644 --- a/src/vs/workbench/services/credentials/browser/credentialsService.ts +++ b/src/vs/workbench/services/credentials/browser/credentialsService.ts @@ -20,7 +20,7 @@ export interface ICredentialsProvider { export class BrowserCredentialsService implements ICredentialsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private credentialsProvider: ICredentialsProvider; diff --git a/src/vs/workbench/services/credentials/common/credentials.ts b/src/vs/workbench/services/credentials/common/credentials.ts index f8f4dedc95..73402fdf2c 100644 --- a/src/vs/workbench/services/credentials/common/credentials.ts +++ b/src/vs/workbench/services/credentials/common/credentials.ts @@ -9,7 +9,7 @@ export const ICredentialsService = createDecorator('ICreden export interface ICredentialsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getPassword(service: string, account: string): Promise; setPassword(service: string, account: string, password: string): Promise; diff --git a/src/vs/workbench/services/decorations/browser/decorationsService.ts b/src/vs/workbench/services/decorations/browser/decorationsService.ts index b877642397..07af65a6db 100644 --- a/src/vs/workbench/services/decorations/browser/decorationsService.ts +++ b/src/vs/workbench/services/decorations/browser/decorationsService.ts @@ -309,7 +309,7 @@ class DecorationProviderWrapper { export class DecorationsService implements IDecorationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _data = new LinkedList(); private readonly _onDidChangeDecorationsDelayed = new Emitter(); diff --git a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts index 1b7670cad0..71cf4f634c 100644 --- a/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/abstractFileDialogService.ts @@ -28,7 +28,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; export abstract class AbstractFileDialogService implements IFileDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IHostService protected readonly hostService: IHostService, diff --git a/src/vs/workbench/services/dialogs/browser/dialogService.ts b/src/vs/workbench/services/dialogs/browser/dialogService.ts index 1cf317ad13..5a0f852f44 100644 --- a/src/vs/workbench/services/dialogs/browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/browser/dialogService.ts @@ -22,7 +22,7 @@ import { fromNow } from 'vs/base/common/date'; export class DialogService implements IDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private allowableCommands = ['copy', 'cut']; diff --git a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts index c335130053..a23ce5e41c 100644 --- a/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/simpleFileDialog.ts @@ -765,6 +765,9 @@ export class SimpleFileDialog { // File or folder doesn't exist this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateNonexistentDir', 'Please enter a path that exists.'); return Promise.resolve(false); + } else if (uri.path === '/' && (await this.isWindowsOS())) { + this.filePickBox.validationMessage = nls.localize('remoteFileDialog.windowsDriveLetter', 'Please start the path with a drive letter.'); + return Promise.resolve(false); } else if (stat.isDirectory && !this.allowFolderSelection) { // Folder selected when folder selection not permitted this.filePickBox.validationMessage = nls.localize('remoteFileDialog.validateFileOnly', 'Please select a file.'); @@ -865,7 +868,7 @@ export class SimpleFileDialog { private createBackItem(currFolder: URI): FileQuickPickItem | null { const fileRepresentationCurr = this.currentFolder.with({ scheme: Schemas.file }); const fileRepresentationParent = resources.dirname(fileRepresentationCurr); - if (!resources.extUriIgnorePathCase.isEqual(fileRepresentationCurr, fileRepresentationParent)) { + if (!resources.isEqual(fileRepresentationCurr, fileRepresentationParent)) { const parentFolder = resources.dirname(currFolder); return { label: '..', uri: resources.addTrailingPathSeparator(parentFolder, this.separator), isFolder: true }; } @@ -878,8 +881,7 @@ export class SimpleFileDialog { const backDir = this.createBackItem(currentFolder); try { const folder = await this.fileService.resolve(currentFolder); - const fileNames = folder.children ? folder.children.map(child => child.name) : []; - const items = await Promise.all(fileNames.map(fileName => this.createItem(fileName, currentFolder, token))); + const items = folder.children ? await Promise.all(folder.children.map(child => this.createItem(child, currentFolder, token))) : []; for (let item of items) { if (item) { result.push(item); @@ -922,23 +924,18 @@ export class SimpleFileDialog { return true; } - private async createItem(filename: string, parent: URI, token: CancellationToken): Promise { + private async createItem(stat: IFileStat, parent: URI, token: CancellationToken): Promise { if (token.isCancellationRequested) { return undefined; } - let fullPath = resources.joinPath(parent, filename); - try { - const stat = await this.fileService.resolve(fullPath); - if (stat.isDirectory) { - filename = resources.basename(fullPath); - fullPath = resources.addTrailingPathSeparator(fullPath, this.separator); - return { label: filename, uri: fullPath, isFolder: true, iconClasses: getIconClasses(this.modelService, this.modeService, fullPath || undefined, FileKind.FOLDER) }; - } else if (!stat.isDirectory && this.allowFileSelection && this.filterFile(fullPath)) { - return { label: filename, uri: fullPath, isFolder: false, iconClasses: getIconClasses(this.modelService, this.modeService, fullPath || undefined) }; - } - return undefined; - } catch (e) { - return undefined; + let fullPath = resources.joinPath(parent, stat.name); + if (stat.isDirectory) { + const filename = resources.basename(fullPath); + fullPath = resources.addTrailingPathSeparator(fullPath, this.separator); + return { label: filename, uri: fullPath, isFolder: true, iconClasses: getIconClasses(this.modelService, this.modeService, fullPath || undefined, FileKind.FOLDER) }; + } else if (!stat.isDirectory && this.allowFileSelection && this.filterFile(fullPath)) { + return { label: stat.name, uri: fullPath, isFolder: false, iconClasses: getIconClasses(this.modelService, this.modeService, fullPath || undefined) }; } + return undefined; } } diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index f7f01cc26e..1d5958cdf7 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -5,7 +5,6 @@ import * as nls from 'vs/nls'; import * as os from 'os'; -import product from 'vs/platform/product/common/product'; import Severity from 'vs/base/common/severity'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; @@ -42,7 +41,7 @@ interface IMassagedMessageBoxOptions { export class DialogService implements IDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private nativeImpl: IDialogService; private customImpl: IDialogService; @@ -59,7 +58,7 @@ export class DialogService implements IDialogService { @IElectronService electronService: IElectronService ) { this.customImpl = new HTMLDialogService(logService, layoutService, themeService, keybindingService, productService, clipboardService); - this.nativeImpl = new NativeDialogService(logService, sharedProcessService, electronService, clipboardService); + this.nativeImpl = new NativeDialogService(logService, sharedProcessService, electronService, productService, clipboardService); } private get useCustomDialog(): boolean { @@ -89,12 +88,13 @@ export class DialogService implements IDialogService { class NativeDialogService implements IDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ILogService private readonly logService: ILogService, @ISharedProcessService sharedProcessService: ISharedProcessService, @IElectronService private readonly electronService: IElectronService, + @IProductService private readonly productService: IProductService, @IClipboardService private readonly clipboardService: IClipboardService ) { sharedProcessService.registerChannel('dialog', new DialogChannel(this)); @@ -205,15 +205,15 @@ class NativeDialogService implements IDialogService { options.buttons = buttons; options.cancelId = cancelId; options.noLink = true; - options.title = options.title || product.nameLong; + options.title = options.title || this.productService.nameLong; return { options, buttonIndexMap }; } async about(): Promise { - let version = product.version; - if (product.target) { - version = `${version} (${product.target} setup)`; + let version = this.productService.version; + if (this.productService.target) { + version = `${version} (${this.productService.target} setup)`; } const isSnap = process.platform === 'linux' && process.env.SNAP && process.env.SNAP_REVISION; @@ -222,14 +222,14 @@ class NativeDialogService implements IDialogService { return nls.localize('aboutDetail', "Version: {0}\nCommit: {1}\nDate: {2}\nVS Code: {8}\nElectron: {3}\nChrome: {4}\nNode.js: {5}\nV8: {6}\nOS: {7}", version, - product.commit || 'Unknown', - product.date ? `${product.date}${useAgo ? ' (' + fromNow(new Date(product.date), true) + ')' : ''}` : 'Unknown', + this.productService.commit || 'Unknown', + this.productService.date ? `${this.productService.date}${useAgo ? ' (' + fromNow(new Date(this.productService.date), true) + ')' : ''}` : 'Unknown', process.versions['electron'], process.versions['chrome'], process.versions['node'], process.versions['v8'], `${os.type()} ${os.arch()} ${os.release()}${isSnap ? ' snap' : ''}`, - product.vscodeVersion + this.productService.vscodeVersion ); }; @@ -246,9 +246,9 @@ class NativeDialogService implements IDialogService { } const result = await this.electronService.showMessageBox({ - title: product.nameLong, + title: this.productService.nameLong, type: 'info', - message: product.nameLong, + message: this.productService.nameLong, detail: `\n${detail}`, buttons, noLink: true, diff --git a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts index 2322100937..39698a6e33 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/fileDialogService.ts @@ -26,7 +26,7 @@ import { NativeSimpleFileDialog } from 'vs/workbench/services/dialogs/electron-b export class FileDialogService extends AbstractFileDialogService implements IFileDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IHostService hostService: IHostService, diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index 76e6955434..b33f731399 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -15,7 +15,7 @@ import { IFileService, FileOperationEvent, FileOperation, FileChangesEvent, File import { Schemas } from 'vs/base/common/network'; import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; -import { basename, isEqualOrParent, joinPath, isEqual } from 'vs/base/common/resources'; +import { basename, joinPath, extUri } from 'vs/base/common/resources'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection, OpenEditorContext } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IResourceEditorInputType, SIDE_GROUP, IResourceEditorReplacement, IOpenEditorOverrideHandler, IEditorService, SIDE_GROUP_TYPE, ACTIVE_GROUP_TYPE, ISaveEditorsOptions, ISaveAllEditorsOptions, IRevertAllEditorsOptions, IBaseSaveRevertAllEditorOptions, IOpenEditorOverrideEntry, ICustomEditorViewTypesHandler, ICustomEditorInfo } from 'vs/workbench/services/editor/common/editorService'; @@ -38,13 +38,14 @@ import { DEFAULT_CUSTOM_EDITOR, updateViewTypeSchema, editorAssociationsConfigur import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/workingCopyService'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { IModelService } from 'vs/editor/common/services/modelService'; type CachedEditorInput = ResourceEditorInput | IFileEditorInput | UntitledTextEditorInput; type OpenInEditorGroup = IEditorGroup | GroupIdentifier | SIDE_GROUP_TYPE | ACTIVE_GROUP_TYPE; export class EditorService extends Disposable implements EditorServiceImpl { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region events @@ -76,7 +77,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { @IConfigurationService private readonly configurationService: IConfigurationService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, - @IUriIdentityService private readonly uriIdentitiyService: IUriIdentityService + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { super(); @@ -241,7 +242,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { for (const editor of group.editors) { const resource = editor.resource; - if (!resource || !isEqualOrParent(resource, source)) { + if (!resource || !this.uriIdentityService.extUri.isEqualOrParent(resource, source)) { continue; // not matching our resource } @@ -255,8 +256,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { targetResource = joinPath(target, resource.path.substr(index + source.path.length + 1)); // parent folder got moved } - // Delegate move() to editor instance - const moveResult = editor.move(group.id, targetResource); + // Delegate rename() to editor instance + const moveResult = editor.rename(group.id, targetResource); if (!moveResult) { return; // not target - ignore } @@ -327,7 +328,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { // Do NOT close any opened editor that matches the resource path (either equal or being parent) of the // resource we move to (movedTo). Otherwise we would close a resource that has been renamed to the same // path but different casing. - if (movedTo && isEqualOrParent(resource, movedTo)) { + if (movedTo && this.uriIdentityService.extUri.isEqualOrParent(resource, movedTo)) { return; } @@ -335,7 +336,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { if (arg1 instanceof FileChangesEvent) { matches = arg1.contains(resource, FileChangeType.DELETED); } else { - matches = isEqualOrParent(resource, arg1); + matches = this.uriIdentityService.extUri.isEqualOrParent(resource, arg1); } if (!matches) { @@ -490,22 +491,22 @@ export class EditorService extends Disposable implements EditorServiceImpl { } getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry][] { - const ret = []; + const overrides = []; for (const handler of this.openEditorHandlers) { - const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(resource, options, group).map(val => { return [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]; }) : []; - ret.push(...handlers); + const handlers = handler.getEditorOverrides ? handler.getEditorOverrides(resource, options, group).map(val => [handler, val] as [IOpenEditorOverrideHandler, IOpenEditorOverrideEntry]) : []; + overrides.push(...handlers); } - return ret; + return overrides; } private onGroupWillOpenEditor(group: IEditorGroup, event: IEditorOpeningEvent): void { - if (event.options && event.options.ignoreOverrides) { - return; + if (event.options?.override === false) { + return; // return early when overrides are explicitly disabled } for (const handler of this.openEditorHandlers) { - const result = handler.open(event.editor, event.options, group, event.context || OpenEditorContext.NEW_EDITOR); + const result = handler.open(event.editor, event.options, group, event.context ?? OpenEditorContext.NEW_EDITOR); const override = result?.override; if (override) { event.prevent((() => override.then(editor => withNullAsUndefined(editor)))); @@ -688,13 +689,13 @@ export class EditorService extends Disposable implements EditorServiceImpl { async openEditors(editors: Array, group?: OpenInEditorGroup): Promise { // Convert to typed editors and options - const typedEditors: IEditorInputWithOptions[] = []; - editors.forEach(editor => { + const typedEditors = editors.map(editor => { if (isEditorInputWithOptions(editor)) { - typedEditors.push(editor); - } else { - typedEditors.push({ editor: this.createEditorInput(editor), options: TextEditorOptions.from(editor) }); + return editor; } + + const editorInput: IEditorInputWithOptions = { editor: this.createEditorInput(editor), options: TextEditorOptions.from(editor) }; + return editorInput; }); // Find target groups to open @@ -736,7 +737,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { } if (editor.resource) { - return this.editorsObserver.hasEditor(editor.resource); + return this.editorsObserver.hasEditor(this.asCanonicalEditorResource(editor.resource)); } return false; @@ -870,24 +871,23 @@ export class EditorService extends Disposable implements EditorServiceImpl { const resourceEditorInput = input as IResourceEditorInput; if (resourceEditorInput.resource instanceof URI) { - // We do not trust the resource that is being passed in as being the truth - // (e.g. in terms of path casing) and as such we ask the URI service to give - // us the canconical form of the URI. As such we ensure that any editor that - // is being opened will use the same canonical form of the URI. - const canonicalResource = this.uriIdentitiyService.asCanonicalUri(resourceEditorInput.resource); - // Derive the label from the path if not provided explicitly - const label = resourceEditorInput.label || basename(canonicalResource); + const label = resourceEditorInput.label || basename(resourceEditorInput.resource); + + // From this moment on, only operate on the canonical resource + // to ensure we reduce the chance of opening the same resource + // with different resource forms (e.g. path casing on Windows) + const canonicalResource = this.asCanonicalEditorResource(resourceEditorInput.resource); return this.createOrGetCached(canonicalResource, () => { // File if (resourceEditorInput.forceFile /* fix for https://github.com/Microsoft/vscode/issues/48275 */ || this.fileService.canHandleResource(canonicalResource)) { - return this.fileEditorInputFactory.createFileEditorInput(canonicalResource, resourceEditorInput.encoding, resourceEditorInput.mode, this.instantiationService); + return this.fileEditorInputFactory.createFileEditorInput(canonicalResource, resourceEditorInput.resource, resourceEditorInput.encoding, resourceEditorInput.mode, this.instantiationService); } // Resource - return this.instantiationService.createInstance(ResourceEditorInput, resourceEditorInput.label, resourceEditorInput.description, canonicalResource, resourceEditorInput.mode); + return this.instantiationService.createInstance(ResourceEditorInput, canonicalResource, resourceEditorInput.label, resourceEditorInput.description, resourceEditorInput.mode); }, cachedInput => { // Untitled @@ -897,6 +897,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { // Files else if (!(cachedInput instanceof ResourceEditorInput)) { + cachedInput.setLabel(resourceEditorInput.resource); + if (resourceEditorInput.encoding) { cachedInput.setPreferredEncoding(resourceEditorInput.encoding); } @@ -926,6 +928,28 @@ export class EditorService extends Disposable implements EditorServiceImpl { throw new Error('Unknown input type'); } + private _modelService: IModelService | undefined = undefined; + private get modelService(): IModelService | undefined { + if (!this._modelService) { + this._modelService = this.instantiationService.invokeFunction(accessor => accessor.get(IModelService)); + } + + return this._modelService; + } + + private asCanonicalEditorResource(resource: URI): URI { + const canonicalResource: URI = this.uriIdentityService.asCanonicalUri(resource); + + // In the unlikely case that a model exists for the original resource but + // differs from the canonical resource, we print a warning as this means + // the model will not be able to be opened as editor. + if (!extUri.isEqual(resource, canonicalResource) && this.modelService?.getModel(resource)) { + console.warn(`EditorService: a model exists for a resource that is not canonical: ${resource.toString(true)}`); + } + + return canonicalResource; + } + private createOrGetCached(resource: URI, factoryFn: () => CachedEditorInput, cachedFn?: (input: CachedEditorInput) => void): CachedEditorInput { // Return early if already cached @@ -1164,8 +1188,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { //#region Editor Tracking - whenClosed(resources: URI[], options?: { waitForSaved: boolean }): Promise { - let remainingResources = [...resources]; + whenClosed(editors: IResourceEditorInput[], options?: { waitForSaved: boolean }): Promise { + let remainingEditors = [...editors]; return new Promise(resolve => { const listener = this.onDidCloseEditor(async event => { @@ -1174,8 +1198,8 @@ export class EditorService extends Disposable implements EditorServiceImpl { // Remove from resources to wait for being closed based on the // resources from editors that got closed - remainingResources = remainingResources.filter(resource => { - if (isEqual(resource, masterResource) || isEqual(resource, detailsResource)) { + remainingEditors = remainingEditors.filter(({ resource }) => { + if (this.uriIdentityService.extUri.isEqual(resource, masterResource) || this.uriIdentityService.extUri.isEqual(resource, detailsResource)) { return false; // remove - the closing editor matches this resource } @@ -1183,15 +1207,15 @@ export class EditorService extends Disposable implements EditorServiceImpl { }); // All resources to wait for being closed are closed - if (remainingResources.length === 0) { + if (remainingEditors.length === 0) { if (options?.waitForSaved) { // If auto save is configured with the default delay (1s) it is possible // to close the editor while the save still continues in the background. As such - // we have to also check if the files to track for are dirty and if so wait + // we have to also check if the editors to track for are dirty and if so wait // for them to get saved. - const dirtyFiles = resources.filter(resource => this.workingCopyService.isDirty(resource)); - if (dirtyFiles.length > 0) { - await Promise.all(dirtyFiles.map(async dirtyFile => await this.whenSaved(dirtyFile))); + const dirtyResources = editors.filter(({ resource }) => this.workingCopyService.isDirty(resource)).map(({ resource }) => resource); + if (dirtyResources.length > 0) { + await Promise.all(dirtyResources.map(async resource => await this.whenSaved(resource))); } } @@ -1211,7 +1235,7 @@ export class EditorService extends Disposable implements EditorServiceImpl { // Otherwise resolve promise when resource is saved const listener = this.workingCopyService.onDidChangeDirty(workingCopy => { - if (!workingCopy.isDirty() && isEqual(resource, workingCopy.resource)) { + if (!workingCopy.isDirty() && this.uriIdentityService.extUri.isEqual(resource, workingCopy.resource)) { listener.dispose(); resolve(); @@ -1247,17 +1271,13 @@ export interface IEditorOpenHandler { */ export class DelegatingEditorService implements IEditorService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( private editorOpenHandler: IEditorOpenHandler, @IEditorService private editorService: EditorService ) { } - getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { - return this.editorService.getEditorOverrides(resource, options, group); - } - openEditor(editor: IEditorInput, options?: IEditorOptions | ITextEditorOptions, group?: OpenInEditorGroup): Promise; openEditor(editor: IResourceEditorInput | IUntitledTextResourceEditorInput, group?: OpenInEditorGroup): Promise; openEditor(editor: IResourceDiffEditorInput, group?: OpenInEditorGroup): Promise; @@ -1327,6 +1347,7 @@ export class DelegatingEditorService implements IEditorService { isOpen(editor: IEditorInput | IResourceEditorInput): boolean { return this.editorService.isOpen(editor as IResourceEditorInput /* TS fail */); } overrideOpenEditor(handler: IOpenEditorOverrideHandler): IDisposable { return this.editorService.overrideOpenEditor(handler); } + getEditorOverrides(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined) { return this.editorService.getEditorOverrides(resource, options, group); } invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { return this.editorService.invokeWithinEditorContext(fn); } @@ -1340,7 +1361,7 @@ export class DelegatingEditorService implements IEditorService { registerCustomEditorViewTypesHandler(source: string, handler: ICustomEditorViewTypesHandler): IDisposable { return this.editorService.registerCustomEditorViewTypesHandler(source, handler); } - whenClosed(resources: URI[]): Promise { return this.editorService.whenClosed(resources); } + whenClosed(editors: IResourceEditorInput[]): Promise { return this.editorService.whenClosed(editors); } //#endregion } diff --git a/src/vs/workbench/services/editor/common/editorGroupsService.ts b/src/vs/workbench/services/editor/common/editorGroupsService.ts index 052113bb40..3d27fa1cbf 100644 --- a/src/vs/workbench/services/editor/common/editorGroupsService.ts +++ b/src/vs/workbench/services/editor/common/editorGroupsService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { createDecorator, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorInput, IEditorPane, GroupIdentifier, IEditorInputWithOptions, CloseDirection, IEditorPartOptions, IEditorPartOptionsChangeEvent, EditorsOrder, IVisibleEditorPane } from 'vs/workbench/common/editor'; +import { IEditorInput, IEditorPane, GroupIdentifier, IEditorInputWithOptions, CloseDirection, IEditorPartOptions, IEditorPartOptionsChangeEvent, EditorsOrder, IVisibleEditorPane, IEditorCloseEvent } from 'vs/workbench/common/editor'; import { IEditorOptions, ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDimension } from 'vs/editor/common/editorCommon'; @@ -140,7 +140,7 @@ export const enum GroupsOrder { export interface IEditorGroupsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * An event for when the active editor group changes. The active editor @@ -387,6 +387,11 @@ export interface IEditorGroup { */ readonly onWillDispose: Event; + /** + * An event that is fired when an editor is about to close. + */ + readonly onWillCloseEditor: Event; + /** * A unique identifier of this group that remains identical even if the * group is moved to different locations. diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index 4e418eef4f..e986c58ae3 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -35,7 +35,7 @@ export interface IOpenEditorOverrideEntry { } export interface IOpenEditorOverrideHandler { - open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext, id?: string): IOpenEditorOverride | undefined; + open(editor: IEditorInput, options: IEditorOptions | ITextEditorOptions | undefined, group: IEditorGroup, context: OpenEditorContext): IOpenEditorOverride | undefined; getEditorOverrides?(resource: URI, options: IEditorOptions | undefined, group: IEditorGroup | undefined): IOpenEditorOverrideEntry[]; } @@ -87,7 +87,7 @@ export interface ICustomEditorViewTypesHandler { export interface IEditorService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Emitted when the currently active editor changes. @@ -247,6 +247,8 @@ export interface IEditorService { /** * Register handlers for custom editor view types. + * The handler will provide all available custom editors registered + * and also notify the editor service when a custom editor view type is registered/unregistered. */ registerCustomEditorViewTypesHandler(source: string, handler: ICustomEditorViewTypesHandler): IDisposable; @@ -289,12 +291,11 @@ export interface IEditorService { revertAll(options?: IRevertAllEditorsOptions): Promise; /** - * Track the provided list of resources for being opened as editors - * and resolve once all have been closed. + * Track the provided editors until all have been closed. * * @param options use `waitForSaved: true` to wait for the resources * being saved. If auto-save is enabled, it may be possible to close * an editor while the save continues in the background. */ - whenClosed(resources: URI[], options?: { waitForSaved: boolean }): Promise; + whenClosed(editors: IResourceEditorInput[], options?: { waitForSaved: boolean }): Promise; } diff --git a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index 90ea3dbe90..a897716fed 100644 --- a/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -449,6 +449,8 @@ suite.skip('EditorGroupsService', () => { // {{SQL CARBON EDIT}} skip suite assert.equal(editorCloseCounter1, 1); assert.equal(editorWillCloseCounter, 1); + assert.ok(inputInactive.gotDisposed); + assert.equal(group.activeEditor, input); assert.equal(editorStickyCounter, 0); @@ -482,10 +484,36 @@ suite.skip('EditorGroupsService', () => { // {{SQL CARBON EDIT}} skip suite assert.equal(group.getEditorByIndex(1), inputInactive); await group.closeEditors([input, inputInactive]); + + assert.ok(input.gotDisposed); + assert.ok(inputInactive.gotDisposed); + assert.equal(group.isEmpty, true); part.dispose(); }); + test('closeEditors (one, opened in multiple groups)', async () => { + const [part] = createPart(); + const group = part.activeGroup; + assert.equal(group.isEmpty, true); + + const rightGroup = part.addGroup(group, GroupDirection.RIGHT); + + const input = new TestFileEditorInput(URI.file('foo/bar'), TEST_EDITOR_INPUT_ID); + const inputInactive = new TestFileEditorInput(URI.file('foo/bar/inactive'), TEST_EDITOR_INPUT_ID); + + await group.openEditors([{ editor: input, options: { pinned: true } }, { editor: inputInactive }]); + await rightGroup.openEditors([{ editor: input, options: { pinned: true } }, { editor: inputInactive }]); + + await rightGroup.closeEditor(input); + + assert.ok(!input.gotDisposed); + + await group.closeEditor(input); + + assert.ok(input.gotDisposed); + }); + test('closeEditors (except one)', async () => { const [part] = createPart(); const group = part.activeGroup; 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 ceb0b8a4a6..78190d3698 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -403,7 +403,7 @@ suite.skip('EditorService', () => { // {{SQL CARBON EDIT}} skip suite const ed = instantiationService.createInstance(MyEditor, 'my.editor'); - const inp = instantiationService.createInstance(ResourceEditorInput, 'name', 'description', URI.parse('my://resource-delegate'), undefined); + const inp = instantiationService.createInstance(ResourceEditorInput, URI.parse('my://resource-delegate'), 'name', 'description', undefined); const delegate = instantiationService.createInstance(DelegatingEditorService, async (delegate, group, input) => { assert.strictEqual(input, inp); @@ -1084,7 +1084,7 @@ suite.skip('EditorService', () => { // {{SQL CARBON EDIT}} skip suite const editor = await service.openEditor(input1, { pinned: true }); await service.openEditor(input2, { pinned: true }); - const whenClosed = service.whenClosed([input1.resource, input2.resource]); + const whenClosed = service.whenClosed([input1, input2]); editor?.group?.closeAllEditors(); diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts index f7a523b658..21dfeb592a 100644 --- a/src/vs/workbench/services/environment/browser/environmentService.ts +++ b/src/vs/workbench/services/environment/browser/environmentService.ts @@ -99,7 +99,7 @@ interface IExtensionHostDebugEnvironment { export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironmentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _configuration: IEnvironmentConfiguration | undefined = undefined; get configuration(): IEnvironmentConfiguration { @@ -269,6 +269,9 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment extensionHostDebugEnvironment.params.port = parseInt(value); extensionHostDebugEnvironment.params.break = true; break; + case 'inspect-extensions': + extensionHostDebugEnvironment.params.port = parseInt(value); + break; case 'enableProposedApi': extensionHostDebugEnvironment.extensionEnabledProposedApi = []; break; diff --git a/src/vs/workbench/services/environment/common/environmentService.ts b/src/vs/workbench/services/environment/common/environmentService.ts index 9c7bdb0ddb..a698b448db 100644 --- a/src/vs/workbench/services/environment/common/environmentService.ts +++ b/src/vs/workbench/services/environment/common/environmentService.ts @@ -17,7 +17,7 @@ export interface IEnvironmentConfiguration extends IWindowConfiguration { export interface IWorkbenchEnvironmentService extends IEnvironmentService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly configuration: IEnvironmentConfiguration; diff --git a/src/vs/workbench/services/environment/electron-browser/environmentService.ts b/src/vs/workbench/services/environment/electron-browser/environmentService.ts index 5ddd738245..00b8f3058f 100644 --- a/src/vs/workbench/services/environment/electron-browser/environmentService.ts +++ b/src/vs/workbench/services/environment/electron-browser/environmentService.ts @@ -32,7 +32,7 @@ export interface INativeEnvironmentConfiguration extends IEnvironmentConfigurati export class NativeWorkbenchEnvironmentService extends EnvironmentService implements INativeWorkbenchEnvironmentService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; @memoize get webviewExternalEndpoint(): string { diff --git a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts index adc62d981f..9b34c1990d 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts @@ -23,7 +23,7 @@ const SOURCE = 'IWorkbenchExtensionEnablementService'; export class ExtensionEnablementService extends Disposable implements IWorkbenchExtensionEnablementService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onEnablementChanged = new Emitter(); public readonly onEnablementChanged: Event = this._onEnablementChanged.event; @@ -121,6 +121,10 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench return enablementState === EnablementState.EnabledWorkspace || enablementState === EnablementState.EnabledGlobally; } + isDisabledGlobally(extension: IExtension): boolean { + return this._isDisabledGlobally(extension.identifier); + } + private _isDisabledInEnv(extension: IExtension): boolean { if (this.allUserExtensionsDisabled) { return extension.type === ExtensionType.User; @@ -168,12 +172,16 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench return EnablementState.DisabledWorkspace; } } - if (this.globalExtensionEnablementService.getDisabledExtensions().filter(e => areSameExtensions(e, identifier))[0]) { + if (this._isDisabledGlobally(identifier)) { return EnablementState.DisabledGlobally; } return EnablementState.EnabledGlobally; } + private _isDisabledGlobally(identifier: IExtensionIdentifier): boolean { + return this.globalExtensionEnablementService.getDisabledExtensions().some(e => areSameExtensions(e, identifier)); + } + private _enableExtension(identifier: IExtensionIdentifier): Promise { this._removeFromWorkspaceDisabledExtensions(identifier); this._removeFromWorkspaceEnabledExtensions(identifier); diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts index 16f7413dbf..13b117742a 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagement.ts @@ -20,7 +20,7 @@ export interface IExtensionManagementServer { } export interface IExtensionManagementServerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly localExtensionManagementServer: IExtensionManagementServer | null; readonly remoteExtensionManagementServer: IExtensionManagementServer | null; getExtensionManagementServer(location: URI): IExtensionManagementServer | null; @@ -38,7 +38,7 @@ export const enum EnablementState { export const IWorkbenchExtensionEnablementService = createDecorator('extensionEnablementService'); export interface IWorkbenchExtensionEnablementService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly allUserExtensionsDisabled: boolean; @@ -62,6 +62,14 @@ export interface IWorkbenchExtensionEnablementService { */ isEnabled(extension: IExtension): boolean; + /** + * Returns `true` if the given extension identifier is disabled globally. + * Extensions can be disabled globally or in workspace or both. + * If an extension is disabled in both then enablement state shows only workspace. + * This will + */ + isDisabledGlobally(extension: IExtension): boolean; + /** * Enable or disable the given extension. * if `workspace` is `true` then enablement is done for workspace, otherwise globally. @@ -115,7 +123,7 @@ export interface IExtensionRecommendationReson { export const IExtensionRecommendationsService = createDecorator('extensionRecommendationsService'); export interface IExtensionRecommendationsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getAllRecommendationsWithReason(): IStringDictionary; getFileBasedRecommendations(): IExtensionRecommendation[]; diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts index ea06060682..ac9135fc5a 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts @@ -15,7 +15,7 @@ import { ILabelService } from 'vs/platform/label/common/label'; export class ExtensionManagementServerService implements IExtensionManagementServerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly localExtensionManagementServer: IExtensionManagementServer | null = null; readonly remoteExtensionManagementServer: IExtensionManagementServer | null = null; diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 580383b845..993f5dccbb 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -22,7 +22,7 @@ import { IDownloadService } from 'vs/platform/download/common/download'; export class ExtensionManagementService extends Disposable implements IExtensionManagementService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly onInstallExtension: Event; readonly onDidInstallExtension: Event; diff --git a/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts b/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts index f11af0ecd5..be0b562e34 100644 --- a/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts +++ b/src/vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService.ts @@ -24,9 +24,12 @@ const localExtensionManagementServerAuthority: string = 'vscode-local'; export class ExtensionManagementServerService implements IExtensionManagementServerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; - readonly localExtensionManagementServer: IExtensionManagementServer; + private readonly _localExtensionManagementServer: IExtensionManagementServer; + public get localExtensionManagementServer(): IExtensionManagementServer { + return this._localExtensionManagementServer; + } readonly remoteExtensionManagementServer: IExtensionManagementServer | null = null; readonly isSingleServer: boolean = false; @@ -41,7 +44,7 @@ export class ExtensionManagementServerService implements IExtensionManagementSer ) { const localExtensionManagementService = new ExtensionManagementChannelClient(sharedProcessService.getChannel('extensions')); - this.localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, authority: localExtensionManagementServerAuthority, label: localize('local', "Local") }; + this._localExtensionManagementServer = { extensionManagementService: localExtensionManagementService, authority: localExtensionManagementServerAuthority, label: localize('local', "Local") }; const remoteAgentConnection = remoteAgentService.getConnection(); if (remoteAgentConnection) { const extensionManagementService = new RemoteExtensionManagementChannelClient(remoteAgentConnection.getChannel('extensions'), this.localExtensionManagementServer.extensionManagementService, galleryService, logService, configurationService, productService); diff --git a/src/vs/workbench/services/extensionResourceLoader/browser/extensionResourceLoaderService.ts b/src/vs/workbench/services/extensionResourceLoader/browser/extensionResourceLoaderService.ts index 770910dcbe..94ae730a94 100644 --- a/src/vs/workbench/services/extensionResourceLoader/browser/extensionResourceLoaderService.ts +++ b/src/vs/workbench/services/extensionResourceLoader/browser/extensionResourceLoaderService.ts @@ -12,7 +12,7 @@ import { Schemas } from 'vs/base/common/network'; class ExtensionResourceLoaderService implements IExtensionResourceLoaderService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IFileService private readonly _fileService: IFileService diff --git a/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts b/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts index a646f7b447..66b2e79172 100644 --- a/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts +++ b/src/vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader.ts @@ -12,7 +12,7 @@ export const IExtensionResourceLoaderService = createDecorator { - return this.whenInstalledExtensionsRegistered().then(() => { - return this._remoteExtensionsEnvironmentData!; - }); + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + const connectionData = this._remoteAuthorityResolverService.getConnectionData(remoteAuthority); + const remoteEnvironment = this._remoteExtensionsEnvironmentData!; + return { connectionData, remoteEnvironment }; } }; } diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts index 9cb6c16c86..b9a989c4cc 100644 --- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts +++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHostStarter.ts @@ -161,6 +161,7 @@ export class WebWorkerExtensionHostStarter implements IExtensionHostStarter { autoStart: this._autoStart, remote: { authority: this._environmentService.configuration.remoteAuthority, + connectionData: null, isRemote: false }, uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index fc610a53c4..891fa15a9c 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -131,7 +131,7 @@ export interface IResponsiveStateChangeEvent { } export interface IExtensionService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * An event emitted when extensions are registered after their extension points got handled. @@ -259,7 +259,7 @@ export function toExtension(extensionDescription: IExtensionDescription): IExten export class NullExtensionService implements IExtensionService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidRegisterExtensions: Event = Event.None; onDidChangeExtensionsStatus: Event = Event.None; onDidChangeExtensions: Event = Event.None; diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 6ee6647099..1f5ebf7644 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -269,6 +269,11 @@ export const schema: IJSONSchema = { description: nls.localize('vscode.extension.activationEvents.workspaceContains', 'An activation event emitted whenever a folder is opened that contains at least a file matching the specified glob pattern.'), body: 'workspaceContains:${4:filePattern}' }, + { + label: 'onStartupFinished', + description: nls.localize('vscode.extension.activationEvents.onStartupFinished', 'An activation event emitted after the start-up finished (after all eager activated extensions have finished activating).'), + body: 'onStartupFinished' + }, { label: 'onFileSystem', description: nls.localize('vscode.extension.activationEvents.onFileSystem', 'An activation event emitted whenever a file or folder is accessed with the given scheme.'), diff --git a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts index 4df8e788ef..565ea987e1 100644 --- a/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts +++ b/src/vs/workbench/services/extensions/common/remoteExtensionHostClient.ts @@ -16,7 +16,7 @@ import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/ import { IExtensionHostStarter, ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/common/extensionDevOptions'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; -import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IRemoteAuthorityResolverService, IRemoteConnectionData } from 'vs/platform/remote/common/remoteAuthorityResolver'; import * as platform from 'vs/base/common/platform'; import { Schemas } from 'vs/base/common/network'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -33,9 +33,14 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputChannelRegistry, Extensions } from 'vs/workbench/services/output/common/output'; import { localize } from 'vs/nls'; +export interface IRemoteInitData { + readonly connectionData: IRemoteConnectionData | null; + readonly remoteEnvironment: IRemoteAgentEnvironment; +} + export interface IInitDataProvider { readonly remoteAuthority: string; - getInitData(): Promise; + getInitData(): Promise; } export class RemoteExtensionHostClient extends Disposable implements IExtensionHostStarter { @@ -190,27 +195,28 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH } private _createExtHostInitData(isExtensionDevelopmentDebug: boolean): Promise { - return Promise.all([this._allExtensions, this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]).then(([allExtensions, telemetryInfo, remoteExtensionHostData]) => { + return Promise.all([this._allExtensions, this._telemetryService.getTelemetryInfo(), this._initDataProvider.getInitData()]).then(([allExtensions, telemetryInfo, remoteInitData]) => { // Collect all identifiers for extension ids which can be considered "resolved" const resolvedExtensions = allExtensions.filter(extension => !extension.main).map(extension => extension.identifier); const hostExtensions = allExtensions.filter(extension => extension.main && extension.api === 'none').map(extension => extension.identifier); const workspace = this._contextService.getWorkspace(); + const remoteEnv = remoteInitData.remoteEnvironment; const r: IInitData = { commit: this._productService.commit, version: this._productService.version, vscodeVersion: this._productService.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version - parentPid: remoteExtensionHostData.pid, + parentPid: remoteEnv.pid, environment: { isExtensionDevelopmentDebug, - appRoot: remoteExtensionHostData.appRoot, - appSettingsHome: remoteExtensionHostData.appSettingsHome, + appRoot: remoteEnv.appRoot, + appSettingsHome: remoteEnv.appSettingsHome, appName: this._productService.nameLong, appUriScheme: this._productService.urlProtocol, appLanguage: platform.language, extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, - globalStorageHome: remoteExtensionHostData.globalStorageHome, - userHome: remoteExtensionHostData.userHome, + globalStorageHome: remoteEnv.globalStorageHome, + userHome: remoteEnv.userHome, webviewResourceRoot: this._environmentService.webviewResourceRoot, webviewCspSource: this._environmentService.webviewCspSource, }, @@ -221,15 +227,16 @@ export class RemoteExtensionHostClient extends Disposable implements IExtensionH }, remote: { isRemote: true, - authority: this._initDataProvider.remoteAuthority + authority: this._initDataProvider.remoteAuthority, + connectionData: remoteInitData.connectionData }, resolvedExtensions: resolvedExtensions, hostExtensions: hostExtensions, - extensions: remoteExtensionHostData.extensions, + extensions: remoteEnv.extensions, telemetryInfo, logLevel: this._logService.getLevel(), - logsLocation: remoteExtensionHostData.extensionHostLogsPath, - logFile: joinPath(remoteExtensionHostData.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), + logsLocation: remoteEnv.extensionHostLogsPath, + logFile: joinPath(remoteEnv.extensionHostLogsPath, `${ExtensionHostLogFileName}.log`), autoStart: true, uiKind: platform.isWeb ? UIKind.Web : UIKind.Desktop }; diff --git a/src/vs/workbench/services/extensions/common/staticExtensions.ts b/src/vs/workbench/services/extensions/common/staticExtensions.ts index 7ba961cd94..862a2286c4 100644 --- a/src/vs/workbench/services/extensions/common/staticExtensions.ts +++ b/src/vs/workbench/services/extensions/common/staticExtensions.ts @@ -11,13 +11,13 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ export const IStaticExtensionsService = createDecorator('IStaticExtensionsService'); export interface IStaticExtensionsService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; getExtensions(): Promise; } export class StaticExtensionsService implements IStaticExtensionsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _descriptions: IExtensionDescription[] = []; @@ -27,6 +27,7 @@ export class StaticExtensionsService implements IStaticExtensionsService { this._descriptions = staticExtensions.map(data => { identifier: new ExtensionIdentifier(`${data.packageJSON.publisher}.${data.packageJSON.name}`), extensionLocation: data.extensionLocation, + isBuiltin: !!data.isBuiltin, ...data.packageJSON, }); } diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts index 3779e9f90b..4f84ced89b 100644 --- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts @@ -18,7 +18,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { IWorkbenchExtensionEnablementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { BUILTIN_MANIFEST_CACHE_FILE, MANIFEST_CACHE_FOLDER, USER_MANIFEST_CACHE_FILE, ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { ExtensionScanner, ExtensionScannerInput, IExtensionReference, IExtensionResolver, IRelaxedExtensionDescription } from 'vs/workbench/services/extensions/node/extensionPoints'; @@ -57,6 +57,7 @@ export class CachedExtensionScanner { @IWorkbenchEnvironmentService private readonly _environmentService: INativeWorkbenchEnvironmentService, @IWorkbenchExtensionEnablementService private readonly _extensionEnablementService: IWorkbenchExtensionEnablementService, @IHostService private readonly _hostService: IHostService, + @IProductService private readonly _productService: IProductService ) { this.scannedExtensions = new Promise((resolve, reject) => { this._scannedExtensionsResolve = resolve; @@ -68,8 +69,8 @@ export class CachedExtensionScanner { public async scanSingleExtension(path: string, isBuiltin: boolean, log: ILog): Promise { const translations = await this.translationConfig; - const version = product.version; - const commit = product.commit; + const version = this._productService.version; + const commit = this._productService.commit; const devMode = !!process.env['VSCODE_DEV']; const locale = platform.language; const input = new ExtensionScannerInput(version, commit, locale, devMode, path, isBuiltin, false, translations); @@ -79,7 +80,7 @@ export class CachedExtensionScanner { public async startScanningExtensions(log: ILog): Promise { try { const translations = await this.translationConfig; - const { system, user, development } = await CachedExtensionScanner._scanInstalledExtensions(this._hostService, this._notificationService, this._environmentService, this._extensionEnablementService, log, translations); + const { system, user, development } = await CachedExtensionScanner._scanInstalledExtensions(this._hostService, this._notificationService, this._environmentService, this._extensionEnablementService, this._productService, log, translations); let result = new Map(); system.forEach((systemExtension) => { @@ -239,12 +240,13 @@ export class CachedExtensionScanner { notificationService: INotificationService, environmentService: INativeWorkbenchEnvironmentService, extensionEnablementService: IWorkbenchExtensionEnablementService, + productService: IProductService, log: ILog, translations: Translations ): Promise<{ system: IExtensionDescription[], user: IExtensionDescription[], development: IExtensionDescription[] }> { - const version = product.version; - const commit = product.commit; + const version = productService.version; + const commit = productService.commit; const devMode = !!process.env['VSCODE_DEV']; const locale = platform.language; @@ -260,7 +262,7 @@ export class CachedExtensionScanner { let finalBuiltinExtensions: Promise = builtinExtensions; if (devMode) { - const builtInExtensions = Promise.resolve(product.builtInExtensions || []); + const builtInExtensions = Promise.resolve(productService.builtInExtensions || []); const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json'); const controlFile = pfs.readFile(controlFilePath, 'utf8') diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index c16c10c074..b5caa3d0b1 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -25,7 +25,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { ILabelService } from 'vs/platform/label/common/label'; import { ILifecycleService, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; -import product from 'vs/platform/product/common/product'; +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 { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; @@ -85,7 +85,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { @ILogService private readonly _logService: ILogService, @ILabelService private readonly _labelService: ILabelService, @IExtensionHostDebugService private readonly _extensionHostDebugService: IExtensionHostDebugService, - @IHostService private readonly _hostService: IHostService + @IHostService private readonly _hostService: IHostService, + @IProductService private readonly _productService: IProductService ) { const devOpts = parseExtensionDevOptions(this._environmentService); this._isExtensionDevHost = devOpts.isExtensionDevHost; @@ -150,7 +151,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { VERBOSE_LOGGING: true, VSCODE_IPC_HOOK_EXTHOST: pipeName, VSCODE_HANDLES_UNCAUGHT_ERRORS: true, - VSCODE_LOG_STACK: !this._isExtensionDevTestFromCli && (this._isExtensionDevHost || !this._environmentService.isBuilt || product.quality !== 'stable' || this._environmentService.verbose), + 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 }), // We only detach the extension host on windows. Linux and Mac orphan by default @@ -175,8 +176,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { const crashesDirectory = this._environmentService.crashReporterDirectory; if (crashesDirectory) { const crashReporterOptions: CrashReporterStartOptions = { - companyName: product.crashReporter?.companyName || 'Microsoft', - productName: product.crashReporter?.productName || product.nameShort, + companyName: this._productService.crashReporter?.companyName || 'Microsoft', + productName: this._productService.crashReporter?.productName || this._productService.nameShort, submitURL: '', uploadToServer: false, crashesDirectory @@ -414,16 +415,16 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { .then(([telemetryInfo, extensionDescriptions]) => { const workspace = this._contextService.getWorkspace(); const r: IInitData = { - commit: product.commit, - version: product.version, - vscodeVersion: product.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version + commit: this._productService.commit, + version: this._productService.version, + vscodeVersion: this._productService.vscodeVersion, // {{SQL CARBON EDIT}} add vscode version parentPid: process.pid, environment: { isExtensionDevelopmentDebug: this._isExtensionDevDebug, appRoot: this._environmentService.appRoot ? URI.file(this._environmentService.appRoot) : undefined, appSettingsHome: this._environmentService.appSettingsHome ? this._environmentService.appSettingsHome : undefined, - appName: product.nameLong, - appUriScheme: product.urlProtocol, + appName: this._productService.nameLong, + appUriScheme: this._productService.urlProtocol, appLanguage: platform.language, extensionDevelopmentLocationURI: this._environmentService.extensionDevelopmentLocationURI, extensionTestsLocationURI: this._environmentService.extensionTestsLocationURI, @@ -440,6 +441,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { }, remote: { authority: this._environmentService.configuration.remoteAuthority, + connectionData: null, isRemote: false }, resolvedExtensions: [], diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 6753c9d4ed..7089f15b6e 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ipcRenderer } from 'vs/base/parts/sandbox/electron-sandbox/globals'; import { ExtensionHostProcessWorker } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; import { CachedExtensionScanner } from 'vs/workbench/services/extensions/electron-browser/cachedExtensionScanner'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -52,7 +51,7 @@ class DeltaExtensionsQueueItem { export class ExtensionService extends AbstractExtensionService implements IExtensionService { - private readonly _remoteExtensionsEnvironmentData: Map; + private readonly _remoteEnvironment: Map; private readonly _extensionScanner: CachedExtensionScanner; private _deltaExtensionsQueue: DeltaExtensionsQueueItem[]; @@ -95,7 +94,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten }]); } - this._remoteExtensionsEnvironmentData = new Map(); + this._remoteEnvironment = new Map(); this._extensionScanner = instantiationService.createInstance(CachedExtensionScanner); this._deltaExtensionsQueue = []; @@ -328,6 +327,12 @@ export class ExtensionService extends AbstractExtensionService implements IExten shouldActivateReason = activationEvent; break; } + + if (activationEvent === 'onStartupFinished') { + shouldActivate = true; + shouldActivateReason = activationEvent; + break; + } } } @@ -343,10 +348,11 @@ export class ExtensionService extends AbstractExtensionService implements IExten private _createProvider(remoteAuthority: string): IInitDataProvider { return { remoteAuthority: remoteAuthority, - getInitData: () => { - return this.whenInstalledExtensionsRegistered().then(() => { - return this._remoteExtensionsEnvironmentData.get(remoteAuthority)!; - }); + getInitData: async () => { + await this.whenInstalledExtensionsRegistered(); + const connectionData = this._remoteAuthorityResolverService.getConnectionData(remoteAuthority); + const remoteEnvironment = this._remoteEnvironment.get(remoteAuthority)!; + return { connectionData, remoteEnvironment }; } }; } @@ -432,12 +438,12 @@ export class ExtensionService extends AbstractExtensionService implements IExten } const extensionHost = this._extensionHostProcessManagers[0]; - this._remoteAuthorityResolverService.clearResolvedAuthority(remoteAuthority); + this._remoteAuthorityResolverService._clearResolvedAuthority(remoteAuthority); try { const result = await extensionHost.resolveAuthority(remoteAuthority); - this._remoteAuthorityResolverService.setResolvedAuthority(result.authority, result.options); + this._remoteAuthorityResolverService._setResolvedAuthority(result.authority, result.options); } catch (err) { - this._remoteAuthorityResolverService.setResolvedAuthorityError(remoteAuthority, err); + this._remoteAuthorityResolverService._setResolvedAuthorityError(remoteAuthority, err); } } @@ -470,7 +476,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten console.log(`Error handled: Not showing a notification for the error`); } } - this._remoteAuthorityResolverService.setResolvedAuthorityError(remoteAuthority, err); + this._remoteAuthorityResolverService._setResolvedAuthorityError(remoteAuthority, err); // Proceed with the local extension host await this._startLocalExtensionHost(extensionHost, localExtensions, localExtensions.map(extension => extension.identifier)); @@ -478,7 +484,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten } // set the resolved authority - this._remoteAuthorityResolverService.setResolvedAuthority(resolvedAuthority.authority, resolvedAuthority.options); + this._remoteAuthorityResolverService._setResolvedAuthority(resolvedAuthority.authority, resolvedAuthority.options); this._remoteExplorerService.setTunnelInformation(resolvedAuthority.tunnelInformation); // monitor for breakage @@ -490,7 +496,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten return; } if (e.type === PersistentConnectionEventType.ConnectionLost) { - this._remoteAuthorityResolverService.clearResolvedAuthority(remoteAuthority); + this._remoteAuthorityResolverService._clearResolvedAuthority(remoteAuthority); } }); connection.onReconnecting(() => this._resolveAuthorityAgain()); @@ -546,7 +552,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten remoteEnv.extensions = remoteEnv.extensions.filter(ext => runningLocation.get(ExtensionIdentifier.toKey(ext.identifier)) === RunningLocation.Remote); // save for remote extension's init data - this._remoteExtensionsEnvironmentData.set(remoteAuthority, remoteEnv); + this._remoteEnvironment.set(remoteAuthority, remoteEnv); await this._startLocalExtensionHost(extensionHost, remoteEnv.extensions.concat(localExtensions), localExtensions.map(extension => extension.identifier)); } else { @@ -578,7 +584,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten public _onExtensionHostExit(code: number): void { if (this._isExtensionDevTestFromCli) { // When CLI testing make sure to exit with proper exit code - ipcRenderer.send('vscode:exit', code); + this._electronService.exit(code); } else { // Expected development extension termination: When the extension host goes down we also shutdown the window this._electronService.closeWindow(); diff --git a/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts index e831751888..1a3b42baaf 100644 --- a/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts +++ b/src/vs/workbench/services/extensions/electron-browser/remoteExtensionManagementIpc.ts @@ -24,7 +24,7 @@ import { joinPath } from 'vs/base/common/resources'; export class RemoteExtensionManagementChannelClient extends ExtensionManagementChannelClient { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( channel: IChannel, diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts index 50101d7519..63a17e7675 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcessSetup.ts @@ -299,7 +299,7 @@ export async function startExtensionHostProcess(): Promise { // host abstraction const hostUtils = new class NodeHost implements IHostUtils { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; exit(code: number) { nativeExit(code); } exists(path: string) { return exists(path); } realpath(path: string) { return realpath(path); } diff --git a/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts b/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts index 5be6accd91..e7ae22b2f7 100644 --- a/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts +++ b/src/vs/workbench/services/extensions/worker/extensionHostWorker.ts @@ -36,7 +36,7 @@ self.addEventLister = () => console.trace(`'addEventListener' has been blocked`) //#endregion --- const hostUtil = new class implements IHostUtils { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; exit(_code?: number | undefined): void { nativeClose(); } diff --git a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts index 18eb551d90..5bb4d9e2d5 100644 --- a/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts +++ b/src/vs/workbench/services/filesConfiguration/common/filesConfigurationService.ts @@ -35,7 +35,7 @@ export const IFilesConfigurationService = createDecorator(EditorExtensions.EditorInputFactories); + constructor( @IEditorService private readonly editorService: EditorServiceImpl, @IEditorGroupsService private readonly editorGroupService: IEditorGroupsService, @@ -259,7 +263,7 @@ export class HistoryService extends Disposable implements IHistoryService { remove(arg1: IEditorInput | IResourceEditorInput | FileChangesEvent): void { this.removeFromHistory(arg1); this.removeFromNavigationStack(arg1); - this.removeFromRecentlyClosedFiles(arg1); + this.removeFromRecentlyClosedEditors(arg1); this.removeFromRecentlyOpened(arg1); } @@ -285,8 +289,8 @@ export class HistoryService extends Disposable implements IHistoryService { this.editorStackListeners.forEach(listeners => dispose(listeners)); this.editorStackListeners.clear(); - // Closed files - this.recentlyClosedFiles = []; + // Recently closed editors + this.recentlyClosedEditors = []; // Context Keys this.updateContextKeys(); @@ -601,88 +605,120 @@ export class HistoryService extends Disposable implements IHistoryService { //#endregion - //#region Recently Closed Files + //#region Recently Closed Editors private static readonly MAX_RECENTLY_CLOSED_EDITORS = 20; - private recentlyClosedFiles: IRecentlyClosedFile[] = []; + private recentlyClosedEditors: IRecentlyClosedEditor[] = []; private onEditorClosed(event: IEditorCloseEvent): void { - - // Track closing of editor to support to reopen closed editors (unless editor was replaced) - if (!event.replaced) { - const resource = event.editor ? event.editor.resource : undefined; - const supportsReopen = resource && this.fileService.canHandleResource(resource); // we only support file'ish things to reopen - if (resource && supportsReopen) { - - // Remove all inputs matching and add as last recently closed - this.removeFromRecentlyClosedFiles(event.editor); - this.recentlyClosedFiles.push({ resource, index: event.index, sticky: event.sticky }); - - // Bounding - if (this.recentlyClosedFiles.length > HistoryService.MAX_RECENTLY_CLOSED_EDITORS) { - this.recentlyClosedFiles.shift(); - } - - // Context - this.canReopenClosedEditorContextKey.set(true); - } - } - } - - reopenLastClosedEditor(): void { - let lastClosedFile = this.recentlyClosedFiles.pop(); - while (lastClosedFile && this.containsRecentlyClosedFile(this.editorGroupService.activeGroup, lastClosedFile)) { - lastClosedFile = this.recentlyClosedFiles.pop(); // pop until we find a file that is not opened + const { editor, replaced } = event; + if (replaced) { + return; // ignore if editor was replaced } - if (lastClosedFile) { - (async () => { - let options: IEditorOptions; - if (lastClosedFile.sticky) { - // Sticky: in case the target index is outside of the range of - // sticky editors, we make sure to not provide the index as - // option. Otherwise the index will cause the sticky flag to - // be ignored. - if (!this.editorGroupService.activeGroup.isSticky(lastClosedFile.index)) { - options = { pinned: true, sticky: true }; - } else { - options = { pinned: true, sticky: true, index: lastClosedFile.index }; - } - } else { - options = { pinned: true, index: lastClosedFile.index }; - } + const factory = this.editorInputFactory.getEditorInputFactory(editor.getTypeId()); + if (!factory || !factory.canSerialize(editor)) { + return; // we need a factory from this point that can serialize this editor + } - const editor = await this.editorService.openEditor({ resource: lastClosedFile.resource, options }); + const serialized = factory.serialize(editor); + if (typeof serialized !== 'string') { + return; // we need something to deserialize from + } - // 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 - // endless loops. - if (!editor) { - this.recentlyClosedFiles.pop(); - this.reopenLastClosedEditor(); - } - })(); + const associatedResources: URI[] = []; + const editorResource = toResource(editor, { supportSideBySide: SideBySideEditor.BOTH }); + if (URI.isUri(editorResource)) { + associatedResources.push(editorResource); + } else if (editorResource) { + associatedResources.push(...coalesce([editorResource.master, editorResource.detail])); + } + + // Remove from list of recently closed before... + this.removeFromRecentlyClosedEditors(editor); + + // ...adding it as last recently closed + this.recentlyClosedEditors.push({ + resource: editor.resource, + associatedResources, + serialized: { typeId: editor.getTypeId(), value: serialized }, + index: event.index, + sticky: event.sticky + }); + + // Bounding + if (this.recentlyClosedEditors.length > HistoryService.MAX_RECENTLY_CLOSED_EDITORS) { + this.recentlyClosedEditors.shift(); } // Context - this.canReopenClosedEditorContextKey.set(this.recentlyClosedFiles.length > 0); + this.canReopenClosedEditorContextKey.set(true); } - private containsRecentlyClosedFile(group: IEditorGroup, recentlyClosedEditor: IRecentlyClosedFile): boolean { - for (const editor of group.editors) { - if (isEqual(editor.resource, recentlyClosedEditor.resource)) { - return true; - } + reopenLastClosedEditor(): void { + + // Open editor if we have one + const lastClosedEditor = this.recentlyClosedEditors.pop(); + if (lastClosedEditor) { + this.doReopenLastClosedEditor(lastClosedEditor); } - return false; + // Update context + this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); } - private removeFromRecentlyClosedFiles(arg1: IEditorInput | IResourceEditorInput | FileChangesEvent): void { - this.recentlyClosedFiles = this.recentlyClosedFiles.filter(e => !this.matchesFile(e.resource, arg1)); - this.canReopenClosedEditorContextKey.set(this.recentlyClosedFiles.length > 0); + private async doReopenLastClosedEditor(lastClosedEditor: IRecentlyClosedEditor): Promise { + + // Determine editor options + let options: IEditorOptions; + if (lastClosedEditor.sticky) { + // Sticky: in case the target index is outside of the range of + // sticky editors, we make sure to not provide the index as + // option. Otherwise the index will cause the sticky flag to + // be ignored. + if (!this.editorGroupService.activeGroup.isSticky(lastClosedEditor.index)) { + options = { pinned: true, sticky: true, ignoreError: true }; + } else { + options = { pinned: true, sticky: true, index: lastClosedEditor.index, ignoreError: true }; + } + } else { + options = { pinned: true, index: lastClosedEditor.index, ignoreError: true }; + } + + // Deserialize and open editor unless already opened + const restoredEditor = this.editorInputFactory.getEditorInputFactory(lastClosedEditor.serialized.typeId)?.deserialize(this.instantiationService, lastClosedEditor.serialized.value); + let editorPane: IEditorPane | undefined = undefined; + if (restoredEditor && !this.editorGroupService.activeGroup.isOpened(restoredEditor)) { + editorPane = await this.editorService.openEditor(restoredEditor, options); + } + + // 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 + // endless loops. + remove(this.recentlyClosedEditors, lastClosedEditor); + this.reopenLastClosedEditor(); + } + } + + private removeFromRecentlyClosedEditors(arg1: IEditorInput | IResourceEditorInput | FileChangesEvent): void { + this.recentlyClosedEditors = this.recentlyClosedEditors.filter(recentlyClosedEditor => { + if (recentlyClosedEditor.resource && this.matchesFile(recentlyClosedEditor.resource, arg1)) { + return false; // editor matches directly + } + + if (recentlyClosedEditor.associatedResources.some(associatedResource => this.matchesFile(associatedResource, arg1))) { + return false; // an associated resource matches + } + + return true; + }); + + // Update context + this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); } //#endregion @@ -720,7 +756,7 @@ export class HistoryService extends Disposable implements IHistoryService { 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.recentlyClosedFiles.length > 0); + this.canReopenClosedEditorContextKey.set(this.recentlyClosedEditors.length > 0); } //#endregion @@ -825,21 +861,23 @@ export class HistoryService extends Disposable implements IHistoryService { const entriesRaw = this.storageService.get(HistoryService.HISTORY_STORAGE_KEY, StorageScope.WORKSPACE); if (entriesRaw) { - entries = coalesce(JSON.parse(entriesRaw)); + try { + entries = coalesce(JSON.parse(entriesRaw)); + } catch (error) { + onUnexpectedError(error); // https://github.com/microsoft/vscode/issues/99075 + } } - const registry = Registry.as(EditorExtensions.EditorInputFactories); - return coalesce(entries.map(entry => { try { - return this.safeLoadHistoryEntry(registry, entry); + return this.safeLoadHistoryEntry(entry); } catch (error) { return undefined; // https://github.com/Microsoft/vscode/issues/60960 } })); } - private safeLoadHistoryEntry(registry: IEditorInputFactoryRegistry, entry: ISerializedEditorHistoryEntry): IEditorInput | IResourceEditorInput | undefined { + private safeLoadHistoryEntry(entry: ISerializedEditorHistoryEntry): IEditorInput | IResourceEditorInput | undefined { const serializedEditorHistoryEntry = entry; // File resource: via URI.revive() @@ -850,7 +888,7 @@ export class HistoryService extends Disposable implements IHistoryService { // Editor input: via factory const { editorInputJSON } = serializedEditorHistoryEntry; if (editorInputJSON?.deserialized) { - const factory = registry.getEditorInputFactory(editorInputJSON.typeId); + const factory = this.editorInputFactory.getEditorInputFactory(editorInputJSON.typeId); if (factory) { const input = factory.deserialize(this.instantiationService, editorInputJSON.deserialized); if (input) { @@ -869,13 +907,11 @@ export class HistoryService extends Disposable implements IHistoryService { return; // nothing to save because history was not used } - const registry = Registry.as(EditorExtensions.EditorInputFactories); - const entries: ISerializedEditorHistoryEntry[] = coalesce(this.history.map((input): ISerializedEditorHistoryEntry | undefined => { // Editor input: try via factory if (input instanceof EditorInput) { - const factory = registry.getEditorInputFactory(input.getTypeId()); + const factory = this.editorInputFactory.getEditorInputFactory(input.getTypeId()); if (factory) { const deserialized = factory.serialize(input); if (deserialized) { diff --git a/src/vs/workbench/services/history/common/history.ts b/src/vs/workbench/services/history/common/history.ts index 73f405b3a4..085a6bd30e 100644 --- a/src/vs/workbench/services/history/common/history.ts +++ b/src/vs/workbench/services/history/common/history.ts @@ -12,7 +12,7 @@ export const IHistoryService = createDecorator('historyService' export interface IHistoryService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Re-opens the last closed editor if any. diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index 46510561e2..d03f4c0b9d 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -59,7 +59,7 @@ export interface IWorkspaceProvider { export class BrowserHostService extends Disposable implements IHostService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private workspaceProvider: IWorkspaceProvider; @@ -224,7 +224,7 @@ export class BrowserHostService extends Disposable implements IHostService { (async () => { // Wait for the resources to be closed in the editor... - await this.editorService.whenClosed(fileOpenables.map(openable => openable.fileUri), { waitForSaved: true }); + await this.editorService.whenClosed(fileOpenables.map(openable => ({ resource: openable.fileUri })), { waitForSaved: true }); // ...before deleting the wait marker file await this.fileService.del(waitMarkerFileURI); diff --git a/src/vs/workbench/services/host/browser/host.ts b/src/vs/workbench/services/host/browser/host.ts index ca472fede8..53d7e0823f 100644 --- a/src/vs/workbench/services/host/browser/host.ts +++ b/src/vs/workbench/services/host/browser/host.ts @@ -11,7 +11,7 @@ export const IHostService = createDecorator('hostService'); export interface IHostService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; //#region Focus diff --git a/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts b/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts index b46880f594..0cf8235da3 100644 --- a/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-sandbox/desktopHostService.ts @@ -14,7 +14,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; export class DesktopHostService extends Disposable implements IHostService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IElectronService private readonly electronService: IElectronService, diff --git a/src/vs/workbench/services/integrity/browser/integrityService.ts b/src/vs/workbench/services/integrity/browser/integrityService.ts index 33767222e1..3b9aaab2ce 100644 --- a/src/vs/workbench/services/integrity/browser/integrityService.ts +++ b/src/vs/workbench/services/integrity/browser/integrityService.ts @@ -8,7 +8,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class BrowserIntegrityServiceImpl implements IIntegrityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; async isPure(): Promise { return { isPure: true, proof: [] }; diff --git a/src/vs/workbench/services/integrity/common/integrity.ts b/src/vs/workbench/services/integrity/common/integrity.ts index 246a60c709..72a4324276 100644 --- a/src/vs/workbench/services/integrity/common/integrity.ts +++ b/src/vs/workbench/services/integrity/common/integrity.ts @@ -21,7 +21,7 @@ export interface IntegrityTestResult { } export interface IIntegrityService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; isPure(): Promise; } diff --git a/src/vs/workbench/services/integrity/node/integrityService.ts b/src/vs/workbench/services/integrity/node/integrityService.ts index bf4d7fa1dd..1f8389368e 100644 --- a/src/vs/workbench/services/integrity/node/integrityService.ts +++ b/src/vs/workbench/services/integrity/node/integrityService.ts @@ -10,7 +10,7 @@ import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; import { ChecksumPair, IIntegrityService, IntegrityTestResult } from 'vs/workbench/services/integrity/common/integrity'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -56,7 +56,7 @@ class IntegrityStorage { export class IntegrityServiceImpl implements IIntegrityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _storage: IntegrityStorage; private _isPurePromise: Promise; @@ -65,7 +65,8 @@ export class IntegrityServiceImpl implements IIntegrityService { @INotificationService private readonly notificationService: INotificationService, @IStorageService storageService: IStorageService, @ILifecycleService private readonly lifecycleService: ILifecycleService, - @IOpenerService private readonly openerService: IOpenerService + @IOpenerService private readonly openerService: IOpenerService, + @IProductService private readonly productService: IProductService ) { this._storage = new IntegrityStorage(storageService); @@ -82,12 +83,12 @@ export class IntegrityServiceImpl implements IIntegrityService { private _prompt(): void { const storedData = this._storage.get(); - if (storedData?.dontShowPrompt && storedData.commit === product.commit) { + if (storedData?.dontShowPrompt && storedData.commit === this.productService.commit) { return; // Do not prompt } - const checksumFailMoreInfoUrl = product.checksumFailMoreInfoUrl; - const message = nls.localize('integrity.prompt', "Your {0} installation appears to be corrupt. Please reinstall.", product.nameShort); + const checksumFailMoreInfoUrl = this.productService.checksumFailMoreInfoUrl; + const message = nls.localize('integrity.prompt', "Your {0} installation appears to be corrupt. Please reinstall.", this.productService.nameShort); if (checksumFailMoreInfoUrl) { this.notificationService.prompt( Severity.Warning, @@ -100,7 +101,7 @@ export class IntegrityServiceImpl implements IIntegrityService { { label: nls.localize('integrity.dontShowAgain', "Don't Show Again"), isSecondary: true, - run: () => this._storage.set({ dontShowPrompt: true, commit: product.commit }) + run: () => this._storage.set({ dontShowPrompt: true, commit: this.productService.commit }) } ], { sticky: true } @@ -119,7 +120,7 @@ export class IntegrityServiceImpl implements IIntegrityService { } private async _isPure(): Promise { - const expectedChecksums = product.checksums || {}; + const expectedChecksums = this.productService.checksums || {}; await this.lifecycleService.when(LifecyclePhase.Eventually); diff --git a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts index a0ad06a9ee..5a01e063b0 100644 --- a/src/vs/workbench/services/issue/electron-sandbox/issueService.ts +++ b/src/vs/workbench/services/issue/electron-sandbox/issueService.ts @@ -10,7 +10,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class IssueService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(@IMainProcessService mainProcessService: IMainProcessService) { return createChannelSender(mainProcessService.getChannel('issue')); diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index c07d2cc57d..aabd1ae91b 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -30,7 +30,7 @@ export const IKeybindingEditingService = createDecorator; diff --git a/src/vs/workbench/services/keybinding/common/keymapInfo.ts b/src/vs/workbench/services/keybinding/common/keymapInfo.ts index 425fa59b65..e65cd55524 100644 --- a/src/vs/workbench/services/keybinding/common/keymapInfo.ts +++ b/src/vs/workbench/services/keybinding/common/keymapInfo.ts @@ -94,7 +94,7 @@ export type IKeyboardLayoutInfo = (IWindowsKeyboardLayoutInfo | ILinuxKeyboardLa export const IKeymapService = createDecorator('keymapService'); export interface IKeymapService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidChangeKeyboardMapper: Event; getKeyboardMapper(dispatchConfig: DispatchConfig): IKeyboardMapper; getCurrentKeyboardLayout(): IKeyboardLayoutInfo | null; diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index 91e58bbae0..f965e82325 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -58,6 +58,8 @@ import { TestTextResourcePropertiesService, TestContextService, TestWorkingCopyS import { IThemeService } from 'vs/platform/theme/common/themeService'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; class TestEnvironmentService extends NativeWorkbenchEnvironmentService { @@ -117,6 +119,7 @@ suite('KeybindingsEditing', () => { fileService.registerProvider(Schemas.file, diskFileSystemProvider); fileService.registerProvider(Schemas.userData, new FileUserDataProvider(environmentService.appSettingsHome, environmentService.backupHome, diskFileSystemProvider, environmentService, new NullLogService())); instantiationService.stub(IFileService, fileService); + instantiationService.stub(IUriIdentityService, new UriIdentityService(fileService)); instantiationService.stub(IWorkingCopyService, new TestWorkingCopyService()); instantiationService.stub(IWorkingCopyFileService, instantiationService.createInstance(WorkingCopyFileService)); instantiationService.stub(ITextFileService, instantiationService.createInstance(TestTextFileService)); diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts index 63a9cc285e..3263135b43 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxFallbackKeyboardMapper.test.ts @@ -107,9 +107,9 @@ suite('keyboardMapper - MAC fallback', () => { }, { label: '⌘', - ariaLabel: 'Command+', + ariaLabel: 'Command', electronAccelerator: null, - userSettingsLabel: 'cmd+', + userSettingsLabel: 'cmd', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -228,10 +228,10 @@ suite('keyboardMapper - LINUX fallback', () => { code: null! }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts index 84d4bef62f..5ea3e8e36a 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/macLinuxKeyboardMapper.test.ts @@ -344,9 +344,9 @@ suite('keyboardMapper - MAC de_ch', () => { }, { label: '⌘', - ariaLabel: 'Command+', + ariaLabel: 'Command', electronAccelerator: null, - userSettingsLabel: 'cmd+', + userSettingsLabel: 'cmd', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -368,9 +368,9 @@ suite('keyboardMapper - MAC de_ch', () => { }, { label: '⌘', - ariaLabel: 'Command+', + ariaLabel: 'Command', electronAccelerator: null, - userSettingsLabel: 'cmd+', + userSettingsLabel: 'cmd', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -425,9 +425,9 @@ suite('keyboardMapper - MAC en_us', () => { }, { label: '⌘', - ariaLabel: 'Command+', + ariaLabel: 'Command', electronAccelerator: null, - userSettingsLabel: 'cmd+', + userSettingsLabel: 'cmd', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -449,9 +449,9 @@ suite('keyboardMapper - MAC en_us', () => { }, { label: '⌘', - ariaLabel: 'Command+', + ariaLabel: 'Command', electronAccelerator: null, - userSettingsLabel: 'cmd+', + userSettingsLabel: 'cmd', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -780,10 +780,10 @@ suite('keyboardMapper - LINUX de_ch', () => { code: 'ControlLeft' }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -804,10 +804,10 @@ suite('keyboardMapper - LINUX de_ch', () => { code: 'ControlRight' }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -1180,10 +1180,10 @@ suite('keyboardMapper - LINUX en_us', () => { code: 'ControlLeft' }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -1204,10 +1204,10 @@ suite('keyboardMapper - LINUX en_us', () => { code: 'ControlRight' }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts index c1deaa7985..166e0afa55 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/windowsKeyboardMapper.test.ts @@ -308,10 +308,10 @@ suite('keyboardMapper - WINDOWS de_ch', () => { code: null! }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], @@ -396,10 +396,10 @@ suite('keyboardMapper - WINDOWS en_us', () => { code: null! }, { - label: 'Ctrl+', - ariaLabel: 'Control+', + label: 'Ctrl', + ariaLabel: 'Control', electronAccelerator: null, - userSettingsLabel: 'ctrl+', + userSettingsLabel: 'ctrl', isWYSIWYG: true, isChord: false, dispatchParts: [null], diff --git a/src/vs/workbench/services/label/common/labelService.ts b/src/vs/workbench/services/label/common/labelService.ts index 5a256e5858..30db647de4 100644 --- a/src/vs/workbench/services/label/common/labelService.ts +++ b/src/vs/workbench/services/label/common/labelService.ts @@ -14,7 +14,6 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { IWorkspaceContextService, IWorkspace } from 'vs/platform/workspace/common/workspace'; import { isEqual, basenameOrAuthority, basename, joinPath, dirname } from 'vs/base/common/resources'; import { tildify, getPathLabel } from 'vs/base/common/labels'; -import { ltrim } from 'vs/base/common/strings'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, WORKSPACE_EXTENSION, toWorkspaceIdentifier, isWorkspaceIdentifier, isUntitledWorkspace } 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'; @@ -92,7 +91,7 @@ Registry.as(WorkbenchExtensions.Workbench).regi export class LabelService extends Disposable implements ILabelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private formatters: ResourceLabelFormatter[] = []; @@ -139,20 +138,24 @@ export class LabelService extends Disposable implements ILabelService { } let label: string | undefined; - const baseResource = this.contextService && this.contextService.getWorkspaceFolder(resource); + const baseResource = this.contextService?.getWorkspaceFolder(resource); if (options.relative && baseResource) { + const rootName = baseResource?.name ?? basenameOrAuthority(baseResource.uri); + let relativeLabel: string; if (isEqual(baseResource.uri, resource)) { relativeLabel = ''; // no label if resources are identical } else { const baseResourceLabel = this.formatUri(baseResource.uri, formatting, options.noPrefix); - relativeLabel = ltrim(this.formatUri(resource, formatting, options.noPrefix).substring(baseResourceLabel.length), formatting.separator); + relativeLabel = this.formatUri(resource, formatting, options.noPrefix).substring(baseResourceLabel.lastIndexOf(formatting.separator) + 1); + if (relativeLabel.startsWith(rootName)) { + relativeLabel = relativeLabel.substring(rootName.length + (relativeLabel[rootName.length] === formatting.separator ? 1 : 0)); + } } const hasMultipleRoots = this.contextService.getWorkspace().folders.length > 1; if (hasMultipleRoots && !options.noPrefix) { - const rootName = (baseResource && baseResource.name) ? baseResource.name : basenameOrAuthority(baseResource.uri); relativeLabel = relativeLabel ? (rootName + ' • ' + relativeLabel) : rootName; // always show root basename if there are multiple } diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index 655c3b8863..145c073e12 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -50,7 +50,7 @@ export function positionFromString(str: string): Position { export interface IWorkbenchLayoutService extends ILayoutService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Emits when the zen mode is enabled or disabled. diff --git a/src/vs/workbench/services/lifecycle/browser/lifecycleService.ts b/src/vs/workbench/services/lifecycle/browser/lifecycleService.ts index 7bf38f5cc9..e806c6957f 100644 --- a/src/vs/workbench/services/lifecycle/browser/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/browser/lifecycleService.ts @@ -11,7 +11,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class BrowserLifecycleService extends AbstractLifecycleService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ILogService readonly logService: ILogService diff --git a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts index 2759bf89ad..2368d5e4f5 100644 --- a/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts +++ b/src/vs/workbench/services/lifecycle/electron-sandbox/lifecycleService.ts @@ -20,7 +20,7 @@ export class NativeLifecycleService extends AbstractLifecycleService { private static readonly LAST_SHUTDOWN_REASON_KEY = 'lifecyle.lastShutdownReason'; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private shutdownReason: ShutdownReason | undefined; diff --git a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts index f6e6a40b09..eb8bd71b9e 100644 --- a/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts +++ b/src/vs/workbench/services/localizations/electron-browser/localizationsService.ts @@ -10,7 +10,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class LocalizationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @ISharedProcessService sharedProcessService: ISharedProcessService, diff --git a/src/vs/workbench/services/log/common/keyValueLogProvider.ts b/src/vs/workbench/services/log/common/keyValueLogProvider.ts index abb5abe487..98ebb8c216 100644 --- a/src/vs/workbench/services/log/common/keyValueLogProvider.ts +++ b/src/vs/workbench/services/log/common/keyValueLogProvider.ts @@ -14,7 +14,9 @@ import { localize } from 'vs/nls'; export abstract class KeyValueLogProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability { - readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.FileReadWrite; + readonly capabilities: FileSystemProviderCapabilities = + FileSystemProviderCapabilities.FileReadWrite + | FileSystemProviderCapabilities.PathCaseSensitive; readonly onDidChangeCapabilities: Event = Event.None; private readonly _onDidChangeFile = this._register(new Emitter()); diff --git a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts index 35a37f0436..c7475118af 100644 --- a/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts +++ b/src/vs/workbench/services/menubar/electron-sandbox/menubarService.ts @@ -10,7 +10,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class MenubarService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(@IMainProcessService mainProcessService: IMainProcessService) { return createChannelSender(mainProcessService.getChannel('menubar')); diff --git a/src/vs/workbench/services/notification/common/notificationService.ts b/src/vs/workbench/services/notification/common/notificationService.ts index 0142a2c152..b6418474b9 100644 --- a/src/vs/workbench/services/notification/common/notificationService.ts +++ b/src/vs/workbench/services/notification/common/notificationService.ts @@ -14,7 +14,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag export class NotificationService extends Disposable implements INotificationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _model: INotificationsModel = this._register(new NotificationsModel()); get model(): INotificationsModel { return this._model; } diff --git a/src/vs/workbench/services/output/common/outputChannelModel.ts b/src/vs/workbench/services/output/common/outputChannelModel.ts index 7818fc5227..a51a0a024e 100644 --- a/src/vs/workbench/services/output/common/outputChannelModel.ts +++ b/src/vs/workbench/services/output/common/outputChannelModel.ts @@ -31,7 +31,7 @@ export interface IOutputChannelModel extends IDisposable { export const IOutputChannelModelService = createDecorator('outputChannelModelService'); export interface IOutputChannelModelService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; createOutputChannelModel(id: string, modelUri: URI, mimeType: string, file?: URI): IOutputChannelModel; diff --git a/src/vs/workbench/services/output/common/outputChannelModelService.ts b/src/vs/workbench/services/output/common/outputChannelModelService.ts index 45f9d2f983..a5371ec133 100644 --- a/src/vs/workbench/services/output/common/outputChannelModelService.ts +++ b/src/vs/workbench/services/output/common/outputChannelModelService.ts @@ -7,7 +7,7 @@ import { IOutputChannelModelService, AsbtractOutputChannelModelService } from 'v import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class OutputChannelModelService extends AsbtractOutputChannelModelService implements IOutputChannelModelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; } registerSingleton(IOutputChannelModelService, OutputChannelModelService); diff --git a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts index ea869fa803..7b73f5ef44 100644 --- a/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts +++ b/src/vs/workbench/services/output/electron-browser/outputChannelModelService.ts @@ -200,7 +200,7 @@ class DelegatedOutputChannelModel extends Disposable implements IOutputChannelMo export class OutputChannelModelService extends AsbtractOutputChannelModelService implements IOutputChannelModelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IInstantiationService instantiationService: IInstantiationService, diff --git a/src/vs/workbench/services/panel/common/panelService.ts b/src/vs/workbench/services/panel/common/panelService.ts index fa7d9bee1b..bae0d2b829 100644 --- a/src/vs/workbench/services/panel/common/panelService.ts +++ b/src/vs/workbench/services/panel/common/panelService.ts @@ -20,7 +20,7 @@ export interface IPanelIdentifier { export interface IPanelService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidPanelOpen: Event<{ readonly panel: IPanel, readonly focus: boolean }>; readonly onDidPanelClose: Event; diff --git a/src/vs/workbench/services/path/common/pathService.ts b/src/vs/workbench/services/path/common/pathService.ts index 490eeb9551..812c5f611f 100644 --- a/src/vs/workbench/services/path/common/pathService.ts +++ b/src/vs/workbench/services/path/common/pathService.ts @@ -18,7 +18,7 @@ export const IPathService = createDecorator('path'); */ export interface IPathService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * The correct path library to use for the target environment. If @@ -53,7 +53,7 @@ export interface IPathService { export abstract class AbstractPathService implements IPathService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private remoteOS: Promise; diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 4b0c7663b6..0c9a074c14 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -46,7 +46,7 @@ const emptyEditableSettingsContent = '{\n}'; export class PreferencesService extends Disposable implements IPreferencesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private lastOpenedSettingsInput: PreferencesEditorInput | null = null; @@ -546,7 +546,7 @@ export class PreferencesService extends Disposable implements IPreferencesServic return this.textFileService.read(workspaceConfig) .then(content => { if (Object.keys(parse(content.value)).indexOf('settings') === -1) { - return this.jsonEditingService.write(resource, [{ key: 'settings', value: {} }], true).then(undefined, () => { }); + return this.jsonEditingService.write(resource, [{ path: ['settings'], value: {} }], true).then(undefined, () => { }); } return undefined; }); @@ -614,9 +614,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic const type = schema ? schema.type : 'object' /* Override Identifier */; let setting = settingsModel.getPreference(settingKey); if (!setting) { - const defaultValue = type === 'array' ? this.configurationService.inspect(settingKey).defaultValue : getDefaultValue(type); + const defaultValue = (type === 'object' || type === 'array') ? this.configurationService.inspect(settingKey).defaultValue : getDefaultValue(type); if (defaultValue !== undefined) { - await this.jsonEditingService.write(settingsModel.uri!, [{ key: settingKey, value: defaultValue }], false); + const key = settingsModel instanceof WorkspaceConfigurationEditorModel ? ['settings', settingKey] : [settingKey]; + await this.jsonEditingService.write(settingsModel.uri!, [{ path: key, value: defaultValue }], false); setting = settingsModel.getPreference(settingKey); } } diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index dea03aace0..3a02c81109 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -7,6 +7,7 @@ import { IStringDictionary } from 'vs/base/common/collections'; import { Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { IRange } from 'vs/editor/common/core/range'; +import { IJSONSchemaMap, IJSONSchema } from 'vs/base/common/jsonSchema'; import { ITextModel } from 'vs/editor/common/model'; import { localize } from 'vs/nls'; import { ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; @@ -29,7 +30,8 @@ export enum SettingValueType { Exclude = 'exclude', Complex = 'complex', NullableInteger = 'nullable-integer', - NullableNumber = 'nullable-number' + NullableNumber = 'nullable-number', + Object = 'object' } export interface ISettingsGroup { @@ -64,6 +66,9 @@ export interface ISetting { scope?: ConfigurationScope; type?: string | string[]; arrayItemType?: string; + objectProperties?: IJSONSchemaMap, + objectPatternProperties?: IJSONSchemaMap, + objectAdditionalProperties?: boolean | IJSONSchema, enum?: string[]; enumDescriptions?: string[]; enumDescriptionsAreMarkdown?: boolean; @@ -188,7 +193,7 @@ export interface IKeybindingsEditorModel extends IPreferencesEditorModel { export const IPreferencesService = createDecorator('preferencesService'); export interface IPreferencesService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; userSettingsResource: URI; workspaceSettingsResource: URI | null; diff --git a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts index ccd8fbe541..7dd4f1a996 100644 --- a/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts +++ b/src/vs/workbench/services/preferences/common/preferencesEditorInput.ts @@ -45,7 +45,7 @@ export class DefaultPreferencesEditorInput extends ResourceEditorInput { @ILabelService labelService: ILabelService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService ) { - super(nls.localize('settingsEditorName', "Default Settings"), '', defaultSettingsResource, undefined, textModelResolverService, textFileService, editorService, editorGroupService, fileService, labelService, filesConfigurationService); + super(defaultSettingsResource, nls.localize('settingsEditorName', "Default Settings"), '', undefined, textModelResolverService, textFileService, editorService, editorGroupService, fileService, labelService, filesConfigurationService); } getTypeId(): string { @@ -80,6 +80,7 @@ export class KeybindingsEditorInput extends EditorInput { constructor(@IInstantiationService instantiationService: IInstantiationService) { super(); + this.keybindingsModel = instantiationService.createInstance(KeybindingsEditorModel, OS); } @@ -91,13 +92,19 @@ export class KeybindingsEditorInput extends EditorInput { return nls.localize('keybindingsInputName', "Keyboard Shortcuts"); } - resolve(): Promise { - return Promise.resolve(this.keybindingsModel); + async resolve(): Promise { + return this.keybindingsModel; } matches(otherInput: unknown): boolean { return otherInput instanceof KeybindingsEditorInput; } + + dispose(): void { + this.keybindingsModel.dispose(); + + super.dispose(); + } } export class SettingsEditor2Input extends EditorInput { @@ -130,7 +137,13 @@ export class SettingsEditor2Input extends EditorInput { return nls.localize('settingsEditor2InputName', "Settings"); } - resolve(): Promise { - return Promise.resolve(this._settingsModel); + async resolve(): Promise { + return this._settingsModel; + } + + dispose(): void { + this._settingsModel.dispose(); + + super.dispose(); } } diff --git a/src/vs/workbench/services/preferences/common/preferencesModels.ts b/src/vs/workbench/services/preferences/common/preferencesModels.ts index 40273298a7..c0d07d5f05 100644 --- a/src/vs/workbench/services/preferences/common/preferencesModels.ts +++ b/src/vs/workbench/services/preferences/common/preferencesModels.ts @@ -620,6 +620,10 @@ export class DefaultSettings extends Disposable { ? prop.items.type : undefined; + const objectProperties = prop.type === 'object' ? prop.properties : undefined; + const objectPatternProperties = prop.type === 'object' ? prop.patternProperties : undefined; + const objectAdditionalProperties = prop.type === 'object' ? prop.additionalProperties : undefined; + result.push({ key, value, @@ -633,6 +637,9 @@ export class DefaultSettings extends Disposable { scope: prop.scope, type: prop.type, arrayItemType: listItemType, + objectProperties, + objectPatternProperties, + objectAdditionalProperties, enum: prop.enum, enumDescriptions: prop.enumDescriptions || prop.markdownEnumDescriptions, enumDescriptionsAreMarkdown: !prop.enumDescriptions, diff --git a/src/vs/workbench/services/progress/browser/progressIndicator.ts b/src/vs/workbench/services/progress/browser/progressIndicator.ts index 8b05bc5107..12b0f23c6a 100644 --- a/src/vs/workbench/services/progress/browser/progressIndicator.ts +++ b/src/vs/workbench/services/progress/browser/progressIndicator.ts @@ -61,7 +61,7 @@ export class ProgressBarIndicator extends Disposable implements IProgressIndicat export class EditorProgressIndicator extends ProgressBarIndicator { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(progressBar: ProgressBar, private readonly group: IEditorGroupView) { super(progressBar); diff --git a/src/vs/workbench/services/progress/browser/progressService.ts b/src/vs/workbench/services/progress/browser/progressService.ts index f22e42a197..8d0cd08d6a 100644 --- a/src/vs/workbench/services/progress/browser/progressService.ts +++ b/src/vs/workbench/services/progress/browser/progressService.ts @@ -29,7 +29,7 @@ import { IViewsService, IViewDescriptorService, ViewContainerLocation } from 'vs export class ProgressService extends Disposable implements IProgressService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IActivityService private readonly activityService: IActivityService, diff --git a/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl.ts b/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl.ts index e31c39fb98..4c6a396f8c 100644 --- a/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl.ts +++ b/src/vs/workbench/services/remote/browser/remoteAgentServiceImpl.ts @@ -27,7 +27,7 @@ export class RemoteAgentService extends AbstractRemoteAgentService implements IR @ISignService signService: ISignService, @ILogService logService: ILogService ) { - super(environmentService); + super(environmentService, remoteAuthorityResolverService); this.socketFactory = new BrowserSocketFactory(webSocketFactory); const remoteAuthority = environmentService.configuration.remoteAuthority; diff --git a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts index 3c2d467a5a..7a9ca4a923 100644 --- a/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/abstractRemoteAgentService.ts @@ -25,12 +25,13 @@ import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; export abstract class AbstractRemoteAgentService extends Disposable { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _environment: Promise | null; constructor( - @IEnvironmentService protected readonly _environmentService: IEnvironmentService + @IEnvironmentService protected readonly _environmentService: IEnvironmentService, + @IRemoteAuthorityResolverService private readonly _remoteAuthorityResolverService: IRemoteAuthorityResolverService ) { super(); this._environment = null; @@ -41,7 +42,11 @@ export abstract class AbstractRemoteAgentService extends Disposable { getEnvironment(bail?: boolean): Promise { if (!this._environment) { this._environment = this._withChannel( - (channel, connection) => RemoteExtensionEnvironmentChannelClient.getEnvironmentData(channel, connection.remoteAuthority, this._environmentService.extensionDevelopmentLocationURI), + async (channel, connection) => { + const env = await RemoteExtensionEnvironmentChannelClient.getEnvironmentData(channel, connection.remoteAuthority, this._environmentService.extensionDevelopmentLocationURI); + this._remoteAuthorityResolverService._setAuthorityConnectionToken(connection.remoteAuthority, env.connectionToken); + return env; + }, null ); } diff --git a/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel.ts b/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel.ts index a1ce53f7a0..3fe8fb9396 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel.ts +++ b/src/vs/workbench/services/remote/common/remoteAgentEnvironmentChannel.ts @@ -9,7 +9,6 @@ import { IChannel } from 'vs/base/parts/ipc/common/ipc'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IRemoteAgentEnvironment } from 'vs/platform/remote/common/remoteAgentEnvironment'; import { IDiagnosticInfoOptions, IDiagnosticInfo } from 'vs/platform/diagnostics/common/diagnostics'; -import { RemoteAuthorities } from 'vs/base/common/network'; import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; export interface IGetEnvironmentDataArguments { @@ -44,8 +43,6 @@ export class RemoteExtensionEnvironmentChannelClient { const data = await channel.call('getEnvironmentData', args); - RemoteAuthorities.setConnectionToken(remoteAuthority, data.connectionToken); - return { pid: data.pid, connectionToken: data.connectionToken, diff --git a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts b/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts index 402117352a..4a71a87603 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts +++ b/src/vs/workbench/services/remote/common/remoteAgentFileSystemChannel.ts @@ -51,8 +51,12 @@ export class RemoteFileSystemProvider extends Disposable implements const connection = remoteAgentService.getConnection()!; this.channel = connection.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); + // Initially assume case sensitivity until remote environment is resolved this.setCaseSensitive(true); - remoteAgentService.getEnvironment().then(remoteAgentEnvironment => this.setCaseSensitive(!!(remoteAgentEnvironment && remoteAgentEnvironment.os === OperatingSystem.Linux))); + (async () => { + const remoteAgentEnvironment = await remoteAgentService.getEnvironment(); + this.setCaseSensitive(remoteAgentEnvironment?.os === OperatingSystem.Linux); + })(); this.registerListeners(); } @@ -117,7 +121,7 @@ export class RemoteFileSystemProvider extends Disposable implements return buff.buffer; } - readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents { + readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents { const stream = newWriteableStream(data => VSBuffer.concat(data.map(data => VSBuffer.wrap(data))).buffer); // Reading as file stream goes through an event to the remote side @@ -152,19 +156,17 @@ export class RemoteFileSystemProvider extends Disposable implements }); // Support cancellation - if (token) { - token.onCancellationRequested(() => { + token.onCancellationRequested(() => { - // Ensure to end the stream properly with an error - // to indicate the cancellation. - stream.end(canceled()); + // Ensure to end the stream properly with an error + // to indicate the cancellation. + stream.end(canceled()); - // Ensure to dispose the listener upon cancellation. This will - // bubble through the remote side as event and allows to stop - // reading the file. - listener.dispose(); - }); - } + // Ensure to dispose the listener upon cancellation. This will + // bubble through the remote side as event and allows to stop + // reading the file. + listener.dispose(); + }); return stream; } diff --git a/src/vs/workbench/services/remote/common/remoteAgentService.ts b/src/vs/workbench/services/remote/common/remoteAgentService.ts index 84727f0ed9..dd0968c6d2 100644 --- a/src/vs/workbench/services/remote/common/remoteAgentService.ts +++ b/src/vs/workbench/services/remote/common/remoteAgentService.ts @@ -16,7 +16,7 @@ export const RemoteExtensionLogFileName = 'remoteagent'; export const IRemoteAgentService = createDecorator('remoteAgentService'); export interface IRemoteAgentService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly socketFactory: ISocketFactory; diff --git a/src/vs/workbench/services/remote/common/remoteExplorerService.ts b/src/vs/workbench/services/remote/common/remoteExplorerService.ts index 961d8a180c..db49632527 100644 --- a/src/vs/workbench/services/remote/common/remoteExplorerService.ts +++ b/src/vs/workbench/services/remote/common/remoteExplorerService.ts @@ -11,7 +11,8 @@ import { ITunnelService, RemoteTunnel } from 'vs/platform/remote/common/tunnel'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IEditableData } from 'vs/workbench/common/views'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { TunnelInformation, TunnelDescription } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { TunnelInformation, TunnelDescription, IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; +import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; export const IRemoteExplorerService = createDecorator('remoteExplorerService'); export const REMOTE_EXPLORER_TYPE_KEY: string = 'remote.explorerType'; @@ -75,7 +76,9 @@ export class TunnelModel extends Disposable { constructor( @ITunnelService private readonly tunnelService: ITunnelService, @IStorageService private readonly storageService: IStorageService, - @IConfigurationService private readonly configurationService: IConfigurationService + @IConfigurationService private readonly configurationService: IConfigurationService, + @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService private readonly remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { super(); this.forwarded = new Map(); @@ -137,7 +140,13 @@ export class TunnelModel extends Disposable { async forward(remote: { host: string, port: number }, local?: number, name?: string): Promise { const key = MakeAddress(remote.host, remote.port); if (!this.forwarded.has(key)) { - const tunnel = await this.tunnelService.openTunnel(remote.host, remote.port, local); + const authority = this.environmentService.configuration.remoteAuthority; + const resolvedRemote = authority ? await this.remoteAuthorityResolverService.resolveAuthority(authority) : undefined; + if (!resolvedRemote) { + return; + } + + const tunnel = await this.tunnelService.openTunnel(resolvedRemote.authority, remote.host, remote.port, local); if (tunnel && tunnel.localAddress) { const newForward: Tunnel = { remoteHost: tunnel.tunnelRemoteHost, @@ -224,7 +233,7 @@ export class TunnelModel extends Disposable { } export interface IRemoteExplorerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidChangeTargetType: Event; targetType: string[]; readonly tunnelModel: TunnelModel; @@ -253,9 +262,11 @@ class RemoteExplorerService implements IRemoteExplorerService { constructor( @IStorageService private readonly storageService: IStorageService, @ITunnelService tunnelService: ITunnelService, - @IConfigurationService configurationService: IConfigurationService + @IConfigurationService configurationService: IConfigurationService, + @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, + @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, ) { - this._tunnelModel = new TunnelModel(tunnelService, storageService, configurationService); + this._tunnelModel = new TunnelModel(tunnelService, storageService, configurationService, environmentService, remoteAuthorityResolverService); } set targetType(name: string[]) { diff --git a/src/vs/workbench/services/remote/common/tunnelService.ts b/src/vs/workbench/services/remote/common/tunnelService.ts deleted file mode 100644 index d6d15895e6..0000000000 --- a/src/vs/workbench/services/remote/common/tunnelService.ts +++ /dev/null @@ -1,151 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the Source EULA. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { ITunnelService, RemoteTunnel, ITunnelProvider } from 'vs/platform/remote/common/tunnel'; -import { Event, Emitter } from 'vs/base/common/event'; -import { IDisposable } from 'vs/base/common/lifecycle'; -import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { ILogService } from 'vs/platform/log/common/log'; - -export abstract class AbstractTunnelService implements ITunnelService { - _serviceBrand: undefined; - - 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; - protected readonly _tunnels = new Map }>>(); - protected _tunnelProvider: ITunnelProvider | undefined; - - public constructor( - @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @ILogService protected readonly logService: ILogService - ) { } - - setTunnelProvider(provider: ITunnelProvider | undefined): IDisposable { - if (!provider) { - return { - dispose: () => { } - }; - } - this._tunnelProvider = provider; - return { - dispose: () => { - this._tunnelProvider = undefined; - } - }; - } - - public get tunnels(): Promise { - const promises: Promise[] = []; - Array.from(this._tunnels.values()).forEach(portMap => Array.from(portMap.values()).forEach(x => promises.push(x.value))); - return Promise.all(promises); - } - - dispose(): void { - for (const portMap of this._tunnels.values()) { - for (const { value } of portMap.values()) { - value.then(tunnel => tunnel.dispose()); - } - portMap.clear(); - } - this._tunnels.clear(); - } - - openTunnel(remoteHost: string | undefined, remotePort: number, localPort: number): Promise | undefined { - const remoteAuthority = this.environmentService.configuration.remoteAuthority; - if (!remoteAuthority) { - return undefined; - } - - if (!remoteHost || (remoteHost === '127.0.0.1')) { - remoteHost = 'localhost'; - } - - const resolvedTunnel = this.retainOrCreateTunnel(remoteAuthority, remoteHost, remotePort, localPort); - if (!resolvedTunnel) { - return resolvedTunnel; - } - - return resolvedTunnel.then(tunnel => { - const newTunnel = this.makeTunnel(tunnel); - if (tunnel.tunnelRemoteHost !== remoteHost || tunnel.tunnelRemotePort !== remotePort) { - this.logService.warn('Created tunnel does not match requirements of requested tunnel. Host or port mismatch.'); - } - this._onTunnelOpened.fire(newTunnel); - return newTunnel; - }); - } - - private makeTunnel(tunnel: RemoteTunnel): RemoteTunnel { - return { - tunnelRemotePort: tunnel.tunnelRemotePort, - tunnelRemoteHost: tunnel.tunnelRemoteHost, - tunnelLocalPort: tunnel.tunnelLocalPort, - localAddress: tunnel.localAddress, - dispose: () => { - const existingHost = this._tunnels.get(tunnel.tunnelRemoteHost); - if (existingHost) { - const existing = existingHost.get(tunnel.tunnelRemotePort); - if (existing) { - existing.refcount--; - this.tryDisposeTunnel(tunnel.tunnelRemoteHost, tunnel.tunnelRemotePort, existing); - } - } - } - }; - } - - private async tryDisposeTunnel(remoteHost: string, remotePort: number, tunnel: { refcount: number, readonly value: Promise }): Promise { - if (tunnel.refcount <= 0) { - const disposePromise: Promise = tunnel.value.then(tunnel => { - tunnel.dispose(true); - this._onTunnelClosed.fire({ host: tunnel.tunnelRemoteHost, port: tunnel.tunnelRemotePort }); - }); - if (this._tunnels.has(remoteHost)) { - this._tunnels.get(remoteHost)!.delete(remotePort); - } - return disposePromise; - } - } - - async closeTunnel(remoteHost: string, remotePort: number): Promise { - const portMap = this._tunnels.get(remoteHost); - if (portMap && portMap.has(remotePort)) { - const value = portMap.get(remotePort)!; - value.refcount = 0; - await this.tryDisposeTunnel(remoteHost, remotePort, value); - } - } - - protected addTunnelToMap(remoteHost: string, remotePort: number, tunnel: Promise) { - if (!this._tunnels.has(remoteHost)) { - this._tunnels.set(remoteHost, new Map()); - } - this._tunnels.get(remoteHost)!.set(remotePort, { refcount: 1, value: tunnel }); - } - - protected abstract retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number): Promise | undefined; -} - -export class TunnelService extends AbstractTunnelService { - protected retainOrCreateTunnel(remoteAuthority: string, remoteHost: string, remotePort: number, localPort?: number | undefined): Promise | undefined { - const portMap = this._tunnels.get(remoteHost); - const existing = portMap ? portMap.get(remotePort) : undefined; - if (existing) { - ++existing.refcount; - return existing.value; - } - - if (this._tunnelProvider) { - const tunnel = this._tunnelProvider.forwardPort({ remoteAddress: { host: remoteHost, port: remotePort } }); - if (tunnel) { - this.addTunnelToMap(remoteHost, remotePort, tunnel); - } - return tunnel; - } - return undefined; - } -} diff --git a/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts b/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts index 133121a29c..b120b54be6 100644 --- a/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts +++ b/src/vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts @@ -5,7 +5,7 @@ import { IRemoteAgentConnection, IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { nodeSocketFactory } from 'vs/platform/remote/node/nodeSocketFactory'; import { AbstractRemoteAgentService, RemoteAgentConnection } from 'vs/workbench/services/remote/common/abstractRemoteAgentService'; import { ISignService } from 'vs/platform/sign/common/sign'; @@ -23,12 +23,13 @@ export class RemoteAgentService extends AbstractRemoteAgentService implements IR @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @IRemoteAuthorityResolverService remoteAuthorityResolverService: IRemoteAuthorityResolverService, @ISignService signService: ISignService, - @ILogService logService: ILogService + @ILogService logService: ILogService, + @IProductService productService: IProductService ) { - super(environmentService); + super(environmentService, remoteAuthorityResolverService); this.socketFactory = nodeSocketFactory; if (environmentService.configuration.remoteAuthority) { - this._connection = this._register(new RemoteAgentConnection(environmentService.configuration.remoteAuthority, product.commit, nodeSocketFactory, remoteAuthorityResolverService, signService, logService)); + this._connection = this._register(new RemoteAgentConnection(environmentService.configuration.remoteAuthority, productService.commit, nodeSocketFactory, remoteAuthorityResolverService, signService, logService)); } } diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index 14835b1553..cdb47f8caa 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -18,6 +18,7 @@ import { Event } from 'vs/base/common/event'; import { relative } from 'vs/base/common/path'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ResourceGlobMatcher } from 'vs/workbench/common/resources'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; export const VIEWLET_ID = 'workbench.view.search'; export const PANEL_ID = 'workbench.panel.search'; @@ -31,7 +32,7 @@ export const ISearchService = createDecorator('searchService'); * A service that enables to search for files or with in files. */ export interface ISearchService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; textSearch(query: ITextQuery, token?: CancellationToken, onProgress?: (result: ISearchProgressItem) => void): Promise; fileSearch(query: IFileQuery, token?: CancellationToken): Promise; clearCache(cacheKey: string): Promise; @@ -350,7 +351,7 @@ export interface ISearchConfigurationProperties { searchEditor: { doubleClickBehaviour: 'selectWord' | 'goToLocation' | 'openLocationToSide', reusePriorSearchConfiguration: boolean, - defaultShowContextValue: number | null, + defaultNumberOfContextLines: number | null, experimental: {} }; sortOrder: SearchSortOrder; @@ -422,7 +423,8 @@ export enum SearchErrorCode { globParseError, invalidLiteral, rgProcessError, - other + other, + canceled } export class SearchError extends Error { @@ -431,7 +433,13 @@ export class SearchError extends Error { } } -export function deserializeSearchError(errorMsg: string): SearchError { +export function deserializeSearchError(error: Error): SearchError { + const errorMsg = error.message; + + if (isPromiseCanceledError(error)) { + return new SearchError(errorMsg, SearchErrorCode.canceled); + } + try { const details = JSON.parse(errorMsg); return new SearchError(details.message, details.code); diff --git a/src/vs/workbench/services/search/common/searchService.ts b/src/vs/workbench/services/search/common/searchService.ts index 85f12ecc19..0a43f14eba 100644 --- a/src/vs/workbench/services/search/common/searchService.ts +++ b/src/vs/workbench/services/search/common/searchService.ts @@ -7,7 +7,7 @@ import * as arrays from 'vs/base/common/arrays'; import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; -import { keys, ResourceMap, values } from 'vs/base/common/map'; +import { keys, ResourceMap } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; import { StopWatch } from 'vs/base/common/stopwatch'; import { URI as uri } from 'vs/base/common/uri'; @@ -24,7 +24,7 @@ import { DeferredPromise } from 'vs/base/test/common/utils'; export class SearchService extends Disposable implements ISearchService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; protected diskSearch: ISearchResultProvider | null = null; private readonly fileSearchProviders = new Map(); @@ -260,7 +260,8 @@ export class SearchService extends Disposable implements ISearchService { }, err => { const endToEndTime = e2eSW.elapsed(); this.logService.trace(`SearchService#search: ${endToEndTime}ms`); - const searchError = deserializeSearchError(err.message); + const searchError = deserializeSearchError(err); + this.logService.trace(`SearchService#searchError: ${searchError.message}`); this.sendTelemetry(query, endToEndTime, undefined, searchError); throw searchError; @@ -387,7 +388,8 @@ export class SearchService extends Disposable implements ISearchService { err.code === SearchErrorCode.globParseError ? 'glob' : err.code === SearchErrorCode.invalidLiteral ? 'literal' : err.code === SearchErrorCode.other ? 'other' : - 'unknown'; + err.code === SearchErrorCode.canceled ? 'canceled' : + 'unknown'; } type TextSearchCompleteClassification = { @@ -491,7 +493,7 @@ export class SearchService extends Disposable implements ISearchService { clearCache(cacheKey: string): Promise { const clearPs = [ this.diskSearch, - ...values(this.fileSearchProviders) + ...Array.from(this.fileSearchProviders.values()) ].map(provider => provider && provider.clearCache(cacheKey)); return Promise.all(clearPs) diff --git a/src/vs/workbench/services/search/test/common/replace.test.ts b/src/vs/workbench/services/search/test/common/replace.test.ts index cc9ea1424b..0d4a6e4fab 100644 --- a/src/vs/workbench/services/search/test/common/replace.test.ts +++ b/src/vs/workbench/services/search/test/common/replace.test.ts @@ -109,7 +109,7 @@ suite('Replace Pattern test', () => { actual = testObject.getReplaceString('bla'); assert.equal('hellobla', actual); - testObject = new ReplacePattern('import * as $1 from \'$2\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w\.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); + testObject = new ReplacePattern('import * as $1 from \'$2\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); actual = testObject.getReplaceString('let fs = require(\'fs\')'); assert.equal('import * as fs from \'fs\';', actual); @@ -119,19 +119,19 @@ suite('Replace Pattern test', () => { actual = testObject.getReplaceString('let require(\'fs\')'); assert.equal(null, actual); - testObject = new ReplacePattern('import * as $1 from \'$1\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w\.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); + testObject = new ReplacePattern('import * as $1 from \'$1\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); actual = testObject.getReplaceString('let something = require(\'fs\')'); assert.equal('import * as something from \'something\';', actual); - testObject = new ReplacePattern('import * as $2 from \'$1\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w\.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); + testObject = new ReplacePattern('import * as $2 from \'$1\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); actual = testObject.getReplaceString('let something = require(\'fs\')'); assert.equal('import * as fs from \'something\';', actual); - testObject = new ReplacePattern('import * as $0 from \'$0\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w\.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); + testObject = new ReplacePattern('import * as $0 from \'$0\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: true }); actual = testObject.getReplaceString('let something = require(\'fs\');'); assert.equal('import * as let something = require(\'fs\') from \'let something = require(\'fs\')\';', actual); - testObject = new ReplacePattern('import * as $1 from \'$2\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w\.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: false }); + testObject = new ReplacePattern('import * as $1 from \'$2\';', { pattern: 'let\\s+(\\w+)\\s*=\\s*require\\s*\\(\\s*[\'\"]([\\w.\\-/]+)\\s*[\'\"]\\s*\\)\\s*', isRegExp: false }); actual = testObject.getReplaceString('let fs = require(\'fs\');'); assert.equal(null, actual); diff --git a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts index 323b6f209c..f3f4f6e7a4 100644 --- a/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts +++ b/src/vs/workbench/services/search/test/node/textSearch.integrationTest.ts @@ -370,7 +370,7 @@ suite('TextSearch-integration', function () { return doSearchTest(config, 0).then(() => { throw new Error('expected fail'); }, err => { - const searchError = deserializeSearchError(err.message); + const searchError = deserializeSearchError(err); assert.equal(searchError.message, 'Unknown encoding: invalidEncoding'); assert.equal(searchError.code, SearchErrorCode.unknownEncoding); }); @@ -386,7 +386,7 @@ suite('TextSearch-integration', function () { return doSearchTest(config, 0).then(() => { throw new Error('expected fail'); }, err => { - const searchError = deserializeSearchError(err.message); + const searchError = deserializeSearchError(err); let regexParseErrorForUnclosedParenthesis = 'Regex parse error: unmatched closing parenthesis'; assert.equal(searchError.message, regexParseErrorForUnclosedParenthesis); assert.equal(searchError.code, SearchErrorCode.regexParseError); @@ -403,7 +403,7 @@ suite('TextSearch-integration', function () { return doSearchTest(config, 0).then(() => { throw new Error('expected fail'); }, err => { - const searchError = deserializeSearchError(err.message); + const searchError = deserializeSearchError(err); let regexParseErrorForLookAround = 'Regex parse error: lookbehind assertion is not fixed length'; assert.equal(searchError.message, regexParseErrorForLookAround); assert.equal(searchError.code, SearchErrorCode.regexParseError); @@ -424,7 +424,7 @@ suite('TextSearch-integration', function () { return doSearchTest(config, 0).then(() => { throw new Error('expected fail'); }, err => { - const searchError = deserializeSearchError(err.message); + const searchError = deserializeSearchError(err); assert.equal(searchError.message, 'Error parsing glob \'/{{}\': nested alternate groups are not allowed'); assert.equal(searchError.code, SearchErrorCode.globParseError); }); diff --git a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts index 8edc11c8fb..842231ac75 100644 --- a/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts +++ b/src/vs/workbench/services/sharedProcess/electron-browser/sharedProcessService.ts @@ -15,7 +15,7 @@ import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron export class SharedProcessService implements ISharedProcessService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private withSharedProcessConnection: Promise>; private sharedProcessMainChannel: IChannel; diff --git a/src/vs/workbench/services/statusbar/common/statusbar.ts b/src/vs/workbench/services/statusbar/common/statusbar.ts index 05c9d14029..7b2479255f 100644 --- a/src/vs/workbench/services/statusbar/common/statusbar.ts +++ b/src/vs/workbench/services/statusbar/common/statusbar.ts @@ -61,7 +61,7 @@ export interface IStatusbarEntry { export interface IStatusbarService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * 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 e396a2b9ea..1c2333a2b2 100644 --- a/src/vs/workbench/services/telemetry/browser/telemetryService.ts +++ b/src/vs/workbench/services/telemetry/browser/telemetryService.ts @@ -33,7 +33,7 @@ export class WebTelemetryAppender implements ITelemetryAppender { export class TelemetryService extends Disposable implements ITelemetryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private impl: ITelemetryService; public readonly sendErrorTelemetry = false; diff --git a/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts b/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts index 46676e28b1..f38a6c7180 100644 --- a/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts +++ b/src/vs/workbench/services/telemetry/electron-browser/telemetryService.ts @@ -21,7 +21,7 @@ import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/enviro export class TelemetryService extends Disposable implements ITelemetryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private impl: ITelemetryService; public readonly sendErrorTelemetry: boolean; diff --git a/src/vs/workbench/services/textMate/common/textMateService.ts b/src/vs/workbench/services/textMate/common/textMateService.ts index 7f0020c030..6b73362a80 100644 --- a/src/vs/workbench/services/textMate/common/textMateService.ts +++ b/src/vs/workbench/services/textMate/common/textMateService.ts @@ -10,7 +10,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' export const ITextMateService = createDecorator('textMateService'); export interface ITextMateService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; onDidEncounterLanguage: Event; diff --git a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts index 0cb36cb8f6..fb819669c4 100644 --- a/src/vs/workbench/services/textfile/browser/browserTextFileService.ts +++ b/src/vs/workbench/services/textfile/browser/browserTextFileService.ts @@ -11,7 +11,7 @@ import { ShutdownReason } from 'vs/platform/lifecycle/common/lifecycle'; export class BrowserTextFileService extends AbstractTextFileService { readonly encoding: IResourceEncodings = { - getPreferredWriteEncoding(): IResourceEncoding { + async getPreferredWriteEncoding(): Promise { return { encoding: 'utf8', hasBOM: false }; } }; diff --git a/src/vs/workbench/services/textfile/browser/textFileService.ts b/src/vs/workbench/services/textfile/browser/textFileService.ts index 461fef0eb6..29bdf18411 100644 --- a/src/vs/workbench/services/textfile/browser/textFileService.ts +++ b/src/vs/workbench/services/textfile/browser/textFileService.ts @@ -19,7 +19,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { Schemas } from 'vs/base/common/network'; import { createTextBufferFactoryFromSnapshot, createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { isEqual, joinPath, dirname, basename, toLocalResource } from 'vs/base/common/resources'; +import { joinPath, dirname, basename, toLocalResource } from 'vs/base/common/resources'; import { IDialogService, IFileDialogService, IConfirmation } from 'vs/platform/dialogs/common/dialogs'; import { VSBuffer } from 'vs/base/common/buffer'; import { ITextSnapshot, ITextModel } from 'vs/editor/common/model'; @@ -34,13 +34,14 @@ import { suggestFilename } from 'vs/base/common/mime'; import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { isValidBasename } from 'vs/base/common/extpath'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; /** * The workbench file service implementation implements the raw file service spec and adds additional methods on top. */ export abstract class AbstractTextFileService extends Disposable implements ITextFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region events @@ -69,7 +70,8 @@ export abstract class AbstractTextFileService extends Disposable implements ITex @ITextModelService private readonly textModelService: ITextModelService, @ICodeEditorService private readonly codeEditorService: ICodeEditorService, @IPathService private readonly pathService: IPathService, - @IWorkingCopyFileService private readonly workingCopyFileService: IWorkingCopyFileService + @IWorkingCopyFileService private readonly workingCopyFileService: IWorkingCopyFileService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { super(); @@ -223,7 +225,18 @@ export abstract class AbstractTextFileService extends Disposable implements ITex // Just save if target is same as models own resource if (source.toString() === target.toString()) { - return this.save(source, options); + return this.save(source, { ...options, force: true /* force to save, even if not dirty (https://github.com/microsoft/vscode/issues/99619) */ }); + } + + // If the target is different but of same identity, we + // move the source to the target, knowing that the + // underlying file system cannot have both and then save. + // However, this will only work if the source exists + // and is not orphaned, so we need to check that too. + if (this.fileService.canHandleResource(source) && this.uriIdentityService.extUri.isEqual(source, target) && (await this.fileService.exists(source))) { + await this.workingCopyFileService.move(source, target); + + return this.save(target, options); } // Do it @@ -329,7 +342,7 @@ export abstract class AbstractTextFileService extends Disposable implements ITex // path. This can happen if the file was created after the untitled file was opened. // See https://github.com/Microsoft/vscode/issues/67946 let write: boolean; - if (sourceModel instanceof UntitledTextEditorModel && sourceModel.hasAssociatedFilePath && targetExists && isEqual(target, toLocalResource(sourceModel.resource, this.environmentService.configuration.remoteAuthority))) { + if (sourceModel instanceof UntitledTextEditorModel && sourceModel.hasAssociatedFilePath && targetExists && this.uriIdentityService.extUri.isEqual(target, toLocalResource(sourceModel.resource, this.environmentService.configuration.remoteAuthority))) { write = await this.confirmOverwrite(target); } else { write = true; diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 6d22ae2684..9a26558b35 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -286,6 +286,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } private async loadFromBackup(backup: IResolvedBackup, options?: ITextFileLoadOptions): Promise { + const preferredEncoding = await this.textFileService.encoding.getPreferredWriteEncoding(this.resource, this.preferredEncoding); // Load with backup this.loadFromContent({ @@ -296,7 +297,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil size: backup.meta ? backup.meta.size : 0, etag: backup.meta ? backup.meta.etag : ETAG_DISABLED, // etag disabled if unknown! value: backup.value, - encoding: this.textFileService.encoding.getPreferredWriteEncoding(this.resource, this.preferredEncoding).encoding + encoding: preferredEncoding.encoding }, options, true /* from backup */); // Restore orphaned flag based on state diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts index db7bdf7e89..ace5dd7d83 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModelManager.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { toErrorMessage } from 'vs/base/common/errorMessage'; -import { Emitter } from 'vs/base/common/event'; +import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { dispose, IDisposable, Disposable, DisposableStore } from 'vs/base/common/lifecycle'; @@ -23,9 +23,10 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IWorkingCopyFileService, WorkingCopyFileEvent } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { ITextSnapshot, ITextBufferFactory } from 'vs/editor/common/model'; -import { joinPath, isEqualOrParent, isEqual, extUri } from 'vs/base/common/resources'; +import { joinPath, extUri } from 'vs/base/common/resources'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export class TextFileEditorModelManager extends Disposable implements ITextFileEditorModelManager { @@ -76,7 +77,8 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE @IInstantiationService private readonly instantiationService: IInstantiationService, @IFileService private readonly fileService: IFileService, @INotificationService private readonly notificationService: INotificationService, - @IWorkingCopyFileService private readonly workingCopyFileService: IWorkingCopyFileService + @IWorkingCopyFileService private readonly workingCopyFileService: IWorkingCopyFileService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { super(); @@ -142,11 +144,12 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE for (const model of this.models) { const resource = model.resource; - if (extUri.isEqualOrParent(resource, e.target/* do not ignorecase, see https://github.com/Microsoft/vscode/issues/56384 */)) { + if (extUri.isEqualOrParent(resource, e.target)) { + // EXPLICITLY do not ignorecase, see https://github.com/Microsoft/vscode/issues/56384 targetModels.push(model); } - if (isEqualOrParent(resource, source)) { + if (this.uriIdentityService.extUri.isEqualOrParent(resource, source)) { sourceModels.push(model); } } @@ -159,7 +162,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE // If the source is the actual model, just use target as new resource let targetModelResource: URI; - if (isEqual(sourceModelResource, e.source)) { + if (this.uriIdentityService.extUri.isEqual(sourceModelResource, e.source)) { targetModelResource = e.target; } @@ -191,7 +194,10 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE this.mapCorrelationIdToModelsToRestore.delete(e.correlationId); modelsToRestore.forEach(model => { - // snapshot presence means this model used to be dirty + + // snapshot presence means this model used to be dirty and so we restore that + // flag. we do NOT have to restore the content because the model was only soft + // reverted and did not loose its original dirty contents. if (model.snapshot) { this.get(model.source)?.setDirty(true); } @@ -347,7 +353,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE this.mapResourceToModelListeners.set(model.resource, modelListeners); } - add(resource: URI, model: TextFileEditorModel): void { + protected add(resource: URI, model: TextFileEditorModel): void { const knownModel = this.mapResourceToModel.get(resource); if (knownModel === model) { return; // already cached @@ -364,7 +370,7 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE this.mapResourceToDisposeListener.set(resource, model.onDispose(() => this.remove(resource))); } - remove(resource: URI): void { + protected remove(resource: URI): void { this.mapResourceToModel.delete(resource); const disposeListener = this.mapResourceToDisposeListener.get(resource); @@ -401,32 +407,52 @@ export class TextFileEditorModelManager extends Disposable implements ITextFileE this.mapResourceToPendingModelLoaders.clear(); // dispose the dispose listeners - this.mapResourceToDisposeListener.forEach(l => l.dispose()); + this.mapResourceToDisposeListener.forEach(listener => listener.dispose()); this.mapResourceToDisposeListener.clear(); // dispose the model change listeners - this.mapResourceToModelListeners.forEach(l => l.dispose()); + this.mapResourceToModelListeners.forEach(listener => listener.dispose()); this.mapResourceToModelListeners.clear(); } - disposeModel(model: TextFileEditorModel): void { - if (!model) { - return; // we need data! + canDispose(model: TextFileEditorModel): true | Promise { + + // quick return if model already disposed or not dirty and not loading + if ( + model.isDisposed() || + (!this.mapResourceToPendingModelLoaders.has(model.resource) && !model.isDirty()) + ) { + return true; } - if (model.isDisposed()) { - return; // already disposed - } - - if (this.mapResourceToPendingModelLoaders.has(model.resource)) { - return; // not yet loaded + // promise based return in all other cases + return this.doCanDispose(model); + } + + private async doCanDispose(model: TextFileEditorModel): Promise { + + // pending model load: wait for the load to finish before trying again + const pendingModelLoad = this.mapResourceToPendingModelLoaders.get(model.resource); + if (pendingModelLoad) { + try { + await pendingModelLoad; + } catch (error) { + // ignore any error + } + + return this.canDispose(model); } + // dirty model: we do not allow to dispose dirty models to prevent + // data loss cases. dirty models can only be disposed when they are + // either saved or reverted if (model.isDirty()) { - return; // not saved + await Event.toPromise(model.onDidChangeDirty); + + return this.canDispose(model); } - model.dispose(); + return true; } dispose(): void { diff --git a/src/vs/workbench/services/textfile/common/textfiles.ts b/src/vs/workbench/services/textfile/common/textfiles.ts index b2e0dd3020..e1a6764eee 100644 --- a/src/vs/workbench/services/textfile/common/textfiles.ts +++ b/src/vs/workbench/services/textfile/common/textfiles.ts @@ -27,7 +27,7 @@ export interface TextFileCreateEvent extends IWaitUntil { export interface ITextFileService extends IDisposable { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Access to the manager of text file editor models providing further @@ -171,7 +171,7 @@ export class TextFileOperationError extends FileOperationError { } export interface IResourceEncodings { - getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding; + getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): Promise; } export interface IResourceEncoding { @@ -327,8 +327,14 @@ export interface ITextFileEditorModelManager { readonly onDidSave: Event; readonly onDidRevert: Event; + /** + * Access to all text file editor models in memory. + */ readonly models: ITextFileEditorModel[]; + /** + * Allows to configure the error handler that is called on save errors. + */ saveErrorHandler: ISaveErrorHandler; /** @@ -352,7 +358,12 @@ export interface ITextFileEditorModelManager { */ runSaveParticipants(model: ITextFileEditorModel, context: { reason: SaveReason; }, token: CancellationToken): Promise - disposeModel(model: ITextFileEditorModel): void; + /** + * Waits for the model to be ready to be disposed. There may be conditions + * under which the model cannot be disposed, e.g. when it is dirty. Once the + * promise is settled, it is safe to dispose the model. + */ + canDispose(model: ITextFileEditorModel): true | Promise; } export interface ITextFileSaveOptions extends ISaveOptions { diff --git a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts index a55cc52934..8f2e94a4ea 100644 --- a/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts +++ b/src/vs/workbench/services/textfile/electron-browser/nativeTextFileService.ts @@ -3,7 +3,6 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { tmpdir } from 'os'; import { localize } from 'vs/nls'; import { AbstractTextFileService } from 'vs/workbench/services/textfile/browser/textFileService'; import { ITextFileService, ITextFileStreamContent, ITextFileContent, IResourceEncodings, IResourceEncoding, IReadTextFileOptions, IWriteTextFileOptions, stringToSnapshot, TextFileOperationResult, TextFileOperationError } from 'vs/workbench/services/textfile/common/textfiles'; @@ -11,22 +10,21 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { URI } from 'vs/base/common/uri'; import { IFileStatWithMetadata, ICreateFileOptions, FileOperationError, FileOperationResult, IFileStreamContent, IFileService } from 'vs/platform/files/common/files'; import { Schemas } from 'vs/base/common/network'; -import { exists, stat, chmod, rimraf, MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/base/node/pfs'; +import { stat, chmod, MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/base/node/pfs'; import { join, dirname } from 'vs/base/common/path'; import { isMacintosh } from 'vs/base/common/platform'; import { IProductService } from 'vs/platform/product/common/productService'; import { ITextResourceConfigurationService } from 'vs/editor/common/services/textResourceConfigurationService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { UTF8, UTF8_with_bom, UTF16be, UTF16le, encodingExists, encodeStream, UTF8_BOM, toDecodeStream, IDecodeStreamResult, detectEncodingByBOMFromBuffer, isUTFEncoding } from 'vs/base/node/encoding'; +import { UTF8, UTF8_with_bom, UTF16be, UTF16le, encodingExists, UTF8_BOM, toDecodeStream, toEncodeReadable, IDecodeStreamResult, detectEncodingByBOMFromBuffer } from 'vs/base/node/encoding'; import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { joinPath, extname, isEqualOrParent } from 'vs/base/common/resources'; import { Disposable } from 'vs/base/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { VSBufferReadable, bufferToStream } from 'vs/base/common/buffer'; -import { Readable } from 'stream'; +import { bufferToStream, VSBufferReadable } from 'vs/base/common/buffer'; import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; import { ITextSnapshot } from 'vs/editor/common/model'; -import { nodeReadableToString, streamToNodeReadable, nodeStreamToVSBufferReadable } from 'vs/base/node/stream'; +import { consumeStream } from 'vs/base/common/stream'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -40,6 +38,7 @@ import { IPathService } from 'vs/workbench/services/path/common/pathService'; import { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'; import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-browser/environmentService'; import { ILogService } from 'vs/platform/log/common/log'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export class NativeTextFileService extends AbstractTextFileService { @@ -59,9 +58,10 @@ export class NativeTextFileService extends AbstractTextFileService { @ICodeEditorService codeEditorService: ICodeEditorService, @IPathService pathService: IPathService, @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService, - @ILogService private readonly logService: ILogService + @ILogService private readonly logService: ILogService, + @IUriIdentityService uriIdentityService: IUriIdentityService ) { - super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, dialogService, fileDialogService, textResourceConfigurationService, filesConfigurationService, textModelService, codeEditorService, pathService, workingCopyFileService); + super(fileService, untitledTextEditorService, lifecycleService, instantiationService, modelService, environmentService, dialogService, fileDialogService, textResourceConfigurationService, filesConfigurationService, textModelService, codeEditorService, pathService, workingCopyFileService, uriIdentityService); } private _encoding: EncodingOracle | undefined; @@ -87,7 +87,7 @@ export class NativeTextFileService extends AbstractTextFileService { return { ...bufferStream, encoding: decoder.detected.encoding || UTF8, - value: await nodeReadableToString(decoder.stream) + value: await consumeStream(decoder.stream, strings => strings.join('')) }; } @@ -119,7 +119,7 @@ export class NativeTextFileService extends AbstractTextFileService { } // read through encoding library - const decoder = await toDecodeStream(streamToNodeReadable(bufferStream.value), { + const decoder = await toDecodeStream(bufferStream.value, { guessEncoding: options?.autoGuessEncoding || this.textResourceConfigurationService.getValue(resource, 'files.autoGuessEncoding'), overwriteEncoding: detectedEncoding => this.encoding.getReadEncoding(resource, options, detectedEncoding) }); @@ -170,14 +170,15 @@ export class NativeTextFileService extends AbstractTextFileService { } // otherwise create with encoding - return this.fileService.createFile(resource, this.getEncodedReadable(value || '', encoding, addBOM), options); + const encodedReadable = await this.getEncodedReadable(value || '', encoding, addBOM); + return this.fileService.createFile(resource, encodedReadable, options); } async write(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { // check for overwriteReadonly property (only supported for local file://) try { - if (options?.overwriteReadonly && resource.scheme === Schemas.file && await exists(resource.fsPath)) { + if (options?.overwriteReadonly && resource.scheme === Schemas.file && await this.fileService.exists(resource)) { const fileStat = await stat(resource.fsPath); // try to change mode to writeable @@ -204,7 +205,8 @@ export class NativeTextFileService extends AbstractTextFileService { // otherwise save with encoding else { - return await this.fileService.writeFile(resource, this.getEncodedReadable(value, encoding, addBOM), options); + const encodedReadable = await this.getEncodedReadable(value, encoding, addBOM); + return await this.fileService.writeFile(resource, encodedReadable, options); } } catch (error) { @@ -229,57 +231,31 @@ export class NativeTextFileService extends AbstractTextFileService { } } - private getEncodedReadable(value: string | ITextSnapshot, encoding: string, addBOM: boolean): VSBufferReadable { - const readable = this.snapshotToNodeReadable(typeof value === 'string' ? stringToSnapshot(value) : value); - const encoder = encodeStream(encoding, { addBOM }); - - const encodedReadable = readable.pipe(encoder); - - return nodeStreamToVSBufferReadable(encodedReadable, addBOM && isUTFEncoding(encoding) ? { encoding } : undefined); - } - - private snapshotToNodeReadable(snapshot: ITextSnapshot): Readable { - return new Readable({ - read: function () { - try { - let chunk: string | null = null; - let canPush = true; - - // Push all chunks as long as we can push and as long as - // the underlying snapshot returns strings to us - while (canPush && typeof (chunk = snapshot.read()) === 'string') { - canPush = this.push(chunk); - } - - // Signal EOS by pushing NULL - if (typeof chunk !== 'string') { - this.push(null); - } - } catch (error) { - this.emit('error', error); - } - }, - encoding: UTF8 // very important, so that strings are passed around and not buffers! - }); + private getEncodedReadable(value: string | ITextSnapshot, encoding: string, addBOM: boolean): Promise { + const snapshot = typeof value === 'string' ? stringToSnapshot(value) : value; + return toEncodeReadable(snapshot, encoding, { addBOM }); } private async writeElevated(resource: URI, value: string | ITextSnapshot, options?: IWriteTextFileOptions): Promise { // write into a tmp file first - const tmpPath = join(tmpdir(), `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`); + const source = URI.file(join(this.environmentService.userDataPath, `code-elevated-${Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 6)}`)); const { encoding, addBOM } = await this.encoding.getWriteEncoding(resource, options); - await this.write(URI.file(tmpPath), value, { encoding: encoding === UTF8 && addBOM ? UTF8_with_bom : encoding }); + try { + await this.write(source, value, { encoding: encoding === UTF8 && addBOM ? UTF8_with_bom : encoding }); - // sudo prompt copy - await this.sudoPromptCopy(tmpPath, resource.fsPath, options); + // sudo prompt copy + await this.sudoPromptCopy(source, resource, options); + } finally { - // clean up - await rimraf(tmpPath); + // clean up + await this.fileService.del(source); + } return this.fileService.resolve(resource, { resolveMetadata: true }); } - private async sudoPromptCopy(source: string, target: string, options?: IWriteTextFileOptions): Promise { + private async sudoPromptCopy(source: URI, target: URI, options?: IWriteTextFileOptions): Promise { // load sudo-prompt module lazy const sudoPrompt = await import('sudo-prompt'); @@ -295,7 +271,7 @@ export class NativeTextFileService extends AbstractTextFileService { sudoCommand.push('--file-chmod'); } - sudoCommand.push('--file-write', `"${source}"`, `"${target}"`); + sudoCommand.push('--file-write', `"${source.fsPath}"`, `"${target.fsPath}"`); sudoPrompt.exec(sudoCommand.join(' '), promptOptions, (error: string, stdout: string, stderr: string) => { if (stdout) { @@ -323,7 +299,10 @@ export interface IEncodingOverride { } export class EncodingOracle extends Disposable implements IResourceEncodings { - protected encodingOverrides: IEncodingOverride[]; + + private _encodingOverrides: IEncodingOverride[]; + protected get encodingOverrides(): IEncodingOverride[] { return this._encodingOverrides; } + protected set encodingOverrides(value: IEncodingOverride[]) { this._encodingOverrides = value; } constructor( @ITextResourceConfigurationService private textResourceConfigurationService: ITextResourceConfigurationService, @@ -333,7 +312,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { ) { super(); - this.encodingOverrides = this.getDefaultEncodingOverrides(); + this._encodingOverrides = this.getDefaultEncodingOverrides(); this.registerListeners(); } @@ -363,7 +342,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { } async getWriteEncoding(resource: URI, options?: IWriteTextFileOptions): Promise<{ encoding: string, addBOM: boolean }> { - const { encoding, hasBOM } = this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined); + const { encoding, hasBOM } = await this.getPreferredWriteEncoding(resource, options ? options.encoding : undefined); // Some encodings come with a BOM automatically if (hasBOM) { @@ -387,8 +366,8 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { return { encoding, addBOM: false }; } - getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): IResourceEncoding { - const resourceEncoding = this.getEncodingForResource(resource, preferredEncoding); + async getPreferredWriteEncoding(resource: URI, preferredEncoding?: string): Promise { + const resourceEncoding = await this.getEncodingForResource(resource, preferredEncoding); return { encoding: resourceEncoding, @@ -396,7 +375,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { }; } - getReadEncoding(resource: URI, options: IReadTextFileOptions | undefined, detectedEncoding: string | null): string { + getReadEncoding(resource: URI, options: IReadTextFileOptions | undefined, detectedEncoding: string | null): Promise { let preferredEncoding: string | undefined; // Encoding passed in as option @@ -421,7 +400,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { return this.getEncodingForResource(resource, preferredEncoding); } - private getEncodingForResource(resource: URI, preferredEncoding?: string): string { + private async getEncodingForResource(resource: URI, preferredEncoding?: string): Promise { let fileEncoding: string; const override = this.getEncodingOverride(resource); @@ -433,7 +412,7 @@ export class EncodingOracle extends Disposable implements IResourceEncodings { fileEncoding = this.textResourceConfigurationService.getValue(resource, 'files.encoding'); // and last we check for settings } - if (!fileEncoding || !encodingExists(fileEncoding)) { + if (!fileEncoding || !(await encodingExists(fileEncoding))) { fileEncoding = UTF8; // the default is UTF 8 } diff --git a/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts index b48bf014d8..b04d7ad3cf 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileEditorModelManager.test.ts @@ -7,13 +7,15 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; -import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { FileChangesEvent, FileChangeType } from 'vs/platform/files/common/files'; import { toResource } from 'vs/base/test/common/utils'; import { ModesRegistry, PLAINTEXT_MODE_ID } from 'vs/editor/common/modes/modesRegistry'; import { ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; +import { extUri } from 'vs/base/common/resources'; +import { timeout } from 'vs/base/common/async'; suite('Files - TextFileEditorModelManager', () => { @@ -26,7 +28,7 @@ suite('Files - TextFileEditorModelManager', () => { }); test('add, remove, clear, get, getAll', function () { - const manager: TextFileEditorModelManager = instantiationService.createInstance(TextFileEditorModelManager); + const manager: TestTextFileEditorModelManager = instantiationService.createInstance(TestTextFileEditorModelManager); const model1: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/random1.txt'), 'utf8', undefined); const model2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/random2.txt'), 'utf8', undefined); @@ -81,7 +83,7 @@ suite('Files - TextFileEditorModelManager', () => { }); test('resolve', async () => { - const manager: TextFileEditorModelManager = instantiationService.createInstance(TextFileEditorModelManager); + const manager: TestTextFileEditorModelManager = instantiationService.createInstance(TestTextFileEditorModelManager); const resource = URI.file('/test.html'); const encoding = 'utf8'; @@ -115,7 +117,7 @@ suite('Files - TextFileEditorModelManager', () => { }); test('removed from cache when model disposed', function () { - const manager: TextFileEditorModelManager = instantiationService.createInstance(TextFileEditorModelManager); + const manager: TestTextFileEditorModelManager = instantiationService.createInstance(TestTextFileEditorModelManager); const model1: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/random1.txt'), 'utf8', undefined); const model2: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/random2.txt'), 'utf8', undefined); @@ -184,8 +186,8 @@ suite('Files - TextFileEditorModelManager', () => { const model1 = await manager.resolve(resource1, { encoding: 'utf8' }); assert.equal(loadedCounter, 1); - accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource: resource1, type: FileChangeType.DELETED }])); - accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource: resource1, type: FileChangeType.ADDED }])); + accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource: resource1, type: FileChangeType.DELETED }], extUri)); + accessor.fileService.fireFileChanges(new FileChangesEvent([{ resource: resource1, type: FileChangeType.ADDED }], extUri)); const model2 = await manager.resolve(resource2, { encoding: 'utf8' }); assert.equal(loadedCounter, 2); @@ -225,18 +227,32 @@ suite('Files - TextFileEditorModelManager', () => { manager.dispose(); }); - test('dispose prevents dirty model from getting disposed', async function () { + test('canDispose with dirty model', async function () { const manager: TextFileEditorModelManager = instantiationService.createInstance(TextFileEditorModelManager); const resource = toResource.call(this, '/path/index_something.txt'); const model = await manager.resolve(resource, { encoding: 'utf8' }); model.updateTextEditorModel(createTextBufferFactory('make dirty')); - manager.disposeModel((model as TextFileEditorModel)); - assert.ok(!model.isDisposed()); + + let canDisposePromise = manager.canDispose(model as TextFileEditorModel); + assert.ok(canDisposePromise instanceof Promise); + + let canDispose = false; + (async () => { + canDispose = await canDisposePromise; + })(); + + assert.equal(canDispose, false); model.revert({ soft: true }); - manager.disposeModel((model as TextFileEditorModel)); - assert.ok(model.isDisposed()); + + await timeout(0); + + assert.equal(canDispose, true); + + let canDispose2 = manager.canDispose(model as TextFileEditorModel); + assert.equal(canDispose2, true); + manager.dispose(); }); @@ -256,7 +272,7 @@ suite('Files - TextFileEditorModelManager', () => { model = await manager.resolve(resource, { mode: 'text' }); assert.equal(model.textEditorModel!.getModeId(), PLAINTEXT_MODE_ID); - manager.disposeModel((model as TextFileEditorModel)); + model.dispose(); manager.dispose(); }); }); diff --git a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts index 7aa9a50e36..91139743b2 100644 --- a/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/browser/textFileService.test.ts @@ -4,11 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; -import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; suite('Files - TextFileService', () => { @@ -23,12 +22,12 @@ suite('Files - TextFileService', () => { teardown(() => { model?.dispose(); - (accessor.textFileService.files).dispose(); + (accessor.textFileService.files).dispose(); }); test('isDirty/getDirty - files and untitled', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model.load(); @@ -50,7 +49,7 @@ suite('Files - TextFileService', () => { test('save - file', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model.load(); model.textEditorModel!.setValue('foo'); @@ -63,7 +62,7 @@ suite('Files - TextFileService', () => { test('saveAll - file', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model.load(); model.textEditorModel!.setValue('foo'); @@ -76,7 +75,7 @@ suite('Files - TextFileService', () => { test('saveAs - file', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); accessor.fileDialogService.setPickFileToSave(model.resource); await model.load(); @@ -90,7 +89,7 @@ suite('Files - TextFileService', () => { test('revert - file', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); accessor.fileDialogService.setPickFileToSave(model.resource); await model.load(); @@ -103,7 +102,7 @@ suite('Files - TextFileService', () => { test('create', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model.load(); model!.textEditorModel!.setValue('foo'); diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index cee295d36d..69c540b81d 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -15,20 +15,19 @@ import { ITextModelService, ITextModelContentProvider, ITextEditorModel, IResolv import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { IFileService } from 'vs/platform/files/common/files'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { ModelUndoRedoParticipant } from 'vs/editor/common/services/modelUndoRedoParticipant'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; class ResourceModelCollection extends ReferenceCollection> { - private readonly providers: { [scheme: string]: ITextModelContentProvider[] } = Object.create(null); + private readonly providers = new Map(); private readonly modelsToDispose = new Set(); constructor( @IInstantiationService private readonly instantiationService: IInstantiationService, @ITextFileService private readonly textFileService: ITextFileService, @IFileService private readonly fileService: IFileService, - @ITelemetryService private readonly telemetryService: ITelemetryService, @IModelService private readonly modelService: IModelService ) { super(); @@ -61,7 +60,7 @@ class ResourceModelCollection extends ReferenceCollection): void { - // Track as being disposed + // untitled and inMemory are bound to a different lifecycle + const resource = URI.parse(key); + if (resource.scheme === network.Schemas.untitled || resource.scheme === network.Schemas.inMemory) { + return; + } + + // Track as being disposed before waiting for model to load + // to handle the case that the reference is aquired again this.modelsToDispose.add(key); - modelPromise.then(model => { - if (!this.modelsToDispose.has(key)) { - return; // return if model has been aquired again meanwhile - } + (async () => { + try { + const model = await modelPromise; - const resource = URI.parse(key); - if (resource.scheme === network.Schemas.untitled || resource.scheme === network.Schemas.inMemory) { - // untitled and inMemory are bound to a different lifecycle - } else if (model instanceof TextFileEditorModel) { - this.textFileService.files.disposeModel(model); - } else { + if (!this.modelsToDispose.has(key)) { + // return if model has been aquired again meanwhile + return; + } + + if (model instanceof TextFileEditorModel) { + // text file models have conditions that prevent them + // from dispose, so we have to wait until we can dispose + await this.textFileService.files.canDispose(model); + } + + if (!this.modelsToDispose.has(key)) { + // return if model has been aquired again meanwhile + return; + } + + // Finally we can dispose the model model.dispose(); + } catch (error) { + // ignore + } finally { + this.modelsToDispose.delete(key); // Untrack as being disposed } - }, err => { - // ignore - }); + })(); } registerTextModelContentProvider(scheme: string, provider: ITextModelContentProvider): IDisposable { - const registry = this.providers; - const providers = registry[scheme] || (registry[scheme] = []); + let providers = this.providers.get(scheme); + if (!providers) { + providers = []; + this.providers.set(scheme, providers); + } providers.unshift(provider); return toDisposable(() => { - const array = registry[scheme]; - - if (!array) { + const providersForScheme = this.providers.get(scheme); + if (!providersForScheme) { return; } - const index = array.indexOf(provider); - + const index = providersForScheme.indexOf(provider); if (index === -1) { return; } - array.splice(index, 1); + providersForScheme.splice(index, 1); - if (array.length === 0) { - delete registry[scheme]; + if (providersForScheme.length === 0) { + this.providers.delete(scheme); } }); } hasTextModelContentProvider(scheme: string): boolean { - return this.providers[scheme] !== undefined; + return this.providers.get(scheme) !== undefined; } private async resolveTextModelContent(key: string): Promise { const resource = URI.parse(key); - const providers = this.providers[resource.scheme] || []; + const providersForScheme = this.providers.get(resource.scheme) || []; - if (resource.query || resource.fragment) { - type TextModelResolverUri = { - query: boolean; - fragment: boolean; - }; - type TextModelResolverUriMeta = { - query: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - fragment: { classification: 'SystemMetaData', purpose: 'FeatureInsight' }; - }; - this.telemetryService.publicLog2('textmodelresolveruri', { - query: Boolean(resource.query), - fragment: Boolean(resource.fragment) - }); - } - - for (const provider of providers) { + for (const provider of providersForScheme) { const value = await provider.provideTextContent(resource); if (value) { return value; @@ -163,7 +167,7 @@ class ResourceModelCollection extends ReferenceCollection> { + + // From this moment on, only operate on the canonical resource + // to ensure we reduce the chance of resolving the same resource + // with different resource forms (e.g. path casing on Windows) + resource = this.uriIdentityService.asCanonicalUri(resource); + const ref = this.resourceModelCollection.acquire(resource.toString()); try { diff --git a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts index 405b96f799..124650d3d1 100644 --- a/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts +++ b/src/vs/workbench/services/textmodelResolver/test/browser/textModelResolverService.test.ts @@ -9,7 +9,7 @@ import { URI } from 'vs/base/common/uri'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; import { snapshotToString } from 'vs/workbench/services/textfile/common/textfiles'; @@ -17,6 +17,7 @@ import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/commo import { Event } from 'vs/base/common/event'; import { timeout } from 'vs/base/common/async'; import { UntitledTextEditorInput } from 'vs/workbench/services/untitled/common/untitledTextEditorInput'; +import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; suite('Workbench - TextModelResolverService', () => { @@ -51,7 +52,7 @@ suite('Workbench - TextModelResolverService', () => { }); let resource = URI.from({ scheme: 'test', authority: null!, path: 'thePath' }); - let input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, 'The Name', 'The Description', resource, undefined); + let input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', undefined); const model = await input.resolve(); assert.ok(model); @@ -72,7 +73,7 @@ suite('Workbench - TextModelResolverService', () => { test('resolve file', async function () { const textModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file_resolver.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(textModel.resource, textModel); + (accessor.textFileService.files).add(textModel.resource, textModel); await textModel.load(); @@ -94,6 +95,63 @@ suite('Workbench - TextModelResolverService', () => { assert.equal(disposed, true); }); + test('resolved dirty file eventually disposes', async function () { + const textModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file_resolver.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(textModel.resource, textModel); + + const loadedModel = await textModel.load(); + + loadedModel.updateTextEditorModel(createTextBufferFactory('make dirty')); + + const ref = await accessor.textModelResolverService.createModelReference(textModel.resource); + + let disposed = false; + Event.once(loadedModel.onDispose)(() => { + disposed = true; + }); + + ref.dispose(); + await timeout(0); + assert.equal(disposed, false); // not disposed because model still dirty + + loadedModel.revert(); + + await timeout(0); + assert.equal(disposed, true); // now disposed because model got reverted + }); + + test('resolved dirty file does not dispose when new reference created', async function () { + const textModel = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file_resolver.txt'), 'utf8', undefined); + (accessor.textFileService.files).add(textModel.resource, textModel); + + const loadedModel = await textModel.load(); + + loadedModel.updateTextEditorModel(createTextBufferFactory('make dirty')); + + const ref1 = await accessor.textModelResolverService.createModelReference(textModel.resource); + + let disposed = false; + Event.once(loadedModel.onDispose)(() => { + disposed = true; + }); + + ref1.dispose(); + await timeout(0); + assert.equal(disposed, false); // not disposed because model still dirty + + const ref2 = await accessor.textModelResolverService.createModelReference(textModel.resource); + + loadedModel.revert(); + + await timeout(0); + assert.equal(disposed, false); // not disposed because we got another ref meanwhile + + ref2.dispose(); + + await timeout(0); + assert.equal(disposed, true); // now disposed because last ref got disposed + }); + test('resolve untitled', async () => { const service = accessor.untitledTextEditorService; const untitledModel = service.create(); diff --git a/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService.ts b/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService.ts index 7ff95af2f9..709d7fe60e 100644 --- a/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService.ts +++ b/src/vs/workbench/services/textresourceProperties/common/textResourcePropertiesService.ts @@ -16,7 +16,7 @@ import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteA export class TextResourcePropertiesService implements ITextResourcePropertiesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private remoteEnvironment: IRemoteAgentEnvironment | null = null; diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index e56196c608..e33a18e2e2 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -71,7 +71,7 @@ const fileIconThemesExtPoint = registerFileIconThemeExtensionPoint(); const productIconThemesExtPoint = registerProductIconThemeExtensionPoint(); export class WorkbenchThemeService implements IWorkbenchThemeService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly container: HTMLElement; private settings: ThemeConfiguration; diff --git a/src/vs/workbench/services/themes/common/workbenchThemeService.ts b/src/vs/workbench/services/themes/common/workbenchThemeService.ts index 15a0ac03e0..f6d7c155c4 100644 --- a/src/vs/workbench/services/themes/common/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/common/workbenchThemeService.ts @@ -61,7 +61,7 @@ export interface IWorkbenchProductIconTheme extends IWorkbenchTheme { export interface IWorkbenchThemeService extends IThemeService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; setColorTheme(themeId: string | undefined, settingsTarget: ConfigurationTarget | undefined | 'auto'): Promise; getColorTheme(): IWorkbenchColorTheme; getColorThemes(): Promise; diff --git a/src/vs/workbench/services/timer/electron-browser/timerService.ts b/src/vs/workbench/services/timer/electron-browser/timerService.ts index 85962e2202..083ebed5d8 100644 --- a/src/vs/workbench/services/timer/electron-browser/timerService.ts +++ b/src/vs/workbench/services/timer/electron-browser/timerService.ts @@ -292,13 +292,13 @@ export interface IStartupMetrics { } export interface ITimerService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly startupMetrics: Promise; } class TimerService implements ITimerService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _startupMetrics?: Promise; diff --git a/src/vs/workbench/services/title/common/titleService.ts b/src/vs/workbench/services/title/common/titleService.ts index 186105282b..8daf5d734e 100644 --- a/src/vs/workbench/services/title/common/titleService.ts +++ b/src/vs/workbench/services/title/common/titleService.ts @@ -16,7 +16,7 @@ export interface ITitleProperties { export interface ITitleService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * An event when the menubar visibility changes. diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts index aa5b8a5d73..5ed2a09668 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorInput.ts @@ -13,7 +13,6 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IFileService } from 'vs/platform/files/common/files'; import { IFilesConfigurationService } from 'vs/workbench/services/filesConfiguration/common/filesConfigurationService'; -import { basenameOrAuthority } from 'vs/base/common/resources'; /** * An editor input to be used for untitled text buffers. @@ -33,7 +32,7 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp @IFileService fileService: IFileService, @IFilesConfigurationService filesConfigurationService: IFilesConfigurationService ) { - super(model.resource, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); + super(model.resource, undefined, editorService, editorGroupService, textFileService, labelService, fileService, filesConfigurationService); this.registerModelListeners(model); } @@ -52,10 +51,6 @@ export class UntitledTextEditorInput extends AbstractTextResourceEditorInput imp return UntitledTextEditorInput.ID; } - get ariaLabel(): string { - return basenameOrAuthority(this.resource); - } - getName(): string { return this.model.name; } diff --git a/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts b/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts index 69897026ba..fcf4825d31 100644 --- a/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts +++ b/src/vs/workbench/services/untitled/common/untitledTextEditorService.ts @@ -110,12 +110,12 @@ export interface IUntitledTextEditorModelManager { export interface IUntitledTextEditorService extends IUntitledTextEditorModelManager { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; } export class UntitledTextEditorService extends Disposable implements IUntitledTextEditorService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidChangeDirty = this._register(new Emitter()); readonly onDidChangeDirty = this._onDidChangeDirty.event; diff --git a/src/vs/workbench/services/update/browser/updateService.ts b/src/vs/workbench/services/update/browser/updateService.ts index 152bcfc8ec..597c0c5810 100644 --- a/src/vs/workbench/services/update/browser/updateService.ts +++ b/src/vs/workbench/services/update/browser/updateService.ts @@ -26,7 +26,7 @@ export interface IUpdateProvider { export class BrowserUpdateService extends Disposable implements IUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _onStateChange = this._register(new Emitter()); readonly onStateChange: Event = this._onStateChange.event; diff --git a/src/vs/workbench/services/update/electron-sandbox/updateService.ts b/src/vs/workbench/services/update/electron-sandbox/updateService.ts index 7f5fd799ba..1778ee27e7 100644 --- a/src/vs/workbench/services/update/electron-sandbox/updateService.ts +++ b/src/vs/workbench/services/update/electron-sandbox/updateService.ts @@ -11,7 +11,7 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; export class NativeUpdateService implements IUpdateService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onStateChange = new Emitter(); readonly onStateChange: Event = this._onStateChange.event; diff --git a/src/vs/workbench/services/uriIdentity/common/uriIdentity.ts b/src/vs/workbench/services/uriIdentity/common/uriIdentity.ts index b05cb954c7..0acb7a996b 100644 --- a/src/vs/workbench/services/uriIdentity/common/uriIdentity.ts +++ b/src/vs/workbench/services/uriIdentity/common/uriIdentity.ts @@ -7,16 +7,12 @@ import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IExtUri } from 'vs/base/common/resources'; -export interface IUriIdentity { - readonly pathHierarchical: boolean; - readonly ignorePathCasing: boolean; -} export const IUriIdentityService = createDecorator('IUriIdentityService'); export interface IUriIdentityService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; /** * Uri extensions that are aware of casing. diff --git a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts index e7769a84c7..555f131673 100644 --- a/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts +++ b/src/vs/workbench/services/uriIdentity/common/uriIdentityService.ts @@ -6,9 +6,11 @@ import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { URI } from 'vs/base/common/uri'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; +import { IFileService, FileSystemProviderCapabilities, IFileSystemProviderCapabilitiesChangeEvent, IFileSystemProviderRegistrationEvent } from 'vs/platform/files/common/files'; import { ExtUri, IExtUri, normalizePath } from 'vs/base/common/resources'; import { SkipList } from 'vs/base/common/skipList'; +import { Event } from 'vs/base/common/event'; +import { DisposableStore } from 'vs/base/common/lifecycle'; class Entry { static _clock = 0; @@ -22,39 +24,50 @@ class Entry { export class UriIdentityService implements IUriIdentityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly extUri: IExtUri; + private readonly _dispooables = new DisposableStore(); private readonly _canonicalUris: SkipList; private readonly _limit = 2 ** 16; constructor(@IFileService private readonly _fileService: IFileService) { - // assume path casing matters unless the file system provider spec'ed the opposite + const schemeIgnoresPathCasingCache = new Map(); + + // assume path casing matters unless the file system provider spec'ed the opposite. + // for all other cases path casing matters, e.g for + // * virtual documents + // * in-memory uris + // * all kind of "private" schemes const ignorePathCasing = (uri: URI): boolean => { - // perf@jrieken cache this information - if (this._fileService.canHandleResource(uri)) { - return !this._fileService.hasCapability(uri, FileSystemProviderCapabilities.PathCaseSensitive); + let ignorePathCasing = schemeIgnoresPathCasingCache.get(uri.scheme); + if (ignorePathCasing === undefined) { + // retrieve once and then case per scheme until a change happens + ignorePathCasing = _fileService.canHandleResource(uri) && !this._fileService.hasCapability(uri, FileSystemProviderCapabilities.PathCaseSensitive); + schemeIgnoresPathCasingCache.set(uri.scheme, ignorePathCasing); } - // this defaults to false which is a good default for - // * virtual documents - // * in-memory uris - // * all kind of "private" schemes - return false; + return ignorePathCasing; }; + this._dispooables.add(Event.any( + _fileService.onDidChangeFileSystemProviderRegistrations, + _fileService.onDidChangeFileSystemProviderCapabilities + )(e => { + // remove from cache + schemeIgnoresPathCasingCache.delete(e.scheme); + })); + this.extUri = new ExtUri(ignorePathCasing); this._canonicalUris = new SkipList((a, b) => this.extUri.compare(a, b, true), this._limit); } - asCanonicalUri(uri: URI): URI { + dispose(): void { + this._dispooables.dispose(); + this._canonicalUris.clear(); + } - // todo@jrieken there is more to it than just comparing - // * ASYNC!? - // * windows 8.3-filenames - // * substr-drives... - // * sym links? - // * fetch real casing? + asCanonicalUri(uri: URI): URI { // (1) normalize URI if (this._fileService.canHandleResource(uri)) { diff --git a/src/vs/workbench/services/uriIdentity/test/common/uriIdentityService.test.ts b/src/vs/workbench/services/uriIdentity/test/common/uriIdentityService.test.ts index 82e02fccc3..b24479f5c1 100644 --- a/src/vs/workbench/services/uriIdentity/test/common/uriIdentityService.test.ts +++ b/src/vs/workbench/services/uriIdentity/test/common/uriIdentityService.test.ts @@ -8,11 +8,15 @@ import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uri import { mock } from 'vs/workbench/test/common/workbenchTestServices'; import { IFileService, FileSystemProviderCapabilities } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; +import { Event } from 'vs/base/common/event'; suite('URI Identity', function () { class FakeFileService extends mock() { + onDidChangeFileSystemProviderCapabilities = Event.None; + onDidChangeFileSystemProviderRegistrations = Event.None; + constructor(readonly data: Map) { super(); } diff --git a/src/vs/workbench/services/url/browser/urlService.ts b/src/vs/workbench/services/url/browser/urlService.ts index 236237d6ed..cba8472e24 100644 --- a/src/vs/workbench/services/url/browser/urlService.ts +++ b/src/vs/workbench/services/url/browser/urlService.ts @@ -38,7 +38,7 @@ export interface IURLCallbackProvider { export class BrowserURLService extends AbstractURLService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private provider: IURLCallbackProvider | undefined; diff --git a/src/vs/workbench/services/url/electron-sandbox/urlService.ts b/src/vs/workbench/services/url/electron-sandbox/urlService.ts index 30ba5ab8ed..512afcef14 100644 --- a/src/vs/workbench/services/url/electron-sandbox/urlService.ts +++ b/src/vs/workbench/services/url/electron-sandbox/urlService.ts @@ -8,7 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IMainProcessService } from 'vs/platform/ipc/electron-sandbox/mainProcessService'; import { URLHandlerChannel } from 'vs/platform/url/common/urlIpc'; import { IOpenerService, IOpener, matchesScheme } from 'vs/platform/opener/common/opener'; -import product from 'vs/platform/product/common/product'; +import { IProductService } from 'vs/platform/product/common/productService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createChannelSender } from 'vs/base/parts/ipc/common/ipc'; import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron'; @@ -26,7 +26,8 @@ export class RelayURLService extends NativeURLService implements IURLHandler, IO constructor( @IMainProcessService mainProcessService: IMainProcessService, @IOpenerService openerService: IOpenerService, - @IElectronService private electronService: IElectronService + @IElectronService private readonly electronService: IElectronService, + @IProductService private readonly productService: IProductService ) { super(); @@ -51,7 +52,7 @@ export class RelayURLService extends NativeURLService implements IURLHandler, IO async open(resource: URI | string, options?: IRelayOpenURLOptions): Promise { - if (!matchesScheme(resource, product.urlProtocol)) { + if (!matchesScheme(resource, this.productService.urlProtocol)) { return false; } diff --git a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts index c0e06063d8..667678e878 100644 --- a/src/vs/workbench/services/userData/common/fileUserDataProvider.ts +++ b/src/vs/workbench/services/userData/common/fileUserDataProvider.ts @@ -7,13 +7,13 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IFileSystemProviderWithFileReadWriteCapability, IFileChange, IWatchOptions, IStat, FileOverwriteOptions, FileType, FileWriteOptions, FileDeleteOptions, FileSystemProviderCapabilities, IFileSystemProviderWithOpenReadWriteCloseCapability, FileOpenOptions, hasReadWriteCapability, hasOpenReadWriteCloseCapability, IFileSystemProviderWithFileReadStreamCapability, FileReadStreamOptions, hasFileReadStreamCapability } from 'vs/platform/files/common/files'; import { URI } from 'vs/base/common/uri'; -import * as resources from 'vs/base/common/resources'; import { startsWith } from 'vs/base/common/strings'; import { BACKUPS } from 'vs/platform/environment/common/environment'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ReadableStreamEvents } from 'vs/base/common/stream'; import { ILogService } from 'vs/platform/log/common/log'; +import { ExtUri, extUri, extUriIgnorePathCase } from 'vs/base/common/resources'; export class FileUserDataProvider extends Disposable implements IFileSystemProviderWithFileReadWriteCapability, @@ -21,12 +21,13 @@ export class FileUserDataProvider extends Disposable implements IFileSystemProviderWithFileReadStreamCapability { readonly capabilities: FileSystemProviderCapabilities = this.fileSystemProvider.capabilities; - readonly onDidChangeCapabilities: Event = Event.None; + readonly onDidChangeCapabilities: Event = this.fileSystemProvider.onDidChangeCapabilities; private readonly _onDidChangeFile = this._register(new Emitter()); readonly onDidChangeFile: Event = this._onDidChangeFile.event; private readonly userDataHome: URI; + private extUri: ExtUri; constructor( private readonly fileSystemUserDataHome: URI, @@ -39,6 +40,10 @@ export class FileUserDataProvider extends Disposable implements this.userDataHome = environmentService.userRoamingDataHome; + this.extUri = !!(this.capabilities & FileSystemProviderCapabilities.PathCaseSensitive) ? extUri : extUriIgnorePathCase; + // update extUri as capabilites might change. + this._register(this.onDidChangeCapabilities(() => this.extUri = !!(this.capabilities & FileSystemProviderCapabilities.PathCaseSensitive) ? extUri : extUriIgnorePathCase)); + // Assumption: This path always exists this._register(this.fileSystemProvider.watch(this.fileSystemUserDataHome, { recursive: false, excludes: [] })); this._register(this.fileSystemProvider.onDidChangeFile(e => this.handleFileChanges(e))); @@ -67,7 +72,7 @@ export class FileUserDataProvider extends Disposable implements throw new Error('not supported'); } - readFileStream(resource: URI, opts: FileReadStreamOptions, token?: CancellationToken): ReadableStreamEvents { + readFileStream(resource: URI, opts: FileReadStreamOptions, token: CancellationToken): ReadableStreamEvents { if (hasFileReadStreamCapability(this.fileSystemProvider)) { return this.fileSystemProvider.readFileStream(this.toFileSystemResource(resource), opts, token); } @@ -135,21 +140,21 @@ export class FileUserDataProvider extends Disposable implements } private toFileSystemResource(userDataResource: URI): URI { - const relativePath = resources.relativePath(this.userDataHome, userDataResource)!; + const relativePath = this.extUri.relativePath(this.userDataHome, userDataResource)!; if (startsWith(relativePath, BACKUPS)) { - return resources.joinPath(resources.dirname(this.fileSystemBackupsHome), relativePath); + return this.extUri.joinPath(this.extUri.dirname(this.fileSystemBackupsHome), relativePath); } - return resources.joinPath(this.fileSystemUserDataHome, relativePath); + return this.extUri.joinPath(this.fileSystemUserDataHome, relativePath); } private toUserDataResource(fileSystemResource: URI): URI | null { - if (resources.isEqualOrParent(fileSystemResource, this.fileSystemUserDataHome)) { - const relativePath = resources.relativePath(this.fileSystemUserDataHome, fileSystemResource); - return relativePath ? resources.joinPath(this.userDataHome, relativePath) : this.userDataHome; + if (this.extUri.isEqualOrParent(fileSystemResource, this.fileSystemUserDataHome)) { + const relativePath = this.extUri.relativePath(this.fileSystemUserDataHome, fileSystemResource); + return relativePath ? this.extUri.joinPath(this.userDataHome, relativePath) : this.userDataHome; } - if (resources.isEqualOrParent(fileSystemResource, this.fileSystemBackupsHome)) { - const relativePath = resources.relativePath(this.fileSystemBackupsHome, fileSystemResource); - return relativePath ? resources.joinPath(this.userDataHome, BACKUPS, relativePath) : resources.joinPath(this.userDataHome, BACKUPS); + if (this.extUri.isEqualOrParent(fileSystemResource, this.fileSystemBackupsHome)) { + const relativePath = this.extUri.relativePath(this.fileSystemBackupsHome, fileSystemResource); + return relativePath ? this.extUri.joinPath(this.userDataHome, BACKUPS, relativePath) : this.extUri.joinPath(this.userDataHome, BACKUPS); } return null; } diff --git a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts index 3237b8dd12..79d4e4d10e 100644 --- a/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts +++ b/src/vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService.ts @@ -3,17 +3,17 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IUserDataSyncService, IUserDataSyncEnablementService, IAuthenticationProvider, getUserDataSyncStore, isAuthenticationProvider } from 'vs/platform/userDataSync/common/userDataSync'; +import { IUserDataSyncService, IAuthenticationProvider, getUserDataSyncStore, isAuthenticationProvider, IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; 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 } from 'vs/workbench/services/userDataSync/common/userDataSync'; +import { IUserDataSyncWorkbenchService, IUserDataSyncAccount, AccountStatus, CONTEXT_SYNC_ENABLEMENT, CONTEXT_SYNC_STATE, CONTEXT_ACCOUNT_STATE, SHOW_SYNCED_DATA_COMMAND_ID } from 'vs/workbench/services/userDataSync/common/userDataSync'; import { AuthenticationSession, AuthenticationSessionsChangeEvent } from 'vs/editor/common/modes'; import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; import { flatten } from 'vs/base/common/arrays'; import { values } from 'vs/base/common/map'; import { IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; -import { IAuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { IQuickInputService, IQuickPickSeparator } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, IWorkspaceStorageChangeEvent, StorageScope } from 'vs/platform/storage/common/storage'; import { ILogService } from 'vs/platform/log/common/log'; @@ -26,6 +26,8 @@ import { canceled } from 'vs/base/common/errors'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { Action } from 'vs/base/common/actions'; type UserAccountClassification = { id: { classification: 'EndUserPseudonymizedInformation', purpose: 'BusinessInsight' }; @@ -77,10 +79,10 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat constructor( @IUserDataSyncService private readonly userDataSyncService: IUserDataSyncService, @IAuthenticationService private readonly authenticationService: IAuthenticationService, - @IAuthenticationTokenService private readonly authenticationTokenService: IAuthenticationTokenService, + @IUserDataSyncAccountService private readonly userDataSyncAccountService: IUserDataSyncAccountService, @IQuickInputService private readonly quickInputService: IQuickInputService, @IStorageService private readonly storageService: IStorageService, - @IUserDataSyncEnablementService private readonly userDataSyncEnablementService: IUserDataSyncEnablementService, + @IUserDataAutoSyncService private readonly userDataAutoSyncService: IUserDataAutoSyncService, @ITelemetryService private readonly telemetryService: ITelemetryService, @ILogService private readonly logService: ILogService, @IProductService productService: IProductService, @@ -89,6 +91,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, @INotificationService private readonly notificationService: INotificationService, @IDialogService private readonly dialogService: IDialogService, + @ICommandService private readonly commandService: ICommandService, @IContextKeyService contextKeyService: IContextKeyService, ) { super(); @@ -101,8 +104,8 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat this.syncStatusContext.set(this.userDataSyncService.status); this._register(userDataSyncService.onDidChangeStatus(status => this.syncStatusContext.set(status))); - this.syncEnablementContext.set(this.userDataSyncEnablementService.isEnabled()); - this._register(this.userDataSyncEnablementService.onDidChangeEnablement(enabled => this.syncEnablementContext.set(enabled))); + this.syncEnablementContext.set(userDataAutoSyncService.isEnabled()); + this._register(userDataAutoSyncService.onDidChangeEnablement(enabled => this.syncEnablementContext.set(enabled))); extensionService.whenInstalledExtensionsRegistered().then(() => { if (this.authenticationProviders.every(({ id }) => authenticationService.isAuthenticationProviderRegistered(id))) { @@ -134,11 +137,12 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat this.authenticationService.onDidRegisterAuthenticationProvider, this.authenticationService.onDidUnregisterAuthenticationProvider, ), authenticationProviderId => this.isSupportedAuthenticationProviderId(authenticationProviderId)), - this.authenticationTokenService.onTokenFailed) + Event.filter(this.userDataSyncAccountService.onTokenFailed, isSuccessive => !isSuccessive)) (() => this.update())); this._register(Event.filter(this.authenticationService.onDidChangeSessions, e => this.isSupportedAuthenticationProviderId(e.providerId))(({ event }) => this.onDidChangeSessions(event))); this._register(this.storageService.onDidChangeStorage(e => this.onDidChangeStorage(e))); + this._register(Event.filter(this.userDataSyncAccountService.onTokenFailed, isSuccessive => isSuccessive)(() => this.onDidSuccessiveAuthFailures())); } private async update(): Promise { @@ -187,7 +191,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat this.logService.error(e); } } - await this.authenticationTokenService.setToken(value); + await this.userDataSyncAccountService.updateAccount(value); } private updateAccountStatus(current: UserDataSyncAccount | undefined): void { @@ -198,10 +202,6 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat const previous = this._accountStatus; this.logService.debug('Sync account status changed', previous, accountStatus); - if (previous === AccountStatus.Available && accountStatus === AccountStatus.Unavailable) { - this.turnoff(false); - } - this._accountStatus = accountStatus; this.accountStatusContext.set(accountStatus); this._onDidChangeAccountStatus.fire(accountStatus); @@ -219,51 +219,51 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat throw new Error(localize('no account', "No account available")); } - await this.handleFirstTimeSync(); - this.userDataSyncEnablementService.setEnablement(true); + const pullFirst = await this.handleFirstTimeSync(); + await this.userDataAutoSyncService.turnOn(pullFirst); this.notificationService.info(localize('sync turned on', "Preferences sync is turned on")); } - async turnoff(everywhere: boolean): Promise { - if (everywhere) { - this.telemetryService.publicLog2('sync/turnOffEveryWhere'); - await this.userDataSyncService.reset(); - } else { - await this.userDataSyncService.resetLocal(); - } - this.userDataSyncEnablementService.setEnablement(false); + turnoff(everywhere: boolean): Promise { + return this.userDataAutoSyncService.turnOff(everywhere); } - private async handleFirstTimeSync(): Promise { - const isFirstSyncWithMerge = await this.userDataSyncService.isFirstTimeSyncWithMerge(); - if (!isFirstSyncWithMerge) { - return; + private async handleFirstTimeSync(): Promise { + const isFirstTimeSyncingWithAnotherMachine = await this.userDataSyncService.isFirstTimeSyncingWithAnotherMachine(); + if (!isFirstTimeSyncingWithAnotherMachine) { + return false; } + const result = await this.dialogService.show( Severity.Info, - localize('firs time sync', "Sync"), + localize('Replace or Merge', "Replace or Merge"), [ + localize('show synced data', "Show Synced Data"), localize('merge', "Merge"), + localize('replace local', "Replace Local"), localize('cancel', "Cancel"), - localize('replace', "Replace Local"), ], { - cancelId: 1, - detail: localize('first time sync detail', "It looks like this is the first time sync is set up.\nWould you like to merge or replace with the data from the cloud?"), + cancelId: 3, + detail: localize('first time sync detail', "It looks like you last synced from another machine.\nWould you like to replace or merge with the synced data?"), } ); switch (result.choice) { case 0: - this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'merge' }); - break; - case 1: - this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'cancelled' }); + this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'showSyncedData' }); + await this.commandService.executeCommand(SHOW_SYNCED_DATA_COMMAND_ID); throw canceled(); + case 1: + this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'merge' }); + return false; case 2: this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'replace-local' }); - await this.userDataSyncService.pull(); - break; + return true; + case 3: + this.telemetryService.publicLog2<{ action: string }, FirstTimeSyncClassification>('sync/firstTimeSync', { action: 'cancelled' }); + throw canceled(); } + return false; } private isSupportedAuthenticationProviderId(authenticationProviderId: string): boolean { @@ -274,7 +274,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat return account.sessionId === this.currentSessionId; } - async pickAccount(): Promise { + async signIn(): Promise { await this.pick(); } @@ -358,8 +358,11 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat // Account proviers for (const authenticationProvider of this.authenticationProviders) { - const providerName = this.authenticationService.getDisplayName(authenticationProvider.id); - quickPickItems.push({ label: localize('sign in using account', "Sign in with {0}", providerName), authenticationProvider }); + const signedInForProvider = this.all.some(account => account.authenticationProviderId === authenticationProvider.id); + if (!signedInForProvider || this.authenticationService.supportsMultipleAccounts(authenticationProvider.id)) { + const providerName = this.authenticationService.getDisplayName(authenticationProvider.id); + quickPickItems.push({ label: localize('sign in using account', "Sign in with {0}", providerName), authenticationProvider }); + } } return quickPickItems; @@ -367,7 +370,7 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat private async switch(sessionId: string, accountName: string, accountId: string): Promise { const currentAccount = this.current; - if (this.userDataSyncEnablementService.isEnabled() && (currentAccount && currentAccount.accountName !== accountName)) { + if (this.userDataAutoSyncService.isEnabled() && (currentAccount && currentAccount.accountName !== accountName)) { // accounts are switched while sync is enabled. } this.currentSessionId = sessionId; @@ -375,6 +378,20 @@ export class UserDataSyncWorkbenchService extends Disposable implements IUserDat await this.update(); } + private async onDidSuccessiveAuthFailures(): Promise { + this.telemetryService.publicLog2('sync/successiveAuthFailures'); + this.currentSessionId = undefined; + await this.update(); + + this.notificationService.notify({ + severity: Severity.Error, + message: localize('successive auth failures', "Preferences sync was turned off because of successive authorization failures. Please sign in again to continue synchronizing"), + actions: { + primary: [new Action('sign in', localize('sign in', "Sign in"), undefined, true, () => this.signIn())] + } + }); + } + private onDidChangeSessions(e: AuthenticationSessionsChangeEvent): void { if (this.currentSessionId && e.removed.includes(this.currentSessionId)) { this.currentSessionId = undefined; diff --git a/src/vs/workbench/services/userDataSync/common/userDataSync.ts b/src/vs/workbench/services/userDataSync/common/userDataSync.ts index ddd2dfd3ab..2eb8e3a943 100644 --- a/src/vs/workbench/services/userDataSync/common/userDataSync.ts +++ b/src/vs/workbench/services/userDataSync/common/userDataSync.ts @@ -28,7 +28,7 @@ export interface IUserDataSyncWorkbenchService { turnOn(): Promise; turnoff(everyWhere: boolean): Promise; - pickAccount(): Promise; + signIn(): Promise; } export function getSyncAreaLabel(source: SyncResource): string { @@ -57,3 +57,4 @@ export const CONTEXT_ENABLE_VIEWS = new RawContextKey(`showUserDataSync export const ENABLE_SYNC_VIEWS_COMMAND_ID = 'workbench.userDataSync.actions.enableViews'; export const CONFIGURE_SYNC_COMMAND_ID = 'workbench.userDataSync.actions.configure'; export const SHOW_SYNC_LOG_COMMAND_ID = 'workbench.userDataSync.actions.showLog'; +export const SHOW_SYNCED_DATA_COMMAND_ID = 'workbench.userDataSync.actions.showSyncedData'; diff --git a/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts b/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts index f012f722f6..2f85f010be 100644 --- a/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts +++ b/src/vs/workbench/services/userDataSync/common/userDataSyncUtil.ts @@ -14,7 +14,7 @@ import { ITextResourcePropertiesService, ITextResourceConfigurationService } fro class UserDataSyncUtilService implements IUserDataSyncUtilService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IKeybindingService private readonly keybindingsService: IKeybindingService, diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService.ts new file mode 100644 index 0000000000..37988ae74c --- /dev/null +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService.ts @@ -0,0 +1,47 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IChannel } from 'vs/base/parts/ipc/common/ipc'; +import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { Event, Emitter } from 'vs/base/common/event'; +import { IUserDataSyncAccountService, IUserDataSyncAccount } from 'vs/platform/userDataSync/common/userDataSyncAccount'; + +export class UserDataSyncAccountService extends Disposable implements IUserDataSyncAccountService { + + declare readonly _serviceBrand: undefined; + + private readonly channel: IChannel; + + private _account: IUserDataSyncAccount | undefined; + get account(): IUserDataSyncAccount | undefined { return this._account; } + + get onTokenFailed(): Event { return this.channel.listen('onTokenFailed'); } + + private _onDidChangeAccount: Emitter = this._register(new Emitter()); + readonly onDidChangeAccount: Event = this._onDidChangeAccount.event; + + constructor( + @ISharedProcessService sharedProcessService: ISharedProcessService, + ) { + super(); + this.channel = sharedProcessService.getChannel('userDataSyncAccount'); + this.channel.call('_getInitialData').then(account => { + this._account = account; + this._register(this.channel.listen('onDidChangeAccount')(account => { + this._account = account; + this._onDidChangeAccount.fire(account); + })); + }); + } + + updateAccount(account: IUserDataSyncAccount | undefined): Promise { + return this.channel.call('updateAccount', account); + } + +} + +registerSingleton(IUserDataSyncAccountService, UserDataSyncAccountService); diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts index c3a780f114..acd9a0d541 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService.ts @@ -11,7 +11,7 @@ import { IUserDataSyncMachinesService, IUserDataSyncMachine } from 'vs/platform/ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMachinesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly channel: IChannel; @@ -26,8 +26,8 @@ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMac return this.channel.call('getMachines'); } - addCurrentMachine(name: string): Promise { - return this.channel.call('addCurrentMachine', [name]); + addCurrentMachine(): Promise { + return this.channel.call('addCurrentMachine'); } removeCurrentMachine(): Promise { @@ -38,8 +38,8 @@ class UserDataSyncMachinesService extends Disposable implements IUserDataSyncMac return this.channel.call('renameMachine', [machineId, name]); } - disableMachine(machineId: string): Promise { - return this.channel.call('disableMachine', [machineId]); + setEnablement(machineId: string, enabled: boolean): Promise { + return this.channel.call('setEnablement', [machineId, enabled]); } } diff --git a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts index f443b5932d..48e6d4985d 100644 --- a/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts +++ b/src/vs/workbench/services/userDataSync/electron-browser/userDataSyncService.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { SyncStatus, SyncResource, IUserDataSyncService, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle } from 'vs/platform/userDataSync/common/userDataSync'; +import { SyncStatus, SyncResource, IUserDataSyncService, UserDataSyncError, SyncResourceConflicts, ISyncResourceHandle, ISyncTask } from 'vs/platform/userDataSync/common/userDataSync'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { Disposable } from 'vs/base/common/lifecycle'; import { Emitter, Event } from 'vs/base/common/event'; @@ -14,7 +14,7 @@ import { URI } from 'vs/base/common/uri'; export class UserDataSyncService extends Disposable implements IUserDataSyncService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly channel: IChannel; @@ -73,6 +73,10 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('sync'); } + createSyncTask(): Promise { + throw new Error('not supported'); + } + stop(): Promise { return this.channel.call('stop'); } @@ -89,8 +93,12 @@ export class UserDataSyncService extends Disposable implements IUserDataSyncServ return this.channel.call('resetLocal'); } - isFirstTimeSyncWithMerge(): Promise { - return this.channel.call('isFirstTimeSyncWithMerge'); + hasPreviouslySynced(): Promise { + return this.channel.call('hasPreviouslySynced'); + } + + isFirstTimeSyncingWithAnotherMachine(): Promise { + return this.channel.call('isFirstTimeSyncingWithAnotherMachine'); } acceptConflict(conflict: URI, content: string): Promise { diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index bfedb22547..69eb605cef 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -13,7 +13,7 @@ export const IViewletService = createDecorator('viewletService' export interface IViewletService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; readonly onDidViewletRegister: Event; readonly onDidViewletDeregister: Event; diff --git a/src/vs/workbench/services/views/browser/viewDescriptorService.ts b/src/vs/workbench/services/views/browser/viewDescriptorService.ts index 7cf9b2a3b8..524c9a2968 100644 --- a/src/vs/workbench/services/views/browser/viewDescriptorService.ts +++ b/src/vs/workbench/services/views/browser/viewDescriptorService.ts @@ -27,7 +27,7 @@ interface ICachedViewContainerInfo { export class ViewDescriptorService extends Disposable implements IViewDescriptorService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private static readonly CACHED_VIEW_POSITIONS = 'views.cachedViewPositions'; private static readonly CACHED_VIEW_CONTAINER_LOCATIONS = 'views.cachedViewContainerLocations'; @@ -295,7 +295,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor return this.viewContainersRegistry.getDefaultViewContainer(location); } - moveViewContainerToLocation(viewContainer: ViewContainer, location: ViewContainerLocation, order?: number): void { + moveViewContainerToLocation(viewContainer: ViewContainer, location: ViewContainerLocation, requestedIndex?: number): void { const from = this.getViewContainerLocation(viewContainer); const to = location; if (from !== to) { @@ -304,10 +304,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor const defaultLocation = this.isGeneratedContainerId(viewContainer.id) ? true : this.getViewContainerLocation(viewContainer) === this.getDefaultViewContainerLocation(viewContainer); this.getOrCreateDefaultViewContainerLocationContextKey(viewContainer).set(defaultLocation); - if (order !== undefined) { - viewContainer.order = order; - } - + viewContainer.requestedIndex = requestedIndex; this._onDidChangeContainerLocation.fire({ viewContainer, from, to }); const views = this.getViewsByContainer(viewContainer); @@ -408,6 +405,8 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor this.saveViewContainerLocationsToCache(); } + this.getOrCreateDefaultViewContainerLocationContextKey(container).set(true); + return container; } diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts index bce812cb24..7837a26f13 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyFileService.ts @@ -12,7 +12,7 @@ import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle' import { IFileService, FileOperation, IFileStatWithMetadata } from 'vs/platform/files/common/files'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IWorkingCopyService, IWorkingCopy } from 'vs/workbench/services/workingCopy/common/workingCopyService'; -import { isEqualOrParent, isEqual } from 'vs/base/common/resources'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress'; import { WorkingCopyFileOperationParticipant } from 'vs/workbench/services/workingCopy/common/workingCopyFileOperationParticipant'; @@ -73,7 +73,7 @@ type WorkingCopyProvider = (resourceOrFolder: URI) => IWorkingCopy[]; */ export interface IWorkingCopyFileService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; //#region Events @@ -169,7 +169,7 @@ export interface IWorkingCopyFileService { export class WorkingCopyFileService extends Disposable implements IWorkingCopyFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region Events @@ -189,7 +189,8 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi constructor( @IFileService private readonly fileService: IFileService, @IWorkingCopyService private readonly workingCopyService: IWorkingCopyService, - @IInstantiationService private readonly instantiationService: IInstantiationService + @IInstantiationService private readonly instantiationService: IInstantiationService, + @IUriIdentityService private readonly uriIdentityService: IUriIdentityService ) { super(); @@ -200,10 +201,10 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi // only check for parents if the resource can be handled // by the file system where we then assume a folder like // path structure - return isEqualOrParent(workingCopy.resource, resource); + return this.uriIdentityService.extUri.isEqualOrParent(workingCopy.resource, resource); } - return isEqual(workingCopy.resource, resource); + return this.uriIdentityService.extUri.isEqual(workingCopy.resource, resource); }); }); } @@ -218,9 +219,27 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi private async moveOrCopy(source: URI, target: URI, move: boolean, overwrite?: boolean): Promise { + // validate move/copy operation before starting + const validateMoveOrCopy = await (move ? this.fileService.canMove(source, target, overwrite) : this.fileService.canCopy(source, target, overwrite)); + if (validateMoveOrCopy instanceof Error) { + throw validateMoveOrCopy; + } + // file operation participant await this.runFileOperationParticipants(target, source, move ? FileOperation.MOVE : FileOperation.COPY); + // Before doing the heave operations, check first if source and target + // are either identical or are considered to be identical for the file + // system. In that case we want the model to stay as is and only do the + // raw file operation. + if (this.uriIdentityService.extUri.isEqual(source, target)) { + if (move) { + return this.fileService.move(source, target, overwrite); + } else { + return this.fileService.copy(source, target, overwrite); + } + } + // before event const event = { correlationId: this.correlationIds++, operation: move ? FileOperation.MOVE : FileOperation.COPY, target, source }; await this._onWillRunWorkingCopyFileOperation.fireAsync(event, CancellationToken.None); @@ -255,6 +274,12 @@ export class WorkingCopyFileService extends Disposable implements IWorkingCopyFi async delete(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise { + // validate delete operation before starting + const validateDelete = await this.fileService.canDelete(resource, options); + if (validateDelete instanceof Error) { + throw validateDelete; + } + // file operation participant await this.runFileOperationParticipants(resource, undefined, FileOperation.DELETE); diff --git a/src/vs/workbench/services/workingCopy/common/workingCopyService.ts b/src/vs/workbench/services/workingCopy/common/workingCopyService.ts index a0f81dc98e..c38b36c25d 100644 --- a/src/vs/workbench/services/workingCopy/common/workingCopyService.ts +++ b/src/vs/workbench/services/workingCopy/common/workingCopyService.ts @@ -118,7 +118,7 @@ export const IWorkingCopyService = createDecorator('working export interface IWorkingCopyService { - _serviceBrand: undefined; + readonly _serviceBrand: undefined; //#region Events @@ -164,7 +164,7 @@ export interface IWorkingCopyService { export class WorkingCopyService extends Disposable implements IWorkingCopyService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; //#region Events @@ -192,7 +192,7 @@ export class WorkingCopyService extends Disposable implements IWorkingCopyServic registerWorkingCopy(workingCopy: IWorkingCopy): IDisposable { if (this.mapResourceToWorkingCopy.has(workingCopy.resource)) { - throw new Error(`Cannot register more than one working copy with the same resource ${workingCopy.resource.toString()}.`); + throw new Error(`Cannot register more than one working copy with the same resource ${workingCopy.resource.toString(true)}.`); } const disposables = new DisposableStore(); 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 856cf2502b..47834da8db 100644 --- a/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts +++ b/src/vs/workbench/services/workingCopy/test/browser/workingCopyFileService.test.ts @@ -8,7 +8,7 @@ import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textF import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { toResource } from 'vs/base/test/common/utils'; -import { workbenchInstantiationService, TestServiceAccessor } from 'vs/workbench/test/browser/workbenchTestServices'; +import { workbenchInstantiationService, TestServiceAccessor, TestTextFileEditorModelManager } from 'vs/workbench/test/browser/workbenchTestServices'; import { URI } from 'vs/base/common/uri'; import { FileOperation } from 'vs/platform/files/common/files'; import { TestWorkingCopy } from 'vs/workbench/services/workingCopy/test/common/workingCopyService.test'; @@ -31,7 +31,7 @@ suite('WorkingCopyFileService', () => { test('delete - dirty file', async function () { model = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model.load(); model!.textEditorModel!.setValue('foo'); @@ -91,8 +91,8 @@ suite('WorkingCopyFileService', () => { async function testMoveOrCopy(source: URI, target: URI, move: boolean, targetDirty?: boolean): Promise { let sourceModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, source, 'utf8', undefined); let targetModel: TextFileEditorModel = instantiationService.createInstance(TextFileEditorModel, target, 'utf8', undefined); - (accessor.textFileService.files).add(sourceModel.resource, sourceModel); - (accessor.textFileService.files).add(targetModel.resource, targetModel); + (accessor.textFileService.files).add(sourceModel.resource, sourceModel); + (accessor.textFileService.files).add(targetModel.resource, targetModel); await sourceModel.load(); sourceModel.textEditorModel!.setValue('foo'); @@ -159,10 +159,10 @@ suite('WorkingCopyFileService', () => { test('getDirty', async function () { const model1 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-1.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); const model2 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-2.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); let dirty = accessor.workingCopyFileService.getDirty(model1.resource); assert.equal(dirty.length, 0); @@ -190,7 +190,7 @@ suite('WorkingCopyFileService', () => { test('registerWorkingCopyProvider', async function () { const model1 = instantiationService.createInstance(TextFileEditorModel, toResource.call(this, '/path/file-1.txt'), 'utf8', undefined); - (accessor.textFileService.files).add(model.resource, model); + (accessor.textFileService.files).add(model.resource, model); await model1.load(); model1.textEditorModel!.setValue('foo'); diff --git a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts index 16614a66dc..3b45ed1719 100644 --- a/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/abstractWorkspaceEditingService.ts @@ -8,13 +8,13 @@ import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; import { IWorkspaceContextService, WorkbenchState } 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 } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, WORKSPACE_FILTER, IEnterWorkspaceResult, hasWorkspaceFileExtension, WORKSPACE_EXTENSION, isUntitledWorkspace, 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'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { distinct } from 'vs/base/common/arrays'; -import { isEqual, getComparisonKey, isEqualAuthority } from 'vs/base/common/resources'; +import { isEqualAuthority, extUri } from 'vs/base/common/resources'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IFileService } from 'vs/platform/files/common/files'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; @@ -24,14 +24,16 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IHostService } from 'vs/workbench/services/host/browser/host'; import { Schemas } from 'vs/base/common/network'; +import { SaveReason } from 'vs/workbench/common/editor'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditingService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IJSONEditingService private readonly jsonEditingService: IJSONEditingService, - @IWorkspaceContextService private readonly contextService: WorkspaceService, + @IWorkspaceContextService protected readonly contextService: WorkspaceService, @IConfigurationService private readonly configurationService: IConfigurationService, @INotificationService private readonly notificationService: INotificationService, @ICommandService private readonly commandService: ICommandService, @@ -41,7 +43,8 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi @IWorkbenchEnvironmentService protected readonly environmentService: IWorkbenchEnvironmentService, @IFileDialogService private readonly fileDialogService: IFileDialogService, @IDialogService protected readonly dialogService: IDialogService, - @IHostService protected readonly hostService: IHostService + @IHostService protected readonly hostService: IHostService, + @IUriIdentityService protected readonly uriIdentityService: IUriIdentityService ) { } async pickNewWorkspacePath(): Promise { @@ -139,7 +142,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi if (state !== WorkbenchState.WORKSPACE) { let newWorkspaceFolders = this.contextService.getWorkspace().folders.map(folder => ({ uri: folder.uri })); newWorkspaceFolders.splice(typeof index === 'number' ? index : newWorkspaceFolders.length, 0, ...foldersToAdd); - newWorkspaceFolders = distinct(newWorkspaceFolders, folder => getComparisonKey(folder.uri)); + newWorkspaceFolders = distinct(newWorkspaceFolders, folder => this.uriIdentityService.extUri.getComparisonKey(folder.uri)); if (state === WorkbenchState.EMPTY && newWorkspaceFolders.length === 0 || state === WorkbenchState.FOLDER && newWorkspaceFolders.length === 1) { return; // return if the operation is a no-op for the current state @@ -183,7 +186,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi private includesSingleFolderWorkspace(folders: URI[]): boolean { if (this.contextService.getWorkbenchState() === WorkbenchState.FOLDER) { const workspaceFolder = this.contextService.getWorkspace().folders[0]; - return (folders.some(folder => isEqual(folder, workspaceFolder.uri))); + return (folders.some(folder => this.uriIdentityService.extUri.isEqual(folder, workspaceFolder.uri))); } return false; @@ -198,6 +201,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi const untitledWorkspace = await this.workspacesService.createUntitledWorkspace(folders, remoteAuthority); if (path) { await this.saveWorkspaceAs(untitledWorkspace, path); + await this.workspacesService.deleteUntitledWorkspace(untitledWorkspace); // https://github.com/microsoft/vscode/issues/100276 } else { path = untitledWorkspace.configPath; } @@ -206,12 +210,18 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi } async saveAndEnterWorkspace(path: URI): Promise { - if (!await this.isValidTargetWorkspacePath(path)) { + const workspaceIdentifier = this.getCurrentWorkspaceIdentifier(); + if (!workspaceIdentifier) { return; } - const workspaceIdentifier = this.getCurrentWorkspaceIdentifier(); - if (!workspaceIdentifier) { + // Allow to save the workspace of the current window + if (extUri.isEqual(workspaceIdentifier.configPath, path)) { + return this.saveWorkspace(workspaceIdentifier); + } + + // From this moment on we require a valid target that is not opened already + if (!await this.isValidTargetWorkspacePath(path)) { return; } @@ -224,11 +234,11 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi return true; // OK } - protected async saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPathURI: URI): Promise { + protected async saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPathURI: URI): Promise { const configPathURI = workspace.configPath; // Return early if target is same as source - if (isEqual(configPathURI, targetConfigPathURI)) { + if (this.uriIdentityService.extUri.isEqual(configPathURI, targetConfigPathURI)) { return; } @@ -240,6 +250,28 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi await this.textFileService.create(targetConfigPathURI, newRawWorkspaceContents, { overwrite: true }); } + protected async saveWorkspace(workspace: IWorkspaceIdentifier): Promise { + const configPathURI = workspace.configPath; + + // First: try to save any existing model as it could be dirty + const existingModel = this.textFileService.files.get(configPathURI); + if (existingModel) { + await existingModel.save({ force: true, reason: SaveReason.EXPLICIT }); + return; + } + + // Second: if the file exists on disk, simply return + const workspaceFileExists = await this.fileService.exists(configPathURI); + if (workspaceFileExists) { + return; + } + + // Finally, we need to re-create the file as it was deleted + const newWorkspace: IStoredWorkspace = { folders: [] }; + const newRawWorkspaceContents = rewriteWorkspaceFileForNewLocation(JSON.stringify(newWorkspace, null, '\t'), configPathURI, false, configPathURI); + await this.textFileService.create(configPathURI, newRawWorkspaceContents); + } + private handleWorkspaceConfigurationEditingError(error: JSONEditingError): void { switch (error.code) { case JSONEditingErrorCode.ERROR_INVALID_FILE: @@ -313,7 +345,7 @@ export abstract class AbstractWorkspaceEditingService implements IWorkspaceEditi } } - return this.jsonEditingService.write(toWorkspace.configPath, [{ key: 'settings', value: targetWorkspaceConfiguration }], true); + return this.jsonEditingService.write(toWorkspace.configPath, [{ path: ['settings'], value: targetWorkspaceConfiguration }], true); } protected getCurrentWorkspaceIdentifier(): IWorkspaceIdentifier | undefined { diff --git a/src/vs/workbench/services/workspaces/browser/workspaceEditingService.ts b/src/vs/workbench/services/workspaces/browser/workspaceEditingService.ts index 95fabe3465..2a5bb83d27 100644 --- a/src/vs/workbench/services/workspaces/browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspaces/browser/workspaceEditingService.ts @@ -19,10 +19,11 @@ import { AbstractWorkspaceEditingService } from 'vs/workbench/services/workspace import { IWorkspaceEditingService } from 'vs/workbench/services/workspaces/common/workspaceEditing'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { URI } from 'vs/base/common/uri'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export class BrowserWorkspaceEditingService extends AbstractWorkspaceEditingService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IJSONEditingService jsonEditingService: IJSONEditingService, @@ -36,9 +37,10 @@ export class BrowserWorkspaceEditingService extends AbstractWorkspaceEditingServ @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService, @IFileDialogService fileDialogService: IFileDialogService, @IDialogService dialogService: IDialogService, - @IHostService hostService: IHostService + @IHostService hostService: IHostService, + @IUriIdentityService uriIdentityService: IUriIdentityService ) { - super(jsonEditingService, contextService, configurationService, notificationService, commandService, fileService, textFileService, workspacesService, environmentService, fileDialogService, dialogService, hostService); + super(jsonEditingService, contextService, configurationService, notificationService, commandService, fileService, textFileService, workspacesService, environmentService, fileDialogService, dialogService, hostService, uriIdentityService); } async enterWorkspace(path: URI): Promise { diff --git a/src/vs/workbench/services/workspaces/browser/workspacesService.ts b/src/vs/workbench/services/workspaces/browser/workspacesService.ts index 05d42c7f96..0ad8b9d7c7 100644 --- a/src/vs/workbench/services/workspaces/browser/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/browser/workspacesService.ts @@ -22,7 +22,7 @@ export class BrowserWorkspacesService extends Disposable implements IWorkspacesS static readonly RECENTLY_OPENED_KEY = 'recently.opened'; - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onRecentlyOpenedChange = this._register(new Emitter()); readonly onRecentlyOpenedChange = this._onRecentlyOpenedChange.event; diff --git a/src/vs/workbench/services/workspaces/common/workspaceEditing.ts b/src/vs/workbench/services/workspaces/common/workspaceEditing.ts index f2fd98d196..9fb7724dcb 100644 --- a/src/vs/workbench/services/workspaces/common/workspaceEditing.ts +++ b/src/vs/workbench/services/workspaces/common/workspaceEditing.ts @@ -11,7 +11,7 @@ export const IWorkspaceEditingService = createDecorator !!window.workspace && isEqual(window.workspace.configPath, path))) { + if (windows.some(window => !!window.workspace && this.uriIdentityService.extUri.isEqual(window.workspace.configPath, path))) { await this.dialogService.show( Severity.Info, nls.localize('workspaceOpenedMessage', "Unable to save workspace '{0}'", basename(path)), diff --git a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts index 42c55bc1ea..493210843b 100644 --- a/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts +++ b/src/vs/workbench/services/workspaces/electron-sandbox/workspacesService.ts @@ -11,7 +11,7 @@ import { IElectronService } from 'vs/platform/electron/electron-sandbox/electron export class NativeWorkspacesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IMainProcessService mainProcessService: IMainProcessService, diff --git a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts b/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts index f6f49dcfb7..89f9453caf 100644 --- a/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts +++ b/src/vs/workbench/test/browser/api/extHostDocumentData.test.ts @@ -301,7 +301,7 @@ suite('ExtHostDocumentData', () => { test('getWordRangeAtPosition can freeze the extension host #95319', function () { const regex = /(https?:\/\/github\.com\/(([^\s]+)\/([^\s]+))\/([^\s]+\/)?(issues|pull)\/([0-9]+))|(([^\s]+)\/([^\s]+))?#([1-9][0-9]*)($|[\s\:\;\-\(\=])/; - const line = '{"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/authentication/common/authentication"},{"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/authentication/common/authenticationIpc"},{"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":"IAuthenticationTokenService","kind":"const","kindModifiers":"export","sortText":"5","hasAction":true,"source":"/Users/jrieken/Code/vscode/src/vs/platform/authentication/common/authentication"},{"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"}]}}'; + const line = '{"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"}]}}'; data = new ExtHostDocumentData(undefined!, URI.file(''), [ line ], '\n', 'text', 1, false); diff --git a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts index 414d737251..8ceb5f04b5 100644 --- a/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/browser/api/extHostLanguageFeatures.test.ts @@ -883,9 +883,9 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const value = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); - assert.equal(value.length, 1); - assert.equal(value[0].completion.insertText, 'testing2'); + const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + assert.equal(items.length, 1); + assert.equal(items[0].completion.insertText, 'testing2'); }); test('Suggest, order 2/3', async () => { @@ -903,9 +903,9 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const value = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); - assert.equal(value.length, 1); - assert.equal(value[0].completion.insertText, 'weak-selector'); + const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + assert.equal(items.length, 1); + assert.equal(items[0].completion.insertText, 'weak-selector'); }); test('Suggest, order 2/3', async () => { @@ -923,10 +923,10 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - const value = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); - assert.equal(value.length, 2); - assert.equal(value[0].completion.insertText, 'strong-1'); // sort by label - assert.equal(value[1].completion.insertText, 'strong-2'); + const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + assert.equal(items.length, 2); + assert.equal(items[0].completion.insertText, 'strong-1'); // sort by label + assert.equal(items[1].completion.insertText, 'strong-2'); }); test('Suggest, evil provider', async () => { @@ -945,8 +945,8 @@ suite('ExtHostLanguageFeatures', function () { await rpcProtocol.sync(); - const value = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); - assert.equal(value[0].container.incomplete, false); + const { items } = await provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))); + assert.equal(items[0].container.incomplete, false); }); test('Suggest, CompletionList', async () => { @@ -958,8 +958,8 @@ suite('ExtHostLanguageFeatures', function () { }, [])); await rpcProtocol.sync(); - provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))).then(value => { - assert.equal(value[0].container.incomplete, true); + provideSuggestionItems(model, new EditorPosition(1, 1), new CompletionOptions(undefined, new Set().add(modes.CompletionItemKind.Snippet))).then(model => { + assert.equal(model.items[0].container.incomplete, true); }); }); diff --git a/src/vs/workbench/test/browser/api/extHostMessagerService.test.ts b/src/vs/workbench/test/browser/api/extHostMessagerService.test.ts index 4d624d9ecd..30e43af53e 100644 --- a/src/vs/workbench/test/browser/api/extHostMessagerService.test.ts +++ b/src/vs/workbench/test/browser/api/extHostMessagerService.test.ts @@ -13,7 +13,7 @@ import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; const emptyDialogService = new class implements IDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; show(): never { throw new Error('not implemented'); } @@ -37,7 +37,7 @@ const emptyCommandService: ICommandService = { }; const emptyNotificationService = new class implements INotificationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; notify(...args: any[]): never { throw new Error('not implemented'); } @@ -62,7 +62,7 @@ const emptyNotificationService = new class implements INotificationService { }; class EmptyNotificationService implements INotificationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private withNotify: (notification: INotification) => void) { } diff --git a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts b/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts index 5d802285b2..da373a4e9e 100644 --- a/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts +++ b/src/vs/workbench/test/browser/api/extHostNotebookConcatDocument.test.ts @@ -73,7 +73,7 @@ suite('NotebookConcatDocument', function () { }); await extHostNotebooks.$acceptDocumentAndEditorsDelta({ newActiveEditor: '_notebook_editor_0' }); - notebook = extHostNotebooks.activeNotebookDocument!; + notebook = extHostNotebooks.notebookDocuments[0]!; disposables.add(reg); disposables.add(notebook); diff --git a/src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts b/src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts index 90427abd09..7649f62e4b 100644 --- a/src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts +++ b/src/vs/workbench/test/browser/api/extHostTypeConverter.test.ts @@ -7,12 +7,21 @@ import * as assert from 'assert'; import { MarkdownString, LogLevel } from 'vs/workbench/api/common/extHostTypeConverters'; import { isEmptyObject } from 'vs/base/common/types'; -import { size, forEach } from 'vs/base/common/collections'; +import { forEach } from 'vs/base/common/collections'; import * as types from 'vs/workbench/api/common/extHostTypes'; import { LogLevel as _MainLogLevel } from 'vs/platform/log/common/log'; import { URI } from 'vs/base/common/uri'; suite('ExtHostTypeConverter', function () { + function size(from: Record): number { + let count = 0; + for (let key in from) { + if (Object.prototype.hasOwnProperty.call(from, key)) { + count += 1; + } + } + return count; + } test('MarkdownConvert - uris', function () { diff --git a/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts b/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts index 6ee47ff573..92042892d6 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadDocuments.test.ts @@ -8,10 +8,11 @@ import { BoundModelReferenceCollection } from 'vs/workbench/api/browser/mainThre import { createTextModel } from 'vs/editor/test/common/editorTestUtils'; import { timeout } from 'vs/base/common/async'; import { URI } from 'vs/base/common/uri'; +import { extUri } from 'vs/base/common/resources'; suite('BoundModelReferenceCollection', () => { - let col = new BoundModelReferenceCollection(15, 75); + let col = new BoundModelReferenceCollection(extUri, 15, 75); teardown(() => { col.dispose(); diff --git a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts index 0501131083..7ee1d686c8 100644 --- a/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadDocumentsAndEditors.test.ts @@ -27,6 +27,7 @@ import { TestDialogService } from 'vs/platform/dialogs/test/common/testDialogSer import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { TestTextResourcePropertiesService, TestWorkingCopyFileService } from 'vs/workbench/test/common/workbenchTestServices'; import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; suite('MainThreadDocumentsAndEditors', () => { @@ -67,6 +68,8 @@ suite('MainThreadDocumentsAndEditors', () => { const fileService = new class extends mock() { onDidRunOperation = Event.None; + onDidChangeFileSystemProviderCapabilities = Event.None; + onDidChangeFileSystemProviderRegistrations = Event.None; }; new MainThreadDocumentsAndEditors( @@ -82,7 +85,7 @@ suite('MainThreadDocumentsAndEditors', () => { editorGroupService, null!, new class extends mock() implements IPanelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidPanelOpen = Event.None; onDidPanelClose = Event.None; getActivePanel() { @@ -92,6 +95,11 @@ suite('MainThreadDocumentsAndEditors', () => { TestEnvironmentService, new TestWorkingCopyFileService(), new UriIdentityService(fileService), + new class extends mock() { + readText() { + return Promise.resolve('clipboard_contents'); + } + } ); }); diff --git a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts index a25dbd7b12..ec2e0d449a 100644 --- a/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/browser/api/mainThreadEditors.test.ts @@ -48,6 +48,8 @@ import { IUndoRedoService } from 'vs/platform/undoRedo/common/undoRedo'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { TestTextResourcePropertiesService, TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; +import { extUri } from 'vs/base/common/resources'; suite('MainThreadEditors', () => { @@ -131,13 +133,16 @@ suite('MainThreadEditors', () => { }); services.set(IPanelService, new class extends mock() implements IPanelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidPanelOpen = Event.None; onDidPanelClose = Event.None; getActivePanel() { return undefined; } }); + services.set(IUriIdentityService, new class extends mock() { + get extUri() { return extUri; } + }); const instaService = new InstantiationService(services); diff --git a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts index 71a37a88be..ac9b191efd 100644 --- a/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/baseEditor.test.ts @@ -20,6 +20,7 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorModel } from 'vs/platform/editor/common/editor'; import { dispose } from 'vs/base/common/lifecycle'; import { TestStorageService } from 'vs/workbench/test/common/workbenchTestServices'; +import { extUri } from 'vs/base/common/resources'; const NullThemeService = new TestThemeService(); @@ -158,10 +159,10 @@ suite('Workbench base editor', () => { let inst = workbenchInstantiationService(); - const editor = EditorRegistry.getEditor(inst.createInstance(MyResourceEditorInput, 'fake', '', URI.file('/fake'), undefined))!.instantiate(inst); + const editor = EditorRegistry.getEditor(inst.createInstance(MyResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst); assert.strictEqual(editor.getId(), 'myEditor'); - const otherEditor = EditorRegistry.getEditor(inst.createInstance(ResourceEditorInput, 'fake', '', URI.file('/fake'), undefined))!.instantiate(inst); + const otherEditor = EditorRegistry.getEditor(inst.createInstance(ResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst); assert.strictEqual(otherEditor.getId(), 'workbench.editors.textResourceEditor'); disposable.dispose(); @@ -170,7 +171,7 @@ suite('Workbench base editor', () => { test('Editor Lookup favors specific class over superclass (match on super class)', function () { let inst = workbenchInstantiationService(); - const editor = EditorRegistry.getEditor(inst.createInstance(MyResourceEditorInput, 'fake', '', URI.file('/fake'), undefined))!.instantiate(inst); + const editor = EditorRegistry.getEditor(inst.createInstance(MyResourceEditorInput, URI.file('/fake'), 'fake', '', undefined))!.instantiate(inst); assert.strictEqual('workbench.editors.textResourceEditor', editor.getId()); }); @@ -266,7 +267,7 @@ suite('Workbench base editor', () => { memento.saveEditorState(testGroup0, URI.file('/some/folder/file-2.txt'), { line: 2 }); memento.saveEditorState(testGroup0, URI.file('/some/other/file.txt'), { line: 3 }); - memento.moveEditorState(URI.file('/some/folder/file-1.txt'), URI.file('/some/folder/file-moved.txt')); + memento.moveEditorState(URI.file('/some/folder/file-1.txt'), URI.file('/some/folder/file-moved.txt'), extUri); let res = memento.loadEditorState(testGroup0, URI.file('/some/folder/file-1.txt')); assert.ok(!res); @@ -274,7 +275,7 @@ suite('Workbench base editor', () => { res = memento.loadEditorState(testGroup0, URI.file('/some/folder/file-moved.txt')); assert.equal(res?.line, 1); - memento.moveEditorState(URI.file('/some/folder'), URI.file('/some/folder-moved')); + memento.moveEditorState(URI.file('/some/folder'), URI.file('/some/folder-moved'), extUri); res = memento.loadEditorState(testGroup0, URI.file('/some/folder-moved/file-moved.txt')); assert.equal(res?.line, 1); diff --git a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts index 257fff36b2..81778e8909 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorDiffModel.test.ts @@ -35,8 +35,8 @@ suite('Workbench editor model', () => { } }); - let input = instantiationService.createInstance(ResourceEditorInput, 'name', 'description', URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), undefined); - let otherInput = instantiationService.createInstance(ResourceEditorInput, 'name2', 'description', URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), undefined); + let input = instantiationService.createInstance(ResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name', 'description', undefined); + let otherInput = instantiationService.createInstance(ResourceEditorInput, URI.from({ scheme: 'test', authority: null!, path: 'thePath' }), 'name2', 'description', undefined); let diffInput = new DiffEditorInput('name', 'description', input, otherInput); let model = await diffInput.resolve() as TextDiffEditorModel; diff --git a/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts index 027f7c83f7..d80d44d073 100644 --- a/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/editorGroups.test.ts @@ -155,6 +155,7 @@ class TestFileEditorInput extends EditorInput implements IFileEditorInput { } getTypeId() { return 'testFileEditorInputForGroups'; } resolve(): Promise { return Promise.resolve(null!); } + setLabel(label: URI): void { } setEncoding(encoding: string) { } getEncoding() { return undefined; } setPreferredEncoding(encoding: string) { } @@ -276,9 +277,11 @@ suite('Workbench editor groups', () => { group.openEditor(input1, { pinned: true, active: true }); assert.equal(group.contains(input1), true); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { strictEquals: true }), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), false); + assert.equal(group.contains(input2, { strictEquals: true }), false); + assert.equal(group.contains(input2, { supportSideBySide: true }), false); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), false); @@ -306,7 +309,7 @@ suite('Workbench editor groups', () => { group.closeEditor(input1); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), true); assert.equal(group.contains(diffInput1), true); assert.equal(group.contains(diffInput2), true); @@ -314,27 +317,27 @@ suite('Workbench editor groups', () => { group.closeEditor(input2); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), true); + assert.equal(group.contains(input2, { supportSideBySide: true }), true); assert.equal(group.contains(diffInput1), true); assert.equal(group.contains(diffInput2), true); group.closeEditor(diffInput1); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), true); + assert.equal(group.contains(input1, { supportSideBySide: true }), true); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), true); + assert.equal(group.contains(input2, { supportSideBySide: true }), true); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), true); group.closeEditor(diffInput2); assert.equal(group.contains(input1), false); - assert.equal(group.contains(input1, true), false); + assert.equal(group.contains(input1, { supportSideBySide: true }), false); assert.equal(group.contains(input2), false); - assert.equal(group.contains(input2, true), false); + assert.equal(group.contains(input2, { supportSideBySide: true }), false); assert.equal(group.contains(diffInput1), false); assert.equal(group.contains(diffInput2), false); diff --git a/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts index 91d11eef05..9fece24feb 100644 --- a/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts +++ b/src/vs/workbench/test/browser/parts/editor/resourceEditorInput.test.ts @@ -26,7 +26,7 @@ suite('Resource text editors', () => { const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); accessor.modelService.createModel('function test() {}', accessor.modeService.create('text'), resource); - const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, 'The Name', 'The Description', resource, undefined); + const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', undefined); const model = await input.resolve(); @@ -42,7 +42,7 @@ suite('Resource text editors', () => { const resource = URI.from({ scheme: 'inmemory', authority: null!, path: 'thePath' }); accessor.modelService.createModel('function test() {}', accessor.modeService.create('text'), resource); - const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, 'The Name', 'The Description', resource, 'resource-input-test'); + const input: ResourceEditorInput = instantiationService.createInstance(ResourceEditorInput, resource, 'The Name', 'The Description', 'resource-input-test'); const model = await input.resolve(); assert.ok(model); diff --git a/src/vs/workbench/test/browser/workbenchTestServices.ts b/src/vs/workbench/test/browser/workbenchTestServices.ts index 365be3b2b2..f46c0ffbb8 100644 --- a/src/vs/workbench/test/browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/browser/workbenchTestServices.ts @@ -109,9 +109,10 @@ import { IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService } from import { IPaneComposite } from 'vs/workbench/common/panecomposite'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; import { UriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentityService'; +import { TextFileEditorModelManager } from 'vs/workbench/services/textfile/common/textFileEditorModelManager'; export function createFileEditorInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { - return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined); + return instantiationService.createInstance(FileEditorInput, resource, undefined, undefined, undefined); } export interface ITestInstantiationService extends IInstantiationService { @@ -120,7 +121,8 @@ export interface ITestInstantiationService extends IInstantiationService { export function workbenchInstantiationService(overrides?: { textFileService?: (instantiationService: IInstantiationService) => ITextFileService - pathService?: (instantiationService: IInstantiationService) => IPathService + pathService?: (instantiationService: IInstantiationService) => IPathService, + editorService?: (instantiationService: IInstantiationService) => IEditorService }): ITestInstantiationService { const instantiationService = new TestInstantiationService(new ServiceCollection([ILifecycleService, new TestLifecycleService()])); @@ -171,7 +173,7 @@ export function workbenchInstantiationService(overrides?: { const editorGroupService = new TestEditorGroupsService([new TestEditorGroupView(0)]); instantiationService.stub(IEditorGroupsService, editorGroupService); instantiationService.stub(ILabelService, instantiationService.createInstance(LabelService)); - const editorService = new TestEditorService(editorGroupService); + const editorService = overrides?.editorService ? overrides.editorService(instantiationService) : new TestEditorService(editorGroupService); instantiationService.stub(IEditorService, editorService); instantiationService.stub(ICodeEditorService, new CodeEditorService(editorService, themeService)); instantiationService.stub(IViewletService, new TestViewletService()); @@ -223,7 +225,8 @@ export class TestTextFileService extends BrowserTextFileService { @ITextModelService textModelService: ITextModelService, @ICodeEditorService codeEditorService: ICodeEditorService, @IPathService pathService: IPathService, - @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService + @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService, + @IUriIdentityService uriIdentityService: IUriIdentityService ) { super( fileService, @@ -239,7 +242,8 @@ export class TestTextFileService extends BrowserTextFileService { textModelService, codeEditorService, pathService, - workingCopyFileService + workingCopyFileService, + uriIdentityService ); } @@ -277,7 +281,7 @@ export const TestEnvironmentService = new TestEnvironmentServiceWithArgs(Object. export class TestProgressService implements IProgressService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; withProgress( options: IProgressOptions | IProgressWindowOptions | IProgressNotificationOptions | IProgressCompositeOptions, @@ -290,7 +294,7 @@ export class TestProgressService implements IProgressService { export class TestAccessibilityService implements IAccessibilityService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidChangeScreenReaderOptimized = Event.None; @@ -302,7 +306,7 @@ export class TestAccessibilityService implements IAccessibilityService { export class TestDecorationsService implements IDecorationsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidChangeDecorations: Event = Event.None; @@ -312,7 +316,7 @@ export class TestDecorationsService implements IDecorationsService { export class TestMenuService implements IMenuService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; createMenu(_id: MenuId, _scopedKeybindingService: IContextKeyService): IMenu { return { @@ -325,7 +329,7 @@ export class TestMenuService implements IMenuService { export class TestHistoryService implements IHistoryService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private root?: URI) { } @@ -346,7 +350,7 @@ export class TestHistoryService implements IHistoryService { export class TestFileDialogService implements IFileDialogService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private confirmResult!: ConfirmResult; @@ -371,7 +375,7 @@ export class TestFileDialogService implements IFileDialogService { export class TestLayoutService implements IWorkbenchLayoutService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; openedDefaultEditors = false; @@ -431,7 +435,7 @@ export class TestLayoutService implements IWorkbenchLayoutService { let activeViewlet: Viewlet = {} as any; export class TestViewletService implements IViewletService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidViewletRegisterEmitter = new Emitter(); onDidViewletDeregisterEmitter = new Emitter(); @@ -456,7 +460,7 @@ export class TestViewletService implements IViewletService { } export class TestPanelService implements IPanelService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidPanelOpen = new Emitter<{ panel: IPanel, focus: boolean }>().event; onDidPanelClose = new Emitter().event; @@ -475,7 +479,7 @@ export class TestPanelService implements IPanelService { } export class TestViewsService implements IViewsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidChangeViewContainerVisibility = new Emitter<{ id: string; visible: boolean; location: ViewContainerLocation }>().event; @@ -495,7 +499,7 @@ export class TestViewsService implements IViewsService { export class TestEditorGroupsService implements IEditorGroupsService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(public groups: TestEditorGroupView[] = []) { } @@ -626,7 +630,7 @@ export class TestEditorGroupAccessor implements IEditorGroupsAccessor { export class TestEditorService implements EditorServiceImpl { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onDidActiveEditorChange: Event = Event.None; onDidVisibleEditorsChange: Event = Event.None; @@ -634,10 +638,17 @@ export class TestEditorService implements EditorServiceImpl { onDidOpenEditorFail: Event = Event.None; onDidMostRecentlyActiveEditorsChange: Event = Event.None; + private _activeTextEditorControl: ICodeEditor | IDiffEditor | undefined; + public get activeTextEditorControl(): ICodeEditor | IDiffEditor | undefined { return this._activeTextEditorControl; } + public set activeTextEditorControl(value: ICodeEditor | IDiffEditor | undefined) { this._activeTextEditorControl = value; } + activeEditorPane: IVisibleEditorPane | undefined; - activeTextEditorControl: ICodeEditor | IDiffEditor | undefined; activeTextEditorMode: string | undefined; - activeEditor: IEditorInput | undefined; + + private _activeEditor: IEditorInput | undefined; + public get activeEditor(): IEditorInput | undefined { return this._activeEditor; } + public set activeEditor(value: IEditorInput | undefined) { this._activeEditor = value; } + editors: ReadonlyArray = []; mostRecentlyActiveEditors: ReadonlyArray = []; visibleEditorPanes: ReadonlyArray = []; @@ -674,12 +685,12 @@ export class TestEditorService implements EditorServiceImpl { saveAll(options?: ISaveEditorsOptions): Promise { throw new Error('Method not implemented.'); } revert(editors: IEditorIdentifier[], options?: IRevertOptions): Promise { throw new Error('Method not implemented.'); } revertAll(options?: IRevertAllEditorsOptions): Promise { throw new Error('Method not implemented.'); } - whenClosed(resources: URI[], options?: { waitForSaved: boolean }): Promise { throw new Error('Method not implemented.'); } + whenClosed(editors: IResourceEditorInput[], options?: { waitForSaved: boolean }): Promise { throw new Error('Method not implemented.'); } } export class TestFileService implements IFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private readonly _onDidFilesChange = new Emitter(); private readonly _onDidRunOperation = new Emitter(); @@ -741,7 +752,7 @@ export class TestFileService implements IFileService { this.lastReadFileUri = resource; return Promise.resolve({ - resource: resource, + resource, value: { on: (event: string, callback: Function): void => { if (event === 'data') { @@ -751,6 +762,7 @@ export class TestFileService implements IFileService { callback(); } }, + removeListener: () => { }, resume: () => { }, pause: () => { }, destroy: () => { } @@ -822,10 +834,14 @@ export class TestFileService implements IFileService { getWriteEncoding(_resource: URI): IResourceEncoding { return { encoding: 'utf8', hasBOM: false }; } dispose(): void { } + + 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; } } export class TestBackupFileService implements IBackupFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; hasBackups(): Promise { return Promise.resolve(false); } hasBackup(_resource: URI): Promise { return Promise.resolve(false); } @@ -847,7 +863,7 @@ export class TestBackupFileService implements IBackupFileService { export class TestLifecycleService implements ILifecycleService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; phase!: LifecyclePhase; startupKind!: StartupKind; @@ -875,7 +891,7 @@ export class TestLifecycleService implements ILifecycleService { export class TestTextResourceConfigurationService implements ITextResourceConfigurationService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private configurationService = new TestConfigurationService()) { } @@ -932,7 +948,7 @@ export const productService: IProductService = { _serviceBrand: undefined, ...pr export class TestHostService implements IHostService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private _hasFocus = true; get hasFocus() { return this._hasFocus; } @@ -1057,6 +1073,7 @@ export class TestFileEditorInput extends EditorInput implements IFileEditorInput getTypeId() { return this.typeId; } resolve(): Promise { return !this.fails ? Promise.resolve(null) : Promise.reject(new Error('fails')); } matches(other: EditorInput): boolean { return !!(other?.resource && this.resource.toString() === other.resource.toString() && other instanceof TestFileEditorInput && other.getTypeId() === this.typeId); } + setLabel(label: URI): void { } setEncoding(encoding: string) { } getEncoding() { return undefined; } setPreferredEncoding(encoding: string) { } @@ -1094,7 +1111,7 @@ export class TestFileEditorInput extends EditorInput implements IFileEditorInput this.gotDisposed = true; } movedEditor: IMoveResult | undefined = undefined; - move(): IMoveResult | undefined { return this.movedEditor; } + rename(): IMoveResult | undefined { return this.movedEditor; } } export class TestEditorPart extends EditorPart { @@ -1117,7 +1134,7 @@ export class TestEditorPart extends EditorPart { } export class TestListService implements IListService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; lastFocusedList: any | undefined = undefined; @@ -1128,7 +1145,7 @@ export class TestListService implements IListService { export class TestPathService implements IPathService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(private readonly fallbackUserHome: URI = URI.from({ scheme: Schemas.vscodeRemote, path: '/' })) { } @@ -1141,3 +1158,14 @@ export class TestPathService implements IPathService { return URI.file(path); } } + +export class TestTextFileEditorModelManager extends TextFileEditorModelManager { + + add(resource: URI, model: TextFileEditorModel): void { + return super.add(resource, model); + } + + remove(resource: URI): void { + return super.remove(resource); + } +} diff --git a/src/vs/workbench/test/common/workbenchTestServices.ts b/src/vs/workbench/test/common/workbenchTestServices.ts index e0f2928ea7..88e9417df1 100644 --- a/src/vs/workbench/test/common/workbenchTestServices.ts +++ b/src/vs/workbench/test/common/workbenchTestServices.ts @@ -22,7 +22,7 @@ import { FileOperation, IFileStatWithMetadata } from 'vs/platform/files/common/f export class TestTextResourcePropertiesService implements ITextResourcePropertiesService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor( @IConfigurationService private readonly configurationService: IConfigurationService, @@ -40,7 +40,7 @@ export class TestTextResourcePropertiesService implements ITextResourcePropertie export class TestContextService implements IWorkspaceContextService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; private workspace: Workspace; private options: object; @@ -126,7 +126,7 @@ export class TestWorkingCopyService extends WorkingCopyService { } export class TestWorkingCopyFileService implements IWorkingCopyFileService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; onWillRunWorkingCopyFileOperation: Event = Event.None; onDidFailWorkingCopyFileOperation: Event = Event.None; diff --git a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts b/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts index d12ad4963c..bba0e57f2e 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts @@ -144,7 +144,7 @@ suite('ExtHostSearch', () => { constructor() { super( rpcProtocol, - new class extends mock() { remote = { isRemote: false, authority: undefined }; }, + new class extends mock() { remote = { isRemote: false, authority: undefined, connectionData: null }; }, new URITransformerService(null), logService ); diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index f00df3144d..6eb5a8c9c9 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -38,6 +38,7 @@ import { IWorkingCopyService } from 'vs/workbench/services/workingCopy/common/wo import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { INativeWindowConfiguration } from 'vs/platform/windows/node/window'; import { TestContextService } from 'vs/workbench/test/common/workbenchTestServices'; +import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export const TestWindowConfiguration: INativeWindowConfiguration = { windowId: 0, @@ -74,7 +75,8 @@ export class TestTextFileService extends NativeTextFileService { @ICodeEditorService codeEditorService: ICodeEditorService, @IPathService athService: IPathService, @IWorkingCopyFileService workingCopyFileService: IWorkingCopyFileService, - @ILogService logService: ILogService + @ILogService logService: ILogService, + @IUriIdentityService uriIdentityService: IUriIdentityService ) { super( fileService, @@ -92,7 +94,8 @@ export class TestTextFileService extends NativeTextFileService { codeEditorService, athService, workingCopyFileService, - logService + logService, + uriIdentityService ); } @@ -149,7 +152,7 @@ class TestEncodingOracle extends EncodingOracle { export class TestSharedProcessService implements ISharedProcessService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; getChannel(channelName: string): any { return undefined; } @@ -161,7 +164,7 @@ export class TestSharedProcessService implements ISharedProcessService { export class TestElectronService implements IElectronService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; readonly windowId = -1; @@ -170,6 +173,7 @@ export class TestElectronService implements IElectronService { onWindowUnmaximize: Event = Event.None; onWindowFocus: Event = Event.None; onWindowBlur: Event = Event.None; + onOSResume: Event = Event.None; windowCount = Promise.resolve(1); getWindowCount(): Promise { return this.windowCount; } @@ -209,11 +213,13 @@ export class TestElectronService implements IElectronService { async moveWindowTabToNewWindow(): Promise { } async mergeAllWindowTabs(): Promise { } async toggleWindowTabsBar(): Promise { } + async notifyReady(): Promise { } async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } async reload(): Promise { } async closeWindow(): Promise { } async closeWindowById(): Promise { } async quit(): Promise { } + async exit(code: number): Promise { } async openDevTools(options?: Electron.OpenDevToolsOptions | undefined): Promise { } async toggleDevTools(): Promise { } async startCrashReporter(options: Electron.CrashReporterStartOptions): Promise { } @@ -257,7 +263,7 @@ export class TestServiceAccessor { export class TestNativePathService extends TestPathService { - _serviceBrand: undefined; + declare readonly _serviceBrand: undefined; constructor(@IWorkbenchEnvironmentService environmentService: INativeWorkbenchEnvironmentService) { super(environmentService.userHome); diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index 1380ad4f7c..3cad0ea575 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -85,6 +85,7 @@ import 'vs/workbench/services/filesConfiguration/common/filesConfigurationServic import 'vs/workbench/services/views/browser/viewDescriptorService'; import 'vs/workbench/services/quickinput/browser/quickInputService'; import 'vs/workbench/services/userDataSync/browser/userDataSyncWorkbenchService'; +import 'vs/workbench/services/authentication/browser/authenticationService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionGalleryService'; @@ -111,10 +112,10 @@ import { IDownloadService } from 'vs/platform/download/common/download'; import { DownloadService } from 'vs/platform/download/common/downloadService'; import { OpenerService } from 'vs/editor/browser/services/openerService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IUserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; -import { UserDataSyncEnablementService } from 'vs/platform/userDataSync/common/userDataSyncEnablementService'; +import { IUserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSync'; +import { UserDataSyncResourceEnablementService } from 'vs/platform/userDataSync/common/userDataSyncResourceEnablementService'; -registerSingleton(IUserDataSyncEnablementService, UserDataSyncEnablementService); +registerSingleton(IUserDataSyncResourceEnablementService, UserDataSyncResourceEnablementService); registerSingleton(IGlobalExtensionEnablementService, GlobalExtensionEnablementService); registerSingleton(IExtensionGalleryService, ExtensionGalleryService, true); registerSingleton(IContextViewService, ContextViewService, true); @@ -387,6 +388,9 @@ import 'vs/workbench/contrib/welcome/common/viewsWelcome.contribution'; // Timeline import 'vs/workbench/contrib/timeline/browser/timeline.contribution'; +// Hover +import 'vs/workbench/contrib/hover/browser/hover.contribution'; + //#endregion //#region -- contributions diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 6cb43e08dd..fa1756562d 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -52,13 +52,11 @@ import 'vs/workbench/services/telemetry/electron-browser/telemetryService'; import 'vs/workbench/services/configurationResolver/electron-browser/configurationResolverService'; import 'vs/workbench/services/extensionManagement/node/extensionManagementService'; import 'vs/workbench/services/accessibility/electron-browser/accessibilityService'; -import 'vs/workbench/services/remote/node/tunnelService'; import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/workspaces/electron-browser/workspaceEditingService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncMachinesService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService'; -import 'vs/workbench/services/authentication/electron-browser/authenticationTokenService'; -import 'vs/workbench/services/authentication/browser/authenticationService'; +import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncAccountService'; import 'vs/workbench/services/sharedProcess/electron-browser/sharedProcessService'; import 'vs/workbench/services/localizations/electron-browser/localizationsService'; import 'vs/workbench/services/clipboard/electron-browser/clipboardService'; @@ -69,9 +67,12 @@ import { ICredentialsService } from 'vs/platform/credentials/common/credentials' import { KeytarCredentialsService } from 'vs/platform/credentials/node/credentialsService'; import { IUserDataAutoSyncService } from 'vs/platform/userDataSync/common/userDataSync'; import { UserDataAutoSyncService } from 'vs/workbench/contrib/userDataSync/electron-browser/userDataAutoSyncService'; +import { ITunnelService } from 'vs/platform/remote/common/tunnel'; +import { TunnelService } from 'vs/platform/remote/node/tunnelService'; registerSingleton(ICredentialsService, KeytarCredentialsService, true); registerSingleton(IUserDataAutoSyncService, UserDataAutoSyncService); +registerSingleton(ITunnelService, TunnelService); //#endregion @@ -121,8 +122,8 @@ import 'vs/workbench/contrib/remote/electron-browser/remote.contribution'; // CodeEditor Contributions import 'vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution'; -// Execution -import 'vs/workbench/contrib/externalTerminal/node/externalTerminalService'; +// External Terminal +import 'vs/workbench/contrib/externalTerminal/node/externalTerminal.contribution'; // Performance import 'vs/workbench/contrib/performance/electron-browser/performance.contribution'; diff --git a/src/vs/workbench/workbench.web.api.ts b/src/vs/workbench/workbench.web.api.ts index 633926a343..7d29c3711c 100644 --- a/src/vs/workbench/workbench.web.api.ts +++ b/src/vs/workbench/workbench.web.api.ts @@ -17,6 +17,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { Disposable, IDisposable } 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/platform/product/common/productService'; interface IResourceUriProvider { (uri: URI): URI; @@ -25,6 +26,7 @@ interface IResourceUriProvider { interface IStaticExtension { packageJSON: IExtensionManifest; extensionLocation: URI; + isBuiltin?: boolean; } interface ICommontTelemetryPropertiesResolver { @@ -161,14 +163,22 @@ interface IDefaultPanelLayout { })[]; } +interface IDefaultView { + readonly id: string; +} + interface IDefaultEditor { readonly uri: UriComponents; readonly openOnlyIfExists?: boolean; + readonly openWith?: string; } interface IDefaultLayout { + /** @deprecated Use views instead */ readonly sidebar?: IDefaultSideBarLayout; + /** @deprecated Use views instead */ readonly panel?: IDefaultPanelLayout; + readonly views?: IDefaultView[]; readonly editors?: IDefaultEditor[]; } @@ -273,15 +283,25 @@ interface IWorkbenchConstructionOptions { */ readonly commands?: readonly ICommand[]; + /** + * Optional default layout to apply on first time the workspace is opened. + */ + readonly defaultLayout?: IDefaultLayout; + + //#endregion + + + //#region Branding + /** * Optional home indicator to appear above the hamburger menu in the activity bar. */ readonly homeIndicator?: IHomeIndicator; /** - * Optional default layout to apply on first time the workspace is opened. + * Optional override for the product configuration properties. */ - readonly defaultLayout?: IDefaultLayout; + readonly productConfiguration?: Partial; //#endregion @@ -429,14 +449,16 @@ export { ICommand, commands, - // Home Indicator + // Branding IHomeIndicator, + IProductConfiguration, // Default layout + IDefaultView, IDefaultEditor, IDefaultLayout, IDefaultPanelLayout, - IDefaultSideBarLayout, + IDefaultSideBarLayout }; //#endregion diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 9ab49f720a..86f5765319 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -61,19 +61,17 @@ import { BackupFileService } from 'vs/workbench/services/backup/common/backupFil import { IExtensionManagementService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionTipsService'; import { ExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagementService'; -import { ITunnelService } from 'vs/platform/remote/common/tunnel'; -import { TunnelService } from 'vs/workbench/services/remote/common/tunnelService'; +import { ITunnelService, TunnelService } from 'vs/platform/remote/common/tunnel'; import { ILoggerService } from 'vs/platform/log/common/log'; import { FileLoggerService } from 'vs/platform/log/common/fileLogService'; import { UserDataSyncMachinesService, IUserDataSyncMachinesService } from 'vs/platform/userDataSync/common/userDataSyncMachines'; import { IUserDataSyncStoreService, IUserDataSyncService, IUserDataSyncLogService, IUserDataAutoSyncService, IUserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSync'; import { StorageKeysSyncRegistryService, IStorageKeysSyncRegistryService } from 'vs/platform/userDataSync/common/storageKeys'; -import { AuthenticationService, IAuthenticationService } from 'vs/workbench/services/authentication/browser/authenticationService'; import { UserDataSyncLogService } from 'vs/platform/userDataSync/common/userDataSyncLog'; import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { UserDataSyncBackupStoreService } from 'vs/platform/userDataSync/common/userDataSyncBackupStoreService'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; -import { IAuthenticationTokenService, AuthenticationTokenService } from 'vs/platform/authentication/common/authentication'; +import { IUserDataSyncAccountService, UserDataSyncAccountService } from 'vs/platform/userDataSync/common/userDataSyncAccount'; import { UserDataAutoSyncService } from 'vs/workbench/contrib/userDataSync/browser/userDataAutoSyncService'; import { AccessibilityService } from 'vs/platform/accessibility/common/accessibilityService'; import { ITitleService } from 'vs/workbench/services/title/common/titleService'; @@ -85,13 +83,12 @@ registerSingleton(IAccessibilityService, AccessibilityService, true); registerSingleton(IContextMenuService, ContextMenuService); registerSingleton(ITunnelService, TunnelService, true); registerSingleton(ILoggerService, FileLoggerService); -registerSingleton(IAuthenticationService, AuthenticationService); registerSingleton(IUserDataSyncLogService, UserDataSyncLogService); registerSingleton(IUserDataSyncStoreService, UserDataSyncStoreService); registerSingleton(IUserDataSyncMachinesService, UserDataSyncMachinesService); registerSingleton(IUserDataSyncBackupStoreService, UserDataSyncBackupStoreService); registerSingleton(IStorageKeysSyncRegistryService, StorageKeysSyncRegistryService); -registerSingleton(IAuthenticationTokenService, AuthenticationTokenService); +registerSingleton(IUserDataSyncAccountService, UserDataSyncAccountService); registerSingleton(IUserDataAutoSyncService, UserDataAutoSyncService); registerSingleton(IUserDataSyncService, UserDataSyncService); registerSingleton(ITitleService, TitlebarPart); diff --git a/test/automation/src/code.ts b/test/automation/src/code.ts index 4fb898ad46..619e121c64 100644 --- a/test/automation/src/code.ts +++ b/test/automation/src/code.ts @@ -120,8 +120,10 @@ export async function spawn(options: SpawnOptions): Promise { let child: cp.ChildProcess | undefined; let connectDriver: typeof connectElectronDriver; + copyExtension(options, 'vscode-notebook-tests'); + if (options.web) { - await launch(options.userDataDir, options.workspacePath, options.extensionsPath, options.codePath); + await launch(options.userDataDir, options.workspacePath, options.codePath, options.extensionsPath); connectDriver = connectPlaywrightDriver.bind(connectPlaywrightDriver, options.browser); return connect(connectDriver, child, '', handle, options.logger); } @@ -134,6 +136,7 @@ export async function spawn(options: SpawnOptions): Promise { options.workspacePath, '--skip-release-notes', '--disable-telemetry', + '--no-cached-data', '--disable-updates', '--disable-crash-reporter', `--extensions-dir=${options.extensionsPath}`, @@ -156,7 +159,7 @@ export async function spawn(options: SpawnOptions): Promise { env['TESTRESOLVER_DATA_FOLDER'] = remoteDataDir; } - copyExtension(options, 'vscode-notebook-tests'); + args.push('--enable-proposed-api=vscode.vscode-notebook-tests'); if (!codePath) { diff --git a/test/automation/src/notebook.ts b/test/automation/src/notebook.ts index d8355adf9e..109aa6eb42 100644 --- a/test/automation/src/notebook.ts +++ b/test/automation/src/notebook.ts @@ -35,7 +35,7 @@ export class Notebook { } async stopEditingCell() { - await this.code.dispatchKeybinding('esc'); + await this.quickAccess.runCommand('notebook.cell.quitEdit'); } async waitForTypeInEditor(text: string): Promise { diff --git a/test/automation/src/playwrightDriver.ts b/test/automation/src/playwrightDriver.ts index 2b1adedfbf..e06c7c3886 100644 --- a/test/automation/src/playwrightDriver.ts +++ b/test/automation/src/playwrightDriver.ts @@ -91,7 +91,7 @@ let server: ChildProcess | undefined; let endpoint: string | undefined; let workspacePath: string | undefined; -export async function launch(userDataDir: string, _workspacePath: string, extensionsDir: string, codeServerPath = process.env.VSCODE_REMOTE_SERVER_PATH): Promise { +export async function launch(userDataDir: string, _workspacePath: string, codeServerPath = process.env.VSCODE_REMOTE_SERVER_PATH, extPath: string): Promise { workspacePath = _workspacePath; const agentFolder = userDataDir; @@ -111,7 +111,7 @@ export async function launch(userDataDir: string, _workspacePath: string, extens } server = spawn( serverLocation, - ['--browser', 'none', '--driver', 'web', '--extensions-dir', `${extensionsDir}`], + ['--browser', 'none', '--driver', 'web', '--extensions-dir', extPath], { env } ); server.stderr?.on('data', error => console.log(`Server stderr: ${error}`)); @@ -146,7 +146,8 @@ export function connect(browserType: 'chromium' | 'webkit' | 'firefox' = 'chromi const context = await browser.newContext(); const page = await context.newPage(); await page.setViewportSize({ width, height }); - await page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${URI.file(workspacePath!).path}`); + const payloadParam = `[["enableProposedApi",""]]`; + await page.goto(`${endpoint}&folder=vscode-remote://localhost:9888${URI.file(workspacePath!).path}&payload=${payloadParam}`); const result = { client: { dispose: () => browser.close() && teardown() }, driver: buildDriver(browser, page) diff --git a/test/automation/src/statusbar.ts b/test/automation/src/statusbar.ts index 6f161d8b7e..980d856c22 100644 --- a/test/automation/src/statusbar.ts +++ b/test/automation/src/statusbar.ts @@ -19,7 +19,7 @@ export const enum StatusBarElement { export class StatusBar { - private readonly mainSelector = 'div[id="workbench.parts.statusbar"]'; + private readonly mainSelector = 'footer[id="workbench.parts.statusbar"]'; constructor(private code: Code) { } diff --git a/test/smoke/src/main.ts b/test/smoke/src/main.ts index 0bcccb0adc..5b3858e5cd 100644 --- a/test/smoke/src/main.ts +++ b/test/smoke/src/main.ts @@ -319,7 +319,7 @@ describe(`VSCode Smoke Tests (${opts.web ? 'Web' : 'Electron'})`, () => { /*if (!opts.web) { setupDataLossTests(); } if (!opts.web) { setupDataPreferencesTests(); } setupDataSearchTests(); - if (!opts.web) { setupDataNotebookTests(); } + setupDataNotebookTests(); setupDataLanguagesTests(); setupDataEditorTests(); setupDataStatusbarTests(!!opts.web); diff --git a/test/unit/electron/index.js b/test/unit/electron/index.js index 75b5493c7b..17d1ef2e97 100644 --- a/test/unit/electron/index.js +++ b/test/unit/electron/index.js @@ -126,7 +126,8 @@ app.on('ready', () => { webSecurity: false, webviewTag: true, preload: path.join(__dirname, '..', '..', '..', 'src', 'vs', 'base', 'parts', 'sandbox', 'electron-browser', 'preload.js'), // ensure similar environment as VSCode as tests may depend on this - enableWebSQL: false + enableWebSQL: false, + nativeWindowOpen: true } }); diff --git a/yarn.lock b/yarn.lock index bdb298a5b6..9370be67f0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -411,47 +411,71 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.21.0.tgz#a34de84a0791cae0357c4dda805c5b4e8203b6c6" - integrity sha512-b5jjjDMxzcjh/Sbjuo7WyhrQmVJg0WipTHQgXh5Xwx10uYm6nPWqN1WGOsaNq4HR3Zh4wUx4IRQdDkCHwyewyw== +"@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== dependencies: - "@typescript-eslint/experimental-utils" "2.21.0" - eslint-utils "^1.4.3" + "@typescript-eslint/experimental-utils" "3.2.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" + semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.21.0.tgz#71de390a3ec00b280b69138d80733406e6e86bfa" - integrity sha512-olKw9JP/XUkav4lq0I7S1mhGgONJF9rHNhKFn9wJlpfRVjNo3PPjSvybxEldvCXnvD+WAshSzqH5cEjPp9CsBA== +"@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== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/typescript-estree" "3.2.0" eslint-scope "^5.0.0" + eslint-utils "^2.0.0" -"@typescript-eslint/parser@^2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.21.0.tgz#4f200995517c3d5fc5ef51b17527bc948992e438" - integrity sha512-VrmbdrrrvvI6cPPOG7uOgGUFXNYTiSbnRq8ZMyuGa4+qmXJXVLEEz78hKuqupvkpwJQNk1Ucz1TenrRP90gmBg== +"@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== + 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/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== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.21.0" - "@typescript-eslint/typescript-estree" "2.21.0" + "@typescript-eslint/experimental-utils" "3.3.0" + "@typescript-eslint/typescript-estree" "3.3.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.21.0": - version "2.21.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.21.0.tgz#7e4be29f2e338195a2e8c818949ed0ff727cc943" - integrity sha512-NC/nogZNb9IK2MEFQqyDBAciOT8Lp8O3KgAfvHx2Skx6WBo+KmDqlU3R9KxHONaijfTIKtojRe3SZQyMjr3wBw== +"@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 "^6.3.0" + semver "^7.3.2" + tsutils "^3.17.1" + +"@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== + 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" "@webassemblyjs/ast@1.5.13": @@ -2810,10 +2834,10 @@ electron-to-chromium@^1.2.7: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" integrity sha1-eOy4o5kGYYe7N07t412ccFZagD0= -electron@7.3.0: - version "7.3.0" - resolved "https://registry.yarnpkg.com/electron/-/electron-7.3.0.tgz#b4e1bd1efe32314534dba9b60ea5cc688216f3b3" - integrity sha512-uG3WVhyawWXBUJN+f5GkdCq8z5r+XsvpLLAyUuPo+DL2PXt57YI1wEXc5qTJq9hzlLAcGOlU/4+8pSkYBWOn1A== +electron@7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/electron/-/electron-7.3.1.tgz#3574f85866b97a8712265442dbf7244cac639910" + integrity sha512-T1yuQqjTpRIh/oQ1rIhuN2aIk0YZaielyn09oxrMMwvL+C3bHvpPUJSCZrtVSzdUmTORhQRM9FZPzheBsneVUA== dependencies: "@electron/get" "^1.0.1" "@types/node" "^12.0.12" @@ -3015,6 +3039,13 @@ eslint-utils@^1.4.3: 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== + dependencies: + eslint-visitor-keys "^1.1.0" + eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" @@ -4680,10 +4711,10 @@ husky@^0.13.1: is-ci "^1.0.9" normalize-path "^1.0.0" -iconv-lite@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550" - integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw== +iconv-lite@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.0.tgz#66a93b80df0bd05d2a43a7426296b7f91073f125" + integrity sha512-43ZpGYZ9QtuutX5l6WC1DSO8ane9N+Ct5qPLF2OV7vM9abM69gnAbVkh66ibaZd3aOGkoP1ZmringlKhLBkw2Q== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -7978,9 +8009,9 @@ regexpp@^2.0.1: integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== regexpp@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" - integrity sha512-Z+hNr7RAVWxznLPuA7DIh8UNX1j9CDrUQxskw9IrBE1Dxue2lyXT+shqEIeLUjrokxIP8CMy1WkjgG3rTsd5/g== + version "3.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" + integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== regextras@^0.7.0: version "0.7.0" @@ -8458,6 +8489,11 @@ semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + serialize-error@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" @@ -9518,9 +9554,9 @@ typescript@^2.6.2: integrity sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q= typescript@^3.9.3: - version "3.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" - integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== + version "3.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.5.tgz#586f0dba300cde8be52dd1ac4f7e1009c1b13f36" + integrity sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ== uc.micro@^1.0.1, uc.micro@^1.0.3: version "1.0.3" @@ -9930,10 +9966,10 @@ vsce@1.48.0: yauzl "^2.3.1" yazl "^2.2.2" -vscode-debugprotocol@^1.40.0: - version "1.40.0" - resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.40.0.tgz#63e1f670a6f5c4928f3f91b27b259a21c4db7861" - integrity sha512-Fwze+9qbLDPuQUhtITJSu/Vk6zIuakNM1iR2ZiZRgRaMEgBpMs2JSKaT0chrhJHCOy6/UbpsUbUBIseF6msV+g== +vscode-debugprotocol@1.41.0: + version "1.41.0" + resolved "https://registry.yarnpkg.com/vscode-debugprotocol/-/vscode-debugprotocol-1.41.0.tgz#fc99b01dee26e9f25cbb5708318fc0081002808c" + integrity sha512-Sxp7kDDuhpEZiDaIfhM0jLF3RtMqvc6CpoESANE77t351uezsd/oDoqALLcOnmmsDzTgQ3W0sCvM4gErnjDFpA== vscode-nls-dev@^3.3.1: version "3.3.1"