From c814b9255765edb7dc1232ce3ed3bcd5b58a5c99 Mon Sep 17 00:00:00 2001 From: Anthony Dresser Date: Wed, 20 Mar 2019 10:39:09 -0700 Subject: [PATCH] VSCode merge (#4610) * Merge from vscode e388c734f30757875976c7e326d6cfeee77710de * fix yarn lcoks * remove small issue --- .gitattributes | 3 +- .nvmrc | 2 +- .vscode/launch.json | 9 +- .vscode/tasks.json | 19 +- .../darwin/continuous-build-darwin.yml | 30 +- .../darwin/product-build-darwin.yml | 13 +- .../linux/continuous-build-linux.yml | 30 +- .../linux/product-build-linux.yml | 12 +- .../win32/continuous-build-win32.yml | 28 +- .../win32/product-build-win32.yml | 5 +- build/gulpfile.hygiene.js | 3 +- build/gulpfile.mixin.js | 10 +- build/gulpfile.vscode.js | 2 +- build/lib/i18n.resources.json | 8 + build/npm/postinstall.js | 11 +- build/yarn.lock | 1005 ++++++++++++++++- package.json | 2 - product.json | 1 + .../tree/treeViewDataProvider.ts | 4 +- .../electron-browser/mainThreadDashboard.ts | 4 +- .../electron-browser/mainThreadModalDialog.ts | 4 +- .../api/electron-browser/mainThreadTasks.ts | 4 +- .../api/node/extHostAccountManagement.ts | 4 +- .../node/extHostBackgroundTaskManagement.ts | 4 +- .../api/node/extHostConnectionManagement.ts | 2 +- .../api/node/extHostCredentialManagement.ts | 2 +- .../workbench/api/node/extHostDashboard.ts | 2 +- .../api/node/extHostDashboardWebview.ts | 2 +- .../workbench/api/node/extHostDataProtocol.ts | 2 +- .../api/node/extHostExtensionManagement.ts | 2 +- .../workbench/api/node/extHostModalDialog.ts | 2 +- .../workbench/api/node/extHostModelView.ts | 2 +- .../api/node/extHostModelViewDialog.ts | 2 +- .../api/node/extHostModelViewTree.ts | 2 +- src/sql/workbench/api/node/extHostNotebook.ts | 2 +- .../extHostNotebookDocumentsAndEditors.ts | 2 +- .../api/node/extHostObjectExplorer.ts | 2 +- .../workbench/api/node/extHostQueryEditor.ts | 2 +- .../api/node/extHostResourceProvider.ts | 4 +- .../api/node/extHostSerializationProvider.ts | 2 +- src/sql/workbench/api/node/extHostTasks.ts | 2 +- .../api/node/mainThreadAccountManagement.ts | 4 +- .../mainThreadBackgroundTaskManagement.ts | 4 +- .../node/mainThreadConnectionManagement.ts | 4 +- .../node/mainThreadCredentialManagement.ts | 4 +- .../api/node/mainThreadDashboardWebview.ts | 4 +- .../api/node/mainThreadDataProtocol.ts | 4 +- .../api/node/mainThreadExtensionManagement.ts | 4 +- .../workbench/api/node/mainThreadModelView.ts | 4 +- .../api/node/mainThreadModelViewDialog.ts | 6 +- .../workbench/api/node/mainThreadNotebook.ts | 4 +- .../mainThreadNotebookDocumentsAndEditors.ts | 6 +- .../api/node/mainThreadObjectExplorer.ts | 4 +- .../api/node/mainThreadQueryEditor.ts | 4 +- .../api/node/mainThreadResourceProvider.ts | 4 +- .../node/mainThreadSerializationProvider.ts | 4 +- .../workbench/api/node/sqlExtHost.api.impl.ts | 2 +- .../workbench/api/node/sqlExtHost.protocol.ts | 9 +- .../api/extHostAccountManagement.test.ts | 4 +- .../extHostBackgroundTaskManagement.test.ts | 4 +- .../api/extHostCredentialManagement.test.ts | 2 +- .../workbench/api/extHostModelView.test.ts | 4 +- .../api/extHostModelViewDialog.test.ts | 4 +- .../workbench/api/exthostNotebook.test.ts | 4 +- ...mainThreadBackgroundTaskManagement.test.ts | 4 +- .../api/mainThreadModelViewDialog.test.ts | 4 +- .../workbench/api/mainThreadNotebook.test.ts | 2 +- src/tsconfig.base.json | 1 + src/tsconfig.strictNullChecks.json | 474 -------- src/vs/base/browser/ui/actionbar/actionbar.ts | 3 +- src/vs/base/browser/ui/menu/menubar.ts | 5 +- src/vs/base/common/arrays.ts | 4 + src/vs/base/parts/ipc/node/ipc.net.ts | 792 ++++++++++--- .../base/parts/ipc/test/node/ipc.net.test.ts | 215 +++- src/vs/code/electron-main/app.ts | 14 +- src/vs/code/electron-main/windows.ts | 2 +- src/vs/editor/common/modes.ts | 3 +- .../editor/contrib/hover/modesContentHover.ts | 13 +- .../editor/contrib/hover/modesGlyphHover.ts | 7 +- src/vs/editor/contrib/quickOpen/quickOpen.ts | 19 +- src/vs/platform/files/common/files.ts | 162 ++- .../remote/node/remoteAgentConnection.ts | 58 +- src/vs/platform/windows/common/windows.ts | 3 +- src/vs/vscode.d.ts | 60 +- src/vs/vscode.proposed.d.ts | 108 +- .../mainThreadClipboard.ts | 15 +- .../mainThreadCommands.ts | 4 +- .../mainThreadConfiguration.ts | 4 +- .../mainThreadDebugService.ts | 8 +- .../mainThreadDecorations.ts | 4 +- .../mainThreadDiagnostics.ts | 4 +- .../mainThreadDialogs.ts | 4 +- .../mainThreadDocumentContentProviders.ts | 4 +- .../mainThreadErrors.ts | 4 +- .../mainThreadFileSystem.ts | 4 +- .../mainThreadFileSystemEventService.ts | 4 +- .../mainThreadLanguages.ts | 4 +- .../mainThreadLogService.ts | 4 +- .../mainThreadMessageService.ts | 4 +- .../mainThreadOutputService.ts | 4 +- .../mainThreadProgress.ts | 4 +- .../mainThreadQuickOpen.ts | 7 +- .../mainThreadSCM.ts | 4 +- .../mainThreadSaveParticipant.ts | 4 +- .../mainThreadSearch.ts | 17 +- .../mainThreadStatusBar.ts | 4 +- .../mainThreadStorage.ts | 4 +- .../mainThreadTelemetry.ts | 4 +- .../mainThreadTerminalService.ts | 20 +- .../mainThreadTreeViews.ts | 4 +- .../mainThreadWindow.ts | 4 +- .../mainThreadWorkspace.ts | 7 +- .../api/{node => common}/extHost.protocol.ts | 165 ++- .../extHostCustomers.ts | 4 +- .../api/{ => common}/shared/editor.ts | 0 .../api/{ => common}/shared/tasks.ts | 0 .../extensionHost.contribution.ts | 61 +- .../electron-browser/mainThreadComments.ts | 61 +- .../api/electron-browser/mainThreadConsole.ts | 4 +- .../electron-browser/mainThreadDocuments.ts | 2 +- .../mainThreadDocumentsAndEditors.ts | 6 +- .../api/electron-browser/mainThreadEditor.ts | 32 +- .../api/electron-browser/mainThreadEditors.ts | 4 +- .../mainThreadExtensionService.ts | 4 +- .../electron-browser/mainThreadHeapService.ts | 4 +- .../mainThreadLanguageFeatures.ts | 36 +- .../api/electron-browser/mainThreadTask.ts | 8 +- .../api/electron-browser/mainThreadUrls.ts | 4 +- .../api/electron-browser/mainThreadWebview.ts | 15 +- src/vs/workbench/api/node/apiCommands.ts | 2 +- src/vs/workbench/api/node/extHost.api.impl.ts | 12 +- .../workbench/api/node/extHostApiCommands.ts | 2 +- src/vs/workbench/api/node/extHostClipboard.ts | 2 +- src/vs/workbench/api/node/extHostCommands.ts | 2 +- src/vs/workbench/api/node/extHostComments.ts | 23 +- .../api/node/extHostConfiguration.ts | 2 +- .../workbench/api/node/extHostDebugService.ts | 5 +- .../workbench/api/node/extHostDecorations.ts | 5 +- .../workbench/api/node/extHostDiagnostics.ts | 2 +- src/vs/workbench/api/node/extHostDialogs.ts | 2 +- .../node/extHostDocumentContentProviders.ts | 2 +- .../workbench/api/node/extHostDocumentData.ts | 2 +- .../node/extHostDocumentSaveParticipant.ts | 2 +- src/vs/workbench/api/node/extHostDocuments.ts | 2 +- .../api/node/extHostDocumentsAndEditors.ts | 2 +- .../api/node/extHostExtensionService.ts | 5 +- .../workbench/api/node/extHostFileSystem.ts | 2 +- .../api/node/extHostFileSystemEventService.ts | 2 +- .../workbench/api/node/extHostHeapService.ts | 2 +- .../api/node/extHostLanguageFeatures.ts | 92 +- src/vs/workbench/api/node/extHostLanguages.ts | 2 +- .../workbench/api/node/extHostLogService.ts | 2 +- .../api/node/extHostMessageService.ts | 2 +- .../api/node/extHostOutputService.ts | 2 +- src/vs/workbench/api/node/extHostProgress.ts | 2 +- src/vs/workbench/api/node/extHostQuickOpen.ts | 2 +- src/vs/workbench/api/node/extHostSCM.ts | 2 +- src/vs/workbench/api/node/extHostSearch.ts | 2 +- src/vs/workbench/api/node/extHostStatusBar.ts | 2 +- src/vs/workbench/api/node/extHostStorage.ts | 2 +- src/vs/workbench/api/node/extHostTask.ts | 6 +- .../api/node/extHostTerminalService.ts | 39 +- .../workbench/api/node/extHostTextEditor.ts | 10 +- .../workbench/api/node/extHostTextEditors.ts | 4 +- src/vs/workbench/api/node/extHostTreeViews.ts | 2 +- .../api/node/extHostTypeConverters.ts | 29 +- src/vs/workbench/api/node/extHostTypes.ts | 42 +- src/vs/workbench/api/node/extHostUrls.ts | 2 +- src/vs/workbench/api/node/extHostWebview.ts | 4 +- src/vs/workbench/api/node/extHostWindow.ts | 2 +- src/vs/workbench/api/node/extHostWorkspace.ts | 2 +- src/vs/workbench/browser/layout.ts | 2 +- .../browser/nodeless.simpleservices.ts | 3 +- src/vs/workbench/browser/workbench.ts | 17 +- .../browser/callHierarchy.contribution.ts | 160 +++ .../browser/callHierarchyPeek.ts | 425 +++++++ .../browser/callHierarchyTree.ts | 96 ++ .../browser/media/CallerOrCalleeView_16x.svg | 1 + .../media/CallerOrCalleeView_16x_dark.svg | 1 + .../browser/media/callHierarchy.css | 39 + .../callHierarchy/common/callHierarchy.ts | 45 + .../browser/codeEditor.contribution.ts | 2 +- .../comments/electron-browser/commentNode.ts | 4 +- .../electron-browser/commentThreadWidget.ts | 15 +- .../commentsEditorContribution.ts | 57 +- .../contrib/debug/browser/callStackView.ts | 27 +- .../contrib/debug/browser/debugCommands.ts | 180 ++- .../contrib/debug/browser/debugViewlet.ts | 18 +- .../workbench/contrib/debug/browser/repl.ts | 12 +- .../contrib/debug/browser/variablesView.ts | 35 +- .../debug/browser/watchExpressionsView.ts | 14 +- .../debug/common/abstractDebugAdapter.ts | 161 +++ .../workbench/contrib/debug/common/debug.ts | 1 + .../contrib/debug/common/debugUtils.ts | 21 +- .../contrib/debug/common/debugViewModel.ts | 5 +- .../electron-browser/debug.contribution.ts | 124 +- .../contrib/debug/node/debugAdapter.ts | 163 +-- .../electron-browser/extensionsWidgets.ts | 38 +- .../preferences/browser/keybindingsEditor.ts | 54 +- .../contrib/preferences/common/preferences.ts | 2 +- .../preferences.contribution.ts | 25 +- .../search/browser/media/searchview.css | 2 +- .../search/browser/search.contribution.ts | 38 +- .../contrib/search/browser/searchActions.ts | 29 +- .../contrib/search/browser/searchPanel.ts | 4 +- .../contrib/search/browser/searchView.ts | 28 +- .../contrib/search/browser/searchViewlet.ts | 4 +- .../contrib/search/browser/searchWidget.ts | 10 +- .../contrib/search/common/queryBuilder.ts | 8 + .../contrib/search/common/searchModel.ts | 2 +- .../jsonSchemaCommon.ts | 0 .../jsonSchema_v1.ts | 0 .../jsonSchema_v2.ts | 3 +- .../media/configure-inverse.svg | 0 .../media/configure.svg | 0 .../media/status-error.svg | 0 .../media/status-info.svg | 0 .../media/status-warning.svg | 0 .../media/task.contribution.css | 0 .../media/task.svg | 0 .../electron-browser/task.contribution.ts | 6 +- .../terminal/browser/terminal.contribution.ts | 4 +- .../browser/terminalProcessManager.ts | 21 + .../contrib/terminal/common/terminal.ts | 6 +- .../common/terminalProcessExtHostProxy.ts | 16 + .../terminal/common/terminalService.ts | 2 +- .../electron-browser/terminalService.ts | 26 +- .../contrib/terminal/node/terminalProcess.ts | 4 + .../welcome/page/browser/welcomePage.ts | 6 +- .../electron-browser/main.contribution.ts | 10 + src/vs/workbench/electron-browser/main.ts | 6 +- src/vs/workbench/electron-browser/window.ts | 4 +- .../browser/configurationResolverService.ts | 33 +- .../common/configurationResolver.ts | 4 +- .../common/variableResolver.ts | 4 +- .../configurationResolverService.test.ts | 6 +- .../dialogs/browser/remoteFileDialog.ts | 3 +- .../node/multiExtensionManagement.ts | 9 +- .../{node => common}/proxyIdentifier.ts | 0 .../electron-browser/extensionHost.ts | 6 +- .../extensionHostProcessManager.ts | 6 +- .../electron-browser/extensionService.ts | 24 +- .../extensions/node/extensionHostMain.ts | 5 +- .../extensions/node/extensionHostProcess.ts | 109 +- .../extensions/node/extensionHostProtocol.ts | 9 + .../services/extensions/node/proxyResolver.ts | 16 +- .../services/extensions/node/rpcProtocol.ts | 5 +- .../extensions/test/node/rpcProtocol.test.ts | 2 +- .../services/files/node/fileService.ts | 55 +- .../services/files/node/remoteFileService.ts | 85 +- .../test/electron-browser/fileService.test.ts | 48 - .../services/files2/common/fileService2.ts | 259 +++++ .../files2/node/diskFileSystemProvider.ts | 150 +++ .../files2/node/diskFileSystemSupport.ts | 19 + .../files2/test/browser/fileService2.test.ts | 59 + .../files2/test/node/diskFileService.test.ts | 98 ++ .../fixtures/resolver/examples/company.js | 23 + .../node/fixtures/resolver/examples/conway.js | 117 ++ .../fixtures/resolver/examples/employee.js | 38 + .../node/fixtures/resolver/examples/small.js | 24 + .../test/node/fixtures/resolver/index.html | 121 ++ .../fixtures/resolver/other/deep/company.js | 23 + .../fixtures/resolver/other/deep/conway.js | 117 ++ .../fixtures/resolver/other/deep/employee.js | 38 + .../fixtures/resolver/other/deep/small.js | 24 + .../test/node/fixtures/resolver/site.css | 40 + .../test/node/fixtures/service/binary.txt | Bin 0 -> 274 bytes .../node/fixtures/service/deep/company.js | 23 + .../test/node/fixtures/service/deep/conway.js | 117 ++ .../node/fixtures/service/deep/employee.js | 38 + .../test/node/fixtures/service/deep/small.js | 24 + .../test/node/fixtures/service/index.html | 121 ++ .../test/node/fixtures/service/lorem.txt | 283 +++++ .../test/node/fixtures/service/small.txt | 1 + .../node/fixtures/service/small_umlaut.txt | 1 + .../node/fixtures/service/some_utf16le.css | Bin 0 -> 1408 bytes .../node/fixtures/service/some_utf8_bom.txt | 1 + .../common/keybindingsEditorModel.ts | 24 +- .../remoteAgentServiceImpl.ts | 11 +- .../services/search/common/search.ts | 4 +- .../services/search/node/searchService.ts | 20 +- .../services/search/node/textSearchAdapter.ts | 4 +- .../api/extHostApiCommands.test.ts | 4 +- .../api/extHostCommands.test.ts | 2 +- .../api/extHostConfiguration.test.ts | 2 +- .../api/extHostDiagnostics.test.ts | 2 +- .../api/extHostDocumentData.test.ts | 2 +- .../extHostDocumentSaveParticipant.test.ts | 2 +- .../api/extHostFileSystemEventService.test.ts | 2 +- .../api/extHostLanguageFeatures.test.ts | 4 +- .../api/extHostMessagerService.test.ts | 2 +- .../api/extHostSearch.test.ts | 2 +- .../api/extHostTextEditor.test.ts | 74 +- .../api/extHostTextEditors.test.ts | 2 +- .../api/extHostTreeViews.test.ts | 4 +- .../api/extHostWebview.test.ts | 2 +- .../api/extHostWorkspace.test.ts | 4 +- .../api/mainThreadCommands.test.ts | 2 +- .../api/mainThreadConfiguration.test.ts | 2 +- .../api/mainThreadDiagnostics.test.ts | 2 +- ...mainThreadDocumentContentProviders.test.ts | 2 +- .../api/mainThreadDocumentsAndEditors.test.ts | 2 +- .../api/mainThreadEditors.test.ts | 2 +- .../api/mainThreadSaveParticipant.test.ts | 2 +- .../api/mainThreadWorkspace.test.ts | 2 +- .../electron-browser/api/testRPCProtocol.ts | 4 +- .../workbench/test/workbenchTestServices.ts | 32 +- src/vs/workbench/workbench.main.ts | 4 + test/smoke/src/areas/debug/debugSmoke.ts | 12 +- yarn.lock | 115 +- 310 files changed, 6606 insertions(+), 2129 deletions(-) delete mode 100644 src/tsconfig.strictNullChecks.json rename src/vs/workbench/api/{electron-browser => browser}/mainThreadClipboard.ts (57%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadCommands.ts (95%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadConfiguration.ts (96%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadDebugService.ts (98%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadDecorations.ts (96%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadDiagnostics.ts (92%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadDialogs.ts (95%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadDocumentContentProviders.ts (96%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadErrors.ts (88%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadFileSystem.ts (98%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadFileSystemEventService.ts (94%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadLanguages.ts (92%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadLogService.ts (88%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadMessageService.ts (96%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadOutputService.ts (96%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadProgress.ts (92%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadQuickOpen.ts (94%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadSCM.ts (98%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadSaveParticipant.ts (99%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadSearch.ts (90%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadStatusBar.ts (93%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadStorage.ts (93%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadTelemetry.ts (90%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadTerminalService.ts (92%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadTreeViews.ts (98%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadWindow.ts (90%) rename src/vs/workbench/api/{electron-browser => browser}/mainThreadWorkspace.ts (97%) rename src/vs/workbench/api/{node => common}/extHost.protocol.ts (90%) rename src/vs/workbench/api/{electron-browser => common}/extHostCustomers.ts (95%) rename src/vs/workbench/api/{ => common}/shared/editor.ts (100%) rename src/vs/workbench/api/{ => common}/shared/tasks.ts (100%) create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x.svg create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x_dark.svg create mode 100644 src/vs/workbench/contrib/callHierarchy/browser/media/callHierarchy.css create mode 100644 src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts create mode 100644 src/vs/workbench/contrib/debug/common/abstractDebugAdapter.ts rename src/vs/workbench/contrib/tasks/{electron-browser => common}/jsonSchemaCommon.ts (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/jsonSchema_v1.ts (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/jsonSchema_v2.ts (99%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/configure-inverse.svg (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/configure.svg (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/status-error.svg (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/status-info.svg (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/status-warning.svg (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/task.contribution.css (100%) rename src/vs/workbench/contrib/tasks/{electron-browser => common}/media/task.svg (100%) rename src/vs/workbench/services/extensions/{node => common}/proxyIdentifier.ts (100%) create mode 100644 src/vs/workbench/services/files2/common/fileService2.ts create mode 100644 src/vs/workbench/services/files2/node/diskFileSystemProvider.ts create mode 100644 src/vs/workbench/services/files2/node/diskFileSystemSupport.ts create mode 100644 src/vs/workbench/services/files2/test/browser/fileService2.test.ts create mode 100644 src/vs/workbench/services/files2/test/node/diskFileService.test.ts create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/company.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/conway.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/employee.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/small.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/index.html create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/company.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/conway.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/employee.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/small.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/resolver/site.css create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/binary.txt create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/deep/company.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/deep/conway.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/deep/employee.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/deep/small.js create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/index.html create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/lorem.txt create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/small.txt create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/small_umlaut.txt create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/some_utf16le.css create mode 100644 src/vs/workbench/services/files2/test/node/fixtures/service/some_utf8_bom.txt diff --git a/.gitattributes b/.gitattributes index 0a56ba75f9..5a817c30b6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,4 +6,5 @@ ThirdPartyNotices.txt eol=crlf *.bat eol=crlf *.cmd eol=crlf *.ps1 eol=lf -*.sh eol=lf \ No newline at end of file +*.sh eol=lf +*.rtf -text \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 45a4fb75db..f599e28b8a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -8 +10 diff --git a/.vscode/launch.json b/.vscode/launch.json index 04058a1233..96078090cb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -211,6 +211,13 @@ "Launch azuredatastudio", "Attach to Extension Host" ] - } + }, + { + "name": "Debug Unit Tests", + "configurations": [ + "Attach to VS Code", + "Run Unit Tests" + ] + }, ] } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 4a704226c4..7055bf826f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -28,23 +28,6 @@ } } }, - { - "type": "npm", - "script": "strict-null-check-watch", - "label": "TS - Strict Null Checks", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "problemMatcher": { - "base": "$tsc-watch", - "owner": "typescript-strict-null", - "applyTo": "allDocuments" - }, - "runOptions": { - "runOn": "folderOpen" - } - }, { "type": "gulp", "task": "tslint", @@ -86,4 +69,4 @@ "problemMatcher": [] } ] -} +} \ No newline at end of file diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index ffa80168b1..1d370b0781 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -2,24 +2,25 @@ steps: - task: NodeTool@0 inputs: versionSpec: "10.15.1" -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: versionSpec: "1.10.1" +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: eq(variables['System.PullRequest.PullRequestId'], '') - script: | yarn displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) +# condition: or(ne(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: and(succeeded(), eq(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) - script: | yarn gulp electron-x64 displayName: Download Electron @@ -29,9 +30,6 @@ steps: - script: | yarn monaco-compile-check displayName: Run Monaco Editor Checks -- script: | - yarn strict-null-check - displayName: Run Strict Null Checks - script: | yarn compile displayName: Compile Sources @@ -49,4 +47,4 @@ steps: inputs: testResultsFiles: '*-results.xml' searchFolder: '$(Build.ArtifactStagingDirectory)/test-results' - condition: succeededOrFailed() \ No newline at end of file + condition: succeededOrFailed() diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index 40b4eb98f8..bf5afddde0 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -9,12 +9,19 @@ steps: - script: | set -e - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc + + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(VSO_PAT) + machine github.com + login vscode + password $(VSCODE_MIXIN_PASSWORD) + EOF + yarn + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" yarn gulp -- mixin yarn gulp -- hygiene yarn monaco-compile-check - yarn strict-null-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" yarn gulp -- mixin node build/azure-pipelines/common/installDistro.js node build/lib/builtInExtensions.js displayName: Prepare build diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml index 484334c7b7..db7d7d7402 100644 --- a/build/azure-pipelines/linux/continuous-build-linux.yml +++ b/build/azure-pipelines/linux/continuous-build-linux.yml @@ -10,24 +10,25 @@ steps: - task: NodeTool@0 inputs: versionSpec: "10.15.1" -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: versionSpec: "1.10.1" +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: eq(variables['System.PullRequest.PullRequestId'], '') - script: | yarn displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: or(ne(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: and(succeeded(), eq(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) - script: | yarn gulp electron-x64 displayName: Download Electron @@ -37,9 +38,6 @@ steps: - script: | yarn monaco-compile-check displayName: Run Monaco Editor Checks -- script: | - yarn strict-null-check - displayName: Run Strict Null Checks - script: | yarn compile displayName: Compile Sources @@ -54,4 +52,4 @@ steps: inputs: testResultsFiles: '*-results.xml' searchFolder: '$(Build.ArtifactStagingDirectory)/test-results' - condition: succeededOrFailed() \ No newline at end of file + condition: succeededOrFailed() diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index be321a474e..f7bec85a97 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -14,12 +14,18 @@ steps: export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig" fi - echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc + cat << EOF > ~/.netrc + machine monacotools.visualstudio.com + password $(VSO_PAT) + machine github.com + login vscode + password $(VSCODE_MIXIN_PASSWORD) + EOF + CHILD_CONCURRENCY=1 yarn + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin npm run gulp -- hygiene npm run monaco-compile-check - npm run strict-null-check - VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin node build/azure-pipelines/common/installDistro.js node build/lib/builtInExtensions.js diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index 764d7916fe..4508501f68 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -9,21 +9,22 @@ steps: inputs: versionSpec: '2.x' addToPath: true -- task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' +# - task: 1ESLighthouseEng.PipelineArtifactCaching.RestoreCacheV1.RestoreCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: eq(variables['System.PullRequest.PullRequestId'], '') - powershell: | yarn displayName: Install Dependencies - condition: ne(variables['CacheRestored'], 'true') -- task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 - inputs: - keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' - targetfolder: '**/node_modules, !**/node_modules/**/node_modules' - vstsFeed: '$(ArtifactFeed)' - condition: and(succeeded(), ne(variables['CacheRestored'], 'true')) + # condition: or(ne(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) +# - task: 1ESLighthouseEng.PipelineArtifactCaching.SaveCacheV1.SaveCache@1 +# inputs: +# keyfile: '**/yarn.lock, !**/node_modules/**/yarn.lock, !**/.*/**/yarn.lock' +# targetfolder: '**/node_modules, !**/node_modules/**/node_modules' +# vstsFeed: '$(ArtifactFeed)' +# condition: and(succeeded(), eq(variables['System.PullRequest.PullRequestId'], ''), ne(variables['CacheRestored'], 'true')) - powershell: | yarn gulp electron displayName: Download Electron @@ -33,9 +34,6 @@ steps: - powershell: | yarn monaco-compile-check displayName: Run Monaco Editor Checks -- script: | - yarn strict-null-check - displayName: Run Strict Null Checks - powershell: | yarn compile displayName: Compile Sources diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index ca028b0048..6d680f0d9d 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -15,15 +15,14 @@ steps: - powershell: | . build/azure-pipelines/win32/exec.ps1 $ErrorActionPreference = "Stop" - "machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII + "machine monacotools.visualstudio.com`npassword $(VSO_PAT)`nmachine github.com`nlogin vscode`npassword $(VSCODE_MIXIN_PASSWORD)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII $env:npm_config_arch="$(VSCODE_ARCH)" $env:CHILD_CONCURRENCY="1" $env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" exec { yarn } + exec { npm run gulp -- mixin } exec { npm run gulp -- hygiene } exec { npm run monaco-compile-check } - exec { npm run strict-null-check } - exec { npm run gulp -- mixin } exec { node build/azure-pipelines/common/installDistro.js } exec { node build/lib/builtInExtensions.js } diff --git a/build/gulpfile.hygiene.js b/build/gulpfile.hygiene.js index c151379359..f3fa69fedc 100644 --- a/build/gulpfile.hygiene.js +++ b/build/gulpfile.hygiene.js @@ -42,7 +42,8 @@ const indentationFilter = [ // except specific files '!ThirdPartyNotices.txt', - '!LICENSE.txt', + '!LICENSE.{txt,rtf}', + '!LICENSES.chromium.html', '!**/LICENSE', '!src/vs/nls.js', '!src/vs/nls.build.js', diff --git a/build/gulpfile.mixin.js b/build/gulpfile.mixin.js index 3b66a61d41..f03209f894 100644 --- a/build/gulpfile.mixin.js +++ b/build/gulpfile.mixin.js @@ -10,15 +10,15 @@ const json = require('gulp-json-editor'); const buffer = require('gulp-buffer'); const filter = require('gulp-filter'); const es = require('event-stream'); -const util = require('./lib/util'); -const remote = require('gulp-remote-src'); -const zip = require('gulp-vinyl-zip'); +const vfs = require('vinyl-fs'); +const pkg = require('../package.json'); +const cp = require('child_process'); +const fancyLog = require('fancy-log'); +const ansiColors = require('ansi-colors'); // {{SQL CARBON EDIT}} const jeditor = require('gulp-json-editor'); -const pkg = require('../package.json'); - gulp.task('mixin', function () { // {{SQL CARBON EDIT}} const updateUrl = process.env['SQLOPS_UPDATEURL']; diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 344ff2f2e3..5c1a35dc54 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -321,7 +321,7 @@ function packageTask(platform, arch, sourceFolderName, destinationFolderName, op const productJsonStream = gulp.src(['product.json'], { base: '.' }) .pipe(json(productJsonUpdate)); - const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true }); + const license = gulp.src(['LICENSES.chromium.html', product.licenseFileName, 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true }); // TODO the API should be copied to `out` during compile, not here const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts')); diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 424fd364c5..61a96c7d05 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -42,6 +42,10 @@ "name": "vs/workbench/contrib/codeinset", "project": "vscode-workbench" }, + { + "name": "vs/workbench/contrib/callHierarchy", + "project": "vscode-workbench" + }, { "name": "vs/workbench/contrib/comments", "project": "vscode-workbench" @@ -218,6 +222,10 @@ "name": "vs/workbench/services/files", "project": "vscode-workbench" }, + { + "name": "vs/workbench/services/files2", + "project": "vscode-workbench" + }, { "name": "vs/workbench/services/integrity", "project": "vscode-workbench" diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 45bd052cd5..f11f29dad4 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -17,8 +17,17 @@ function yarnInstall(location, opts) { opts.cwd = location; opts.stdio = 'inherit'; + const raw = process.env['npm_config_argv'] || '{}'; + const argv = JSON.parse(raw); + const original = argv.original || []; + const args = ['install']; + + if (original.indexOf('--ignore-optional') > -1) { + args.push('--ignore-optional'); + } + console.log('Installing dependencies in \'%s\'.', location); - const result = cp.spawnSync(yarn, ['install'], opts); + const result = cp.spawnSync(yarn, args, opts); if (result.error || result.status !== 0) { process.exit(1); diff --git a/build/yarn.lock b/build/yarn.lock index 279d0fdd91..b7c297cf93 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -27,14 +27,6 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.1.tgz#9794c69c8385d0192acc471a540d1f8e0d16218a" integrity sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A== -"@types/chokidar@*": - version "1.7.5" - resolved "https://registry.yarnpkg.com/@types/chokidar/-/chokidar-1.7.5.tgz#1fa78c8803e035bed6d98e6949e514b133b0c9b6" - integrity sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ== - dependencies: - "@types/events" "*" - "@types/node" "*" - "@types/debounce@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/debounce/-/debounce-1.0.0.tgz#417560200331e1bb84d72da85391102c2fcd61b7" @@ -89,9 +81,9 @@ "@types/node" "*" "@types/gulp-filter@^3.0.32": - version "3.0.32" - resolved "https://registry.yarnpkg.com/@types/gulp-filter/-/gulp-filter-3.0.32.tgz#eeff3e9dbc092268fed01f2421ab00f6c8cb4848" - integrity sha512-JvY4qTxXehoK2yCUxYVxTMvckVbDM5TWHWeUoYJyX31gwFqw4YDD6JNzhuTxI3yHPUTY4BBRTqgm6puQEZVCNg== + version "3.0.33" + resolved "https://registry.yarnpkg.com/@types/gulp-filter/-/gulp-filter-3.0.33.tgz#353f6a9a5c0edea1a704f50b14f7979179497134" + integrity sha512-LYwn+zTIt1h97RuGhqWT5DoeQQyfyiYIBOtPmeOYDEu0vo9GToiORUO+zBeYnCs5PIfJTAcHkGdhH61OTbSS4w== dependencies: "@types/minimatch" "*" "@types/node" "*" @@ -120,21 +112,21 @@ "@types/node" "*" "@types/gulp-uglify@^3.0.5": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.5.tgz#ddcbbb6bd15a84b8a6c5e2218c2efba98102d135" - integrity sha512-LD2b6gCPugrKI1W188nIp0gm+cAnGGwaTFpPdeZYVXwPHdoCQloy3du0JR62MeMjAwUwlcOb+SKYT6Qgw7yBiA== + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/gulp-uglify/-/gulp-uglify-3.0.6.tgz#7c7c38017680bbb8a3d815e23a7026799432ce54" + integrity sha512-NvnNG0lg0+fJHNDK/b4OvLZkn5uHSIgm1XslRqgHal8CHG85sxmcktnNR1XdIUkwYpNbYZkXfvpzNtAxb6cgyQ== dependencies: "@types/node" "*" - "@types/uglify-js" "^2" + "@types/uglify-js" "*" "@types/gulp@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.5.tgz#f5f498d5bf9538364792de22490a12c0e6bc5eb4" - integrity sha512-nx1QjPTiRpvLfYsZ7MBu7bT6Cm7tAXyLbY0xbdx2IEMxCK2v2urIhJMQZHW0iV1TskM71Xl6p2uRRuWDbk+/7g== + version "4.0.6" + resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.6.tgz#68fe0e1f0ff3657cfca46fb564806b744a1bf899" + integrity sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow== dependencies: - "@types/chokidar" "*" "@types/undertaker" "*" "@types/vinyl-fs" "*" + chokidar "^2.1.2" "@types/js-beautify@*": version "1.8.0" @@ -229,13 +221,6 @@ dependencies: source-map "^0.6.1" -"@types/uglify-js@^2": - version "2.6.31" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-2.6.31.tgz#c694755eeb6a1bb9f8f321f3ec37cc22ca4c4f6b" - integrity sha512-LjcyGt6CHsgZ0AoofnMwhyxo9hUqz2mgl6IcF+S8B1zdSTxHAvTO/1RPvBAHG3C1ZeAc+AoWA5mb3lDJKtM9Zg== - dependencies: - source-map "^0.6.1" - "@types/underscore@^1.8.9": version "1.8.9" resolved "https://registry.yarnpkg.com/@types/underscore/-/underscore-1.8.9.tgz#fef41f800cd23db1b4f262ddefe49cd952d82323" @@ -276,6 +261,11 @@ resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.0.33.tgz#20c5dd6460245284d64a55690015b95e409fb7de" integrity sha1-IMXdZGAkUoTWSlVpABW5XkCft94= +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + acorn@4.X: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" @@ -318,6 +308,11 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -335,6 +330,14 @@ ansi-wrap@0.1.0: resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768= +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" + applicationinsights@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/applicationinsights/-/applicationinsights-1.0.6.tgz#bc201810de91cea910dab34e8ad35ecde488edeb" @@ -344,6 +347,19 @@ applicationinsights@1.0.6: diagnostic-channel-publishers "0.2.1" zone.js "0.7.6" +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== + +are-we-there-yet@~1.1.2: + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -351,6 +367,21 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +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-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" @@ -368,6 +399,11 @@ array-uniq@^1.0.1, array-uniq@^1.0.2: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= +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@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -383,6 +419,16 @@ assert-plus@^0.2.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= +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.2" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" + integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -449,6 +495,19 @@ base64-js@^1.0.2: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== +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" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -461,6 +520,11 @@ beeper@^1.0.0: resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= +binary-extensions@^1.0.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + binary-search-bounds@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.3.tgz#5ff8616d6dd2ca5388bc85b2d6266e2b9da502dc" @@ -513,6 +577,22 @@ brace-expansion@^1.1.7: 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" + browserify-mime@~1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/browserify-mime/-/browserify-mime-1.2.9.tgz#aeb1af28de6c0d7a6a2ce40adb68ff18422af31f" @@ -554,6 +634,21 @@ builtin-modules@^1.1.1: resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= +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" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -591,6 +686,40 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" + integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== + 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.0" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" + integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== + +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" + clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" @@ -606,6 +735,19 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= +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= + +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" @@ -654,11 +796,21 @@ commander@~2.8.1: dependencies: graceful-readlink ">= 1.0.0" +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= + 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= +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" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= + convert-source-map@1.X: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" @@ -666,6 +818,11 @@ convert-source-map@1.X: dependencies: safe-buffer "~5.1.1" +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.2, 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" @@ -731,7 +888,7 @@ debug-fabulous@0.0.X: lazy-debug-legacy "0.0.X" object-assign "4.1.0" -debug@2.X: +debug@2.X, debug@^2.1.2, 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== @@ -810,6 +967,33 @@ decompress@^4.2.0: pify "^2.3.0" strip-dirs "^2.0.0" +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +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" + del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" @@ -827,11 +1011,21 @@ delayed-stream@~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" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" integrity sha1-OjYof1A05pnnV3kBBSwubJQlFjE= +detect-libc@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= + detect-newline@2.X: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -968,6 +1162,34 @@ eventemitter2@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-5.0.1.tgz#6197a095d5fb6b57e8942f6fd7eaad63a09c9452" integrity sha1-YZegldX7a1folC9v1+qtY6CclFI= +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" + +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" + extend@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c" @@ -978,6 +1200,20 @@ extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= +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" + extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -1024,6 +1260,21 @@ file-type@^6.1.0: resolved "https://registry.yarnpkg.com/file-type/-/file-type-6.2.0.tgz#e50cd75d356ffed4e306dc4f5bcf52a79903a919" integrity sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg== +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" + +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= + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1047,6 +1298,13 @@ form-data@~2.3.1: combined-stream "1.0.6" 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" + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -1068,11 +1326,40 @@ fs-extra@^2.1.2: graceful-fs "^4.1.2" jsonfile "^2.1.0" +fs-minipass@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== + dependencies: + minipass "^2.2.1" + 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.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + get-stream@^2.2.0: version "2.3.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" @@ -1081,6 +1368,11 @@ get-stream@^2.2.0: object-assign "^4.0.1" pinkie-promise "^2.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= + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1098,6 +1390,14 @@ github-releases@^0.4.1: prettyjson "1.2.1" request "2.81.0" +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@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" @@ -1133,7 +1433,7 @@ graceful-fs@4.X: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6: +graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -1244,6 +1544,42 @@ has-gulplog@^0.1.0: dependencies: sparkles "^1.0.0" +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= + +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.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" @@ -1335,11 +1671,25 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.4: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== +ignore-walk@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== + dependencies: + minimatch "^3.0.4" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1353,11 +1703,124 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== + +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-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@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + +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: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= + dependencies: + is-extglob "^2.1.1" + is-natural-number@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha1-q5124dtM7VHjXeDHLr7PCfc0zeg= +is-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-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -1377,6 +1840,13 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-object@^2.0.1, 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-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -1392,16 +1862,33 @@ is-utf8@^0.2.0: resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= +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== + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@~1.0.0: +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= +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= + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1481,6 +1968,30 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.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.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== + lazy-debug-legacy@0.0.X: version "0.0.1" resolved "https://registry.yarnpkg.com/lazy-debug-legacy/-/lazy-debug-legacy-0.0.1.tgz#537716c0776e4cf79e3ed1b621f7658c2911b1b1" @@ -1604,6 +2115,18 @@ make-dir@^1.0.0: dependencies: pify "^3.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" + markdown-it@^8.3.1: version "8.4.2" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" @@ -1628,6 +2151,25 @@ mdurl@^1.0.1: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= +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" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -1679,7 +2221,30 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -mkdirp@^0.5.1: +minipass@^2.2.1, minipass@^2.3.4: + version "2.3.5" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" + integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.1.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" + integrity sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA== + dependencies: + minipass "^2.2.1" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@^0.5.0, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -1708,13 +2273,96 @@ mute-stream@~0.0.4: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -normalize-path@^2.0.1: +nan@^2.9.2: + version "2.13.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" + integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== + +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" + +needle@^2.2.1: + version "2.2.4" + resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== + dependencies: + debug "^2.1.2" + iconv-lite "^0.4.4" + sax "^1.2.4" + +node-pre-gyp@^0.10.0: + version "0.10.3" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== + dependencies: + detect-libc "^1.0.2" + mkdirp "^0.5.1" + needle "^2.2.1" + nopt "^4.0.1" + npm-packlist "^1.1.6" + npmlog "^4.0.2" + rc "^1.2.7" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^4" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= + dependencies: + abbrev "1" + osenv "^0.1.4" + +normalize-path@^2.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: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-bundled@^1.0.1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + +npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + nth-check@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" @@ -1722,6 +2370,11 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -1737,11 +2390,34 @@ object-assign@^3.0.0: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" integrity sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I= -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.0: 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.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -1767,7 +2443,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.3: +osenv@^0.1.3, osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -1794,6 +2470,16 @@ parse5@^3.0.1: dependencies: "@types/node" "*" +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-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-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" @@ -1846,6 +2532,11 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +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= + prettyjson@1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" @@ -1889,6 +2580,16 @@ qs@~6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== +rc@^1.2.7: + version "1.2.8" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + read@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" @@ -1896,7 +2597,7 @@ read@^1.0.7: dependencies: mute-stream "~0.0.4" -readable-stream@^2.1.5, readable-stream@^2.3.0, readable-stream@^2.3.5: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -1940,11 +2641,38 @@ readable-stream@~2.0.0: string_decoder "~0.10.x" 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" + +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= + replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" @@ -2018,7 +2746,12 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.5" -rimraf@^2.2.8: +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.2.8, rimraf@^2.6.1: version "2.6.3" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== @@ -2030,11 +2763,18 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== -safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +safe-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" + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -2045,7 +2785,7 @@ sax@0.5.2: resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.2.tgz#735ffaa39a1cff8ffb9598f0223abdb03a9fb2ea" integrity sha1-c1/6o5oc/4/7lZjwIjq9sDqfsuo= -sax@>=0.6.0: +sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -2078,6 +2818,66 @@ semver@^5.1.0, semver@^5.3.0: mkdirp "^0.5.1" tmp "^0.0.33" +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@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +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= + +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" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -2092,7 +2892,7 @@ sntp@2.x.x: dependencies: hoek "4.x.x" -source-map-resolve@^0.5.2: +source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== @@ -2108,6 +2908,11 @@ source-map-url@^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.1, source-map@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -2118,6 +2923,13 @@ sparkles@^1.0.0: resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.1.tgz#008db65edce6c50eec0c5e228e1945061dd0437c" integrity sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw== +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" + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -2138,6 +2950,31 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +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" + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -2155,13 +2992,20 @@ stringstream@~0.0.4, stringstream@~0.0.5: resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" integrity sha1-TkhM1N5aC7vuGORjB3EKioFiGHg= -strip-ansi@^3.0.0: +strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + strip-bom@2.X: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -2176,6 +3020,11 @@ strip-dirs@^2.0.0: dependencies: is-natural-number "^4.0.1" +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -2201,6 +3050,19 @@ tar-stream@^1.5.2: to-buffer "^1.1.1" xtend "^4.0.0" +tar@^4: + version "4.4.8" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" + integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== + dependencies: + chownr "^1.1.1" + fs-minipass "^1.2.5" + minipass "^2.3.4" + minizlib "^1.1.1" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + through2@2.X, through2@^2.0.0, through2@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" @@ -2238,6 +3100,31 @@ to-buffer@^1.1.1: resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== +to-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@^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" + tough-cookie@~2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" @@ -2335,6 +3222,29 @@ underscore@^1.8.3: resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +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.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" + integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -2345,6 +3255,11 @@ url-join@^1.1.0: resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= +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" @@ -2425,6 +3340,13 @@ vso-node-api@6.1.2-preview: typed-rest-client "^0.9.0" underscore "^1.8.3" +wide-align@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -2465,6 +3387,11 @@ xtend@^4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= +yallist@^3.0.0, yallist@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + yauzl@^2.3.1, yauzl@^2.4.2: version "2.10.0" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" diff --git a/package.json b/package.json index b53295d4fb..2128788911 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,6 @@ "update-localization-extension": "node build/npm/update-localization-extension.js", "smoketest": "cd test/smoke && node test/index.js", "monaco-compile-check": "tsc -p src/tsconfig.monaco.json --noEmit", - "download-builtin-extensions": "node build/lib/builtInExtensions.js", - "check-monaco-editor-compilation": "tsc -p src/tsconfig.monaco.json --noEmit", "tslint": "node node_modules/tslint/bin/tslint -c tslint-gci.json -p src/tsconfig.json", "strict-null-check": "tsc -p src/tsconfig.strictNullChecks.json", "strict-null-check-watch": "tsc -p src/tsconfig.strictNullChecks.json --watch" diff --git a/product.json b/product.json index 9870802e13..84a2616465 100644 --- a/product.json +++ b/product.json @@ -17,6 +17,7 @@ "win32ShellNameShort": "Azure Data Studio", "darwinBundleIdentifier": "com.azuredatastudio.oss", "linuxIconName": "com.azuredatastudio.oss", + "licenseFileName": "LICENSE.txt", "reportIssueUrl": "https://github.com/Microsoft/azuredatastudio/issues/new?labels=customer%20reported%20issue", "requestFeatureUrl": "https://github.com/Microsoft/azuredatastudio/issues/new?labels=feature-request", "privacyStatementUrl": "https://privacy.microsoft.com/en-us/privacystatement", diff --git a/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts b/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts index b2ca842123..fc30901e48 100644 --- a/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts +++ b/src/sql/parts/modelComponents/tree/treeViewDataProvider.ts @@ -5,10 +5,10 @@ 'use strict'; import { ExtHostModelViewTreeViewsShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IModelViewTreeViewDataProvider, ITreeComponentItem } from 'sql/workbench/common/views'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import * as vsTreeView from 'vs/workbench/api/electron-browser/mainThreadTreeViews'; +import * as vsTreeView from 'vs/workbench/api/browser/mainThreadTreeViews'; export class TreeViewDataProvider extends vsTreeView.TreeViewDataProvider implements IModelViewTreeViewDataProvider { constructor(handle: number, treeViewId: string, diff --git a/src/sql/workbench/api/electron-browser/mainThreadDashboard.ts b/src/sql/workbench/api/electron-browser/mainThreadDashboard.ts index 94d5267423..42dd805bd5 100644 --- a/src/sql/workbench/api/electron-browser/mainThreadDashboard.ts +++ b/src/sql/workbench/api/electron-browser/mainThreadDashboard.ts @@ -4,9 +4,9 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { SqlMainContext, MainThreadDashboardShape, ExtHostDashboardShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IDashboardService } from 'sql/platform/dashboard/browser/dashboardService'; @extHostNamedCustomer(SqlMainContext.MainThreadDashboard) diff --git a/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts b/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts index 750d8dfa05..3e0659c45c 100644 --- a/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts +++ b/src/sql/workbench/api/electron-browser/mainThreadModalDialog.ts @@ -8,8 +8,8 @@ import 'vs/css!sql/media/icons/common-icons'; import { WebViewDialog } from 'sql/workbench/parts/webview/electron-browser/webViewDialog'; import { MainThreadModalDialogShape, SqlMainContext, SqlExtHostContext, ExtHostModalDialogsShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @extHostNamedCustomer(SqlMainContext.MainThreadModalDialog) diff --git a/src/sql/workbench/api/electron-browser/mainThreadTasks.ts b/src/sql/workbench/api/electron-browser/mainThreadTasks.ts index e0e597f654..d737997f37 100644 --- a/src/sql/workbench/api/electron-browser/mainThreadTasks.ts +++ b/src/sql/workbench/api/electron-browser/mainThreadTasks.ts @@ -3,10 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { TaskRegistry, ITaskHandlerDescription } from 'sql/platform/tasks/common/tasks'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostAccountManagementShape, diff --git a/src/sql/workbench/api/node/extHostAccountManagement.ts b/src/sql/workbench/api/node/extHostAccountManagement.ts index 832efb91a0..49dfe5b31d 100644 --- a/src/sql/workbench/api/node/extHostAccountManagement.ts +++ b/src/sql/workbench/api/node/extHostAccountManagement.ts @@ -13,7 +13,7 @@ import { SqlMainContext, } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { AzureResource } from 'sql/workbench/api/common/sqlExtHostTypes'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Event, Emitter } from 'vs/base/common/event'; export class ExtHostAccountManagement extends ExtHostAccountManagementShape { @@ -167,5 +167,3 @@ interface AccountProviderWithMetadata { metadata: azdata.AccountProviderMetadata; provider: azdata.AccountProvider; } - - diff --git a/src/sql/workbench/api/node/extHostBackgroundTaskManagement.ts b/src/sql/workbench/api/node/extHostBackgroundTaskManagement.ts index 25b84a7ac9..af7aad9659 100644 --- a/src/sql/workbench/api/node/extHostBackgroundTaskManagement.ts +++ b/src/sql/workbench/api/node/extHostBackgroundTaskManagement.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostBackgroundTaskManagementShape, SqlMainContext, MainThreadBackgroundTaskManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; @@ -110,4 +110,4 @@ export class ExtHostBackgroundTaskManagement implements ExtHostBackgroundTaskMan this._handlers.delete(operationId); } } -} \ No newline at end of file +} diff --git a/src/sql/workbench/api/node/extHostConnectionManagement.ts b/src/sql/workbench/api/node/extHostConnectionManagement.ts index 355f260ce3..f81e4bdf5b 100644 --- a/src/sql/workbench/api/node/extHostConnectionManagement.ts +++ b/src/sql/workbench/api/node/extHostConnectionManagement.ts @@ -5,7 +5,7 @@ 'use strict'; import { ExtHostConnectionManagementShape, SqlMainContext, MainThreadConnectionManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { generateUuid } from 'vs/base/common/uuid'; import * as azdata from 'azdata'; diff --git a/src/sql/workbench/api/node/extHostCredentialManagement.ts b/src/sql/workbench/api/node/extHostCredentialManagement.ts index 974c4371a4..2d509a993a 100644 --- a/src/sql/workbench/api/node/extHostCredentialManagement.ts +++ b/src/sql/workbench/api/node/extHostCredentialManagement.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { SqlMainContext, MainThreadCredentialManagementShape, ExtHostCredentialManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as vscode from 'vscode'; import * as azdata from 'azdata'; diff --git a/src/sql/workbench/api/node/extHostDashboard.ts b/src/sql/workbench/api/node/extHostDashboard.ts index c4396b7345..2bfb8d6094 100644 --- a/src/sql/workbench/api/node/extHostDashboard.ts +++ b/src/sql/workbench/api/node/extHostDashboard.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Event, Emitter } from 'vs/base/common/event'; import * as azdata from 'azdata'; diff --git a/src/sql/workbench/api/node/extHostDashboardWebview.ts b/src/sql/workbench/api/node/extHostDashboardWebview.ts index a15e076c25..1877b42093 100644 --- a/src/sql/workbench/api/node/extHostDashboardWebview.ts +++ b/src/sql/workbench/api/node/extHostDashboardWebview.ts @@ -6,7 +6,7 @@ import { SqlMainContext, ExtHostDashboardWebviewsShape, MainThreadDashboardWebviewShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Emitter } from 'vs/base/common/event'; import { deepClone } from 'vs/base/common/objects'; diff --git a/src/sql/workbench/api/node/extHostDataProtocol.ts b/src/sql/workbench/api/node/extHostDataProtocol.ts index 81897a5dda..8909848a00 100644 --- a/src/sql/workbench/api/node/extHostDataProtocol.ts +++ b/src/sql/workbench/api/node/extHostDataProtocol.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode'; import * as azdata from 'azdata'; import { Event, Emitter } from 'vs/base/common/event'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import { SqlMainContext, MainThreadDataProtocolShape, ExtHostDataProtocolShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { DataProviderType } from 'sql/workbench/api/common/sqlExtHostTypes'; diff --git a/src/sql/workbench/api/node/extHostExtensionManagement.ts b/src/sql/workbench/api/node/extHostExtensionManagement.ts index 81e9daa6ec..935026891b 100644 --- a/src/sql/workbench/api/node/extHostExtensionManagement.ts +++ b/src/sql/workbench/api/node/extHostExtensionManagement.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostExtensionManagementShape, MainThreadExtensionManagementShape, SqlMainContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; diff --git a/src/sql/workbench/api/node/extHostModalDialog.ts b/src/sql/workbench/api/node/extHostModalDialog.ts index c4d5e1a69e..409ddd0971 100644 --- a/src/sql/workbench/api/node/extHostModalDialog.ts +++ b/src/sql/workbench/api/node/extHostModalDialog.ts @@ -5,7 +5,7 @@ 'use strict'; import { SqlMainContext, MainThreadModalDialogShape, ExtHostModalDialogsShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import * as vscode from 'vscode'; import * as azdata from 'azdata'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/sql/workbench/api/node/extHostModelView.ts b/src/sql/workbench/api/node/extHostModelView.ts index fbbf7e7776..65e38a8b50 100644 --- a/src/sql/workbench/api/node/extHostModelView.ts +++ b/src/sql/workbench/api/node/extHostModelView.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Emitter } from 'vs/base/common/event'; import { deepClone } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; diff --git a/src/sql/workbench/api/node/extHostModelViewDialog.ts b/src/sql/workbench/api/node/extHostModelViewDialog.ts index 5cb37b297d..8c3c02a1bc 100644 --- a/src/sql/workbench/api/node/extHostModelViewDialog.ts +++ b/src/sql/workbench/api/node/extHostModelViewDialog.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Event, Emitter } from 'vs/base/common/event'; import { deepClone } from 'vs/base/common/objects'; import * as nls from 'vs/nls'; diff --git a/src/sql/workbench/api/node/extHostModelViewTree.ts b/src/sql/workbench/api/node/extHostModelViewTree.ts index dc50ffa30c..88c0c3ee4c 100644 --- a/src/sql/workbench/api/node/extHostModelViewTree.ts +++ b/src/sql/workbench/api/node/extHostModelViewTree.ts @@ -9,7 +9,7 @@ import * as vscode from 'vscode'; import { SqlMainContext, ExtHostModelViewTreeViewsShape, MainThreadModelViewShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { ITreeComponentItem } from 'sql/workbench/common/views'; import { CommandsConverter } from 'vs/workbench/api/node/extHostCommands'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import * as azdata from 'azdata'; import * as vsTreeExt from 'vs/workbench/api/node/extHostTreeViews'; import { Emitter } from 'vs/base/common/event'; diff --git a/src/sql/workbench/api/node/extHostNotebook.ts b/src/sql/workbench/api/node/extHostNotebook.ts index bf76909b9b..b86e9da1c4 100644 --- a/src/sql/workbench/api/node/extHostNotebook.ts +++ b/src/sql/workbench/api/node/extHostNotebook.ts @@ -7,7 +7,7 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import { localize } from 'vs/nls'; import { URI, UriComponents } from 'vs/base/common/uri'; diff --git a/src/sql/workbench/api/node/extHostNotebookDocumentsAndEditors.ts b/src/sql/workbench/api/node/extHostNotebookDocumentsAndEditors.ts index ece55782fa..9044ba9e20 100644 --- a/src/sql/workbench/api/node/extHostNotebookDocumentsAndEditors.ts +++ b/src/sql/workbench/api/node/extHostNotebookDocumentsAndEditors.ts @@ -12,7 +12,7 @@ import { dispose } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ok } from 'vs/base/common/assert'; import { diff --git a/src/sql/workbench/api/node/extHostObjectExplorer.ts b/src/sql/workbench/api/node/extHostObjectExplorer.ts index 5593954951..2a49d281a8 100644 --- a/src/sql/workbench/api/node/extHostObjectExplorer.ts +++ b/src/sql/workbench/api/node/extHostObjectExplorer.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostObjectExplorerShape, SqlMainContext, MainThreadObjectExplorerShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; diff --git a/src/sql/workbench/api/node/extHostQueryEditor.ts b/src/sql/workbench/api/node/extHostQueryEditor.ts index aa61068a5c..a73b30edb3 100644 --- a/src/sql/workbench/api/node/extHostQueryEditor.ts +++ b/src/sql/workbench/api/node/extHostQueryEditor.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostQueryEditorShape, SqlMainContext, MainThreadQueryEditorShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; diff --git a/src/sql/workbench/api/node/extHostResourceProvider.ts b/src/sql/workbench/api/node/extHostResourceProvider.ts index f265ba5e77..0277e0c9a2 100644 --- a/src/sql/workbench/api/node/extHostResourceProvider.ts +++ b/src/sql/workbench/api/node/extHostResourceProvider.ts @@ -6,7 +6,7 @@ 'use strict'; import * as azdata from 'azdata'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostResourceProviderShape, @@ -88,5 +88,3 @@ interface ResourceProviderWithMetadata { metadata: azdata.ResourceProviderMetadata; provider: azdata.ResourceProvider; } - - diff --git a/src/sql/workbench/api/node/extHostSerializationProvider.ts b/src/sql/workbench/api/node/extHostSerializationProvider.ts index d44b3033ca..2b80c381cb 100644 --- a/src/sql/workbench/api/node/extHostSerializationProvider.ts +++ b/src/sql/workbench/api/node/extHostSerializationProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { SqlMainContext, MainThreadSerializationProviderShape, ExtHostSerializationProviderShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as vscode from 'vscode'; import * as azdata from 'azdata'; diff --git a/src/sql/workbench/api/node/extHostTasks.ts b/src/sql/workbench/api/node/extHostTasks.ts index 1d043fb0aa..84db3c28dd 100644 --- a/src/sql/workbench/api/node/extHostTasks.ts +++ b/src/sql/workbench/api/node/extHostTasks.ts @@ -6,7 +6,7 @@ import { validateConstraint } from 'vs/base/common/types'; import { ILogService } from 'vs/platform/log/common/log'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import * as extHostTypes from 'vs/workbench/api/node/extHostTypes'; import * as azdata from 'azdata'; diff --git a/src/sql/workbench/api/node/mainThreadAccountManagement.ts b/src/sql/workbench/api/node/mainThreadAccountManagement.ts index b97f76e02b..ecb5f405c0 100644 --- a/src/sql/workbench/api/node/mainThreadAccountManagement.ts +++ b/src/sql/workbench/api/node/mainThreadAccountManagement.ts @@ -13,8 +13,8 @@ import { SqlExtHostContext, SqlMainContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UpdateAccountListEventParams } from 'sql/platform/accountManagement/common/eventTypes'; @extHostNamedCustomer(SqlMainContext.MainThreadAccountManagement) diff --git a/src/sql/workbench/api/node/mainThreadBackgroundTaskManagement.ts b/src/sql/workbench/api/node/mainThreadBackgroundTaskManagement.ts index 18670e64ea..9262643df6 100644 --- a/src/sql/workbench/api/node/mainThreadBackgroundTaskManagement.ts +++ b/src/sql/workbench/api/node/mainThreadBackgroundTaskManagement.ts @@ -7,8 +7,8 @@ import { ITaskService } from 'sql/platform/taskHistory/common/taskService'; import { MainThreadBackgroundTaskManagementShape, SqlMainContext, ExtHostBackgroundTaskManagementShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts index c38f050743..657f6e05b4 100644 --- a/src/sql/workbench/api/node/mainThreadConnectionManagement.ts +++ b/src/sql/workbench/api/node/mainThreadConnectionManagement.ts @@ -6,8 +6,8 @@ import { SqlExtHostContext, SqlMainContext, ExtHostConnectionManagementShape, MainThreadConnectionManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as azdata from 'azdata'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { IObjectExplorerService } from 'sql/workbench/services/objectExplorer/common/objectExplorerService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/sql/workbench/api/node/mainThreadCredentialManagement.ts b/src/sql/workbench/api/node/mainThreadCredentialManagement.ts index 6e8ee9085c..9d6a28dfee 100644 --- a/src/sql/workbench/api/node/mainThreadCredentialManagement.ts +++ b/src/sql/workbench/api/node/mainThreadCredentialManagement.ts @@ -11,8 +11,8 @@ import { } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { ICredentialsService } from 'sql/platform/credentials/common/credentialsService'; import * as azdata from 'azdata'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(SqlMainContext.MainThreadCredentialManagement) export class MainThreadCredentialManagement implements MainThreadCredentialManagementShape { diff --git a/src/sql/workbench/api/node/mainThreadDashboardWebview.ts b/src/sql/workbench/api/node/mainThreadDashboardWebview.ts index fc4d0e60b9..3534d714c6 100644 --- a/src/sql/workbench/api/node/mainThreadDashboardWebview.ts +++ b/src/sql/workbench/api/node/mainThreadDashboardWebview.ts @@ -5,8 +5,8 @@ 'use strict'; import { MainThreadDashboardWebviewShape, SqlMainContext, ExtHostDashboardWebviewsShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IDashboardViewService, IDashboardWebview } from 'sql/platform/dashboard/common/dashboardViewService'; @extHostNamedCustomer(SqlMainContext.MainThreadDashboardWebview) diff --git a/src/sql/workbench/api/node/mainThreadDataProtocol.ts b/src/sql/workbench/api/node/mainThreadDataProtocol.ts index 3ffefce1a1..c2cf3b71f0 100644 --- a/src/sql/workbench/api/node/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/node/mainThreadDataProtocol.ts @@ -24,9 +24,9 @@ import { ITaskService } from 'sql/platform/taskHistory/common/taskService'; import { IProfilerService } from 'sql/workbench/services/profiler/common/interfaces'; import { ISerializationService } from 'sql/platform/serialization/common/serializationService'; import { IFileBrowserService } from 'sql/platform/fileBrowser/common/interfaces'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IDacFxService } from 'sql/platform/dacfx/common/dacFxService'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; /** * Main thread class for handling data protocol management registration. diff --git a/src/sql/workbench/api/node/mainThreadExtensionManagement.ts b/src/sql/workbench/api/node/mainThreadExtensionManagement.ts index 30a8586ea0..b02873eab7 100644 --- a/src/sql/workbench/api/node/mainThreadExtensionManagement.ts +++ b/src/sql/workbench/api/node/mainThreadExtensionManagement.ts @@ -5,8 +5,8 @@ 'use strict'; import { SqlMainContext, MainThreadExtensionManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IExtensionManagementService, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; import { URI } from 'vs/base/common/uri'; diff --git a/src/sql/workbench/api/node/mainThreadModelView.ts b/src/sql/workbench/api/node/mainThreadModelView.ts index a142cfde5a..a3040974d1 100644 --- a/src/sql/workbench/api/node/mainThreadModelView.ts +++ b/src/sql/workbench/api/node/mainThreadModelView.ts @@ -5,8 +5,8 @@ 'use strict'; import { MainThreadModelViewShape, SqlMainContext, ExtHostModelViewShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/sql/workbench/api/node/mainThreadModelViewDialog.ts b/src/sql/workbench/api/node/mainThreadModelViewDialog.ts index 43485ee6c6..c0aba793c5 100644 --- a/src/sql/workbench/api/node/mainThreadModelViewDialog.ts +++ b/src/sql/workbench/api/node/mainThreadModelViewDialog.ts @@ -5,8 +5,8 @@ 'use strict'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { MainThreadModelViewDialogShape, SqlMainContext, ExtHostModelViewDialogShape, SqlExtHostContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; @@ -293,4 +293,4 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape private validateDialogClose(handle: number): Thenable { return this._proxy.$validateDialogClose(handle); } -} \ No newline at end of file +} diff --git a/src/sql/workbench/api/node/mainThreadNotebook.ts b/src/sql/workbench/api/node/mainThreadNotebook.ts index 21c7a71d70..d7b7de843c 100644 --- a/src/sql/workbench/api/node/mainThreadNotebook.ts +++ b/src/sql/workbench/api/node/mainThreadNotebook.ts @@ -6,9 +6,9 @@ import * as azdata from 'azdata'; import { SqlExtHostContext, SqlMainContext, ExtHostNotebookShape, MainThreadNotebookShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { Event, Emitter } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; diff --git a/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts b/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts index 8e3c91f3c5..83ddbe3ea0 100644 --- a/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts +++ b/src/sql/workbench/api/node/mainThreadNotebookDocumentsAndEditors.ts @@ -6,15 +6,14 @@ import * as azdata from 'azdata'; import * as path from 'path'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; -import { IExtHostContext, IUndoStopOptions } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext, IUndoStopOptions } from 'vs/workbench/api/common/extHost.protocol'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { viewColumnToEditorGroup } from 'vs/workbench/api/shared/editor'; import { Schemas } from 'vs/base/common/network'; import { ConnectionProfile } from 'sql/platform/connection/common/connectionProfile'; @@ -32,6 +31,7 @@ import { ICapabilitiesService } from 'sql/platform/capabilities/common/capabilit import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { notebookModeId } from 'sql/common/constants'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { viewColumnToEditorGroup } from 'vs/workbench/api/common/shared/editor'; class MainThreadNotebookEditor extends Disposable { private _contentChangedEmitter = new Emitter(); diff --git a/src/sql/workbench/api/node/mainThreadObjectExplorer.ts b/src/sql/workbench/api/node/mainThreadObjectExplorer.ts index 98a62eff5f..cefe60b618 100644 --- a/src/sql/workbench/api/node/mainThreadObjectExplorer.ts +++ b/src/sql/workbench/api/node/mainThreadObjectExplorer.ts @@ -7,8 +7,8 @@ import { SqlExtHostContext, SqlMainContext, ExtHostObjectExplorerShape, MainThreadObjectExplorerShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IConnectionManagementService } from 'sql/platform/connection/common/connectionManagement'; import { IObjectExplorerService, NodeInfoWithConnection } from 'sql/workbench/services/objectExplorer/common/objectExplorerService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/sql/workbench/api/node/mainThreadQueryEditor.ts b/src/sql/workbench/api/node/mainThreadQueryEditor.ts index 2ef4dd1d98..3444d91858 100644 --- a/src/sql/workbench/api/node/mainThreadQueryEditor.ts +++ b/src/sql/workbench/api/node/mainThreadQueryEditor.ts @@ -5,8 +5,8 @@ 'use strict'; import { SqlExtHostContext, SqlMainContext, ExtHostQueryEditorShape, MainThreadQueryEditorShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IConnectionManagementService, IConnectionCompletionOptions, ConnectionType, RunQueryOnConnectionMode } from 'sql/platform/connection/common/connectionManagement'; import { IQueryEditorService } from 'sql/workbench/services/queryEditor/common/queryEditorService'; import { QueryEditor } from 'sql/parts/query/editor/queryEditor'; diff --git a/src/sql/workbench/api/node/mainThreadResourceProvider.ts b/src/sql/workbench/api/node/mainThreadResourceProvider.ts index e0385e09ff..5dbdaf1b95 100644 --- a/src/sql/workbench/api/node/mainThreadResourceProvider.ts +++ b/src/sql/workbench/api/node/mainThreadResourceProvider.ts @@ -13,8 +13,8 @@ import { SqlExtHostContext, SqlMainContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(SqlMainContext.MainThreadResourceProvider) diff --git a/src/sql/workbench/api/node/mainThreadSerializationProvider.ts b/src/sql/workbench/api/node/mainThreadSerializationProvider.ts index 4d421a92b0..33389fe196 100644 --- a/src/sql/workbench/api/node/mainThreadSerializationProvider.ts +++ b/src/sql/workbench/api/node/mainThreadSerializationProvider.ts @@ -11,8 +11,8 @@ import { } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { ISerializationService } from 'sql/platform/serialization/common/serializationService'; import * as azdata from 'azdata'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(SqlMainContext.MainThreadSerializationProvider) export class MainThreadSerializationProvider implements MainThreadSerializationProviderShape { diff --git a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts index 9c5cebb5c8..468f968f06 100644 --- a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts @@ -5,7 +5,7 @@ 'use strict'; import * as extHostApi from 'vs/workbench/api/node/extHost.api.impl'; -import { IInitData, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IInitData, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import * as extHostTypes from 'vs/workbench/api/node/extHostTypes'; import { URI } from 'vs/base/common/uri'; diff --git a/src/sql/workbench/api/node/sqlExtHost.protocol.ts b/src/sql/workbench/api/node/sqlExtHost.protocol.ts index 6c96229c19..7be6fa66d2 100644 --- a/src/sql/workbench/api/node/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/node/sqlExtHost.protocol.ts @@ -6,9 +6,8 @@ import { createMainContextProxyIdentifier as createMainId, - createExtHostContextProxyIdentifier as createExtId, - ProxyIdentifier, IRPCProtocol -} from 'vs/workbench/services/extensions/node/proxyIdentifier'; + createExtHostContextProxyIdentifier as createExtId +} from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { UriComponents } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -22,8 +21,8 @@ import { IItemConfig, ModelComponentTypes, IComponentShape, IModelViewDialogDetails, IModelViewTabDetails, IModelViewButtonDetails, IModelViewWizardDetails, IModelViewWizardPageDetails, INotebookManagerDetails, INotebookSessionDetails, INotebookKernelDetails, INotebookFutureDetails, FutureMessageType, INotebookFutureDone, ISingleNotebookEditOperation } from 'sql/workbench/api/common/sqlExtHostTypes'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; -import { IUndoStopOptions } from 'vs/workbench/api/node/extHost.protocol'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; +import { IUndoStopOptions } from 'vs/workbench/api/common/extHost.protocol'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; export abstract class ExtHostAccountManagementShape { diff --git a/src/sqltest/workbench/api/extHostAccountManagement.test.ts b/src/sqltest/workbench/api/extHostAccountManagement.test.ts index bcc840d00e..ecf35f77bf 100644 --- a/src/sqltest/workbench/api/extHostAccountManagement.test.ts +++ b/src/sqltest/workbench/api/extHostAccountManagement.test.ts @@ -12,7 +12,7 @@ import { AccountProviderStub, AccountManagementTestService } from 'sqltest/stubs import { ExtHostAccountManagement } from 'sql/workbench/api/node/extHostAccountManagement'; import { TestRPCProtocol } from 'vs/workbench/test/electron-browser/api/testRPCProtocol'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { IRPCProtocol } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { SqlMainContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { MainThreadAccountManagement } from 'sql/workbench/api/node/mainThreadAccountManagement'; import { IAccountManagementService, AzureResource } from 'sql/platform/accountManagement/common/interfaces'; @@ -453,4 +453,4 @@ function getMockAccountManagementService(accounts: azdata.Account[]): TypeMoq.Mo .returns(() => () => { return undefined; }); return mockAccountManagementService; -} \ No newline at end of file +} diff --git a/src/sqltest/workbench/api/extHostBackgroundTaskManagement.test.ts b/src/sqltest/workbench/api/extHostBackgroundTaskManagement.test.ts index 280b3908ae..d09aa83ceb 100644 --- a/src/sqltest/workbench/api/extHostBackgroundTaskManagement.test.ts +++ b/src/sqltest/workbench/api/extHostBackgroundTaskManagement.test.ts @@ -10,7 +10,7 @@ import * as assert from 'assert'; import { Mock, It, Times } from 'typemoq'; import { ExtHostBackgroundTaskManagement, TaskStatus } from 'sql/workbench/api/node/extHostBackgroundTaskManagement'; import { MainThreadBackgroundTaskManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; suite('ExtHostBackgroundTaskManagement Tests', () => { @@ -105,4 +105,4 @@ suite('ExtHostBackgroundTaskManagement Tests', () => { extHostBackgroundTaskManagement.$removeTask(operationId); }); -}); \ No newline at end of file +}); diff --git a/src/sqltest/workbench/api/extHostCredentialManagement.test.ts b/src/sqltest/workbench/api/extHostCredentialManagement.test.ts index b9504773db..81d5be9d6a 100644 --- a/src/sqltest/workbench/api/extHostCredentialManagement.test.ts +++ b/src/sqltest/workbench/api/extHostCredentialManagement.test.ts @@ -10,7 +10,7 @@ import { TestRPCProtocol } from 'vs/workbench/test/electron-browser/api/testRPCP import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ExtHostCredentialManagement } from 'sql/workbench/api/node/extHostCredentialManagement'; import { SqlMainContext } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IRPCProtocol } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { IRPCProtocol } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { MainThreadCredentialManagement } from 'sql/workbench/api/node/mainThreadCredentialManagement'; import { CredentialsTestProvider, CredentialsTestService } from 'sqltest/stubs/credentialsTestStubs'; import { ICredentialsService } from 'sql/platform/credentials/common/credentialsService'; diff --git a/src/sqltest/workbench/api/extHostModelView.test.ts b/src/sqltest/workbench/api/extHostModelView.test.ts index 1960b00362..6884ce3df2 100644 --- a/src/sqltest/workbench/api/extHostModelView.test.ts +++ b/src/sqltest/workbench/api/extHostModelView.test.ts @@ -10,7 +10,7 @@ import { Mock, It, Times, MockBehavior } from 'typemoq'; import * as azdata from 'azdata'; import { ExtHostModelView } from 'sql/workbench/api/node/extHostModelView'; import { MainThreadModelViewShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { IComponentShape, IItemConfig, ComponentEventType, IComponentEventArgs, ModelComponentTypes } from 'sql/workbench/api/common/sqlExtHostTypes'; import { TitledFormItemLayout } from 'sql/parts/modelComponents/formContainer.component'; @@ -380,4 +380,4 @@ suite('ExtHostModelView Validation Tests', () => { assert.equal((form as IWithItemConfig).itemConfigs.length, 2); assert.equal((form as IWithItemConfig).itemConfigs[1].toIItemConfig().componentShape.type, ModelComponentTypes.ListBox); }); -}); \ No newline at end of file +}); diff --git a/src/sqltest/workbench/api/extHostModelViewDialog.test.ts b/src/sqltest/workbench/api/extHostModelViewDialog.test.ts index 8906752757..d07e13fe04 100644 --- a/src/sqltest/workbench/api/extHostModelViewDialog.test.ts +++ b/src/sqltest/workbench/api/extHostModelViewDialog.test.ts @@ -10,7 +10,7 @@ import * as assert from 'assert'; import { Mock, It, Times } from 'typemoq'; import { ExtHostModelViewDialog } from 'sql/workbench/api/node/extHostModelViewDialog'; import { MainThreadModelViewDialogShape, ExtHostModelViewShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { MessageLevel } from 'sql/workbench/api/common/sqlExtHostTypes'; @@ -328,4 +328,4 @@ suite('ExtHostModelViewDialog Tests', () => { extHostModelViewDialog.$validateDialogClose(dialogHandle); assert.equal(callCount, 1); }); -}); \ No newline at end of file +}); diff --git a/src/sqltest/workbench/api/exthostNotebook.test.ts b/src/sqltest/workbench/api/exthostNotebook.test.ts index 66ffa219ad..bc8dd0ceb4 100644 --- a/src/sqltest/workbench/api/exthostNotebook.test.ts +++ b/src/sqltest/workbench/api/exthostNotebook.test.ts @@ -10,7 +10,7 @@ import * as assert from 'assert'; import * as TypeMoq from 'typemoq'; import { URI } from 'vs/base/common/uri'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostNotebook } from 'sql/workbench/api/node/extHostNotebook'; import { MainThreadNotebookShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; @@ -144,4 +144,4 @@ class NotebookManagerStub implements azdata.nb.NotebookManager { get serverManager(): azdata.nb.ServerManager { return undefined; } -} \ No newline at end of file +} diff --git a/src/sqltest/workbench/api/mainThreadBackgroundTaskManagement.test.ts b/src/sqltest/workbench/api/mainThreadBackgroundTaskManagement.test.ts index 7c01a7b095..fb9c08c570 100644 --- a/src/sqltest/workbench/api/mainThreadBackgroundTaskManagement.test.ts +++ b/src/sqltest/workbench/api/mainThreadBackgroundTaskManagement.test.ts @@ -10,7 +10,7 @@ import { Mock, It, Times } from 'typemoq'; import { MainThreadBackgroundTaskManagement, TaskStatus } from 'sql/workbench/api/node/mainThreadBackgroundTaskManagement'; import { ExtHostBackgroundTaskManagementShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { ITaskService } from 'sql/platform/taskHistory/common/taskService'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { TaskNode } from 'sql/parts/taskHistory/common/taskNode'; import { Emitter } from 'vs/base/common/event'; @@ -94,4 +94,4 @@ suite('MainThreadBackgroundTaskManagement Tests', () => { mockProxy.verify(x => x.$onTaskCanceled(It.is(t => t === operationId)), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/src/sqltest/workbench/api/mainThreadModelViewDialog.test.ts b/src/sqltest/workbench/api/mainThreadModelViewDialog.test.ts index 6570572688..d0cb4d8313 100644 --- a/src/sqltest/workbench/api/mainThreadModelViewDialog.test.ts +++ b/src/sqltest/workbench/api/mainThreadModelViewDialog.test.ts @@ -8,7 +8,7 @@ import * as assert from 'assert'; import { Mock, It, Times } from 'typemoq'; import { MainThreadModelViewDialog } from 'sql/workbench/api/node/mainThreadModelViewDialog'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IModelViewButtonDetails, IModelViewTabDetails, IModelViewDialogDetails, IModelViewWizardPageDetails, IModelViewWizardDetails, DialogMessage, MessageLevel } from 'sql/workbench/api/common/sqlExtHostTypes'; import { CustomDialogService } from 'sql/platform/dialog/customDialogService'; import { Dialog, DialogTab, Wizard } from 'sql/platform/dialog/dialogTypes'; @@ -367,4 +367,4 @@ suite('MainThreadModelViewDialog Tests', () => { // Then the call gets forwarded to the extension host mockExtHostModelViewDialog.verify(x => x.$validateDialogClose(It.is(handle => handle === dialogHandle)), Times.once()); }); -}); \ No newline at end of file +}); diff --git a/src/sqltest/workbench/api/mainThreadNotebook.test.ts b/src/sqltest/workbench/api/mainThreadNotebook.test.ts index 5b10baf479..9a465230c9 100644 --- a/src/sqltest/workbench/api/mainThreadNotebook.test.ts +++ b/src/sqltest/workbench/api/mainThreadNotebook.test.ts @@ -10,7 +10,7 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostNotebookShape } from 'sql/workbench/api/node/sqlExtHost.protocol'; import { MainThreadNotebook } from 'sql/workbench/api/node/mainThreadNotebook'; diff --git a/src/tsconfig.base.json b/src/tsconfig.base.json index cd4c623357..6ae2897421 100644 --- a/src/tsconfig.base.json +++ b/src/tsconfig.base.json @@ -10,6 +10,7 @@ "noImplicitThis": true, "alwaysStrict": true, "strictBindCallApply": true, + "strictNullChecks": false, "baseUrl": ".", "paths": { "vs/*": [ diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json deleted file mode 100644 index 9bec4ee930..0000000000 --- a/src/tsconfig.strictNullChecks.json +++ /dev/null @@ -1,474 +0,0 @@ -{ - "extends": "./tsconfig.base.json", - "compilerOptions": { - "noEmit": true, - "strictNullChecks": true - }, - "include": [ - "./typings", - "./vs/base/**/*.ts", - "./vs/code/**/*.ts", - "./vs/editor/**/*.ts", - "./vs/platform/**/*.ts", - "./vs/workbench/common/**/*", - "./vs/workbench/browser/**/*", - "./vs/workbench/electron-browser/**/*", - "./vs/workbench/contrib/emmet/**/*", - "./vs/workbench/contrib/externalTerminal/**/*", - "./vs/workbench/contrib/scm/**/*.ts", - "./vs/workbench/contrib/snippets/**/*.ts", - "./vs/workbench/contrib/outline/**/*.ts", - "./vs/workbench/contrib/performance/**/*.ts", - "./vs/workbench/contrib/welcome/**/*.ts", - "./vs/workbench/contrib/issue/**/*", - "./vs/workbench/contrib/splash/**/*.ts", - "./vs/workbench/contrib/tasks/**/*.ts", - "./vs/workbench/services/commands/**/*", - "./vs/workbench/services/configuration/common/**/*", - "./vs/workbench/services/files/node/watcher/**/*", - "./vs/workbench/services/themes/**/*.ts", - "./vs/workbench/services/bulkEdit/**/*.ts", - "./vs/workbench/services/output/**/*.ts", - "./vs/workbench/services/preferences/**/*.ts", - "./vs/workbench/services/timer/**/*.ts", - "./vs/workbench/contrib/debug/**/*.ts", - "./vs/workbench/contrib/files/**/*.ts", - "./vs/workbench/contrib/webview/**/*.ts", - "./vs/workbench/contrib/preferences/common/**/*.ts", - "./vs/workbench/contrib/preferences/**/settings*.ts", - "./vs/workbench/contrib/terminal/**/*" - ], - "files": [ - "./vs/monaco.d.ts", - "./vs/nls.d.ts", - "./vs/nls.mock.ts", - "./vs/vscode.d.ts", - "./vs/vscode.proposed.d.ts", - "./vs/workbench/api/browser/viewsExtensionPoint.ts", - "./vs/workbench/api/common/configurationExtensionPoint.ts", - "./vs/workbench/api/common/jsonValidationExtensionPoint.ts", - "./vs/workbench/api/common/menusExtensionPoint.ts", - "./vs/workbench/api/electron-browser/extHostCustomers.ts", - "./vs/workbench/api/electron-browser/mainThreadClipboard.ts", - "./vs/workbench/api/electron-browser/mainThreadCommands.ts", - "./vs/workbench/api/electron-browser/mainThreadConfiguration.ts", - "./vs/workbench/api/electron-browser/mainThreadConsole.ts", - "./vs/workbench/api/electron-browser/mainThreadDebugService.ts", - "./vs/workbench/api/electron-browser/mainThreadDecorations.ts", - "./vs/workbench/api/electron-browser/mainThreadDiagnostics.ts", - "./vs/workbench/api/electron-browser/mainThreadDialogs.ts", - "./vs/workbench/api/electron-browser/mainThreadDocumentContentProviders.ts", - "./vs/workbench/api/electron-browser/mainThreadDocuments.ts", - "./vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts", - "./vs/workbench/api/electron-browser/mainThreadEditor.ts", - "./vs/workbench/api/electron-browser/mainThreadEditors.ts", - "./vs/workbench/api/electron-browser/mainThreadErrors.ts", - "./vs/workbench/api/electron-browser/mainThreadExtensionService.ts", - "./vs/workbench/api/electron-browser/mainThreadFileSystem.ts", - "./vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts", - "./vs/workbench/api/electron-browser/mainThreadHeapService.ts", - "./vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts", - "./vs/workbench/api/electron-browser/mainThreadLanguages.ts", - "./vs/workbench/api/electron-browser/mainThreadLogService.ts", - "./vs/workbench/api/electron-browser/mainThreadMessageService.ts", - "./vs/workbench/api/electron-browser/mainThreadOutputService.ts", - "./vs/workbench/api/electron-browser/mainThreadProgress.ts", - "./vs/workbench/api/electron-browser/mainThreadQuickOpen.ts", - "./vs/workbench/api/electron-browser/mainThreadSCM.ts", - "./vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts", - "./vs/workbench/api/electron-browser/mainThreadSearch.ts", - "./vs/workbench/api/electron-browser/mainThreadStatusBar.ts", - "./vs/workbench/api/electron-browser/mainThreadStorage.ts", - "./vs/workbench/api/electron-browser/mainThreadTask.ts", - "./vs/workbench/api/electron-browser/mainThreadTelemetry.ts", - "./vs/workbench/api/electron-browser/mainThreadTerminalService.ts", - "./vs/workbench/api/electron-browser/mainThreadTreeViews.ts", - "./vs/workbench/api/electron-browser/mainThreadUrls.ts", - "./vs/workbench/api/electron-browser/mainThreadWebview.ts", - "./vs/workbench/api/electron-browser/mainThreadWindow.ts", - "./vs/workbench/api/electron-browser/mainThreadWorkspace.ts", - "./vs/workbench/api/node/apiCommands.ts", - "./vs/workbench/api/node/extHost.protocol.ts", - "./vs/workbench/api/node/extHostApiCommands.ts", - "./vs/workbench/api/node/extHostCLIServer.ts", - "./vs/workbench/api/node/extHostClipboard.ts", - "./vs/workbench/api/node/extHostCommands.ts", - "./vs/workbench/api/node/extHostComments.ts", - "./vs/workbench/api/node/extHostConfiguration.ts", - // "./vs/workbench/api/node/extHostDebugService.ts", - "./vs/workbench/api/node/extHostDecorations.ts", - "./vs/workbench/api/node/extHostDiagnostics.ts", - "./vs/workbench/api/node/extHostDialogs.ts", - "./vs/workbench/api/node/extHostDocumentContentProviders.ts", - "./vs/workbench/api/node/extHostDocumentData.ts", - "./vs/workbench/api/node/extHostDocumentSaveParticipant.ts", - "./vs/workbench/api/node/extHostDocuments.ts", - "./vs/workbench/api/node/extHostDocumentsAndEditors.ts", - "./vs/workbench/api/node/extHostExtensionActivator.ts", - "./vs/workbench/api/node/extHostFileSystem.ts", - "./vs/workbench/api/node/extHostFileSystemEventService.ts", - "./vs/workbench/api/node/extHostHeapService.ts", - "./vs/workbench/api/node/extHostLanguageFeatures.ts", - "./vs/workbench/api/node/extHostLanguages.ts", - "./vs/workbench/api/node/extHostLogService.ts", - "./vs/workbench/api/node/extHostMessageService.ts", - "./vs/workbench/api/node/extHostOutputService.ts", - "./vs/workbench/api/node/extHostProgress.ts", - "./vs/workbench/api/node/extHostQuickOpen.ts", - "./vs/workbench/api/node/extHostSCM.ts", - "./vs/workbench/api/node/extHostSearch.ts", - "./vs/workbench/api/node/extHostStatusBar.ts", - "./vs/workbench/api/node/extHostStorage.ts", - // "./vs/workbench/api/node/extHostTask.ts", - "./vs/workbench/api/node/extHostTerminalService.ts", - "./vs/workbench/api/node/extHostTextEditor.ts", - "./vs/workbench/api/node/extHostTextEditors.ts", - "./vs/workbench/api/node/extHostTreeViews.ts", - "./vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts", - "./vs/workbench/api/node/extHostTypeConverters.ts", - "./vs/workbench/api/node/extHostTypes.ts", - "./vs/workbench/api/node/extHostUrls.ts", - "./vs/workbench/api/node/extHostWebview.ts", - "./vs/workbench/api/node/extHostWindow.ts", - "./vs/workbench/api/node/extHostWorkspace.ts", - "./vs/workbench/api/shared/editor.ts", - "./vs/workbench/api/shared/tasks.ts", - "./vs/workbench/contrib/backup/common/backup.contribution.ts", - "./vs/workbench/contrib/backup/common/backupModelTracker.ts", - "./vs/workbench/contrib/backup/common/backupRestorer.ts", - "./vs/workbench/contrib/cli/node/cli.contribution.ts", - "./vs/workbench/contrib/codeEditor/browser/accessibility/accessibility.ts", - "./vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts", - "./vs/workbench/contrib/codeEditor/browser/inspectKeybindings.ts", - "./vs/workbench/contrib/codeEditor/browser/inspectTMScopes/inspectTMScopes.ts", - "./vs/workbench/contrib/codeEditor/browser/languageConfigurationExtensionPoint.ts", - "./vs/workbench/contrib/codeEditor/browser/largeFileOptimizations.ts", - "./vs/workbench/contrib/codeEditor/browser/menuPreventer.ts", - "./vs/workbench/contrib/codeEditor/browser/selectionClipboard.ts", - "./vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts", - "./vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput.ts", - "./vs/workbench/contrib/codeEditor/browser/toggleMinimap.ts", - "./vs/workbench/contrib/codeEditor/browser/toggleMultiCursorModifier.ts", - "./vs/workbench/contrib/codeEditor/browser/toggleRenderControlCharacter.ts", - "./vs/workbench/contrib/codeEditor/browser/toggleRenderWhitespace.ts", - "./vs/workbench/contrib/codeEditor/browser/toggleWordWrap.ts", - "./vs/workbench/contrib/codeEditor/browser/workbenchReferenceSearch.ts", - "./vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts", - "./vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts", - "./vs/workbench/contrib/codeinset/common/codeInset.ts", - "./vs/workbench/contrib/codeinset/electron-browser/codeInset.contribution.ts", - "./vs/workbench/contrib/codeinset/electron-browser/codeInsetWidget.ts", - "./vs/workbench/contrib/comments/common/commentModel.ts", - "./vs/workbench/contrib/comments/common/commentThreadWidget.ts", - "./vs/workbench/contrib/comments/electron-browser/commentGlyphWidget.ts", - "./vs/workbench/contrib/comments/electron-browser/commentsTreeViewer.ts", - "./vs/workbench/contrib/comments/electron-browser/reactionsAction.ts", - "./vs/workbench/contrib/comments/electron-browser/simpleCommentEditor.ts", - "./vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts", - "./vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts", - "./vs/workbench/contrib/experiments/node/experimentService.ts", - "./vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts", - "./vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts", - "./vs/workbench/contrib/extensions/browser/extensionsQuickOpen.ts", - "./vs/workbench/contrib/extensions/browser/extensionsViewer.ts", - "./vs/workbench/contrib/extensions/common/extensionQuery.ts", - "./vs/workbench/contrib/extensions/common/extensions.ts", - "./vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts", - "./vs/workbench/contrib/extensions/common/extensionsInput.ts", - "./vs/workbench/contrib/extensions/common/extensionsUtils.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsList.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts", - "./vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts", - "./vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts", - "./vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsInput.ts", - "./vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts", - "./vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts", - "./vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts", - "./vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts", - "./vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts", - "./vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts", - "./vs/workbench/contrib/feedback/electron-browser/feedback.contribution.ts", - "./vs/workbench/contrib/feedback/electron-browser/feedback.ts", - "./vs/workbench/contrib/feedback/electron-browser/feedbackStatusbarItem.ts", - "./vs/workbench/contrib/format/browser/format.contribution.ts", - "./vs/workbench/contrib/localizations/browser/localizations.contribution.ts", - "./vs/workbench/contrib/localizations/browser/localizationsActions.ts", - "./vs/workbench/contrib/localizations/browser/minimalTranslations.ts", - "./vs/workbench/contrib/logs/common/logConstants.ts", - "./vs/workbench/contrib/logs/common/logs.contribution.ts", - "./vs/workbench/contrib/logs/common/logsActions.ts", - "./vs/workbench/contrib/markers/browser/constants.ts", - "./vs/workbench/contrib/markers/browser/markers.contribution.ts", - "./vs/workbench/contrib/markers/browser/markers.ts", - "./vs/workbench/contrib/markers/browser/markersFileDecorations.ts", - "./vs/workbench/contrib/markers/browser/markersFilterOptions.ts", - "./vs/workbench/contrib/markers/browser/markersModel.ts", - "./vs/workbench/contrib/markers/browser/markersPanel.ts", - "./vs/workbench/contrib/markers/browser/markersPanelActions.ts", - "./vs/workbench/contrib/markers/browser/markersTreeViewer.ts", - "./vs/workbench/contrib/markers/browser/messages.ts", - "./vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts", - "./vs/workbench/contrib/output/browser/logViewer.ts", - "./vs/workbench/contrib/output/browser/output.contribution.ts", - "./vs/workbench/contrib/output/browser/outputActions.ts", - "./vs/workbench/contrib/output/browser/outputPanel.ts", - "./vs/workbench/contrib/output/browser/outputServices.ts", - "./vs/workbench/contrib/output/common/output.ts", - "./vs/workbench/contrib/output/common/outputLinkComputer.ts", - "./vs/workbench/contrib/output/common/outputLinkProvider.ts", - "./vs/workbench/contrib/output/test/outputLinkProvider.test.ts", - "./vs/workbench/contrib/preferences/browser/preferencesEditor.ts", - "./vs/workbench/contrib/preferences/browser/preferencesRenderers.ts", - "./vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts", - "./vs/workbench/contrib/preferences/browser/keybindingWidgets.ts", - "./vs/workbench/contrib/preferences/browser/preferencesActions.ts", - "./vs/workbench/contrib/preferences/browser/preferencesWidgets.ts", - "./vs/workbench/contrib/preferences/browser/settingsLayout.ts", - "./vs/workbench/contrib/preferences/browser/settingsWidgets.ts", - "./vs/workbench/contrib/preferences/browser/tocTree.ts", - "./vs/workbench/contrib/preferences/common/preferences.ts", - "./vs/workbench/contrib/preferences/common/preferencesContribution.ts", - "./vs/workbench/contrib/preferences/common/smartSnippetInserter.ts", - "./vs/workbench/contrib/preferences/electron-browser/preferencesSearch.ts", - "./vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts", - "./vs/workbench/contrib/quickopen/browser/commandsHandler.ts", - "./vs/workbench/contrib/quickopen/browser/gotoLineHandler.ts", - "./vs/workbench/contrib/quickopen/browser/gotoSymbolHandler.ts", - "./vs/workbench/contrib/quickopen/browser/helpHandler.ts", - "./vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts", - "./vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts", - "./vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts", - "./vs/workbench/contrib/scm/browser/dirtydiffDecorator.ts", - "./vs/workbench/contrib/scm/browser/scmActivity.ts", - "./vs/workbench/contrib/scm/browser/scmMenus.ts", - "./vs/workbench/contrib/scm/browser/scmUtil.ts", - "./vs/workbench/contrib/scm/common/scm.ts", - "./vs/workbench/contrib/scm/common/scmService.ts", - "./vs/workbench/contrib/search/browser/openAnythingHandler.ts", - "./vs/workbench/contrib/search/browser/openFileHandler.ts", - "./vs/workbench/contrib/search/browser/openSymbolHandler.ts", - "./vs/workbench/contrib/search/browser/patternInputWidget.ts", - "./vs/workbench/contrib/search/browser/replaceContributions.ts", - "./vs/workbench/contrib/search/browser/replaceService.ts", - "./vs/workbench/contrib/search/common/constants.ts", - "./vs/workbench/contrib/search/common/queryBuilder.ts", - "./vs/workbench/contrib/search/common/replace.ts", - "./vs/workbench/contrib/search/common/search.ts", - "./vs/workbench/contrib/search/common/searchHistoryService.ts", - "./vs/workbench/contrib/search/common/searchModel.ts", - "./vs/workbench/contrib/search/test/browser/mockSearchTree.ts", - "./vs/workbench/contrib/search/test/browser/openFileHandler.test.ts", - "./vs/workbench/contrib/search/test/browser/searchViewlet.test.ts", - "./vs/workbench/contrib/search/test/common/queryBuilder.test.ts", - "./vs/workbench/contrib/search/test/common/searchModel.test.ts", - "./vs/workbench/contrib/search/test/common/searchResult.test.ts", - "./vs/workbench/contrib/stats/node/workspaceStats.ts", - "./vs/workbench/contrib/stats/test/workspaceStats.test.ts", - "./vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts", - "./vs/workbench/contrib/surveys/electron-browser/nps.contribution.ts", - "./vs/workbench/contrib/telemetry/browser/telemetry.contribution.ts", - "./vs/workbench/contrib/themes/browser/themes.contribution.ts", - "./vs/workbench/contrib/themes/test/electron-browser/themes.test.contribution.ts", - "./vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts", - "./vs/workbench/contrib/update/electron-browser/update.contribution.ts", - "./vs/workbench/contrib/update/electron-browser/update.ts", - "./vs/workbench/contrib/url/common/url.contribution.ts", - "./vs/workbench/contrib/watermark/browser/watermark.ts", - "./vs/workbench/services/activity/browser/activityService.ts", - "./vs/workbench/services/activity/common/activity.ts", - "./vs/workbench/services/activityBar/browser/activityBarService.ts", - "./vs/workbench/services/backup/common/backup.ts", - "./vs/workbench/services/backup/node/backupFileService.ts", - "./vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts", - "./vs/workbench/services/broadcast/electron-browser/broadcastService.ts", - "./vs/workbench/services/configuration/common/configurationEditingService.ts", - "./vs/workbench/services/configuration/common/jsonEditingService.ts", - "./vs/workbench/services/configuration/node/configuration.ts", - "./vs/workbench/services/configuration/node/configurationService.ts", - "./vs/workbench/services/configuration/test/common/configurationModels.test.ts", - "./vs/workbench/services/configuration/test/electron-browser/configurationEditingService.test.ts", - "./vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts", - "./vs/workbench/services/configurationResolver/common/configurationResolver.ts", - "./vs/workbench/services/configurationResolver/common/configurationResolverSchema.ts", - "./vs/workbench/services/configurationResolver/common/configurationResolverUtils.ts", - "./vs/workbench/services/contextmenu/electron-browser/contextmenuService.ts", - "./vs/workbench/services/decorations/browser/decorations.ts", - "./vs/workbench/services/decorations/browser/decorationsService.ts", - "./vs/workbench/services/decorations/test/browser/decorationsService.test.ts", - "./vs/workbench/services/dialogs/browser/remoteFileDialog.ts", - "./vs/workbench/services/dialogs/browser/fileDialogService.ts", - "./vs/workbench/services/dialogs/electron-browser/dialogService.ts", - "./vs/workbench/services/editor/browser/codeEditorService.ts", - "./vs/workbench/services/editor/browser/editorService.ts", - "./vs/workbench/services/editor/common/editorGroupsService.ts", - "./vs/workbench/services/editor/common/editorService.ts", - "./vs/workbench/services/editor/test/browser/editorGroupsService.test.ts", - "./vs/workbench/services/editor/test/browser/editorService.test.ts", - "./vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts", - "./vs/workbench/services/extensions/common/extensions.ts", - "./vs/workbench/services/extensions/common/extensionsRegistry.ts", - "./vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts", - "./vs/workbench/services/extensions/electron-browser/extensionHost.ts", - "./vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts", - "./vs/workbench/services/extensions/electron-browser/extensionHostProfiler.ts", - "./vs/workbench/services/extensions/electron-browser/extensionManagementServerService.ts", - "./vs/workbench/services/extensions/electron-browser/extensionService.ts", - "./vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler.ts", - "./vs/workbench/services/extensions/node/extensionDescriptionRegistry.ts", - "./vs/workbench/services/extensions/node/extensionHostProtocol.ts", - "./vs/workbench/services/extensions/node/extensionPoints.ts", - "./vs/workbench/services/extensions/node/extensionsUtil.ts", - "./vs/workbench/services/extensions/node/lazyPromise.ts", - "./vs/workbench/services/extensions/node/proxyIdentifier.ts", - "./vs/workbench/services/extensions/node/rpcProtocol.ts", - "./vs/workbench/services/extensions/test/node/rpcProtocol.test.ts", - "./vs/workbench/services/files/node/encoding.ts", - "./vs/workbench/services/files/node/fileService.ts", - "./vs/workbench/services/files/node/remoteFileService.ts", - "./vs/workbench/services/files/node/streams.ts", - "./vs/workbench/services/files/test/electron-browser/fileService.test.ts", - "./vs/workbench/services/files/test/electron-browser/resolver.test.ts", - "./vs/workbench/services/files/test/electron-browser/utils.ts", - "./vs/workbench/services/files/test/electron-browser/watcher.test.ts", - "./vs/workbench/services/hash/common/hashService.ts", - "./vs/workbench/services/hash/node/hashService.ts", - "./vs/workbench/services/hash/test/hashService.test.ts", - "./vs/workbench/services/history/browser/history.ts", - "./vs/workbench/services/history/common/history.ts", - "./vs/workbench/services/integrity/common/integrity.ts", - "./vs/workbench/services/integrity/node/integrityService.ts", - "./vs/workbench/services/keybinding/common/keybindingEditing.ts", - "./vs/workbench/services/keybinding/common/keybindingIO.ts", - "./vs/workbench/services/keybinding/common/keyboardMapper.ts", - "./vs/workbench/services/keybinding/common/macLinuxFallbackKeyboardMapper.ts", - "./vs/workbench/services/keybinding/common/macLinuxKeyboardMapper.ts", - "./vs/workbench/services/keybinding/common/windowsKeyboardMapper.ts", - "./vs/workbench/services/keybinding/electron-browser/keybindingService.ts", - "./vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts", - "./vs/workbench/services/keybinding/test/keybindingIO.test.ts", - "./vs/workbench/services/keybinding/test/keyboardMapperTestUtils.ts", - "./vs/workbench/services/keybinding/test/macLinuxFallbackKeyboardMapper.test.ts", - "./vs/workbench/services/keybinding/test/macLinuxKeyboardMapper.test.ts", - "./vs/workbench/services/keybinding/test/windowsKeyboardMapper.test.ts", - "./vs/workbench/services/label/common/labelService.ts", - "./vs/workbench/services/label/test/label.test.ts", - "./vs/workbench/services/layout/browser/layoutService.ts", - "./vs/workbench/services/mode/common/workbenchModeService.ts", - "./vs/workbench/services/notification/common/notificationService.ts", - "./vs/workbench/services/panel/common/panelService.ts", - "./vs/workbench/services/preferences/common/preferencesModels.ts", - "./vs/workbench/services/preferences/common/keybindingsEditorModel.ts", - "./vs/workbench/services/preferences/test/common/keybindingsEditorModel.test.ts", - "./vs/workbench/services/progress/browser/progressService.ts", - "./vs/workbench/services/progress/browser/progressService2.ts", - "./vs/workbench/services/progress/test/progressService.test.ts", - "./vs/workbench/services/remote/common/remoteAgentService.ts", - "./vs/workbench/services/remote/common/remoteEnvironmentService.ts", - "./vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts", - "./vs/workbench/services/remote/node/remoteAgentEnvironmentChannel.ts", - "./vs/workbench/services/search/common/replace.ts", - "./vs/workbench/services/search/common/search.ts", - "./vs/workbench/services/search/common/searchHelpers.ts", - "./vs/workbench/services/search/node/fileSearch.ts", - "./vs/workbench/services/search/node/fileSearchManager.ts", - "./vs/workbench/services/search/node/rawSearchService.ts", - "./vs/workbench/services/search/node/ripgrepFileSearch.ts", - "./vs/workbench/services/search/node/ripgrepSearchProvider.ts", - "./vs/workbench/services/search/node/ripgrepSearchUtils.ts", - "./vs/workbench/services/search/node/ripgrepTextSearchEngine.ts", - "./vs/workbench/services/search/node/searchApp.ts", - "./vs/workbench/services/search/node/searchIpc.ts", - "./vs/workbench/services/search/node/textSearchAdapter.ts", - "./vs/workbench/services/search/node/textSearchManager.ts", - "./vs/workbench/services/search/test/common/replace.test.ts", - "./vs/workbench/services/search/test/common/search.test.ts", - "./vs/workbench/services/search/test/common/searchHelpers.test.ts", - "./vs/workbench/services/search/test/node/ripgrepFileSearch.test.ts", - "./vs/workbench/services/search/test/node/ripgrepTextSearchEngine.test.ts", - "./vs/workbench/services/search/test/node/search.test.ts", - "./vs/workbench/services/search/test/node/textSearch.integrationTest.ts", - "./vs/workbench/services/search/test/node/textSearchManager.test.ts", - "./vs/workbench/services/textMate/common/TMGrammars.ts", - "./vs/workbench/services/textMate/common/TMHelper.ts", - "./vs/workbench/services/textMate/common/textMateService.ts", - "./vs/workbench/services/textMate/electron-browser/textMateService.ts", - "./vs/workbench/services/textfile/common/textFileEditorModel.ts", - "./vs/workbench/services/textfile/common/textFileEditorModelManager.ts", - "./vs/workbench/services/textfile/common/textFileService.ts", - "./vs/workbench/services/textfile/common/textfiles.ts", - "./vs/workbench/services/textfile/node/textResourcePropertiesService.ts", - "./vs/workbench/services/textfile/test/textFileEditorModel.test.ts", - "./vs/workbench/services/textfile/test/textFileEditorModelManager.test.ts", - "./vs/workbench/services/textfile/test/textFileService.test.ts", - "./vs/workbench/services/textmodelResolver/common/textModelResolverService.ts", - "./vs/workbench/services/textmodelResolver/test/textModelResolverService.test.ts", - "./vs/workbench/services/timer/electron-browser/timerService.ts", - "./vs/workbench/services/title/common/titleService.ts", - "./vs/workbench/services/untitled/common/untitledEditorService.ts", - "./vs/workbench/services/viewlet/browser/viewlet.ts", - "./vs/workbench/services/workspace/common/workspaceEditing.ts", - "./vs/workbench/services/configurationResolver/common/variableResolver.ts", - "./vs/workbench/services/workspace/node/workspaceEditingService.ts", - "./vs/workbench/test/browser/actionRegistry.test.ts", - "./vs/workbench/test/browser/part.test.ts", - "./vs/workbench/test/browser/parts/editor/baseEditor.test.ts", - "./vs/workbench/test/browser/parts/editor/breadcrumbModel.test.ts", - "./vs/workbench/test/browser/parts/editor/rangeDecorations.test.ts", - "./vs/workbench/test/browser/parts/views/views.test.ts", - "./vs/workbench/test/browser/quickopen.test.ts", - "./vs/workbench/test/browser/viewlet.test.ts", - "./vs/workbench/test/common/editor/dataUriEditorInput.test.ts", - "./vs/workbench/test/common/editor/editor.test.ts", - "./vs/workbench/test/common/editor/editorDiffModel.test.ts", - "./vs/workbench/test/common/editor/editorGroups.test.ts", - "./vs/workbench/test/common/editor/editorInput.test.ts", - "./vs/workbench/test/common/editor/editorModel.test.ts", - "./vs/workbench/test/common/editor/editorOptions.test.ts", - "./vs/workbench/test/common/editor/resourceEditorInput.test.ts", - "./vs/workbench/test/common/editor/untitledEditor.test.ts", - "./vs/workbench/test/common/memento.test.ts", - "./vs/workbench/test/common/notifications.test.ts", - "./vs/workbench/test/electron-browser/api/extHost.api.impl.test.ts", - "./vs/workbench/test/electron-browser/api/extHostCommands.test.ts", - "./vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts", - "./vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts", - "./vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts", - "./vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts", - "./vs/workbench/test/electron-browser/api/extHostDocumentsAndEditors.test.ts", - "./vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts", - "./vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts", - "./vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts", - "./vs/workbench/test/electron-browser/api/extHostSearch.test.ts", - "./vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts", - "./vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts", - "./vs/workbench/test/electron-browser/api/extHostTypeConverter.test.ts", - "./vs/workbench/test/electron-browser/api/extHostTypes.test.ts", - "./vs/workbench/test/electron-browser/api/extHostWebview.test.ts", - "./vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadDocumentContentProviders.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadDocuments.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts", - "./vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts", - "./vs/workbench/test/electron-browser/api/mock.ts", - "./vs/workbench/test/electron-browser/api/testRPCProtocol.ts", - "./vs/workbench/test/electron-browser/colorRegistry.releaseTest.ts", - "./vs/workbench/test/workbenchTestServices.ts" - ], - "exclude": [ - "./typings/require-monaco.d.ts", - "./vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts" - ] -} \ No newline at end of file diff --git a/src/vs/base/browser/ui/actionbar/actionbar.ts b/src/vs/base/browser/ui/actionbar/actionbar.ts index d50430417a..a2d60485ab 100644 --- a/src/vs/base/browser/ui/actionbar/actionbar.ts +++ b/src/vs/base/browser/ui/actionbar/actionbar.ts @@ -16,6 +16,7 @@ import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { IContextViewProvider } from 'vs/base/browser/ui/contextview/contextview'; import { Event, Emitter } from 'vs/base/common/event'; +import { asArray } from 'vs/base/common/arrays'; export interface IActionItem { actionRunner: IActionRunner; @@ -593,7 +594,7 @@ export class ActionBar extends Disposable implements IActionRunner { } push(arg: IAction | IAction[], options: IActionOptions = {}): void { - const actions: IAction[] = !Array.isArray(arg) ? [arg] : arg; + const actions: IAction[] = asArray(arg); let index = types.isNumber(options.index) ? options.index : null; diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index a016772fe8..c534ba5ba0 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -17,6 +17,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; +import { asArray } from 'vs/base/common/arrays'; const $ = DOM.$; @@ -184,7 +185,7 @@ export class MenuBar extends Disposable { } push(arg: MenuBarMenu | MenuBarMenu[]): void { - const menus: MenuBarMenu[] = !Array.isArray(arg) ? [arg] : arg; + const menus: MenuBarMenu[] = asArray(arg); menus.forEach((menuBarMenu) => { const menuIndex = this.menuCache.length; @@ -993,4 +994,4 @@ class ModifierKeyEmitter extends Emitter { super.dispose(); this._subscriptions = dispose(this._subscriptions); } -} \ No newline at end of file +} diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index 455060a851..6b75768313 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -549,3 +549,7 @@ export function mapArrayOrNot(items: T | T[], fn: (_: T) => U): U | U[] { items.map(fn) : fn(items); } + +export function asArray(x: T | T[]): T[] { + return Array.isArray(x) ? x : [x]; +} diff --git a/src/vs/base/parts/ipc/node/ipc.net.ts b/src/vs/base/parts/ipc/node/ipc.net.ts index a63bfd63a9..df1c3d1bcb 100644 --- a/src/vs/base/parts/ipc/node/ipc.net.ts +++ b/src/vs/base/parts/ipc/node/ipc.net.ts @@ -8,6 +8,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IMessagePassingProtocol, ClientConnectionEvent, IPCServer, IPCClient } from 'vs/base/parts/ipc/node/ipc'; import { join } from 'vs/base/common/path'; import { tmpdir } from 'os'; +import * as fs from 'fs'; import { generateUuid } from 'vs/base/common/uuid'; import { IDisposable } from 'vs/base/common/lifecycle'; @@ -21,6 +22,18 @@ export function generateRandomPipeName(): string { } } +function log(fd: number, msg: string, data?: Buffer): void { + const date = new Date(); + fs.writeSync(fd, `[${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}] ${msg}\n`); + if (data) { + fs.writeSync(fd, data); + fs.writeSync(fd, `\n---------------------------------------------------------------------------------------------------------\n`); + } + fs.fdatasyncSync(fd); +} + +const EMPTY_BUFFER = Buffer.allocUnsafe(0); + class ChunkStream { private _chunks: Buffer[]; @@ -40,14 +53,9 @@ class ChunkStream { this._totalLength += buff.byteLength; } - public readUInt32BE(): number { - let tmp = this.read(4); - return tmp.readUInt32BE(0); - } - public read(byteCount: number): Buffer { if (byteCount === 0) { - return Buffer.allocUnsafe(0); + return EMPTY_BUFFER; } if (byteCount > this._totalLength) { @@ -95,23 +103,250 @@ class ChunkStream { } } +const enum ProtocolMessageType { + None = 0, + Regular = 1, + Control = 2, + Ack = 3, + KeepAlive = 4 +} + +function ProtocolMessageTypeToString(type: ProtocolMessageType): string { + switch (type) { + case ProtocolMessageType.None: return 'None'; + case ProtocolMessageType.Regular: return 'Regular'; + case ProtocolMessageType.Control: return 'Control'; + case ProtocolMessageType.Ack: return 'Ack'; + case ProtocolMessageType.KeepAlive: return 'KeepAlive'; + } +} + +export const enum ProtocolConstants { + HeaderLength = 13, + /** + * Send an Acknowledge message at most 2 seconds later... + */ + AcknowledgeTime = 2000, // 2 seconds + /** + * If there is a message that has been unacknowledged for 10 seconds, consider the connection closed... + */ + AcknowledgeTimeoutTime = 10000, // 10 seconds + /** + * Send at least a message every 30s for keep alive reasons. + */ + KeepAliveTime = 30000, // 30 seconds + /** + * If there is no message received for 60 seconds, consider the connection closed... + */ + KeepAliveTimeoutTime = 60000, // 60 seconds + /** + * If there is no reconnection within this time-frame, consider the connection permanently closed... + */ + ReconnectionGraceTime = 60 * 60 * 1000, // 1hr +} + +class ProtocolMessage { + + public writtenTime: number; + + constructor( + public readonly type: ProtocolMessageType, + public readonly id: number, + public readonly ack: number, + public readonly data: Buffer + ) { + this.writtenTime = 0; + } + + public get size(): number { + return this.data.byteLength; + } +} + +class ProtocolReader { + + private readonly _socket: Socket; + private _isDisposed: boolean; + private readonly _incomingData: ChunkStream; + private readonly _socketDataListener: (data: Buffer) => void; + public lastReadTime: number; + + private readonly _onMessage = new Emitter(); + public readonly onMessage: Event = this._onMessage.event; + + private readonly _state = { + readHead: true, + readLen: ProtocolConstants.HeaderLength, + messageType: ProtocolMessageType.None, + id: 0, + ack: 0 + }; + + constructor(socket: Socket) { + this._socket = socket; + this._isDisposed = false; + this._incomingData = new ChunkStream(); + this._socketDataListener = (data: Buffer) => this.acceptChunk(data); + this._socket.on('data', this._socketDataListener); + this.lastReadTime = Date.now(); + } + + public acceptChunk(data: Buffer | null): void { + if (!data || data.byteLength === 0) { + return; + } + + this.lastReadTime = Date.now(); + + this._incomingData.acceptChunk(data); + + while (this._incomingData.byteLength >= this._state.readLen) { + + const buff = this._incomingData.read(this._state.readLen); + + if (this._state.readHead) { + // buff is the header + + // save new state => next time will read the body + this._state.readHead = false; + this._state.readLen = buff.readUInt32BE(9, true); + this._state.messageType = buff.readUInt8(0, true); + this._state.id = buff.readUInt32BE(1, true); + this._state.ack = buff.readUInt32BE(5, true); + } else { + // buff is the body + const messageType = this._state.messageType; + const id = this._state.id; + const ack = this._state.ack; + + // save new state => next time will read the header + this._state.readHead = true; + this._state.readLen = ProtocolConstants.HeaderLength; + this._state.messageType = ProtocolMessageType.None; + this._state.id = 0; + this._state.ack = 0; + + this._onMessage.fire(new ProtocolMessage(messageType, id, ack, buff)); + + if (this._isDisposed) { + // check if an event listener lead to our disposal + break; + } + } + } + } + + public readEntireBuffer(): Buffer { + return this._incomingData.read(this._incomingData.byteLength); + } + + public dispose(): void { + this._isDisposed = true; + this._socket.removeListener('data', this._socketDataListener); + } +} + +class ProtocolWriter { + + private readonly _socket: Socket; + private readonly _logFile: number; + private _data: Buffer[]; + private _totalLength; + public lastWriteTime: number; + + constructor(socket: Socket, logFile: number) { + this._socket = socket; + this._logFile = logFile; + this._data = []; + this._totalLength = 0; + this.lastWriteTime = 0; + } + + public dispose(): void { + this.flush(); + } + + public flush(): void { + // flush + this._writeNow(); + } + + public write(msg: ProtocolMessage) { + if (this._logFile) { + log(this._logFile, `send-${ProtocolMessageTypeToString(msg.type)}-${msg.id}-${msg.ack}-`, msg.data); + } + msg.writtenTime = Date.now(); + this.lastWriteTime = Date.now(); + const header = Buffer.allocUnsafe(ProtocolConstants.HeaderLength); + header.writeUInt8(msg.type, 0, true); + header.writeUInt32BE(msg.id, 1, true); + header.writeUInt32BE(msg.ack, 5, true); + header.writeUInt32BE(msg.data.length, 9, true); + this._writeSoon(header, msg.data); + } + + private _bufferAdd(head: Buffer, body: Buffer): boolean { + const wasEmpty = this._totalLength === 0; + this._data.push(head, body); + this._totalLength += head.length + body.length; + return wasEmpty; + } + + private _bufferTake(): Buffer { + const ret = Buffer.concat(this._data, this._totalLength); + this._data.length = 0; + this._totalLength = 0; + return ret; + } + + private _writeSoon(header: Buffer, data: Buffer): void { + if (this._bufferAdd(header, data)) { + setImmediate(() => { + this._writeNow(); + }); + } + } + + private _writeNow(): void { + if (this._totalLength === 0) { + return; + } + // return early if socket has been destroyed in the meantime + if (this._socket.destroyed) { + return; + } + // we ignore the returned value from `write` because we would have to cached the data + // anyways and nodejs is already doing that for us: + // > https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback + // > However, the false return value is only advisory and the writable stream will unconditionally + // > accept and buffer chunk even if it has not not been allowed to drain. + this._socket.write(this._bufferTake()); + } +} + /** * A message has the following format: + * ``` + * /-------------------------------|------\ + * | HEADER | | + * |-------------------------------| DATA | + * | TYPE | ID | ACK | DATA_LENGTH | | + * \-------------------------------|------/ + * ``` + * The header is 9 bytes and consists of: + * - TYPE is 1 byte (ProtocolMessageType) - the message type + * - ID is 4 bytes (u32be) - the message id (can be 0 to indicate to be ignored) + * - ACK is 4 bytes (u32be) - the acknowledged message id (can be 0 to indicate to be ignored) + * - DATA_LENGTH is 4 bytes (u32be) - the length in bytes of DATA * - * [bodyLen|message] - * [header^|data^^^] - * [u32be^^|buffer^] + * Only Regular messages are counted, other messages are not counted, nor acknowledged. */ - export class Protocol implements IDisposable, IMessagePassingProtocol { - private static readonly _headerLen = 4; + private _socket: Socket; + private _socketWriter: ProtocolWriter; + private _socketReader: ProtocolReader; - private _isDisposed: boolean; - private _incomingData: ChunkStream; - - private _socketDataListener: (data: Buffer) => void; - private _socketEndListener: () => void; private _socketCloseListener: () => void; private _onMessage = new Emitter(); @@ -120,72 +355,25 @@ export class Protocol implements IDisposable, IMessagePassingProtocol { private _onClose = new Emitter(); readonly onClose: Event = this._onClose.event; - constructor(private _socket: Socket) { - this._isDisposed = false; - this._incomingData = new ChunkStream(); + constructor(socket: Socket) { + this._socket = socket; + this._socketWriter = new ProtocolWriter(this._socket, 0); + this._socketReader = new ProtocolReader(this._socket); - const state = { - readHead: true, - bodyLen: -1, - }; - - const acceptChunk = (data: Buffer) => { - - this._incomingData.acceptChunk(data); - - while (this._incomingData.byteLength > 0) { - - if (state.readHead) { - // expecting header -> read header - if (this._incomingData.byteLength >= Protocol._headerLen) { - state.bodyLen = this._incomingData.readUInt32BE(); - state.readHead = false; - } else { - break; - } - } - - if (!state.readHead) { - // expecting body -> read bodyLen-bytes for - // the actual message or wait for more data - if (this._incomingData.byteLength >= state.bodyLen) { - const buffer = this._incomingData.read(state.bodyLen); - - state.bodyLen = -1; - state.readHead = true; - - this._onMessage.fire(buffer); - - if (this._isDisposed) { - // check if an event listener lead to our disposal - break; - } - } else { - break; - } - } + this._socketReader.onMessage((msg) => { + if (msg.type === ProtocolMessageType.Regular) { + this._onMessage.fire(msg.data); } - }; - - this._socketDataListener = (data: Buffer) => { - acceptChunk(data); - }; - _socket.on('data', this._socketDataListener); - - this._socketEndListener = () => { - }; - _socket.on('end', this._socketEndListener); + }); this._socketCloseListener = () => { this._onClose.fire(); }; - _socket.once('close', this._socketCloseListener); + this._socket.once('close', this._socketCloseListener); } dispose(): void { - this._isDisposed = true; - this._socket.removeListener('data', this._socketDataListener); - this._socket.removeListener('end', this._socketEndListener); + this._socketReader.dispose(); this._socket.removeListener('close', this._socketCloseListener); } @@ -193,51 +381,8 @@ export class Protocol implements IDisposable, IMessagePassingProtocol { this._socket.end(); } - readEntireBuffer(): Buffer { - return this._incomingData.read(this._incomingData.byteLength); - } - send(buffer: Buffer): void { - const header = Buffer.allocUnsafe(Protocol._headerLen); - header.writeUInt32BE(buffer.length, 0, true); - this._writeSoon(header, buffer); - } - - private _writeBuffer = new class { - - private _data: Buffer[] = []; - private _totalLength = 0; - - add(head: Buffer, body: Buffer): boolean { - const wasEmpty = this._totalLength === 0; - this._data.push(head, body); - this._totalLength += head.length + body.length; - return wasEmpty; - } - - take(): Buffer { - const ret = Buffer.concat(this._data, this._totalLength); - this._data.length = 0; - this._totalLength = 0; - return ret; - } - }; - - private _writeSoon(header: Buffer, data: Buffer): void { - if (this._writeBuffer.add(header, data)) { - setImmediate(() => { - // return early if socket has been destroyed in the meantime - if (this._socket.destroyed) { - return; - } - // we ignore the returned value from `write` because we would have to cached the data - // anyways and nodejs is already doing that for us: - // > https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback - // > However, the false return value is only advisory and the writable stream will unconditionally - // > accept and buffer chunk even if it has not not been allowed to drain. - this._socket.write(this._writeBuffer.take()); - }); - } + this._socketWriter.write(new ProtocolMessage(ProtocolMessageType.Regular, 0, 0, buffer)); } } @@ -276,13 +421,14 @@ export class Client extends IPCClient { get onClose(): Event { return this.protocol.onClose; } - constructor(private protocol: Protocol | BufferedProtocol, id: TContext) { + constructor(private protocol: Protocol | PersistentProtocol, id: TContext) { super(protocol, id); } dispose(): void { super.dispose(); this.protocol.end(); + this.protocol.dispose(); } } @@ -355,26 +501,396 @@ function createBufferedEvent(source: Event): Event { return emitter.event; } -/** - * Will ensure no messages are lost if there are no event listeners. - */ -export class BufferedProtocol implements IMessagePassingProtocol { +class QueueElement { + public readonly data: T; + public next: QueueElement | null; - private readonly _actual: Protocol; - public readonly onMessage: Event; - public readonly onClose: Event; - - constructor(actual: Protocol) { - this._actual = actual; - this.onMessage = createBufferedEvent(this._actual.onMessage); - this.onClose = createBufferedEvent(this._actual.onClose); - } - - public send(buffer: Buffer): void { - this._actual.send(buffer); - } - - public end(): void { - this._actual.end(); + constructor(data: T) { + this.data = data; + this.next = null; + } +} + +class Queue { + + private _first: QueueElement | null; + private _last: QueueElement | null; + + constructor() { + this._first = null; + this._last = null; + } + + public peek(): T | null { + if (!this._first) { + return null; + } + return this._first.data; + } + + public toArray(): T[] { + let result: T[] = [], resultLen = 0; + let it = this._first; + while (it) { + result[resultLen++] = it.data; + it = it.next; + } + return result; + } + + public pop(): void { + if (!this._first) { + return; + } + if (this._first === this._last) { + this._first = null; + this._last = null; + return; + } + this._first = this._first.next; + } + + public push(item: T): void { + const element = new QueueElement(item); + if (!this._first) { + this._first = element; + this._last = element; + return; + } + this._last!.next = element; + this._last = element; + } +} + +/** + * Same as Protocol, but will actually track messages and acks. + * Moreover, it will ensure no messages are lost if there are no event listeners. + */ +export class PersistentProtocol { + + private _logFile: number; + private _isReconnecting: boolean; + + private _outgoingUnackMsg: Queue; + private _outgoingMsgId: number; + private _outgoingAckId: number; + private _outgoingAckTimeout: NodeJS.Timeout | null; + + private _incomingMsgId: number; + private _incomingAckId: number; + private _incomingMsgLastTime: number; + private _incomingAckTimeout: NodeJS.Timeout | null; + + private _outgoingKeepAliveTimeout: NodeJS.Timeout | null; + private _incomingKeepAliveTimeout: NodeJS.Timeout | null; + + private _socket: Socket; + private _socketWriter: ProtocolWriter; + private _socketReader: ProtocolReader; + private _socketReaderListener: IDisposable; + + private readonly _socketCloseListener: () => void; + private readonly _socketEndListener: () => void; + private readonly _socketErrorListener: (err: any) => void; + + private _onControlMessage = new Emitter(); + readonly onControlMessage: Event = createBufferedEvent(this._onControlMessage.event); + + private _onMessage = new Emitter(); + readonly onMessage: Event = createBufferedEvent(this._onMessage.event); + + private _onClose = new Emitter(); + readonly onClose: Event = createBufferedEvent(this._onClose.event); + + private _onSocketClose = new Emitter(); + readonly onSocketClose: Event = createBufferedEvent(this._onSocketClose.event); + + private _onSocketTimeout = new Emitter(); + readonly onSocketTimeout: Event = createBufferedEvent(this._onSocketTimeout.event); + + public get unacknowledgedCount(): number { + return this._outgoingMsgId - this._outgoingAckId; + } + + constructor(socket: Socket, initialChunk: Buffer | null = null, logFileName: string | null = null) { + this._logFile = 0; + this._isReconnecting = false; + if (logFileName) { + console.log(`PersistentProtocol log file: ${logFileName}`); + this._logFile = fs.openSync(logFileName, 'a'); + } + this._outgoingUnackMsg = new Queue(); + this._outgoingMsgId = 0; + this._outgoingAckId = 0; + this._outgoingAckTimeout = null; + + this._incomingMsgId = 0; + this._incomingAckId = 0; + this._incomingMsgLastTime = 0; + this._incomingAckTimeout = null; + + this._outgoingKeepAliveTimeout = null; + this._incomingKeepAliveTimeout = null; + + this._socketCloseListener = () => { + console.log(`socket triggered close event!`); + this._onSocketClose.fire(); + }; + this._socketEndListener = () => { + // received FIN + this._onClose.fire(); + }; + this._socketErrorListener = (err) => { + console.log(`socket had an error: `, err); + }; + + this._socket = socket; + this._socketWriter = new ProtocolWriter(this._socket, this._logFile); + this._socketReader = new ProtocolReader(this._socket); + this._socketReaderListener = this._socketReader.onMessage(msg => this._receiveMessage(msg)); + this._socket.on('close', this._socketCloseListener); + this._socket.on('end', this._socketEndListener); + this._socket.on('error', this._socketErrorListener); + if (initialChunk) { + this._socketReader.acceptChunk(initialChunk); + } + + this._sendKeepAliveCheck(); + this._recvKeepAliveCheck(); + } + + dispose(): void { + if (this._outgoingAckTimeout) { + clearTimeout(this._outgoingAckTimeout); + this._outgoingAckTimeout = null; + } + if (this._incomingAckTimeout) { + clearTimeout(this._incomingAckTimeout); + this._incomingAckTimeout = null; + } + if (this._outgoingKeepAliveTimeout) { + clearTimeout(this._outgoingKeepAliveTimeout); + this._outgoingKeepAliveTimeout = null; + } + if (this._incomingKeepAliveTimeout) { + clearTimeout(this._incomingKeepAliveTimeout); + this._incomingKeepAliveTimeout = null; + } + if (this._logFile) { + fs.closeSync(this._logFile); + } + this._socketWriter.dispose(); + this._socketReader.dispose(); + this._socketReaderListener.dispose(); + this._socket.removeListener('close', this._socketCloseListener); + this._socket.removeListener('end', this._socketEndListener); + this._socket.removeListener('error', this._socketErrorListener); + } + + private _sendKeepAliveCheck(): void { + if (this._outgoingKeepAliveTimeout) { + // there will be a check in the near future + return; + } + + const timeSinceLastOutgoingMsg = Date.now() - this._socketWriter.lastWriteTime; + if (timeSinceLastOutgoingMsg >= ProtocolConstants.KeepAliveTime) { + // sufficient time has passed since last message was written, + // and no message from our side needed to be sent in the meantime, + // so we will send a message containing only a keep alive. + const msg = new ProtocolMessage(ProtocolMessageType.KeepAlive, 0, 0, EMPTY_BUFFER); + this._socketWriter.write(msg); + this._sendKeepAliveCheck(); + return; + } + + this._outgoingKeepAliveTimeout = setTimeout(() => { + this._outgoingKeepAliveTimeout = null; + this._sendKeepAliveCheck(); + }, ProtocolConstants.KeepAliveTime - timeSinceLastOutgoingMsg + 5); + } + + private _recvKeepAliveCheck(): void { + if (this._incomingKeepAliveTimeout) { + // there will be a check in the near future + return; + } + + const timeSinceLastIncomingMsg = Date.now() - this._socketReader.lastReadTime; + if (timeSinceLastIncomingMsg >= ProtocolConstants.KeepAliveTimeoutTime) { + // Trash the socket + this._onSocketTimeout.fire(undefined); + return; + } + + this._incomingKeepAliveTimeout = setTimeout(() => { + this._incomingKeepAliveTimeout = null; + this._recvKeepAliveCheck(); + }, ProtocolConstants.KeepAliveTimeoutTime - timeSinceLastIncomingMsg + 5); + } + + public getSocket(): Socket { + return this._socket; + } + + public beginAcceptReconnection(socket: Socket, initialDataChunk: Buffer | null): void { + this._isReconnecting = true; + + this._socketWriter.dispose(); + this._socketReader.dispose(); + this._socketReaderListener.dispose(); + this._socket.removeListener('close', this._socketCloseListener); + this._socket.removeListener('end', this._socketEndListener); + this._socket.removeListener('error', this._socketErrorListener); + + this._socket = socket; + + this._socketWriter = new ProtocolWriter(this._socket, this._logFile); + this._socketReader = new ProtocolReader(this._socket); + this._socketReaderListener = this._socketReader.onMessage(msg => this._receiveMessage(msg)); + this._socketReader.acceptChunk(initialDataChunk); + this._socket.on('close', this._socketCloseListener); + this._socket.on('end', this._socketEndListener); + this._socket.on('error', this._socketErrorListener); + } + + public endAcceptReconnection(): void { + this._isReconnecting = false; + + // Send again all unacknowledged messages + const toSend = this._outgoingUnackMsg.toArray(); + for (let i = 0, len = toSend.length; i < len; i++) { + this._socketWriter.write(toSend[i]); + } + this._recvAckCheck(); + + this._sendKeepAliveCheck(); + this._recvKeepAliveCheck(); + } + + private _receiveMessage(msg: ProtocolMessage): void { + if (this._logFile) { + log(this._logFile, `recv-${ProtocolMessageTypeToString(msg.type)}-${msg.id}-${msg.ack}-`, msg.data); + } + if (msg.ack > this._outgoingAckId) { + this._outgoingAckId = msg.ack; + do { + const first = this._outgoingUnackMsg.peek(); + if (first && first.id <= msg.ack) { + // this message has been confirmed, remove it + this._outgoingUnackMsg.pop(); + } else { + break; + } + } while (true); + } + + if (msg.type === ProtocolMessageType.Regular) { + if (msg.id > this._incomingMsgId) { + if (msg.id !== this._incomingMsgId + 1) { + console.error(`PROTOCOL CORRUPTION, LAST SAW MSG ${this._incomingMsgId} AND HAVE NOW RECEIVED MSG ${msg.id}`); + } + this._incomingMsgId = msg.id; + this._incomingMsgLastTime = Date.now(); + this._sendAckCheck(); + this._onMessage.fire(msg.data); + } + } else if (msg.type === ProtocolMessageType.Control) { + this._onControlMessage.fire(msg.data); + } + } + + end(): void { + this._socket.end(); + } + + readEntireBuffer(): Buffer { + return this._socketReader.readEntireBuffer(); + } + + flush(): void { + this._socketWriter.flush(); + } + + send(buffer: Buffer): void { + const myId = ++this._outgoingMsgId; + this._incomingAckId = this._incomingMsgId; + const msg = new ProtocolMessage(ProtocolMessageType.Regular, myId, this._incomingAckId, buffer); + this._outgoingUnackMsg.push(msg); + if (!this._isReconnecting) { + this._socketWriter.write(msg); + this._recvAckCheck(); + } + } + + /** + * Send a message which will not be part of the regular acknowledge flow. + * Use this for early control messages which are repeated in case of reconnection. + */ + sendControl(buffer: Buffer): void { + const msg = new ProtocolMessage(ProtocolMessageType.Control, 0, 0, buffer); + this._socketWriter.write(msg); + } + + private _sendAckCheck(): void { + if (this._incomingMsgId <= this._incomingAckId) { + // nothink to acknowledge + return; + } + + if (this._incomingAckTimeout) { + // there will be a check in the near future + return; + } + + const timeSinceLastIncomingMsg = Date.now() - this._incomingMsgLastTime; + if (timeSinceLastIncomingMsg >= ProtocolConstants.AcknowledgeTime) { + // sufficient time has passed since this message has been received, + // and no message from our side needed to be sent in the meantime, + // so we will send a message containing only an ack. + this._sendAck(); + return; + } + + this._incomingAckTimeout = setTimeout(() => { + this._incomingAckTimeout = null; + this._sendAckCheck(); + }, ProtocolConstants.AcknowledgeTime - timeSinceLastIncomingMsg + 5); + } + + private _recvAckCheck(): void { + if (this._outgoingMsgId <= this._outgoingAckId) { + // everything has been acknowledged + return; + } + + if (this._outgoingAckTimeout) { + // there will be a check in the near future + return; + } + + const oldestUnacknowledgedMsg = this._outgoingUnackMsg.peek()!; + const timeSinceOldestUnacknowledgedMsg = Date.now() - oldestUnacknowledgedMsg.writtenTime; + if (timeSinceOldestUnacknowledgedMsg >= ProtocolConstants.AcknowledgeTimeoutTime) { + // Trash the socket + this._onSocketTimeout.fire(undefined); + return; + } + + this._outgoingAckTimeout = setTimeout(() => { + this._outgoingAckTimeout = null; + this._recvAckCheck(); + }, ProtocolConstants.AcknowledgeTimeoutTime - timeSinceOldestUnacknowledgedMsg + 5); + } + + private _sendAck(): void { + if (this._incomingMsgId <= this._incomingAckId) { + // nothink to acknowledge + return; + } + + this._incomingAckId = this._incomingMsgId; + const msg = new ProtocolMessage(ProtocolMessageType.Ack, 0, this._incomingAckId, EMPTY_BUFFER); + this._socketWriter.write(msg); } } diff --git a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts index 14f8b8b1c0..19c99ddc28 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.net.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.net.test.ts @@ -6,68 +6,143 @@ import * as assert from 'assert'; import { Socket } from 'net'; import { EventEmitter } from 'events'; -import { Protocol } from 'vs/base/parts/ipc/node/ipc.net'; +import { Protocol, PersistentProtocol } from 'vs/base/parts/ipc/node/ipc.net'; -class MockDuplex extends EventEmitter { +class MessageStream { - private _cache: Buffer[] = []; + private _currentComplete: ((data: Buffer) => void) | null; + private _messages: Buffer[]; - readonly destroyed = false; + constructor(x: Protocol | PersistentProtocol) { + this._currentComplete = null; + this._messages = []; + x.onMessage(data => { + this._messages.push(data); + this._trigger(); + }); + } - private _deliver(): void { - if (this._cache.length) { - const data = Buffer.concat(this._cache); - this._cache.length = 0; - this.emit('data', data); + private _trigger(): void { + if (!this._currentComplete) { + return; } + if (this._messages.length === 0) { + return; + } + const complete = this._currentComplete; + const msg = this._messages.shift()!; + + this._currentComplete = null; + complete(msg); + } + + public waitForOne(): Promise { + return new Promise((complete) => { + this._currentComplete = complete; + this._trigger(); + }); + } +} + +class EtherStream extends EventEmitter { + constructor( + private readonly _ether: Ether, + private readonly _name: 'a' | 'b' + ) { + super(); } write(data: Buffer, cb?: Function): boolean { - this._cache.push(data); - setImmediate(() => this._deliver()); + this._ether.write(this._name, data); return true; } } +class Ether { + + private readonly _a: EtherStream; + private readonly _b: EtherStream; + + private _ab: Buffer[]; + private _ba: Buffer[]; + + public get a(): Socket { + return this._a; + } + + public get b(): Socket { + return this._b; + } + + constructor() { + this._a = new EtherStream(this, 'a'); + this._b = new EtherStream(this, 'b'); + this._ab = []; + this._ba = []; + } + + public write(from: 'a' | 'b', data: Buffer): void { + if (from === 'a') { + this._ab.push(data); + } else { + this._ba.push(data); + } + + setImmediate(() => this._deliver()); + } + + private _deliver(): void { + + if (this._ab.length > 0) { + const data = Buffer.concat(this._ab); + this._ab.length = 0; + this._b.emit('data', data); + setImmediate(() => this._deliver()); + return; + } + + if (this._ba.length > 0) { + const data = Buffer.concat(this._ba); + this._ba.length = 0; + this._a.emit('data', data); + setImmediate(() => this._deliver()); + return; + } + + } +} suite('IPC, Socket Protocol', () => { - let stream: Socket; + let ether: Ether; setup(() => { - stream = new MockDuplex(); + ether = new Ether(); }); test('read/write', async () => { - const a = new Protocol(stream); - const b = new Protocol(stream); + const a = new Protocol(ether.a); + const b = new Protocol(ether.b); + const bMessages = new MessageStream(b); - await new Promise(resolve => { - const sub = b.onMessage(data => { - sub.dispose(); - assert.equal(data.toString(), 'foobarfarboo'); - resolve(undefined); - }); - a.send(Buffer.from('foobarfarboo')); - }); - return new Promise(resolve => { - const sub_1 = b.onMessage(data => { - sub_1.dispose(); - assert.equal(data.readInt8(0), 123); - resolve(undefined); - }); - const buffer = Buffer.allocUnsafe(1); - buffer.writeInt8(123, 0); - a.send(buffer); - }); + a.send(Buffer.from('foobarfarboo')); + const msg1 = await bMessages.waitForOne(); + assert.equal(msg1.toString(), 'foobarfarboo'); + + const buffer = Buffer.allocUnsafe(1); + buffer.writeInt8(123, 0); + a.send(buffer); + const msg2 = await bMessages.waitForOne(); + assert.equal(msg2.readInt8(0), 123); }); - test('read/write, object data', () => { + test('read/write, object data', async () => { - const a = new Protocol(stream); - const b = new Protocol(stream); + const a = new Protocol(ether.a); + const b = new Protocol(ether.b); + const bMessages = new MessageStream(b); const data = { pi: Math.PI, @@ -77,12 +152,68 @@ suite('IPC, Socket Protocol', () => { }; a.send(Buffer.from(JSON.stringify(data))); + const msg = await bMessages.waitForOne(); + assert.deepEqual(JSON.parse(msg.toString()), data); + }); - return new Promise(resolve => { - b.onMessage(msg => { - assert.deepEqual(JSON.parse(msg.toString()), data); - resolve(undefined); - }); - }); +}); + +suite('PersistentProtocol reconnection', () => { + let ether: Ether; + + setup(() => { + ether = new Ether(); + }); + + test('acks get piggybacked with messages', async () => { + const a = new PersistentProtocol(ether.a); + const aMessages = new MessageStream(a); + const b = new PersistentProtocol(ether.b); + const bMessages = new MessageStream(b); + + a.send(Buffer.from('a1')); + assert.equal(a.unacknowledgedCount, 1); + assert.equal(b.unacknowledgedCount, 0); + + a.send(Buffer.from('a2')); + assert.equal(a.unacknowledgedCount, 2); + assert.equal(b.unacknowledgedCount, 0); + + a.send(Buffer.from('a3')); + assert.equal(a.unacknowledgedCount, 3); + assert.equal(b.unacknowledgedCount, 0); + + const a1 = await bMessages.waitForOne(); + assert.equal(a1.toString(), 'a1'); + assert.equal(a.unacknowledgedCount, 3); + assert.equal(b.unacknowledgedCount, 0); + + const a2 = await bMessages.waitForOne(); + assert.equal(a2.toString(), 'a2'); + assert.equal(a.unacknowledgedCount, 3); + assert.equal(b.unacknowledgedCount, 0); + + const a3 = await bMessages.waitForOne(); + assert.equal(a3.toString(), 'a3'); + assert.equal(a.unacknowledgedCount, 3); + assert.equal(b.unacknowledgedCount, 0); + + b.send(Buffer.from('b1')); + assert.equal(a.unacknowledgedCount, 3); + assert.equal(b.unacknowledgedCount, 1); + + const b1 = await aMessages.waitForOne(); + assert.equal(b1.toString(), 'b1'); + assert.equal(a.unacknowledgedCount, 0); + assert.equal(b.unacknowledgedCount, 1); + + a.send(Buffer.from('a4')); + assert.equal(a.unacknowledgedCount, 1); + assert.equal(b.unacknowledgedCount, 1); + + const b2 = await bMessages.waitForOne(); + assert.equal(b2.toString(), 'a4'); + assert.equal(a.unacknowledgedCount, 1); + assert.equal(b.unacknowledgedCount, 0); }); }); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index 741515aa0c..fbb9092102 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -55,7 +55,7 @@ import { LogLevelSetterChannel } from 'vs/platform/log/node/logIpc'; import * as errors from 'vs/base/common/errors'; import { ElectronURLListener } from 'vs/platform/url/electron-main/electronUrlListener'; import { serve as serveDriver } from 'vs/platform/driver/electron-main/driver'; -import { connectRemoteAgentManagement } from 'vs/platform/remote/node/remoteAgentConnection'; +import { connectRemoteAgentManagement, ManagementPersistentConnection } from 'vs/platform/remote/node/remoteAgentConnection'; import { IMenubarService } from 'vs/platform/menubar/common/menubar'; import { MenubarService } from 'vs/platform/menubar/electron-main/menubarService'; import { MenubarChannel } from 'vs/platform/menubar/node/menubarIpc'; @@ -650,26 +650,27 @@ export class CodeApplication extends Disposable { class ActiveConnection { private readonly _authority: string; - private readonly _client: Promise>; + private readonly _connection: Promise; private readonly _disposeRunner: RunOnceScheduler; constructor(authority: string, host: string, port: number) { this._authority = authority; - this._client = connectRemoteAgentManagement(authority, host, port, `main`, isBuilt); + this._connection = connectRemoteAgentManagement(authority, host, port, `main`, isBuilt); this._disposeRunner = new RunOnceScheduler(() => this.dispose(), 5000); } dispose(): void { this._disposeRunner.dispose(); connectionPool.delete(this._authority); - this._client.then((connection) => { + this._connection.then((connection) => { connection.dispose(); }); } - getClient(): Promise> { + async getClient(): Promise> { this._disposeRunner.schedule(); - return this._client; + const connection = await this._connection; + return connection.client; } } @@ -734,4 +735,3 @@ export class CodeApplication extends Disposable { }); } } - diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 9f417ca575..6e2d6ac066 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -422,7 +422,7 @@ export class WindowsManager implements IWindowsMainService { // When run with --wait, make sure we keep the paths to wait for if (fileInputs && openConfig.cli.wait && openConfig.cli.waitMarkerFilePath) { - fileInputs.filesToWait = { paths: [...fileInputs.filesToDiff, ...fileInputs.filesToOpen, ...fileInputs.filesToCreate], waitMarkerFilePath: openConfig.cli.waitMarkerFilePath }; + fileInputs.filesToWait = { paths: [...fileInputs.filesToDiff, ...fileInputs.filesToOpen, ...fileInputs.filesToCreate], waitMarkerFileUri: URI.file(openConfig.cli.waitMarkerFilePath) }; } // diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 92a647c0a4..7e59046d6a 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -1270,6 +1270,7 @@ export interface CommentThread2 { onDidChangeInput: Event; acceptInputCommand?: Command; additionalCommands: Command[]; + deleteCommand?: Command; onDidChangeAcceptInputCommand: Event; onDidChangeAdditionalCommands: Event; onDidChangeRange: Event; @@ -1285,7 +1286,7 @@ export interface CommentingRanges { readonly resource: URI; ranges: IRange[]; newCommentThreadCommand?: Command; - newCommentThreadCallback?: (uri: UriComponents, range: IRange) => void; + newCommentThreadCallback?: (uri: UriComponents, range: IRange) => Promise; } /** diff --git a/src/vs/editor/contrib/hover/modesContentHover.ts b/src/vs/editor/contrib/hover/modesContentHover.ts index bc2e021a00..35b42a39b4 100644 --- a/src/vs/editor/contrib/hover/modesContentHover.ts +++ b/src/vs/editor/contrib/hover/modesContentHover.ts @@ -23,7 +23,7 @@ import { HoverOperation, HoverStartMode, IHoverComputer } from 'vs/editor/contri import { ContentHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { coalesce, isNonEmptyArray } from 'vs/base/common/arrays'; +import { coalesce, isNonEmptyArray, asArray } from 'vs/base/common/arrays'; import { IMarker, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { basename } from 'vs/base/common/resources'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService'; @@ -148,16 +148,7 @@ class ModesContentComputer implements IHoverComputer { return null; } - let contents: IMarkdownString[] = []; - - if (d.options.hoverMessage) { - if (Array.isArray(d.options.hoverMessage)) { - contents = [...d.options.hoverMessage]; - } else { - contents = [d.options.hoverMessage]; - } - } - + const contents: IMarkdownString[] = d.options.hoverMessage ? asArray(d.options.hoverMessage) : []; return { contents, range }; } }); diff --git a/src/vs/editor/contrib/hover/modesGlyphHover.ts b/src/vs/editor/contrib/hover/modesGlyphHover.ts index f64b16c293..1ffd7db37e 100644 --- a/src/vs/editor/contrib/hover/modesGlyphHover.ts +++ b/src/vs/editor/contrib/hover/modesGlyphHover.ts @@ -12,6 +12,7 @@ import { GlyphHoverWidget } from 'vs/editor/contrib/hover/hoverWidgets'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IOpenerService, NullOpenerService } from 'vs/platform/opener/common/opener'; +import { asArray } from 'vs/base/common/arrays'; export interface IHoverMessage { value: IMarkdownString; @@ -62,11 +63,7 @@ class MarginComputer implements IHoverComputer { continue; } - if (Array.isArray(hoverMessage)) { - result.push(...hoverMessage.map(toHoverMessage)); - } else { - result.push(toHoverMessage(hoverMessage)); - } + result.push(...asArray(hoverMessage).map(toHoverMessage)); } return result; diff --git a/src/vs/editor/contrib/quickOpen/quickOpen.ts b/src/vs/editor/contrib/quickOpen/quickOpen.ts index 49b903bca2..b392f8d180 100644 --- a/src/vs/editor/contrib/quickOpen/quickOpen.ts +++ b/src/vs/editor/contrib/quickOpen/quickOpen.ts @@ -11,6 +11,7 @@ import { registerLanguageCommand } from 'vs/editor/browser/editorExtensions'; import { DocumentSymbol, DocumentSymbolProviderRegistry } from 'vs/editor/common/modes'; import { IModelService } from 'vs/editor/common/services/modelService'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; export function getDocumentSymbols(model: ITextModel, flat: boolean, token: CancellationToken): Promise { @@ -70,8 +71,20 @@ registerLanguageCommand('_executeDocumentSymbolProvider', function (accessor, ar throw illegalArgument('resource'); } const model = accessor.get(IModelService).getModel(resource); - if (!model) { - throw illegalArgument('resource'); + if (model) { + return getDocumentSymbols(model, false, CancellationToken.None); } - return getDocumentSymbols(model, false, CancellationToken.None); + + return accessor.get(ITextModelService).createModelReference(resource).then(reference => { + return new Promise((resolve, reject) => { + try { + const result = getDocumentSymbols(reference.object.textEditorModel, false, CancellationToken.None); + resolve(result); + } catch (err) { + reject(err); + } + }).finally(() => { + reference.dispose(); + }); + }); }); diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 6794692d95..bd8d89fe22 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -28,26 +28,18 @@ export interface IResourceEncoding { export interface IFileService { _serviceBrand: any; - /** - * Helper to determine read/write encoding for resources. - */ - encoding: IResourceEncodings; - - /** - * Allows to listen for file changes. The event will fire for every file within the opened workspace - * (if any) as well as all files that have been watched explicitly using the #watchFileChanges() API. - */ - onFileChanges: Event; - - /** - * An event that is fired upon successful completion of a certain file operation. - */ - onAfterOperation: Event; + //#region File System Provider /** * An event that is fired when a file system provider is added or removed */ - onDidChangeFileSystemProviderRegistrations: Event; + readonly onDidChangeFileSystemProviderRegistrations: Event; + + /** + * An event that is fired when a file system provider is about to be activated. Listeners + * can join this event with a long running promise to help in the activation process. + */ + readonly onWillActivateFileSystemProvider: Event; /** * Registers a file system provider for a certain scheme. @@ -64,6 +56,24 @@ export interface IFileService { */ canHandleResource(resource: URI): boolean; + //#endregion + + /** + * Helper to determine read/write encoding for resources. + */ + encoding: IResourceEncodings; + + /** + * Allows to listen for file changes. The event will fire for every file within the opened workspace + * (if any) as well as all files that have been watched explicitly using the #watchFileChanges() API. + */ + readonly onFileChanges: Event; + + /** + * An event that is fired upon successful completion of a certain file operation. + */ + readonly onAfterOperation: Event; + /** * Resolve the properties of a file identified by the resource. * @@ -129,12 +139,6 @@ export interface IFileService { */ createFile(resource: URI, content?: string, options?: ICreateFileOptions): Promise; - /** - * Reads a folder's content with the given path. The returned promise - * will have the list of children as a result. - */ - readFolder(resource: URI): Promise; - /** * Creates a new folder with the given path. The returned promise * will have the stat model object as a result. @@ -234,12 +238,88 @@ export interface IFileSystemProvider { write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise; } +export enum FileSystemProviderErrorCode { + FileExists = 'EntryExists', + FileNotFound = 'EntryNotFound', + FileNotADirectory = 'EntryNotADirectory', + FileIsADirectory = 'EntryIsADirectory', + NoPermissions = 'NoPermissions', + Unavailable = 'Unavailable' +} + +export class FileSystemProviderError extends Error { + + constructor(message: string, public readonly code?: FileSystemProviderErrorCode) { + super(message); + } +} + +export function createFileSystemProviderError(error: Error, code?: FileSystemProviderErrorCode): FileSystemProviderError { + const providerError = new FileSystemProviderError(error.toString(), code); + markAsFileSystemProviderError(providerError); + + return providerError; +} + +export function markAsFileSystemProviderError(error: Error, code?: FileSystemProviderErrorCode): Error { + error.name = code ? `${code} (FileSystemError)` : `FileSystemError`; + + return error; +} + +export function toFileSystemProviderErrorCode(error: Error): FileSystemProviderErrorCode | undefined { + + // FileSystemProviderError comes with the code + if (error instanceof FileSystemProviderError) { + return error.code; + } + + // Any other error, check for name match by assuming that the error + // went through the markAsFileSystemProviderError() method + const match = /^(.+) \(FileSystemError\)$/.exec(error.name); + if (!match) { + return undefined; + } + + switch (match[1]) { + case FileSystemProviderErrorCode.FileExists: return FileSystemProviderErrorCode.FileExists; + case FileSystemProviderErrorCode.FileIsADirectory: return FileSystemProviderErrorCode.FileIsADirectory; + case FileSystemProviderErrorCode.FileNotADirectory: return FileSystemProviderErrorCode.FileNotADirectory; + case FileSystemProviderErrorCode.FileNotFound: return FileSystemProviderErrorCode.FileNotFound; + case FileSystemProviderErrorCode.NoPermissions: return FileSystemProviderErrorCode.NoPermissions; + case FileSystemProviderErrorCode.Unavailable: return FileSystemProviderErrorCode.Unavailable; + } + + return undefined; +} + +export function toFileOperationResult(error: Error): FileOperationResult { + switch (toFileSystemProviderErrorCode(error)) { + case FileSystemProviderErrorCode.FileNotFound: + return FileOperationResult.FILE_NOT_FOUND; + case FileSystemProviderErrorCode.FileIsADirectory: + return FileOperationResult.FILE_IS_DIRECTORY; + case FileSystemProviderErrorCode.NoPermissions: + return FileOperationResult.FILE_PERMISSION_DENIED; + case FileSystemProviderErrorCode.FileExists: + return FileOperationResult.FILE_MOVE_CONFLICT; + case FileSystemProviderErrorCode.FileNotADirectory: + default: + return FileOperationResult.FILE_OTHER_ERROR; + } +} + export interface IFileSystemProviderRegistrationEvent { added: boolean; scheme: string; provider?: IFileSystemProvider; } +export interface IFileSystemProviderActivationEvent { + scheme: string; + join(promise: Promise): void; +} + export const enum FileOperation { CREATE, DELETE, @@ -655,7 +735,8 @@ export const enum FileOperationResult { FILE_PERMISSION_DENIED, FILE_TOO_LARGE, FILE_INVALID_PATH, - FILE_EXCEED_MEMORY_LIMIT + FILE_EXCEED_MEMORY_LIMIT, + FILE_OTHER_ERROR } export const AutoSaveConfiguration = { @@ -942,3 +1023,38 @@ export enum FileKind { export const MIN_MAX_MEMORY_SIZE_MB = 2048; export const FALLBACK_MAX_MEMORY_SIZE_MB = 4096; + +// TODO@ben remove traces of legacy file service +export const ILegacyFileService = createDecorator('legacyFileService'); +export interface ILegacyFileService { + _serviceBrand: any; + + encoding: IResourceEncodings; + + onFileChanges: Event; + onAfterOperation: Event; + + resolveFile(resource: URI, options?: IResolveFileOptions): Promise; + + resolveFiles(toResolve: { resource: URI, options?: IResolveFileOptions }[]): Promise; + + existsFile(resource: URI): Promise; + + resolveContent(resource: URI, options?: IResolveContentOptions): Promise; + + resolveStreamContent(resource: URI, options?: IResolveContentOptions): Promise; + + updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): Promise; + + moveFile(source: URI, target: URI, overwrite?: boolean): Promise; + + copyFile(source: URI, target: URI, overwrite?: boolean): Promise; + + createFile(resource: URI, content?: string, options?: ICreateFileOptions): Promise; + + del(resource: URI, options?: { useTrash?: boolean, recursive?: boolean }): Promise; + + watchFileChanges(resource: URI): void; + + unwatchFileChanges(resource: URI): void; +} \ No newline at end of file diff --git a/src/vs/platform/remote/node/remoteAgentConnection.ts b/src/vs/platform/remote/node/remoteAgentConnection.ts index f817c260d3..91070c0c90 100644 --- a/src/vs/platform/remote/node/remoteAgentConnection.ts +++ b/src/vs/platform/remote/node/remoteAgentConnection.ts @@ -3,26 +3,58 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Client, BufferedProtocol } from 'vs/base/parts/ipc/node/ipc.net'; +import { Client, PersistentProtocol } from 'vs/base/parts/ipc/node/ipc.net'; import { RemoteAgentConnectionContext } from 'vs/platform/remote/common/remoteAgentEnvironment'; - -export function connectRemoteAgentManagement(remoteAuthority: string, host: string, port: number, clientId: string, isBuilt: boolean): Promise> { - throw new Error(`Not implemented`); -} - -export interface IExtensionHostConnectionResult { - protocol: BufferedProtocol; - debugPort?: number; -} +import { Disposable } from 'vs/base/common/lifecycle'; export interface IRemoteExtensionHostStartParams { language: string; debugId?: string; - break: boolean; - port: number | null; + break?: boolean; + port?: number | null; updatePort?: boolean; } -export function connectRemoteAgentExtensionHost(host: string, port: number, startArguments: IRemoteExtensionHostStartParams, isBuilt: boolean): Promise { +export async function connectRemoteAgentManagement(remoteAuthority: string, host: string, port: number, clientId: string, isBuilt: boolean): Promise { throw new Error(`Not implemented`); } + +export async function connectRemoteAgentExtensionHost(host: string, port: number, startArguments: IRemoteExtensionHostStartParams, isBuilt: boolean): Promise { + throw new Error(`Not implemented`); +} + +abstract class PersistentConnection extends Disposable { + + public readonly reconnectionToken: string; + public readonly protocol: PersistentProtocol; + + constructor(reconnectionToken: string, protocol: PersistentProtocol) { + super(); + this.reconnectionToken = reconnectionToken; + this.protocol = protocol; + } +} + +export class ManagementPersistentConnection extends PersistentConnection { + + public readonly client: Client; + + constructor(remoteAuthority: string, host: string, port: number, clientId: string, isBuilt: boolean, reconnectionToken: string, protocol: PersistentProtocol) { + super(reconnectionToken, protocol); + + this.client = this._register(new Client(protocol, { + remoteAuthority: remoteAuthority, + clientId: clientId + })); + } +} + +export class ExtensionHostPersistentConnection extends PersistentConnection { + + public readonly debugPort: number | undefined; + + constructor(host: string, port: number, startArguments: IRemoteExtensionHostStartParams, isBuilt: boolean, reconnectionToken: string, protocol: PersistentProtocol, debugPort: number | undefined) { + super(reconnectionToken, protocol); + this.debugPort = debugPort; + } +} diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index c579f98660..0b29d51883 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -340,11 +340,12 @@ export interface IPath extends IPathData { export interface IPathsToWaitFor extends IPathsToWaitForData { paths: IPath[]; + waitMarkerFileUri: URI; } export interface IPathsToWaitForData { paths: IPathData[]; - waitMarkerFilePath: string; + waitMarkerFileUri: UriComponents; } export interface IPathData { diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 19184c2175..ae4a415327 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3784,6 +3784,48 @@ declare module 'vscode' { provideFoldingRanges(document: TextDocument, context: FoldingContext, token: CancellationToken): ProviderResult; } + /** + * A selection range represents a part of a selection hierarchy. A selection range + * may have a parent selection range that contains it. + */ + export class SelectionRange { + + /** + * The [range](#Range) of this selection range. + */ + range: Range; + + /** + * The parent selection range containing this range. + */ + parent?: SelectionRange; + + /** + * Creates a new selection range. + * + * @param range The range of the selection range. + * @param parent The parent of the selection range. + */ + constructor(range: Range, parent?: SelectionRange); + } + + export interface SelectionRangeProvider { + /** + * Provide selection ranges for the given positions. + * + * Selection ranges should be computed individually and independend for each postion. The editor will merge + * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range + * is [contained](#Range.contains) by its parent. + * + * @param document The document in which the command was invoked. + * @param positions The positions at which the command was invoked. + * @param token A cancellation token. + * @return Selection ranges or a thenable that resolves to such. The lack of a result can be + * signaled by returning `undefined` or `null`. + */ + provideSelectionRanges(document: TextDocument, positions: Position[], token: CancellationToken): ProviderResult; + } + /** * A tuple of two characters, like a pair of * opening and closing brackets. @@ -6883,9 +6925,10 @@ declare module 'vscode' { shellPath?: string; /** - * Args for the custom shell executable, this does not work on Windows (see #8429) + * Args for the custom shell executable. A string can be used on Windows only which allows + * specifying shell args in [command-line format](https://msdn.microsoft.com/en-au/08dfcab2-eb6e-49a4-80eb-87d4076c98c6). */ - shellArgs?: string[]; + shellArgs?: string[] | string; /** * A path or Uri for the current working directory to be used for the terminal. @@ -8094,6 +8137,19 @@ declare module 'vscode' { */ export function registerFoldingRangeProvider(selector: DocumentSelector, provider: FoldingRangeProvider): Disposable; + /** + * Register a selection range provider. + * + * Multiple providers can be registered for a language. In that case providers are asked in + * parallel and the results are merged. A failing provider (rejected promise or exception) will + * not cause a failure of the whole operation. + * + * @param selector A selector that defines the documents this provider is applicable to. + * @param provider A selection range provider. + * @return A [disposable](#Disposable) that unregisters this provider when being disposed. + */ + export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable; + /** * Set a [language configuration](#LanguageConfiguration) for a language. * diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 10e8e89058..2c4ccf43e7 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -16,6 +16,46 @@ declare module 'vscode' { + //#region Joh - call hierarchy + + export enum CallHierarchyDirection { + CallsFrom = 1, + CallsTo = 2, + } + + export class CallHierarchyItem { + kind: SymbolKind; + name: string; + detail?: string; + uri: Uri; + range: Range; + selectionRange: Range; + + constructor(kind: SymbolKind, name: string, detail: string, uri: Uri, range: Range, selectionRange: Range); + } + + export interface CallHierarchyItemProvider { + + provideCallHierarchyItem( + document: TextDocument, + postion: Position, + token: CancellationToken + ): ProviderResult; + + resolveCallHierarchyItem( + item: CallHierarchyItem, + direction: CallHierarchyDirection, + token: CancellationToken + ): ProviderResult<[CallHierarchyItem, Location[]][]>; + } + + export namespace languages { + export function registerCallHierarchyProvider(selector: DocumentSelector, provider: CallHierarchyItemProvider): Disposable; + } + + //#endregion + + //#region Alex - resolvers export class ResolvedAuthority { @@ -82,68 +122,6 @@ declare module 'vscode' { //#endregion - //#region Joh - selection range provider - - /** - * A selection range represents a part of a selection hierarchy. A selection range - * may have a parent selection range that contains it. - */ - export class SelectionRange { - - /** - * The [range](#Range) of this selection range. - */ - range: Range; - - /** - * The parent selection range containing this range. - */ - parent?: SelectionRange; - - /** - * Creates a new selection range. - * - * @param range The range of the selection range. - * @param parent The parent of the selection range. - */ - constructor(range: Range, parent?: SelectionRange); - } - - export interface SelectionRangeProvider { - /** - * Provide selection ranges for the given positions. - * - * Selection ranges should be computed individually and independend for each postion. The editor will merge - * and deduplicate ranges but providers must return hierarchies of selection ranges so that a range - * is [contained](#Range.contains) by its parent. - * - * @param document The document in which the command was invoked. - * @param positions The positions at which the command was invoked. - * @param token A cancellation token. - * @return Selection ranges or a thenable that resolves to such. The lack of a result can be - * signaled by returning `undefined` or `null`. - */ - provideSelectionRanges(document: TextDocument, positions: Position[], token: CancellationToken): ProviderResult; - } - - export namespace languages { - - /** - * Register a selection range provider. - * - * Multiple providers can be registered for a language. In that case providers are asked in - * parallel and the results are merged. A failing provider (rejected promise or exception) will - * not cause a failure of the whole operation. - * - * @param selector A selector that defines the documents this provider is applicable to. - * @param provider A selection range provider. - * @return A [disposable](#Disposable) that unregisters this provider when being disposed. - */ - export function registerSelectionRangeProvider(selector: DocumentSelector, provider: SelectionRangeProvider): Disposable; - } - - //#endregion - //#region Joh - read/write in chunks export interface FileSystemProvider { @@ -820,6 +798,12 @@ declare module 'vscode' { */ collapsibleState?: CommentThreadCollapsibleState; + /** + * The command to be executed when users try to delete the comment thread. Currently, this is only called + * when the user collapses a comment thread that has no comments in it. + */ + deleteCommand?: Command; + /** * Dispose this comment thread. * Once disposed, the comment thread will be removed from visible text editors and Comments Panel. diff --git a/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts b/src/vs/workbench/api/browser/mainThreadClipboard.ts similarity index 57% rename from src/vs/workbench/api/electron-browser/mainThreadClipboard.ts rename to src/vs/workbench/api/browser/mainThreadClipboard.ts index 0c22e5d76a..2cd50d1214 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts +++ b/src/vs/workbench/api/browser/mainThreadClipboard.ts @@ -3,23 +3,28 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { clipboard } from 'electron'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { MainContext, MainThreadClipboardShape } from '../node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, MainThreadClipboardShape } from '../common/extHost.protocol'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; @extHostNamedCustomer(MainContext.MainThreadClipboard) export class MainThreadCommands implements MainThreadClipboardShape { + constructor( + _context: any, + @IClipboardService private readonly _clipboardService: IClipboardService, + ) { } + dispose(): void { // nothing } $readText(): Promise { - return Promise.resolve(clipboard.readText()); + return Promise.resolve(this._clipboardService.readText()); } $writeText(value: string): Promise { - clipboard.writeText(value); + this._clipboardService.writeText(value); return Promise.resolve(); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts b/src/vs/workbench/api/browser/mainThreadCommands.ts similarity index 95% rename from src/vs/workbench/api/electron-browser/mainThreadCommands.ts rename to src/vs/workbench/api/browser/mainThreadCommands.ts index 665889a35b..acf8aa9d87 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/browser/mainThreadCommands.ts @@ -5,8 +5,8 @@ import { ICommandService, CommandsRegistry, ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainThreadCommandsShape, ExtHostCommandsShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +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'; @extHostNamedCustomer(MainContext.MainThreadCommands) diff --git a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts b/src/vs/workbench/api/browser/mainThreadConfiguration.ts similarity index 96% rename from src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts rename to src/vs/workbench/api/browser/mainThreadConfiguration.ts index c4c316af12..3db152d9ad 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/browser/mainThreadConfiguration.ts @@ -8,8 +8,8 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope, getScopes } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { MainThreadConfigurationShape, MainContext, ExtHostContext, IExtHostContext, IWorkspaceConfigurationChangeEventData, IConfigurationInitData } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadConfigurationShape, MainContext, ExtHostContext, IExtHostContext, IWorkspaceConfigurationChangeEventData, IConfigurationInitData } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ConfigurationTarget, IConfigurationChangeEvent, IConfigurationModel, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/browser/mainThreadDebugService.ts similarity index 98% rename from src/vs/workbench/api/electron-browser/mainThreadDebugService.ts rename to src/vs/workbench/api/browser/mainThreadDebugService.ts index f32d2846b5..91a18428e3 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/browser/mainThreadDebugService.ts @@ -12,10 +12,10 @@ import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunc import { ExtHostContext, ExtHostDebugServiceShape, MainThreadDebugServiceShape, DebugSessionUUID, MainContext, IExtHostContext, IBreakpointsDeltaDto, ISourceMultiBreakpointDto, ISourceBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto -} from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +} from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import severity from 'vs/base/common/severity'; -import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; +import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstractDebugAdapter'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/contrib/debug/common/debugUtils'; @@ -153,7 +153,6 @@ export class MainThreadDebugService implements MainThreadDebugServiceShape, IDeb return Promise.resolve(); } - public $registerDebugConfigurationProvider(debugType: string, hasProvide: boolean, hasResolve: boolean, hasProvideDebugAdapter: boolean, handle: number): Promise { const provider = { @@ -384,4 +383,3 @@ class ExtensionHostDebugAdapter extends AbstractDebugAdapter { } // {{SQL CARBON EDIT}} */ - diff --git a/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts b/src/vs/workbench/api/browser/mainThreadDecorations.ts similarity index 96% rename from src/vs/workbench/api/electron-browser/mainThreadDecorations.ts rename to src/vs/workbench/api/browser/mainThreadDecorations.ts index 7bd0c0864d..4b581c9d2b 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDecorations.ts +++ b/src/vs/workbench/api/browser/mainThreadDecorations.ts @@ -6,8 +6,8 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { Emitter } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainContext, IExtHostContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { ExtHostContext, MainContext, IExtHostContext, MainThreadDecorationsShape, ExtHostDecorationsShape, DecorationData, DecorationRequest } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IDecorationsService, IDecorationData } from 'vs/workbench/services/decorations/browser/decorations'; import { values } from 'vs/base/common/collections'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts b/src/vs/workbench/api/browser/mainThreadDiagnostics.ts similarity index 92% rename from src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts rename to src/vs/workbench/api/browser/mainThreadDiagnostics.ts index 8adafe4ad0..42e4f24866 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts +++ b/src/vs/workbench/api/browser/mainThreadDiagnostics.ts @@ -5,8 +5,8 @@ import { IMarkerService, IMarkerData } from 'vs/platform/markers/common/markers'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { MainThreadDiagnosticsShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadDiagnosticsShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadDiagnostics) export class MainThreadDiagnostics implements MainThreadDiagnosticsShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts b/src/vs/workbench/api/browser/mainThreadDialogs.ts similarity index 95% rename from src/vs/workbench/api/electron-browser/mainThreadDialogs.ts rename to src/vs/workbench/api/browser/mainThreadDialogs.ts index 7e8ea278c9..576a7edf80 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts +++ b/src/vs/workbench/api/browser/mainThreadDialogs.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; -import { MainThreadDiaglogsShape, MainContext, IExtHostContext, MainThreadDialogOpenOptions, MainThreadDialogSaveOptions } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadDiaglogsShape, MainContext, IExtHostContext, MainThreadDialogOpenOptions, MainThreadDialogSaveOptions } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { forEach } from 'vs/base/common/collections'; import { IFileDialogService, IOpenDialogOptions, ISaveDialogOptions } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentContentProviders.ts b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts similarity index 96% rename from src/vs/workbench/api/electron-browser/mainThreadDocumentContentProviders.ts rename to src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts index 3497c6fa17..e228003cd5 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentContentProviders.ts +++ b/src/vs/workbench/api/browser/mainThreadDocumentContentProviders.ts @@ -13,8 +13,8 @@ import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerServ import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, ExtHostDocumentContentProvidersShape, IExtHostContext, MainContext, MainThreadDocumentContentProvidersShape } from '../node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostDocumentContentProvidersShape, IExtHostContext, MainContext, MainThreadDocumentContentProvidersShape } from '../common/extHost.protocol'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; @extHostNamedCustomer(MainContext.MainThreadDocumentContentProviders) diff --git a/src/vs/workbench/api/electron-browser/mainThreadErrors.ts b/src/vs/workbench/api/browser/mainThreadErrors.ts similarity index 88% rename from src/vs/workbench/api/electron-browser/mainThreadErrors.ts rename to src/vs/workbench/api/browser/mainThreadErrors.ts index 54d38e9c80..87e1524713 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadErrors.ts +++ b/src/vs/workbench/api/browser/mainThreadErrors.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { SerializedError, onUnexpectedError } from 'vs/base/common/errors'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { MainContext, MainThreadErrorsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, MainThreadErrorsShape } from 'vs/workbench/api/common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadErrors) export class MainThreadErrors implements MainThreadErrorsShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/browser/mainThreadFileSystem.ts similarity index 98% rename from src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts rename to src/vs/workbench/api/browser/mainThreadFileSystem.ts index de0c7e7987..e0090d0a44 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystem.ts @@ -7,8 +7,8 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { FileWriteOptions, FileSystemProviderCapabilities, IFileChange, IFileService, IFileSystemProvider, IStat, IWatchOptions, FileType, FileOverwriteOptions, FileDeleteOptions, FileOpenOptions } from 'vs/platform/files/common/files'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostFileSystemShape, IExtHostContext, IFileChangeDto, MainContext, MainThreadFileSystemShape } from '../common/extHost.protocol'; import { ResourceLabelFormatter, ILabelService } from 'vs/platform/label/common/label'; @extHostNamedCustomer(MainContext.MainThreadFileSystem) diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts similarity index 94% rename from src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts rename to src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts index 0d2aaf3ba9..1cce198c98 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/browser/mainThreadFileSystemEventService.ts @@ -5,8 +5,8 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { FileChangeType, IFileService, FileOperation } from 'vs/platform/files/common/files'; -import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, FileSystemEvents, IExtHostContext } from '../node/extHost.protocol'; +import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, FileSystemEvents, IExtHostContext } from '../common/extHost.protocol'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @extHostCustomer diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguages.ts b/src/vs/workbench/api/browser/mainThreadLanguages.ts similarity index 92% rename from src/vs/workbench/api/electron-browser/mainThreadLanguages.ts rename to src/vs/workbench/api/browser/mainThreadLanguages.ts index 97093b54e0..628da41389 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguages.ts +++ b/src/vs/workbench/api/browser/mainThreadLanguages.ts @@ -6,8 +6,8 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { MainThreadLanguagesShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadLanguagesShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadLanguages) export class MainThreadLanguages implements MainThreadLanguagesShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadLogService.ts b/src/vs/workbench/api/browser/mainThreadLogService.ts similarity index 88% rename from src/vs/workbench/api/electron-browser/mainThreadLogService.ts rename to src/vs/workbench/api/browser/mainThreadLogService.ts index 24b2d894c7..aecacfa2d6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLogService.ts +++ b/src/vs/workbench/api/browser/mainThreadLogService.ts @@ -3,10 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IExtHostContext, ExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; @extHostCustomer export class MainThreadLogService extends Disposable { diff --git a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts b/src/vs/workbench/api/browser/mainThreadMessageService.ts similarity index 96% rename from src/vs/workbench/api/electron-browser/mainThreadMessageService.ts rename to src/vs/workbench/api/browser/mainThreadMessageService.ts index 8ba915f32d..9a7873560c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadMessageService.ts +++ b/src/vs/workbench/api/browser/mainThreadMessageService.ts @@ -6,8 +6,8 @@ import * as nls from 'vs/nls'; import Severity from 'vs/base/common/severity'; import { Action, IAction } from 'vs/base/common/actions'; -import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadMessageServiceShape, MainContext, IExtHostContext, MainThreadMessageOptions } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts b/src/vs/workbench/api/browser/mainThreadOutputService.ts similarity index 96% rename from src/vs/workbench/api/electron-browser/mainThreadOutputService.ts rename to src/vs/workbench/api/browser/mainThreadOutputService.ts index 5c893eb8a4..5be21059dd 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts +++ b/src/vs/workbench/api/browser/mainThreadOutputService.ts @@ -7,8 +7,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IOutputService, IOutputChannel, OUTPUT_PANEL_ID, Extensions, IOutputChannelRegistry } from 'vs/workbench/contrib/output/common/output'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { MainThreadOutputServiceShape, MainContext, IExtHostContext, ExtHostOutputServiceShape, ExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadOutputServiceShape, MainContext, IExtHostContext, ExtHostOutputServiceShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; import { Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts b/src/vs/workbench/api/browser/mainThreadProgress.ts similarity index 92% rename from src/vs/workbench/api/electron-browser/mainThreadProgress.ts rename to src/vs/workbench/api/browser/mainThreadProgress.ts index 71f87e89c8..492c7867ed 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts +++ b/src/vs/workbench/api/browser/mainThreadProgress.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IProgress, IProgressService2, IProgressStep, IProgressOptions } from 'vs/platform/progress/common/progress'; -import { MainThreadProgressShape, MainContext, IExtHostContext, ExtHostProgressShape, ExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadProgressShape, MainContext, IExtHostContext, ExtHostProgressShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadProgress) export class MainThreadProgress implements MainThreadProgressShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts similarity index 94% rename from src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts rename to src/vs/workbench/api/browser/mainThreadQuickOpen.ts index 21f89269d4..b003b1860d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadQuickOpen.ts +++ b/src/vs/workbench/api/browser/mainThreadQuickOpen.ts @@ -4,9 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IPickOptions, IInputOptions, IQuickInputService, IQuickInput } from 'vs/platform/quickinput/common/quickInput'; -import { InputBoxOptions } from 'vscode'; -import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, TransferQuickPickItems, MainContext, IExtHostContext, TransferQuickInput, TransferQuickInputButton } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { ExtHostContext, MainThreadQuickOpenShape, ExtHostQuickOpenShape, TransferQuickPickItems, MainContext, IExtHostContext, TransferQuickInput, TransferQuickInputButton, IInputBoxOptions } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -85,7 +84,7 @@ export class MainThreadQuickOpen implements MainThreadQuickOpenShape { // ---- input - $input(options: InputBoxOptions | undefined, validateInput: boolean, token: CancellationToken): Promise { + $input(options: IInputBoxOptions | undefined, validateInput: boolean, token: CancellationToken): Promise { const inputOptions: IInputOptions = Object.create(null); if (options) { diff --git a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts b/src/vs/workbench/api/browser/mainThreadSCM.ts similarity index 98% rename from src/vs/workbench/api/electron-browser/mainThreadSCM.ts rename to src/vs/workbench/api/browser/mainThreadSCM.ts index f08c916a91..b5cae4bd36 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/browser/mainThreadSCM.ts @@ -8,9 +8,9 @@ import { Event, Emitter } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ISCMService, ISCMRepository, ISCMProvider, ISCMResource, ISCMResourceGroup, ISCMResourceDecorations, IInputValidation } from 'vs/workbench/contrib/scm/common/scm'; -import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, MainThreadSCMShape, ExtHostSCMShape, SCMProviderFeatures, SCMRawResourceSplices, SCMGroupFeatures, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { Command } from 'vs/editor/common/modes'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ISplice, Sequence } from 'vs/base/common/sequence'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts b/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts similarity index 99% rename from src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts rename to src/vs/workbench/api/browser/mainThreadSaveParticipant.ts index ce70c31b3a..cfc7af127a 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSaveParticipant.ts +++ b/src/vs/workbench/api/browser/mainThreadSaveParticipant.ts @@ -32,11 +32,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProgressService2, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; // {{SQL CARBON EDIT}} import { ISaveParticipant, SaveReason, IResolvedTextFileEditorModel, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; -import { ExtHostContext, ExtHostDocumentSaveParticipantShape, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, ExtHostDocumentSaveParticipantShape, IExtHostContext } from '../common/extHost.protocol'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; // {{SQL CARBON EDIT}} diff --git a/src/vs/workbench/api/electron-browser/mainThreadSearch.ts b/src/vs/workbench/api/browser/mainThreadSearch.ts similarity index 90% rename from src/vs/workbench/api/electron-browser/mainThreadSearch.ts rename to src/vs/workbench/api/browser/mainThreadSearch.ts index 28a5943674..42b95d8729 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSearch.ts +++ b/src/vs/workbench/api/browser/mainThreadSearch.ts @@ -3,15 +3,14 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { isFalsyOrEmpty } from 'vs/base/common/arrays'; +import { CancellationToken } from 'vs/base/common/cancellation'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { values } from 'vs/base/common/map'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { IFileMatch, IRawFileMatch2, ISearchComplete, ISearchCompleteStats, ISearchProgressItem, ISearchResultProvider, ISearchService, QueryType, SearchProviderType, ITextQuery, IFileQuery } from 'vs/workbench/services/search/common/search'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, ExtHostSearchShape, IExtHostContext, MainContext, MainThreadSearchShape } from '../node/extHost.protocol'; -import { CancellationToken } from 'vs/base/common/cancellation'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IFileMatch, IFileQuery, IRawFileMatch2, ISearchComplete, ISearchCompleteStats, ISearchProgressItem, ISearchResultProvider, ISearchService, ITextQuery, QueryType, SearchProviderType } from 'vs/workbench/services/search/common/search'; +import { ExtHostContext, ExtHostSearchShape, IExtHostContext, MainContext, MainThreadSearchShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadSearch) export class MainThreadSearch implements MainThreadSearchShape { @@ -114,7 +113,7 @@ class RemoteSearchProvider implements ISearchResultProvider, IDisposable { dispose(this._registrations); } - fileSearch(query: IFileQuery, token: CancellationToken = CancellationToken.None): Promise { + fileSearch(query: IFileQuery, token: CancellationToken = CancellationToken.None): Promise { return this.doSearch(query, undefined, token); } @@ -122,9 +121,9 @@ class RemoteSearchProvider implements ISearchResultProvider, IDisposable { return this.doSearch(query, onProgress, token); } - doSearch(query: ITextQuery | IFileQuery, onProgress?: (p: ISearchProgressItem) => void, token: CancellationToken = CancellationToken.None): Promise { - if (isFalsyOrEmpty(query.folderQueries)) { - return Promise.resolve(undefined); + doSearch(query: ITextQuery | IFileQuery, onProgress?: (p: ISearchProgressItem) => void, token: CancellationToken = CancellationToken.None): Promise { + if (!query.folderQueries.length) { + throw new Error('Empty folderQueries'); } const search = new SearchOperation(onProgress); diff --git a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts b/src/vs/workbench/api/browser/mainThreadStatusBar.ts similarity index 93% rename from src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts rename to src/vs/workbench/api/browser/mainThreadStatusBar.ts index e0141b068c..ef73e60c2c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadStatusBar.ts +++ b/src/vs/workbench/api/browser/mainThreadStatusBar.ts @@ -5,9 +5,9 @@ import { IStatusbarService, StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { MainThreadStatusBarShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; +import { MainThreadStatusBarShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; @extHostNamedCustomer(MainContext.MainThreadStatusBar) diff --git a/src/vs/workbench/api/electron-browser/mainThreadStorage.ts b/src/vs/workbench/api/browser/mainThreadStorage.ts similarity index 93% rename from src/vs/workbench/api/electron-browser/mainThreadStorage.ts rename to src/vs/workbench/api/browser/mainThreadStorage.ts index afafb1ea18..2c8ffaaba1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadStorage.ts +++ b/src/vs/workbench/api/browser/mainThreadStorage.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { MainThreadStorageShape, MainContext, IExtHostContext, ExtHostStorageShape, ExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadStorageShape, MainContext, IExtHostContext, ExtHostStorageShape, ExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { IDisposable } from 'vs/base/common/lifecycle'; @extHostNamedCustomer(MainContext.MainThreadStorage) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts b/src/vs/workbench/api/browser/mainThreadTelemetry.ts similarity index 90% rename from src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts rename to src/vs/workbench/api/browser/mainThreadTelemetry.ts index f65e40342e..de0cf92391 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTelemetry.ts +++ b/src/vs/workbench/api/browser/mainThreadTelemetry.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { MainThreadTelemetryShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { MainThreadTelemetryShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadTelemetry) export class MainThreadTelemetry implements MainThreadTelemetryShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts similarity index 92% rename from src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts rename to src/vs/workbench/api/browser/mainThreadTerminalService.ts index b58d966992..b29154ec1f 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -5,9 +5,10 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; -import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { UriComponents, URI } from 'vs/base/common/uri'; +import { StopWatch } from 'vs/base/common/stopwatch'; @extHostNamedCustomer(MainContext.MainThreadTerminalService) export class MainThreadTerminalService implements MainThreadTerminalServiceShape { @@ -59,7 +60,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // when the extension host process goes down ? } - public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }> { + public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }> { const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, @@ -227,6 +228,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape request.proxy.onShutdown(immediate => this._proxy.$acceptProcessShutdown(request.proxy.terminalId, immediate)); request.proxy.onRequestCwd(() => this._proxy.$acceptProcessRequestCwd(request.proxy.terminalId)); request.proxy.onRequestInitialCwd(() => this._proxy.$acceptProcessRequestInitialCwd(request.proxy.terminalId)); + request.proxy.onRequestLatency(() => this._onRequestLatency(request.proxy.terminalId)); } public $sendProcessTitle(terminalId: number, title: string): void { @@ -253,4 +255,16 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $sendProcessCwd(terminalId: number, cwd: string): void { this._terminalProcesses[terminalId].emitCwd(cwd); } + + private async _onRequestLatency(terminalId: number): Promise { + const COUNT = 2; + let sum = 0; + for (let i = 0; i < COUNT; i++) { + const sw = StopWatch.create(true); + await this._proxy.$acceptProcessRequestLatency(terminalId); + sw.stop(); + sum += sw.elapsed(); + } + this._terminalProcesses[terminalId].emitLatency(sum / COUNT); + } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts b/src/vs/workbench/api/browser/mainThreadTreeViews.ts similarity index 98% rename from src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts rename to src/vs/workbench/api/browser/mainThreadTreeViews.ts index e429704064..7edef47db8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTreeViews.ts +++ b/src/vs/workbench/api/browser/mainThreadTreeViews.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import { Disposable } from 'vs/base/common/lifecycle'; -import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, MainThreadTreeViewsShape, ExtHostTreeViewsShape, MainContext, IExtHostContext } from '../common/extHost.protocol'; import { ITreeViewDataProvider, ITreeItem, IViewsService, ITreeView, IViewsRegistry, ITreeViewDescriptor, IRevealOptions, Extensions } from 'vs/workbench/common/views'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { distinct } from 'vs/base/common/arrays'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { isUndefinedOrNull, isNumber } from 'vs/base/common/types'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadWindow.ts b/src/vs/workbench/api/browser/mainThreadWindow.ts similarity index 90% rename from src/vs/workbench/api/electron-browser/mainThreadWindow.ts rename to src/vs/workbench/api/browser/mainThreadWindow.ts index 10a33553a9..e7905e4875 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWindow.ts +++ b/src/vs/workbench/api/browser/mainThreadWindow.ts @@ -7,8 +7,8 @@ import { Event } from 'vs/base/common/event'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, ExtHostWindowShape, IExtHostContext, MainContext, MainThreadWindowShape } from '../node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostWindowShape, IExtHostContext, MainContext, MainThreadWindowShape } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadWindow) export class MainThreadWindow implements MainThreadWindowShape { diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts similarity index 97% rename from src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts rename to src/vs/workbench/api/browser/mainThreadWorkspace.ts index 3f3772ebf7..64c6a9cbc6 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -16,13 +16,12 @@ import { IFileMatch, IPatternInfo, ISearchProgressItem, ISearchService } from 'v import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState, IWorkspace } from 'vs/platform/workspace/common/workspace'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; -import { ExtHostContext, ExtHostWorkspaceShape, IExtHostContext, MainContext, MainThreadWorkspaceShape, IWorkspaceData } from '../node/extHost.protocol'; -import { TextSearchComplete } from 'vscode'; +import { ExtHostContext, ExtHostWorkspaceShape, IExtHostContext, MainContext, MainThreadWorkspaceShape, IWorkspaceData, ITextSearchComplete } from '../common/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { @@ -148,7 +147,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { }); } - $startTextSearch(pattern: IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise { + $startTextSearch(pattern: IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise { const workspace = this._contextService.getWorkspace(); const folders = workspace.folders.map(folder => folder.uri); diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts similarity index 90% rename from src/vs/workbench/api/node/extHost.protocol.ts rename to src/vs/workbench/api/common/extHost.protocol.ts index f73d7bfd31..4d65f58e50 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -8,44 +8,42 @@ import { SerializedError } from 'vs/base/common/errors'; import { IDisposable } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; import { URI, UriComponents } from 'vs/base/common/uri'; -import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; +import { TextEditorCursorStyle, RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { ISingleEditOperation } from 'vs/editor/common/model'; +import { ISingleEditOperation, EndOfLineSequence } from 'vs/editor/common/model'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; import * as modes from 'vs/editor/common/modes'; import { CharacterPair, CommentRule, EnterAction } from 'vs/editor/common/modes/languageConfiguration'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ConfigurationTarget, IConfigurationData, IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { FileChangeType, FileDeleteOptions, FileOverwriteOptions, FileSystemProviderCapabilities, FileType, FileWriteOptions, IStat, IWatchOptions, FileOpenOptions } from 'vs/platform/files/common/files'; +import * as files from 'vs/platform/files/common/files'; import { ResourceLabelFormatter } from 'vs/platform/label/common/label'; import { LogLevel } from 'vs/platform/log/common/log'; import { IMarkerData } from 'vs/platform/markers/common/markers'; -import { IPickOptions, IQuickInputButton, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { IPatternInfo, IRawFileMatch2, IRawQuery, IRawTextQuery, ISearchCompleteStats } from 'vs/workbench/services/search/common/search'; -import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; +import * as quickInput from 'vs/platform/quickinput/common/quickInput'; +import * as search from 'vs/workbench/services/search/common/search'; +import * as statusbar from 'vs/platform/statusbar/common/statusbar'; import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; -import { EndOfLine, IFileOperationOptions, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; -import { TaskDTO, TaskExecutionDTO, TaskFilterDTO, TaskHandleDTO, TaskProcessEndedDTO, TaskProcessStartedDTO, TaskSystemInfoDTO, TaskSetDTO } from 'vs/workbench/api/shared/tasks'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; +import * as tasks from 'vs/workbench/api/common/shared/tasks'; import { ITreeItem, IRevealOptions } from 'vs/workbench/common/views'; import { IAdapterDescriptor, IConfig, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import { ITerminalDimensions } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; -import { IRPCProtocol, createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { IRPCProtocol, createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; -import * as vscode from 'vscode'; import { IMarkdownString } from 'vs/base/common/htmlContent'; import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; -import { IRemoteConsoleLog } from 'vs/base/node/console'; import * as codeInset from 'vs/workbench/contrib/codeinset/common/codeInset'; +import * as callHierarchy from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; // {{SQL CARBON EDIT}} import { ITreeItem as sqlITreeItem } from 'sql/workbench/common/views'; @@ -126,12 +124,13 @@ export interface MainThreadCommentsShape extends IDisposable { $registerCommentController(handle: number, id: string, label: string): void; $unregisterCommentController(handle: number): void; $updateCommentControllerFeatures(handle: number, features: CommentProviderFeatures): void; - $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, comments: modes.Comment[], acceptInputCommand: modes.Command | undefined, additionalCommands: modes.Command[], collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 | undefined; + $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, comments: modes.Comment[], acceptInputCommand: modes.Command | undefined, additionalCommands: modes.Command[], deleteCommand: modes.Command | undefined, collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 | undefined; $deleteCommentThread(handle: number, commentThreadHandle: number): void; $updateComments(handle: number, commentThreadHandle: number, comments: modes.Comment[]): void; $setInputValue(handle: number, input: string): void; $updateCommentThreadAcceptInputCommand(handle: number, commentThreadHandle: number, acceptInputCommand: modes.Command): void; $updateCommentThreadAdditionalCommands(handle: number, commentThreadHandle: number, additionalCommands: modes.Command[]): void; + $updateCommentThreadDeleteCommand(handle: number, commentThreadHandle: number, deleteCommand: modes.Command): void; $updateCommentThreadCollapsibleState(handle: number, commentThreadHandle: number, collapseState: modes.CommentThreadCollapsibleState): void; $updateCommentThreadRange(handle: number, commentThreadHandle: number, range: IRange): void; $updateCommentThreadLabel(handle: number, commentThreadHandle: number, label: string): void; @@ -195,7 +194,7 @@ export interface ITextEditorConfigurationUpdate { indentSize?: number | 'tabSize'; insertSpaces?: boolean | 'auto'; cursorStyle?: TextEditorCursorStyle; - lineNumbers?: TextEditorLineNumbersStyle; + lineNumbers?: RenderLineNumbersType; } export interface IResolvedTextEditorConfiguration { @@ -203,7 +202,7 @@ export interface IResolvedTextEditorConfiguration { indentSize: number; insertSpaces: boolean; cursorStyle: TextEditorCursorStyle; - lineNumbers: TextEditorLineNumbersStyle; + lineNumbers: RenderLineNumbersType; } export enum TextEditorRevealType { @@ -219,7 +218,7 @@ export interface IUndoStopOptions { } export interface IApplyEditsOptions extends IUndoStopOptions { - setEndOfLine: EndOfLine; + setEndOfLine?: EndOfLineSequence; } export interface ITextDocumentShowOptions { @@ -258,7 +257,11 @@ export interface MainThreadErrorsShape extends IDisposable { } export interface MainThreadConsoleShape extends IDisposable { - $logExtensionHostMessage(msg: IRemoteConsoleLog): void; + $logExtensionHostMessage(msg: { + type: string; + severity: string; + arguments: string; + }): void; } export interface ISerializedRegExp { @@ -301,11 +304,13 @@ export interface ISerializedLanguageConfiguration { }; } +export type GlobPattern = string | { base: string; pattern: string }; + export interface ISerializedDocumentFilter { $serialized: true; language?: string; scheme?: string; - pattern?: vscode.GlobPattern; + pattern?: GlobPattern; exclusive?: boolean; } @@ -339,6 +344,7 @@ export interface MainThreadLanguageFeaturesShape extends IDisposable { $registerDocumentColorProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $registerFoldingRangeProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $registerSelectionRangeProvider(handle: number, selector: ISerializedDocumentFilter[]): void; + $registerCallHierarchyProvider(handle: number, selector: ISerializedDocumentFilter[]): void; $setLanguageConfiguration(handle: number, languageId: string, configuration: ISerializedLanguageConfiguration): void; } @@ -374,7 +380,7 @@ export interface MainThreadProgressShape extends IDisposable { } export interface MainThreadTerminalServiceShape extends IDisposable { - $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }>; + $createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string, cwd?: string | UriComponents, env?: { [key: string]: string | null }, waitOnExit?: boolean, strictEnv?: boolean): Promise<{ id: number, name: string }>; $createTerminalRenderer(name: string): Promise; $dispose(terminalId: number): void; $hide(terminalId: number): void; @@ -397,11 +403,11 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $terminalRendererRegisterOnInputListener(terminalId: number): void; } -export interface TransferQuickPickItems extends IQuickPickItem { +export interface TransferQuickPickItems extends quickInput.IQuickPickItem { handle: number; } -export interface TransferQuickInputButton extends IQuickInputButton { +export interface TransferQuickInputButton extends quickInput.IQuickInputButton { handle: number; } @@ -462,17 +468,26 @@ export interface TransferInputBox extends BaseTransferQuickInput { validationMessage?: string; } +export interface IInputBoxOptions { + value?: string; + valueSelection?: [number, number]; + prompt?: string; + placeHolder?: string; + password?: boolean; + ignoreFocusOut?: boolean; +} + export interface MainThreadQuickOpenShape extends IDisposable { - $show(instance: number, options: IPickOptions, token: CancellationToken): Promise; + $show(instance: number, options: quickInput.IPickOptions, token: CancellationToken): Promise; $setItems(instance: number, items: TransferQuickPickItems[]): Promise; $setError(instance: number, error: Error): Promise; - $input(options: vscode.InputBoxOptions | undefined, validateInput: boolean, token: CancellationToken): Promise; + $input(options: IInputBoxOptions | undefined, validateInput: boolean, token: CancellationToken): Promise; $createOrUpdate(params: TransferQuickInput): Promise; $dispose(id: number): Promise; } export interface MainThreadStatusBarShape extends IDisposable { - $setEntry(id: number, extensionId: ExtensionIdentifier | undefined, text: string, tooltip: string, command: string, color: string | ThemeColor, alignment: MainThreadStatusBarAlignment, priority: number | undefined): void; + $setEntry(id: number, extensionId: ExtensionIdentifier | undefined, text: string, tooltip: string, command: string, color: string | ThemeColor, alignment: statusbar.StatusbarAlignment, priority: number | undefined): void; $dispose(id: number): void; } @@ -494,16 +509,27 @@ export interface WebviewPanelShowOptions { readonly preserveFocus?: boolean; } +export interface IWebviewPanelOptions { + readonly enableFindWidget?: boolean; + readonly retainContextWhenHidden?: boolean; +} + +export interface IWebviewOptions { + readonly enableScripts?: boolean; + readonly enableCommandUris?: boolean; + readonly localResourceRoots?: ReadonlyArray; +} + export interface MainThreadWebviewsShape extends IDisposable { - $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, showOptions: WebviewPanelShowOptions, options: vscode.WebviewPanelOptions & vscode.WebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void; - $createWebviewCodeInset(handle: WebviewInsetHandle, symbolId: string, options: vscode.WebviewOptions, extensionLocation: UriComponents | undefined): void; + $createWebviewPanel(handle: WebviewPanelHandle, viewType: string, title: string, showOptions: WebviewPanelShowOptions, options: IWebviewPanelOptions & IWebviewOptions, extensionId: ExtensionIdentifier, extensionLocation: UriComponents): void; + $createWebviewCodeInset(handle: WebviewInsetHandle, symbolId: string, options: IWebviewOptions, extensionLocation: UriComponents | undefined): void; $disposeWebview(handle: WebviewPanelHandle): void; $reveal(handle: WebviewPanelHandle, showOptions: WebviewPanelShowOptions): void; $setTitle(handle: WebviewPanelHandle, value: string): void; $setIconPath(handle: WebviewPanelHandle, value: { light: UriComponents, dark: UriComponents } | undefined): void; $setHtml(handle: WebviewPanelHandle | WebviewInsetHandle, value: string): void; - $setOptions(handle: WebviewPanelHandle | WebviewInsetHandle, options: vscode.WebviewOptions): void; + $setOptions(handle: WebviewPanelHandle | WebviewInsetHandle, options: IWebviewOptions): void; $postMessage(handle: WebviewPanelHandle | WebviewInsetHandle, value: any): Promise; $registerSerializer(viewType: string): void; @@ -520,7 +546,7 @@ export interface ExtHostWebviewsShape { $onMessage(handle: WebviewPanelHandle, message: any): void; $onDidChangeWebviewPanelViewState(handle: WebviewPanelHandle, newState: WebviewPanelViewState): void; $onDidDisposeWebviewPanel(handle: WebviewPanelHandle): Promise; - $deserializeWebviewPanel(newWebviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, position: EditorViewColumn, options: vscode.WebviewOptions): Promise; + $deserializeWebviewPanel(newWebviewHandle: WebviewPanelHandle, viewType: string, title: string, state: any, position: EditorViewColumn, options: IWebviewOptions): Promise; } export interface MainThreadUrlsShape extends IDisposable { @@ -532,9 +558,13 @@ export interface ExtHostUrlsShape { $handleExternalUri(handle: number, uri: UriComponents): Promise; } +export interface ITextSearchComplete { + limitHit?: boolean; +} + export interface MainThreadWorkspaceShape extends IDisposable { $startFileSearch(includePattern: string | undefined, includeFolder: UriComponents | undefined, excludePatternOrDisregardExcludes: string | false | undefined, maxResults: number | undefined, token: CancellationToken): Promise; - $startTextSearch(query: IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise; + $startTextSearch(query: search.IPatternInfo, options: ITextQueryBuilderOptions, requestId: number, token: CancellationToken): Promise; $checkExists(includes: string[], token: CancellationToken): Promise; $saveAll(includeUntitled?: boolean): Promise; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Promise; @@ -543,11 +573,11 @@ export interface MainThreadWorkspaceShape extends IDisposable { export interface IFileChangeDto { resource: UriComponents; - type: FileChangeType; + type: files.FileChangeType; } export interface MainThreadFileSystemShape extends IDisposable { - $registerFileSystemProvider(handle: number, scheme: string, capabilities: FileSystemProviderCapabilities): void; + $registerFileSystemProvider(handle: number, scheme: string, capabilities: files.FileSystemProviderCapabilities): void; $unregisterProvider(handle: number): void; $registerResourceLabelFormatter(handle: number, formatter: ResourceLabelFormatter): void; $unregisterResourceLabelFormatter(handle: number): void; @@ -559,18 +589,18 @@ export interface MainThreadSearchShape extends IDisposable { $registerTextSearchProvider(handle: number, scheme: string): void; $unregisterProvider(handle: number): void; $handleFileMatch(handle: number, session: number, data: UriComponents[]): void; - $handleTextMatch(handle: number, session: number, data: IRawFileMatch2[]): void; + $handleTextMatch(handle: number, session: number, data: search.IRawFileMatch2[]): void; $handleTelemetry(eventName: string, data: any): void; } export interface MainThreadTaskShape extends IDisposable { - $createTaskId(task: TaskDTO): Promise; + $createTaskId(task: tasks.TaskDTO): Promise; $registerTaskProvider(handle: number): Promise; $unregisterTaskProvider(handle: number): Promise; - $fetchTasks(filter?: TaskFilterDTO): Promise; - $executeTask(task: TaskHandleDTO | TaskDTO): Promise; + $fetchTasks(filter?: tasks.TaskFilterDTO): Promise; + $executeTask(task: tasks.TaskHandleDTO | tasks.TaskDTO): Promise; $terminateTask(id: string): Promise; - $registerTaskSystem(scheme: string, info: TaskSystemInfoDTO): void; + $registerTaskSystem(scheme: string, info: tasks.TaskSystemInfoDTO): void; $customExecutionComplete(id: string, result?: number): Promise; } @@ -638,6 +668,13 @@ export interface MainThreadSCMShape extends IDisposable { export type DebugSessionUUID = string; +export interface IDebugConfiguration { + type: string; + name: string; + request: string; + [key: string]: any; +} + export interface MainThreadDebugServiceShape extends IDisposable { $registerDebugTypes(debugTypes: string[]): void; $sessionCached(sessionID: string): void; @@ -650,7 +687,7 @@ export interface MainThreadDebugServiceShape extends IDisposable { $unregisterDebugConfigurationProvider(handle: number): void; $unregisterDebugAdapterDescriptorFactory(handle: number): void; $unregisterDebugAdapterTrackerFactory(handle: number): void; - $startDebugging(folder: UriComponents | undefined, nameOrConfig: string | vscode.DebugConfiguration, parentSessionID: string | undefined): Promise; + $startDebugging(folder: UriComponents | undefined, nameOrConfig: string | IDebugConfiguration, parentSessionID: string | undefined): Promise; $customDebugAdapterRequest(id: DebugSessionUUID, command: string, args: any): Promise; $appendDebugConsole(value: string): void; $startBreakpointEvents(): void; @@ -751,29 +788,29 @@ export interface ExtHostTreeViewsShape { export interface ExtHostWorkspaceShape { $initializeWorkspace(workspace: IWorkspaceData | null): void; $acceptWorkspaceData(workspace: IWorkspaceData | null): void; - $handleTextSearchResult(result: IRawFileMatch2, requestId: number): void; + $handleTextSearchResult(result: search.IRawFileMatch2, requestId: number): void; } export interface ExtHostFileSystemShape { - $stat(handle: number, resource: UriComponents): Promise; - $readdir(handle: number, resource: UriComponents): Promise<[string, FileType][]>; + $stat(handle: number, resource: UriComponents): Promise; + $readdir(handle: number, resource: UriComponents): Promise<[string, files.FileType][]>; $readFile(handle: number, resource: UriComponents): Promise; - $writeFile(handle: number, resource: UriComponents, content: Buffer, opts: FileWriteOptions): Promise; - $rename(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise; - $copy(handle: number, resource: UriComponents, target: UriComponents, opts: FileOverwriteOptions): Promise; + $writeFile(handle: number, resource: UriComponents, content: Buffer, opts: files.FileWriteOptions): Promise; + $rename(handle: number, resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; + $copy(handle: number, resource: UriComponents, target: UriComponents, opts: files.FileOverwriteOptions): Promise; $mkdir(handle: number, resource: UriComponents): Promise; - $delete(handle: number, resource: UriComponents, opts: FileDeleteOptions): Promise; - $watch(handle: number, session: number, resource: UriComponents, opts: IWatchOptions): void; + $delete(handle: number, resource: UriComponents, opts: files.FileDeleteOptions): Promise; + $watch(handle: number, session: number, resource: UriComponents, opts: files.IWatchOptions): void; $unwatch(handle: number, session: number): void; - $open(handle: number, resource: UriComponents, opts: FileOpenOptions): Promise; + $open(handle: number, resource: UriComponents, opts: files.FileOpenOptions): Promise; $close(handle: number, fd: number): Promise; $read(handle: number, fd: number, pos: number, length: number): Promise; $write(handle: number, fd: number, pos: number, data: Buffer): Promise; } export interface ExtHostSearchShape { - $provideFileSearchResults(handle: number, session: number, query: IRawQuery, token: CancellationToken): Promise; - $provideTextSearchResults(handle: number, session: number, query: IRawTextQuery, token: CancellationToken): Promise; + $provideFileSearchResults(handle: number, session: number, query: search.IRawQuery, token: CancellationToken): Promise; + $provideTextSearchResults(handle: number, session: number, query: search.IRawTextQuery, token: CancellationToken): Promise; $clearCache(cacheKey: string): Promise; } @@ -869,7 +906,12 @@ export interface WorkspaceSymbolsDto extends IdObject { export interface ResourceFileEditDto { oldUri?: UriComponents; newUri?: UriComponents; - options?: IFileOperationOptions; + options?: { + overwrite?: boolean; + ignoreIfExists?: boolean; + ignoreIfNotExists?: boolean; + recursive?: boolean; + }; } export interface ResourceTextEditDto { @@ -923,6 +965,16 @@ export interface CodeLensDto extends ObjectIdentifier { export type CodeInsetDto = ObjectIdentifier & codeInset.ICodeInsetSymbol; +export interface CallHierarchyDto { + _id: number; + kind: modes.SymbolKind; + name: string; + detail?: string; + uri: UriComponents; + range: IRange; + selectionRange: IRange; +} + export interface ExtHostLanguageFeaturesShape { $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise; $provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise; @@ -955,6 +1007,8 @@ export interface ExtHostLanguageFeaturesShape { $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo, token: CancellationToken): Promise; $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext, token: CancellationToken): Promise; $provideSelectionRanges(handle: number, resource: UriComponents, positions: IPosition[], token: CancellationToken): Promise; + $provideCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; + $resolveCallHierarchyItem(handle: number, item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[CallHierarchyDto, modes.Location[]][]>; } export interface ExtHostQuickOpenShape { @@ -991,6 +1045,7 @@ export interface ExtHostTerminalServiceShape { $acceptProcessShutdown(id: number, immediate: boolean): void; $acceptProcessRequestInitialCwd(id: number): void; $acceptProcessRequestCwd(id: number): void; + $acceptProcessRequestLatency(id: number): number; } export interface ExtHostSCMShape { @@ -1002,11 +1057,11 @@ export interface ExtHostSCMShape { } export interface ExtHostTaskShape { - $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable; - $onDidStartTask(execution: TaskExecutionDTO, terminalId: number): void; - $onDidStartTaskProcess(value: TaskProcessStartedDTO): void; - $onDidEndTaskProcess(value: TaskProcessEndedDTO): void; - $OnDidEndTask(execution: TaskExecutionDTO): void; + $provideTasks(handle: number, validTypes: { [key: string]: boolean; }): Thenable; + $onDidStartTask(execution: tasks.TaskExecutionDTO, terminalId: number): void; + $onDidStartTaskProcess(value: tasks.TaskProcessStartedDTO): void; + $onDidEndTaskProcess(value: tasks.TaskProcessEndedDTO): void; + $OnDidEndTask(execution: tasks.TaskExecutionDTO): void; $resolveVariables(workspaceFolder: UriComponents, toResolve: { process?: { name: string; cwd?: string }, variables: string[] }): Promise<{ process?: string; variables: { [key: string]: string } }>; } @@ -1118,7 +1173,7 @@ export interface ExtHostCommentsShape { $provideCommentingRanges(commentControllerHandle: number, uriComponents: UriComponents, token: CancellationToken): Promise; $provideReactionGroup(commentControllerHandle: number): Promise; $toggleReaction(commentControllerHandle: number, threadHandle: number, uri: UriComponents, comment: modes.Comment, reaction: modes.CommentReaction): Promise; - $createNewCommentWidgetCallback(commentControllerHandle: number, uriComponents: UriComponents, range: IRange, token: CancellationToken): void; + $createNewCommentWidgetCallback(commentControllerHandle: number, uriComponents: UriComponents, range: IRange, token: CancellationToken): Promise; $replyToCommentThread(handle: number, document: UriComponents, range: IRange, commentThread: modes.CommentThread, text: string): Promise; $editComment(handle: number, document: UriComponents, comment: modes.Comment, text: string): Promise; $deleteComment(handle: number, document: UriComponents, comment: modes.Comment): Promise; diff --git a/src/vs/workbench/api/electron-browser/extHostCustomers.ts b/src/vs/workbench/api/common/extHostCustomers.ts similarity index 95% rename from src/vs/workbench/api/electron-browser/extHostCustomers.ts rename to src/vs/workbench/api/common/extHostCustomers.ts index 42ff2e5c6a..f762302f64 100644 --- a/src/vs/workbench/api/electron-browser/extHostCustomers.ts +++ b/src/vs/workbench/api/common/extHostCustomers.ts @@ -5,8 +5,8 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; +import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export type IExtHostNamedCustomer = [ProxyIdentifier, IExtHostCustomerCtor]; diff --git a/src/vs/workbench/api/shared/editor.ts b/src/vs/workbench/api/common/shared/editor.ts similarity index 100% rename from src/vs/workbench/api/shared/editor.ts rename to src/vs/workbench/api/common/shared/editor.ts diff --git a/src/vs/workbench/api/shared/tasks.ts b/src/vs/workbench/api/common/shared/tasks.ts similarity index 100% rename from src/vs/workbench/api/shared/tasks.ts rename to src/vs/workbench/api/common/shared/tasks.ts diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index 14ed9e027c..60d56596d2 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -15,47 +15,46 @@ import { LanguageConfigurationFileHandler } from 'vs/workbench/contrib/codeEdito // --- mainThread participants import 'vs/workbench/api/node/apiCommands'; -import './mainThreadClipboard'; -import './mainThreadCommands'; -import './mainThreadConfiguration'; -import './mainThreadConsole'; +import '../browser/mainThreadClipboard'; +import '../browser/mainThreadCommands'; +import '../browser/mainThreadConfiguration'; // {{SQL CARBON EDIT}} -// disable the debug service -// import './mainThreadDebugService'; -import './mainThreadDecorations'; -import './mainThreadDiagnostics'; -import './mainThreadDialogs'; -import './mainThreadDocumentContentProviders'; +// import '../browser/mainThreadDebugService'; +import '../browser/mainThreadDecorations'; +import '../browser/mainThreadDiagnostics'; +import '../browser/mainThreadDialogs'; +import '../browser/mainThreadDocumentContentProviders'; +import '../browser/mainThreadErrors'; +import '../browser/mainThreadFileSystem'; +import '../browser/mainThreadFileSystemEventService'; +import '../browser/mainThreadMessageService'; +import '../browser/mainThreadOutputService'; +import '../browser/mainThreadProgress'; +import '../browser/mainThreadQuickOpen'; +import '../browser/mainThreadSaveParticipant'; +import '../browser/mainThreadSCM'; +import '../browser/mainThreadSearch'; +import '../browser/mainThreadStatusBar'; +import '../browser/mainThreadStorage'; +import './mainThreadComments'; +import './mainThreadConsole'; import './mainThreadDocuments'; import './mainThreadDocumentsAndEditors'; import './mainThreadEditor'; import './mainThreadEditors'; -import './mainThreadErrors'; import './mainThreadExtensionService'; -import './mainThreadFileSystem'; -import './mainThreadFileSystemEventService'; import './mainThreadHeapService'; import './mainThreadLanguageFeatures'; -import './mainThreadLanguages'; -import './mainThreadMessageService'; -import './mainThreadOutputService'; -import './mainThreadProgress'; -import './mainThreadQuickOpen'; -import './mainThreadSCM'; -import './mainThreadSearch'; -import './mainThreadSaveParticipant'; -import './mainThreadStatusBar'; -import './mainThreadStorage'; +import '../browser/mainThreadLanguages'; +import '../browser/mainThreadLogService'; import './mainThreadTask'; -import './mainThreadTelemetry'; -import './mainThreadTerminalService'; -import './mainThreadTreeViews'; -import './mainThreadLogService'; -import './mainThreadWebview'; -import './mainThreadComments'; +import '../browser/mainThreadTelemetry'; +import '../browser/mainThreadTerminalService'; +import '../browser/mainThreadTreeViews'; import './mainThreadUrls'; -import './mainThreadWindow'; -import './mainThreadWorkspace'; +import './mainThreadWebview'; +import '../browser/mainThreadWindow'; +import '../browser/mainThreadWorkspace'; export class ExtensionPoints implements IWorkbenchContribution { diff --git a/src/vs/workbench/api/electron-browser/mainThreadComments.ts b/src/vs/workbench/api/electron-browser/mainThreadComments.ts index 382e5d5f14..01f3c5b8f2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadComments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadComments.ts @@ -6,10 +6,10 @@ import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ICodeEditor, isCodeEditor, isDiffEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; import * as modes from 'vs/editor/common/modes'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { keys } from 'vs/base/common/map'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ExtHostCommentsShape, ExtHostContext, IExtHostContext, MainContext, MainThreadCommentsShape, CommentProviderFeatures } from '../node/extHost.protocol'; +import { ExtHostCommentsShape, ExtHostContext, IExtHostContext, MainContext, MainThreadCommentsShape, CommentProviderFeatures } from '../common/extHost.protocol'; import { ICommentService, ICommentInfo } from 'vs/workbench/contrib/comments/electron-browser/commentService'; import { COMMENTS_PANEL_ID, CommentsPanel, COMMENTS_PANEL_TITLE } from 'vs/workbench/contrib/comments/electron-browser/commentsPanel'; @@ -142,6 +142,14 @@ export class MainThreadCommentThread implements modes.CommentThread2 { return this._additionalCommands; } + set deleteCommand(newCommand: modes.Command | undefined) { + this._deleteCommand = newCommand; + } + + get deleteCommand(): modes.Command | undefined { + return this._deleteCommand; + } + private _onDidChangeAdditionalCommands = new Emitter(); get onDidChangeAdditionalCommands(): Event { return this._onDidChangeAdditionalCommands.event; } @@ -179,6 +187,7 @@ export class MainThreadCommentThread implements modes.CommentThread2 { private _comments: modes.Comment[], private _acceptInputCommand: modes.Command | undefined, private _additionalCommands: modes.Command[], + private _deleteCommand: modes.Command | undefined, private _collapsibleState: modes.CommentThreadCollapsibleState ) { @@ -240,7 +249,15 @@ export class MainThreadCommentController { this._features = features; } - createCommentThread(commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, comments: modes.Comment[], acceptInputCommand: modes.Command | undefined, additionalCommands: modes.Command[], collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 { + createCommentThread(commentThreadHandle: number, + threadId: string, + resource: UriComponents, + range: IRange, + comments: modes.Comment[], + acceptInputCommand: modes.Command | undefined, + additionalCommands: modes.Command[], + deleteCommand: modes.Command | undefined, + collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 { let thread = new MainThreadCommentThread( commentThreadHandle, this, @@ -251,6 +268,7 @@ export class MainThreadCommentController { comments, acceptInputCommand, additionalCommands, + deleteCommand, collapseState ); @@ -301,6 +319,11 @@ export class MainThreadCommentController { thread.additionalCommands = additionalCommands; } + updateDeleteCommand(commentThreadHandle: number, deleteCommand: modes.Command) { + const thread = this.getKnownThread(commentThreadHandle); + thread.deleteCommand = deleteCommand; + } + updateCollapsibleState(commentThreadHandle: number, collapseState: modes.CommentThreadCollapsibleState) { let thread = this.getKnownThread(commentThreadHandle); thread.collapsibleState = collapseState; @@ -326,7 +349,7 @@ export class MainThreadCommentController { } } - private getKnownThread(commentThreadHandle: number) { + private getKnownThread(commentThreadHandle: number): MainThreadCommentThread { const thread = this._threads.get(commentThreadHandle); if (!thread) { throw new Error('unknown thread'); @@ -351,8 +374,8 @@ export class MainThreadCommentController { threads: ret, commentingRanges: commentingRanges ? { - resource: resource, ranges: commentingRanges, newCommentThreadCallback: (uri: UriComponents, range: IRange) => { - this._proxy.$createNewCommentWidgetCallback(this.handle, uri, range, token); + resource: resource, ranges: commentingRanges, newCommentThreadCallback: async (uri: UriComponents, range: IRange) => { + await this._proxy.$createNewCommentWidgetCallback(this.handle, uri, range, token); } } : [], draftMode: modes.DraftMode.NotSupported @@ -453,6 +476,9 @@ export class MainThreadComments extends Disposable implements MainThreadComments $unregisterCommentController(handle: number): void { const providerId = this._handlers.get(handle); + if (typeof providerId !== 'string') { + throw new Error('unknown handler'); + } this._commentService.unregisterCommentController(providerId); this._handlers.delete(handle); this._commentControllers.delete(handle); @@ -468,14 +494,23 @@ export class MainThreadComments extends Disposable implements MainThreadComments provider.updateFeatures(features); } - $createCommentThread(handle: number, commentThreadHandle: number, threadId: string, resource: UriComponents, range: IRange, comments: modes.Comment[], acceptInputCommand: modes.Command | undefined, additionalCommands: modes.Command[], collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 | undefined { + $createCommentThread(handle: number, + commentThreadHandle: number, + threadId: string, + resource: UriComponents, + range: IRange, + comments: modes.Comment[], + acceptInputCommand: modes.Command | undefined, + additionalCommands: modes.Command[], + deleteCommand: modes.Command, + collapseState: modes.CommentThreadCollapsibleState): modes.CommentThread2 | undefined { let provider = this._commentControllers.get(handle); if (!provider) { return undefined; } - return provider.createCommentThread(commentThreadHandle, threadId, resource, range, comments, acceptInputCommand, additionalCommands, collapseState); + return provider.createCommentThread(commentThreadHandle, threadId, resource, range, comments, acceptInputCommand, additionalCommands, deleteCommand, collapseState); } $deleteCommentThread(handle: number, commentThreadHandle: number) { @@ -528,6 +563,16 @@ export class MainThreadComments extends Disposable implements MainThreadComments provider.updateAdditionalCommands(commentThreadHandle, additionalCommands); } + $updateCommentThreadDeleteCommand(handle: number, commentThreadHandle: number, acceptInputCommand: modes.Command) { + let provider = this._commentControllers.get(handle); + + if (!provider) { + return; + } + + provider.updateDeleteCommand(commentThreadHandle, acceptInputCommand); + } + $updateCommentThreadCollapsibleState(handle: number, commentThreadHandle: number, collapseState: modes.CommentThreadCollapsibleState): void { let provider = this._commentControllers.get(handle); diff --git a/src/vs/workbench/api/electron-browser/mainThreadConsole.ts b/src/vs/workbench/api/electron-browser/mainThreadConsole.ts index 0758acdb35..51271735b1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadConsole.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadConsole.ts @@ -3,8 +3,8 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { MainContext, MainThreadConsoleShape, IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { MainContext, MainThreadConsoleShape, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IRemoteConsoleLog, log, parse } from 'vs/base/node/console'; import { parseExtensionDevOptions } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts index 89dc00ace3..29a64039ba 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocuments.ts @@ -13,7 +13,7 @@ import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IFileService } from 'vs/platform/files/common/files'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors'; -import { ExtHostContext, ExtHostDocumentsShape, IExtHostContext, MainThreadDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostContext, ExtHostDocumentsShape, IExtHostContext, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ITextEditorModel } from 'vs/workbench/common/editor'; import { ITextFileService, TextFileModelChangeEvent } from 'vs/workbench/services/textfile/common/textfiles'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index c5d250c284..93b6ed6977 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -16,12 +16,12 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IModelService, shouldSynchronizeModel } from 'vs/editor/common/services/modelService'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IFileService } from 'vs/platform/files/common/files'; -import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { MainThreadDocuments } from 'vs/workbench/api/electron-browser/mainThreadDocuments'; import { MainThreadTextEditor } from 'vs/workbench/api/electron-browser/mainThreadEditor'; import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors'; -import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IExtHostContext, IModelAddedData, ITextEditorAddData, MainContext } from 'vs/workbench/api/node/extHost.protocol'; -import { EditorViewColumn, editorGroupToViewColumn } from 'vs/workbench/api/shared/editor'; +import { ExtHostContext, ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IExtHostContext, IModelAddedData, ITextEditorAddData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; +import { EditorViewColumn, editorGroupToViewColumn } from 'vs/workbench/api/common/shared/editor'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; import { IEditor as IWorkbenchEditor } from 'vs/workbench/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts index 535e5beaca..bcb6fad1cc 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditor.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditor.ts @@ -10,11 +10,10 @@ import { RenderLineNumbersType, TextEditorCursorStyle, cursorStyleToString } fro import { IRange, Range } from 'vs/editor/common/core/range'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import * as editorCommon from 'vs/editor/common/editorCommon'; -import { EndOfLineSequence, IIdentifiedSingleEditOperation, ISingleEditOperation, ITextModel, ITextModelUpdateOptions } from 'vs/editor/common/model'; +import { IIdentifiedSingleEditOperation, ISingleEditOperation, ITextModel, ITextModelUpdateOptions } from 'vs/editor/common/model'; import { IModelService } from 'vs/editor/common/services/modelService'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { IApplyEditsOptions, IEditorPropertiesChangeData, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType } from 'vs/workbench/api/node/extHost.protocol'; -import { EndOfLine, TextEditorLineNumbersStyle } from 'vs/workbench/api/node/extHostTypes'; +import { IApplyEditsOptions, IEditorPropertiesChangeData, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, IUndoStopOptions, TextEditorRevealType } from 'vs/workbench/api/common/extHost.protocol'; import { IEditor } from 'vs/workbench/common/editor'; import { withNullAsUndefined } from 'vs/base/common/types'; @@ -57,28 +56,17 @@ export class MainThreadTextEditorProperties { } let cursorStyle: TextEditorCursorStyle; - let lineNumbers: TextEditorLineNumbersStyle; + let lineNumbers: RenderLineNumbersType; if (codeEditor) { const codeEditorOpts = codeEditor.getConfiguration(); cursorStyle = codeEditorOpts.viewInfo.cursorStyle; - - switch (codeEditorOpts.viewInfo.renderLineNumbers) { - case RenderLineNumbersType.Off: - lineNumbers = TextEditorLineNumbersStyle.Off; - break; - case RenderLineNumbersType.Relative: - lineNumbers = TextEditorLineNumbersStyle.Relative; - break; - default: - lineNumbers = TextEditorLineNumbersStyle.On; - break; - } + lineNumbers = codeEditorOpts.viewInfo.renderLineNumbers; } else if (previousProperties) { cursorStyle = previousProperties.options.cursorStyle; lineNumbers = previousProperties.options.lineNumbers; } else { cursorStyle = TextEditorCursorStyle.Line; - lineNumbers = TextEditorLineNumbersStyle.On; + lineNumbers = RenderLineNumbersType.On; } const modelOptions = model.getOptions(); @@ -377,10 +365,10 @@ export class MainThreadTextEditor { if (typeof newConfiguration.lineNumbers !== 'undefined') { let lineNumbers: 'on' | 'off' | 'relative'; switch (newConfiguration.lineNumbers) { - case TextEditorLineNumbersStyle.On: + case RenderLineNumbersType.On: lineNumbers = 'on'; break; - case TextEditorLineNumbersStyle.Relative: + case RenderLineNumbersType.Relative: lineNumbers = 'relative'; break; default: @@ -459,10 +447,8 @@ export class MainThreadTextEditor { return false; } - if (opts.setEndOfLine === EndOfLine.CRLF) { - this._model.pushEOL(EndOfLineSequence.CRLF); - } else if (opts.setEndOfLine === EndOfLine.LF) { - this._model.pushEOL(EndOfLineSequence.LF); + if (typeof opts.setEndOfLine !== 'undefined') { + this._model.pushEOL(opts.setEndOfLine); } const transformedEdits = edits.map((edit): IIdentifiedSingleEditOperation => { diff --git a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts index 2c6b2b288d..e52df3cfdb 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -20,8 +20,8 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IOpenerService } from 'vs/platform/opener/common/opener'; import { MainThreadDocumentsAndEditors } from 'vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors'; import { MainThreadTextEditor } from 'vs/workbench/api/electron-browser/mainThreadEditor'; -import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, IExtHostContext, ITextDocumentShowOptions, ITextEditorConfigurationUpdate, ITextEditorPositionData, IUndoStopOptions, MainThreadTextEditorsShape, TextEditorRevealType, WorkspaceEditDto, reviveWorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; -import { EditorViewColumn, editorGroupToViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/shared/editor'; +import { ExtHostContext, ExtHostEditorsShape, IApplyEditsOptions, IExtHostContext, ITextDocumentShowOptions, ITextEditorConfigurationUpdate, ITextEditorPositionData, IUndoStopOptions, MainThreadTextEditorsShape, TextEditorRevealType, WorkspaceEditDto, reviveWorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; +import { EditorViewColumn, editorGroupToViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/common/shared/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IURLService } from 'vs/platform/url/common/url'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts index 80e7ca5871..0bf9330278 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadExtensionService.ts @@ -5,8 +5,8 @@ import { SerializedError } from 'vs/base/common/errors'; import Severity from 'vs/base/common/severity'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { IExtHostContext, MainContext, MainThreadExtensionServiceShape } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { IExtHostContext, MainContext, MainThreadExtensionServiceShape } from 'vs/workbench/api/common/extHost.protocol'; import { IExtensionService, ExtensionActivationError } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionService } from 'vs/workbench/services/extensions/electron-browser/extensionService'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts index 3859f93dfd..c6bb60dd52 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts @@ -3,12 +3,12 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtHostContext, ObjectIdentifier, IExtHostContext } from '../node/extHost.protocol'; +import { ExtHostContext, ObjectIdentifier, IExtHostContext } from '../common/extHost.protocol'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { extHostCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { GCSignal } from 'gc-signals'; export const IHeapService = createDecorator('heapService'); diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index ed0a5d9932..e28feb6533 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -11,17 +11,18 @@ import * as search from 'vs/workbench/contrib/search/common/search'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Position as EditorPosition } from 'vs/editor/common/core/position'; import { Range as EditorRange } from 'vs/editor/common/core/range'; -import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, WorkspaceSymbolDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter, DefinitionLinkDto, ISerializedSignatureHelpProviderMetadata, CodeInsetDto, LinkDto } from '../node/extHost.protocol'; +import { ExtHostContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, MainContext, IExtHostContext, ISerializedLanguageConfiguration, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, LocationDto, WorkspaceSymbolDto, CodeActionDto, reviveWorkspaceEditDto, ISerializedDocumentFilter, DefinitionLinkDto, ISerializedSignatureHelpProviderMetadata, CodeInsetDto, LinkDto, CallHierarchyDto } from '../common/extHost.protocol'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; import { LanguageConfiguration, IndentationRule, OnEnterRule } from 'vs/editor/common/modes/languageConfiguration'; import { IHeapService } from './mainThreadHeapService'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; import { URI } from 'vs/base/common/uri'; import { Selection } from 'vs/editor/common/core/selection'; import * as codeInset from 'vs/workbench/contrib/codeinset/common/codeInset'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import * as callh from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; @extHostNamedCustomer(MainContext.MainThreadLanguageFeatures) export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesShape { @@ -114,6 +115,13 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha return data; } + private static _reviveCallHierarchyItemDto(data: CallHierarchyDto | undefined): callh.CallHierarchyItem { + if (data) { + data.uri = URI.revive(data.uri); + } + return data as callh.CallHierarchyItem; + } + //#endregion // --- outline @@ -471,6 +479,30 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha }); } + // --- call hierarchy + + $registerCallHierarchyProvider(handle: number, selector: ISerializedDocumentFilter[]): void { + this._registrations[handle] = callh.CallHierarchyProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { + provideCallHierarchyItem: (document, position, token) => { + return this._proxy.$provideCallHierarchyItem(handle, document.uri, position, token).then(MainThreadLanguageFeatures._reviveCallHierarchyItemDto); + }, + resolveCallHierarchyItem: (item, direction, token) => { + return this._proxy.$resolveCallHierarchyItem(handle, item, direction, token).then(data => { + if (data) { + for (let i = 0; i < data.length; i++) { + const [item, locations] = data[i]; + data[i] = [ + MainThreadLanguageFeatures._reviveCallHierarchyItemDto(item), + MainThreadLanguageFeatures._reviveLocationDto(locations) + ]; + } + } + return data as [callh.CallHierarchyItem, modes.Location[]][]; + }); + } + }); + } + // --- configuration private static _reviveRegExp(regExp: ISerializedRegExp): RegExp { diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index 51ad5cfc73..bcf45b012c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -26,13 +26,13 @@ import { ITaskService, TaskFilter, ITaskProvider } from 'vs/workbench/contrib/ta import { TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; -import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext, IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, MainThreadTaskShape, ExtHostTaskShape, MainContext, IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { TaskDefinitionDTO, TaskExecutionDTO, ProcessExecutionOptionsDTO, TaskPresentationOptionsDTO, ProcessExecutionDTO, ShellExecutionDTO, ShellExecutionOptionsDTO, CustomExecutionDTO, TaskDTO, TaskSourceDTO, TaskHandleDTO, TaskFilterDTO, TaskProcessStartedDTO, TaskProcessEndedDTO, TaskSystemInfoDTO, RunOptionsDTO -} from 'vs/workbench/api/shared/tasks'; +} from 'vs/workbench/api/common/shared/tasks'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; namespace TaskExecutionDTO { @@ -597,7 +597,7 @@ export class MainThreadTask implements MainThreadTaskShape { }; for (let i = 0; i < partiallyResolvedVars.length; i++) { const variableName = vars[i].substring(2, vars[i].length - 1); - if (values.variables[vars[i]] === vars[i]) { + if (resolvedVars && values.variables[vars[i]] === vars[i]) { result.variables.set(variableName, resolvedVars.get(variableName)); } else { result.variables.set(variableName, partiallyResolvedVars[i]); diff --git a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts index 585b222629..2f7476fb46 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadUrls.ts @@ -3,8 +3,8 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtHostContext, IExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } from 'vs/workbench/api/node/extHost.protocol'; -import { extHostNamedCustomer } from './extHostCustomers'; +import { ExtHostContext, IExtHostContext, MainContext, MainThreadUrlsShape, ExtHostUrlsShape } from 'vs/workbench/api/common/extHost.protocol'; +import { extHostNamedCustomer } from '../common/extHostCustomers'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { URI } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index f4cead48e7..ac7d1360f2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -13,8 +13,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ExtHostContext, ExtHostWebviewsShape, IExtHostContext, MainContext, MainThreadWebviewsShape, WebviewInsetHandle, WebviewPanelHandle, WebviewPanelShowOptions } from 'vs/workbench/api/node/extHost.protocol'; -import { editorGroupToViewColumn, EditorViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/shared/editor'; +import { ExtHostContext, ExtHostWebviewsShape, IExtHostContext, MainContext, MainThreadWebviewsShape, WebviewInsetHandle, WebviewPanelHandle, WebviewPanelShowOptions, IWebviewOptions } from 'vs/workbench/api/common/extHost.protocol'; +import { editorGroupToViewColumn, EditorViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/common/shared/editor'; import { CodeInsetController } from 'vs/workbench/contrib/codeinset/electron-browser/codeInset.contribution'; import { WebviewEditor } from 'vs/workbench/contrib/webview/electron-browser/webviewEditor'; import { WebviewEditorInput } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorInput'; @@ -24,8 +24,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor import { ACTIVE_GROUP, IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IWorkbenchLayoutService, Parts } from 'vs/workbench/services/layout/browser/layoutService'; -import * as vscode from 'vscode'; -import { extHostNamedCustomer } from './extHostCustomers'; +import { extHostNamedCustomer } from '../common/extHostCustomers'; @extHostNamedCustomer(MainContext.MainThreadWebviews) export class MainThreadWebviews extends Disposable implements MainThreadWebviewsShape { @@ -111,7 +110,7 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews this._telemetryService.publicLog('webviews:createWebviewPanel', { extensionId: extensionId.value }); } - $createWebviewCodeInset(handle: WebviewInsetHandle, symbolId: string, options: vscode.WebviewOptions, extensionLocation: UriComponents): void { + $createWebviewCodeInset(handle: WebviewInsetHandle, symbolId: string, options: IWebviewOptions, extensionLocation: UriComponents): void { // todo@joh main is for the lack of a code-inset service // which we maybe wanna have... this is how it now works // 1) create webview element @@ -173,12 +172,12 @@ export class MainThreadWebviews extends Disposable implements MainThreadWebviews } } - public $setOptions(handle: WebviewPanelHandle | WebviewInsetHandle, options: vscode.WebviewOptions): void { + public $setOptions(handle: WebviewPanelHandle | WebviewInsetHandle, options: IWebviewOptions): void { if (typeof handle === 'number') { - this.getWebviewElement(handle).options = reviveWebviewOptions(options); + this.getWebviewElement(handle).options = reviveWebviewOptions(options as any /*todo@mat */); } else { const webview = this.getWebview(handle); - webview.setOptions(reviveWebviewOptions(options)); + webview.setOptions(reviveWebviewOptions(options as any /*todo@mat */)); } } diff --git a/src/vs/workbench/api/node/apiCommands.ts b/src/vs/workbench/api/node/apiCommands.ts index 721fa7af77..d06fa59044 100644 --- a/src/vs/workbench/api/node/apiCommands.ts +++ b/src/vs/workbench/api/node/apiCommands.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; import { CommandsRegistry, ICommandService, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IWindowsService, IOpenSettings } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index dd8dd22353..93b0e1f1b5 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -19,7 +19,7 @@ import { score } from 'vs/editor/common/modes/languageSelector'; import * as files from 'vs/platform/files/common/files'; import pkg from 'vs/platform/product/node/package'; import product from 'vs/platform/product/node/product'; -import { ExtHostContext, IInitData, IMainContext, MainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostContext, IInitData, IMainContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostApiCommands } from 'vs/workbench/api/node/extHostApiCommands'; import { ExtHostClipboard } from 'vs/workbench/api/node/extHostClipboard'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; @@ -61,7 +61,7 @@ import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; import { ExtHostWindow } from 'vs/workbench/api/node/extHostWindow'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { throwProposedApiError, checkProposedApiEnabled, nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { ExtensionDescriptionRegistry } from 'vs/workbench/services/extensions/node/extensionDescriptionRegistry'; import * as vscode from 'vscode'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; @@ -359,6 +359,10 @@ export function createApiFactory( registerSelectionRangeProvider(selector: vscode.DocumentSelector, provider: vscode.SelectionRangeProvider): vscode.Disposable { return extHostLanguageFeatures.registerSelectionRangeProvider(extension, selector, provider); }, + registerCallHierarchyProvider(selector: vscode.DocumentSelector, provider: vscode.CallHierarchyItemProvider): vscode.Disposable { + checkProposedApiEnabled(extension); + return extHostLanguageFeatures.registerCallHierarchyProvider(extension, selector, provider); + }, setLanguageConfiguration: (language: string, configuration: vscode.LanguageConfiguration): vscode.Disposable => { return extHostLanguageFeatures.setLanguageConfiguration(language, configuration); } @@ -835,7 +839,9 @@ export function createApiFactory( Uri: URI, ViewColumn: extHostTypes.ViewColumn, WorkspaceEdit: extHostTypes.WorkspaceEdit, - // functions + // proposed + CallHierarchyDirection: extHostTypes.CallHierarchyDirection, + CallHierarchyItem: extHostTypes.CallHierarchyItem }; }; } diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index c5cb7c5a50..7de4e6478d 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -8,7 +8,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import * as vscode from 'vscode'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; import * as types from 'vs/workbench/api/node/extHostTypes'; -import { IRawColorInfo, WorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { IRawColorInfo, WorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { ISingleEditOperation } from 'vs/editor/common/model'; import * as modes from 'vs/editor/common/modes'; import * as search from 'vs/workbench/contrib/search/common/search'; diff --git a/src/vs/workbench/api/node/extHostClipboard.ts b/src/vs/workbench/api/node/extHostClipboard.ts index 79cbc9d921..51a4a54c16 100644 --- a/src/vs/workbench/api/node/extHostClipboard.ts +++ b/src/vs/workbench/api/node/extHostClipboard.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IMainContext, MainContext, MainThreadClipboardShape } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext, MainContext, MainThreadClipboardShape } from 'vs/workbench/api/common/extHost.protocol'; import * as vscode from 'vscode'; export class ExtHostClipboard implements vscode.Clipboard { diff --git a/src/vs/workbench/api/node/extHostCommands.ts b/src/vs/workbench/api/node/extHostCommands.ts index b808d25097..0f6f52315e 100644 --- a/src/vs/workbench/api/node/extHostCommands.ts +++ b/src/vs/workbench/api/node/extHostCommands.ts @@ -8,7 +8,7 @@ import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands import * as extHostTypes from 'vs/workbench/api/node/extHostTypes'; import * as extHostTypeConverter from 'vs/workbench/api/node/extHostTypeConverters'; import { cloneAndChange } from 'vs/base/common/objects'; -import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, IMainContext, CommandDto } from './extHost.protocol'; +import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, IMainContext, CommandDto } from '../common/extHost.protocol'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; import { isNonEmptyArray } from 'vs/base/common/arrays'; import * as modes from 'vs/editor/common/modes'; diff --git a/src/vs/workbench/api/node/extHostComments.ts b/src/vs/workbench/api/node/extHostComments.ts index 7d26fc5451..ba4325f930 100644 --- a/src/vs/workbench/api/node/extHostComments.ts +++ b/src/vs/workbench/api/node/extHostComments.ts @@ -10,7 +10,7 @@ import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import * as extHostTypeConverter from 'vs/workbench/api/node/extHostTypeConverters'; import * as types from 'vs/workbench/api/node/extHostTypes'; import * as vscode from 'vscode'; -import { ExtHostCommentsShape, IMainContext, MainContext, MainThreadCommentsShape } from './extHost.protocol'; +import { ExtHostCommentsShape, IMainContext, MainContext, MainThreadCommentsShape } from '../common/extHost.protocol'; import { CommandsConverter, ExtHostCommands } from './extHostCommands'; import { IRange } from 'vs/editor/common/core/range'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -145,15 +145,15 @@ export class ExtHostComments implements ExtHostCommentsShape { }); } - $createNewCommentWidgetCallback(commentControllerHandle: number, uriComponents: UriComponents, range: IRange, token: CancellationToken): void { + $createNewCommentWidgetCallback(commentControllerHandle: number, uriComponents: UriComponents, range: IRange, token: CancellationToken): Promise { const commentController = this._commentControllers.get(commentControllerHandle); if (!commentController || !commentController.emptyCommentThreadFactory) { - return; + return Promise.resolve(); } const document = this._documents.getDocument(URI.revive(uriComponents)); - commentController.emptyCommentThreadFactory.createEmptyCommentThread(document, extHostTypeConverter.Range.to(range)); + return asPromise(() => commentController.emptyCommentThreadFactory!.createEmptyCommentThread(document, extHostTypeConverter.Range.to(range))).then(() => Promise.resolve()); } registerWorkspaceCommentProvider( @@ -415,6 +415,18 @@ export class ExtHostCommentThread implements vscode.CommentThread { this._proxy.$updateCommentThreadAdditionalCommands(this._commentController.handle, this.handle, internals); } + private _deleteCommand?: vscode.Command; + get deleteComand(): vscode.Command | undefined { + return this._deleteCommand; + } + + set deleteCommand(deleteCommand: vscode.Command) { + this._deleteCommand = deleteCommand; + + const internal = this._commandsConverter.toInternal(deleteCommand); + this._proxy.$updateCommentThreadDeleteCommand(this._commentController.handle, this.handle, internal); + } + private _collapseState?: vscode.CommentThreadCollapsibleState; get collapsibleState(): vscode.CommentThreadCollapsibleState { @@ -444,6 +456,7 @@ export class ExtHostCommentThread implements vscode.CommentThread { this._comments.map(comment => { return convertToModeComment(this._commentController, comment, this._commandsConverter); }), this._acceptInputCommand ? this._commandsConverter.toInternal(this._acceptInputCommand) : undefined, this._additionalCommands ? this._additionalCommands.map(x => this._commandsConverter.toInternal(x)) : [], + this._deleteCommand ? this._commandsConverter.toInternal(this._deleteCommand) : undefined, this._collapseState! ); } @@ -703,4 +716,4 @@ function convertToCollapsibleState(kind: vscode.CommentThreadCollapsibleState | } } return modes.CommentThreadCollapsibleState.Collapsed; -} \ No newline at end of file +} diff --git a/src/vs/workbench/api/node/extHostConfiguration.ts b/src/vs/workbench/api/node/extHostConfiguration.ts index 208c0af7de..b652271a3e 100644 --- a/src/vs/workbench/api/node/extHostConfiguration.ts +++ b/src/vs/workbench/api/node/extHostConfiguration.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { Event, Emitter } from 'vs/base/common/event'; import * as vscode from 'vscode'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; -import { ExtHostConfigurationShape, MainThreadConfigurationShape, IWorkspaceConfigurationChangeEventData, IConfigurationInitData } from './extHost.protocol'; +import { ExtHostConfigurationShape, MainThreadConfigurationShape, IWorkspaceConfigurationChangeEventData, IConfigurationInitData } from '../common/extHost.protocol'; import { ConfigurationTarget as ExtHostConfigurationTarget } from './extHostTypes'; import { IConfigurationData, ConfigurationTarget, IConfigurationModel } from 'vs/platform/configuration/common/configuration'; import { Configuration, ConfigurationChangeEvent, ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index 5f6163ab3b..1251e2245d 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -14,10 +14,11 @@ import * as nls from 'vs/nls'; import { MainContext, MainThreadDebugServiceShape, ExtHostDebugServiceShape, DebugSessionUUID, IMainContext, IBreakpointsDeltaDto, ISourceMultiBreakpointDto, IFunctionBreakpointDto, IDebugSessionDto -} from 'vs/workbench/api/node/extHost.protocol'; +} from 'vs/workbench/api/common/extHost.protocol'; import * as vscode from 'vscode'; import { Disposable, Position, Location, SourceBreakpoint, FunctionBreakpoint, DebugAdapterServer, DebugAdapterExecutable } from 'vs/workbench/api/node/extHostTypes'; -import { ExecutableDebugAdapter, SocketDebugAdapter, AbstractDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; +import { ExecutableDebugAdapter, SocketDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; +import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstractDebugAdapter'; import { IExtHostWorkspaceProvider } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; diff --git a/src/vs/workbench/api/node/extHostDecorations.ts b/src/vs/workbench/api/node/extHostDecorations.ts index 7382ef267f..a90f8e42ad 100644 --- a/src/vs/workbench/api/node/extHostDecorations.ts +++ b/src/vs/workbench/api/node/extHostDecorations.ts @@ -5,10 +5,11 @@ import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; -import { MainContext, IMainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, DecorationData, DecorationRequest, DecorationReply } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, IMainContext, ExtHostDecorationsShape, MainThreadDecorationsShape, DecorationData, DecorationRequest, DecorationReply } from 'vs/workbench/api/common/extHost.protocol'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { asArray } from 'vs/base/common/arrays'; interface ProviderData { provider: vscode.DecorationProvider; @@ -32,7 +33,7 @@ export class ExtHostDecorations implements ExtHostDecorationsShape { this._proxy.$registerDecorationProvider(handle, extensionId.value); const listener = provider.onDidChangeDecorations(e => { - this._proxy.$onDidChange(handle, !e ? null : Array.isArray(e) ? e : [e]); + this._proxy.$onDidChange(handle, !e ? null : asArray(e)); }); return new Disposable(() => { diff --git a/src/vs/workbench/api/node/extHostDiagnostics.ts b/src/vs/workbench/api/node/extHostDiagnostics.ts index d193742306..623f8ffcb4 100644 --- a/src/vs/workbench/api/node/extHostDiagnostics.ts +++ b/src/vs/workbench/api/node/extHostDiagnostics.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { URI } from 'vs/base/common/uri'; import * as vscode from 'vscode'; -import { MainContext, MainThreadDiagnosticsShape, ExtHostDiagnosticsShape, IMainContext } from './extHost.protocol'; +import { MainContext, MainThreadDiagnosticsShape, ExtHostDiagnosticsShape, IMainContext } from '../common/extHost.protocol'; import { DiagnosticSeverity } from './extHostTypes'; import * as converter from './extHostTypeConverters'; import { mergeSort } from 'vs/base/common/arrays'; diff --git a/src/vs/workbench/api/node/extHostDialogs.ts b/src/vs/workbench/api/node/extHostDialogs.ts index 09006c992e..7cd329ca6c 100644 --- a/src/vs/workbench/api/node/extHostDialogs.ts +++ b/src/vs/workbench/api/node/extHostDialogs.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; -import { MainContext, MainThreadDiaglogsShape, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, MainThreadDiaglogsShape, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; export class ExtHostDialogs { diff --git a/src/vs/workbench/api/node/extHostDocumentContentProviders.ts b/src/vs/workbench/api/node/extHostDocumentContentProviders.ts index 66d0ec7d67..3a9b5cc0cb 100644 --- a/src/vs/workbench/api/node/extHostDocumentContentProviders.ts +++ b/src/vs/workbench/api/node/extHostDocumentContentProviders.ts @@ -8,7 +8,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Disposable } from 'vs/workbench/api/node/extHostTypes'; import * as vscode from 'vscode'; -import { MainContext, ExtHostDocumentContentProvidersShape, MainThreadDocumentContentProvidersShape, IMainContext } from './extHost.protocol'; +import { MainContext, ExtHostDocumentContentProvidersShape, MainThreadDocumentContentProvidersShape, IMainContext } from '../common/extHost.protocol'; import { ExtHostDocumentsAndEditors } from './extHostDocumentsAndEditors'; import { Schemas } from 'vs/base/common/network'; import { ILogService } from 'vs/platform/log/common/log'; diff --git a/src/vs/workbench/api/node/extHostDocumentData.ts b/src/vs/workbench/api/node/extHostDocumentData.ts index 68d2b1e81b..7ffa743ee9 100644 --- a/src/vs/workbench/api/node/extHostDocumentData.ts +++ b/src/vs/workbench/api/node/extHostDocumentData.ts @@ -9,7 +9,7 @@ import { regExpLeadsToEndlessLoop } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { MirrorTextModel } from 'vs/editor/common/model/mirrorTextModel'; import { ensureValidWordDefinition, getWordAtText } from 'vs/editor/common/model/wordHelper'; -import { MainThreadDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { EndOfLine, Position, Range } from 'vs/workbench/api/node/extHostTypes'; import * as vscode from 'vscode'; diff --git a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts index 275a5fd4c4..00c2d98971 100644 --- a/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts +++ b/src/vs/workbench/api/node/extHostDocumentSaveParticipant.ts @@ -7,7 +7,7 @@ import { Event } from 'vs/base/common/event'; import { URI, UriComponents } from 'vs/base/common/uri'; import { sequence } from 'vs/base/common/async'; import { illegalState } from 'vs/base/common/errors'; -import { ExtHostDocumentSaveParticipantShape, MainThreadTextEditorsShape, ResourceTextEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostDocumentSaveParticipantShape, MainThreadTextEditorsShape, ResourceTextEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { TextEdit } from 'vs/workbench/api/node/extHostTypes'; import { Range, TextDocumentSaveReason, EndOfLine } from 'vs/workbench/api/node/extHostTypeConverters'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; diff --git a/src/vs/workbench/api/node/extHostDocuments.ts b/src/vs/workbench/api/node/extHostDocuments.ts index f8f0df4a7e..bdb010545c 100644 --- a/src/vs/workbench/api/node/extHostDocuments.ts +++ b/src/vs/workbench/api/node/extHostDocuments.ts @@ -7,7 +7,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; -import { ExtHostDocumentsShape, IMainContext, MainContext, MainThreadDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostDocumentsShape, IMainContext, MainContext, MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentData, setWordDefinitionFor } from 'vs/workbench/api/node/extHostDocumentData'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import * as TypeConverters from 'vs/workbench/api/node/extHostTypeConverters'; diff --git a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts index 4bbd6b96bb..6bbcebb18a 100644 --- a/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts +++ b/src/vs/workbench/api/node/extHostDocumentsAndEditors.ts @@ -7,7 +7,7 @@ import * as assert from 'vs/base/common/assert'; import { Emitter, Event } from 'vs/base/common/event'; import { dispose } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IMainContext, MainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta, IMainContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import { ExtHostTextEditor } from 'vs/workbench/api/node/extHostTextEditor'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; diff --git a/src/vs/workbench/api/node/extHostExtensionService.ts b/src/vs/workbench/api/node/extHostExtensionService.ts index 6c28e54f8d..a91e954a05 100644 --- a/src/vs/workbench/api/node/extHostExtensionService.ts +++ b/src/vs/workbench/api/node/extHostExtensionService.ts @@ -15,7 +15,7 @@ import { URI } from 'vs/base/common/uri'; import * as pfs from 'vs/base/node/pfs'; import { ILogService } from 'vs/platform/log/common/log'; // {{SQL CARBON EDIT}} - Remove createApiFactory initializeExtensionApi, and IExtensionApiFactory imports -import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IStaticWorkspaceData } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostExtensionServiceShape, IEnvironment, IInitData, IMainContext, MainContext, MainThreadExtensionServiceShape, MainThreadTelemetryShape, MainThreadWorkspaceShape, IStaticWorkspaceData } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ActivatedExtension, EmptyExtension, ExtensionActivatedByAPI, ExtensionActivatedByEvent, ExtensionActivationReason, ExtensionActivationTimes, ExtensionActivationTimesBuilder, ExtensionsActivator, IExtensionAPI, IExtensionContext, IExtensionMemento, IExtensionModule, HostExtension } from 'vs/workbench/api/node/extHostExtensionActivator'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; @@ -31,6 +31,7 @@ import * as vscode from 'vscode'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { Schemas } from 'vs/base/common/network'; +import { withNullAsUndefined } from 'vs/base/common/types'; class ExtensionMemento implements IExtensionMemento { @@ -203,7 +204,7 @@ export class ExtHostExtensionService implements ExtHostExtensionServiceShape { this._readyToRunExtensions = new Barrier(); this._registry = new ExtensionDescriptionRegistry(initData.extensions); this._storage = new ExtHostStorage(this._extHostContext); - this._storagePath = new ExtensionStoragePath(initData.workspace, initData.environment); + this._storagePath = new ExtensionStoragePath(withNullAsUndefined(initData.workspace), initData.environment); const hostExtensions = new Set(); initData.hostExtensions.forEach((extensionId) => hostExtensions.add(ExtensionIdentifier.toKey(extensionId))); diff --git a/src/vs/workbench/api/node/extHostFileSystem.ts b/src/vs/workbench/api/node/extHostFileSystem.ts index 794e22a79e..785bd73330 100644 --- a/src/vs/workbench/api/node/extHostFileSystem.ts +++ b/src/vs/workbench/api/node/extHostFileSystem.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { URI, UriComponents } from 'vs/base/common/uri'; -import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape, IFileChangeDto } from './extHost.protocol'; +import { MainContext, IMainContext, ExtHostFileSystemShape, MainThreadFileSystemShape, IFileChangeDto } from '../common/extHost.protocol'; import * as vscode from 'vscode'; import * as files from 'vs/platform/files/common/files'; import { IDisposable, toDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/api/node/extHostFileSystemEventService.ts b/src/vs/workbench/api/node/extHostFileSystemEventService.ts index 164f6f2c27..14ab0c9e1d 100644 --- a/src/vs/workbench/api/node/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/node/extHostFileSystemEventService.ts @@ -9,7 +9,7 @@ import { IRelativePattern, parse } from 'vs/base/common/glob'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import * as vscode from 'vscode'; -import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, ResourceFileEditDto, ResourceTextEditDto, MainThreadTextEditorsShape } from './extHost.protocol'; +import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, ResourceFileEditDto, ResourceTextEditDto, MainThreadTextEditorsShape } from '../common/extHost.protocol'; import * as typeConverter from './extHostTypeConverters'; import { Disposable, WorkspaceEdit } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/node/extHostHeapService.ts b/src/vs/workbench/api/node/extHostHeapService.ts index fa429b8dca..3991b7beb1 100644 --- a/src/vs/workbench/api/node/extHostHeapService.ts +++ b/src/vs/workbench/api/node/extHostHeapService.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ExtHostHeapServiceShape } from './extHost.protocol'; +import { ExtHostHeapServiceShape } from '../common/extHost.protocol'; export class ExtHostHeapService implements ExtHostHeapServiceShape { diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index effbd963d6..7c7404a382 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -15,11 +15,11 @@ import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHostCommands'; import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import { asPromise } from 'vs/base/common/async'; -import { MainContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, ObjectIdentifier, IRawColorInfo, IMainContext, IdObject, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, ISerializedLanguageConfiguration, WorkspaceSymbolDto, SuggestResultDto, WorkspaceSymbolsDto, SuggestionDto, CodeActionDto, ISerializedDocumentFilter, WorkspaceEditDto, ISerializedSignatureHelpProviderMetadata, LinkDto, CodeLensDto, MainThreadWebviewsShape, CodeInsetDto } from './extHost.protocol'; +import { MainContext, MainThreadLanguageFeaturesShape, ExtHostLanguageFeaturesShape, ObjectIdentifier, IRawColorInfo, IMainContext, IdObject, ISerializedRegExp, ISerializedIndentationRule, ISerializedOnEnterRule, ISerializedLanguageConfiguration, WorkspaceSymbolDto, SuggestResultDto, WorkspaceSymbolsDto, SuggestionDto, CodeActionDto, ISerializedDocumentFilter, WorkspaceEditDto, ISerializedSignatureHelpProviderMetadata, LinkDto, CodeLensDto, MainThreadWebviewsShape, CodeInsetDto } from '../common/extHost.protocol'; import { regExpLeadsToEndlessLoop, regExpFlags } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; import { IRange, Range as EditorRange } from 'vs/editor/common/core/range'; -import { isFalsyOrEmpty, isNonEmptyArray, coalesce } from 'vs/base/common/arrays'; +import { isFalsyOrEmpty, isNonEmptyArray, coalesce, asArray } from 'vs/base/common/arrays'; import { isObject } from 'vs/base/common/types'; import { ISelection, Selection } from 'vs/editor/common/core/selection'; import { ILogService } from 'vs/platform/log/common/log'; @@ -28,6 +28,8 @@ import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensio import { ExtHostWebview } from 'vs/workbench/api/node/extHostWebview'; import * as codeInset from 'vs/workbench/contrib/codeinset/common/codeInset'; import { generateUuid } from 'vs/base/common/uuid'; +import * as callHierarchy from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { LRUCache } from 'vs/base/common/map'; // --- adapter @@ -191,12 +193,7 @@ class CodeInsetAdapter { } function convertToLocationLinks(value: vscode.Definition): modes.LocationLink[] { - if (Array.isArray(value)) { - return (value as (vscode.DefinitionLink | vscode.Location)[]).map(typeConvert.DefinitionLink.from); - } else if (value) { - return [typeConvert.DefinitionLink.from(value)]; - } - return []; + return value ? asArray(value).map(typeConvert.DefinitionLink.from) : []; } class DefinitionAdapter { @@ -963,11 +960,66 @@ class SelectionRangeAdapter { } } +class CallHierarchyAdapter { + + // todo@joh keep object (heap service, lifecycle) + private readonly _cache = new LRUCache(1000, 0.8); + private _idPool = 0; + + constructor( + private readonly _documents: ExtHostDocuments, + private readonly _provider: vscode.CallHierarchyItemProvider + ) { } + + provideCallHierarchyItem(resource: URI, pos: IPosition, token: CancellationToken): Promise { + const document = this._documents.getDocument(resource); + const position = typeConvert.Position.to(pos); + + return asPromise(() => this._provider.provideCallHierarchyItem(document, position, token)).then(item => { + if (!item) { + return undefined; + } + return this._fromItem(item); + }); + } + + resolveCallHierarchyItem(item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[callHierarchy.CallHierarchyItem, modes.Location[]][]> { + return asPromise(() => this._provider.resolveCallHierarchyItem( + this._cache.get(item._id)!, + direction as number, token) // todo@joh proper convert + ).then(data => { + if (!data) { + return []; + } + return data.map(tuple => { + return <[callHierarchy.CallHierarchyItem, modes.Location[]]>[ + this._fromItem(tuple[0]), + tuple[1].map(typeConvert.location.from) + ]; + }); + }); + } + + private _fromItem(item: vscode.CallHierarchyItem, _id: number = this._idPool++): callHierarchy.CallHierarchyItem { + const res = { + _id, + name: item.name, + detail: item.detail, + kind: typeConvert.SymbolKind.from(item.kind), + uri: item.uri, + range: typeConvert.Range.from(item.range), + selectionRange: typeConvert.Range.from(item.selectionRange), + }; + this._cache.set(_id, item); + return res; + } +} + type Adapter = DocumentSymbolAdapter | CodeLensAdapter | DefinitionAdapter | HoverAdapter | DocumentHighlightAdapter | ReferenceAdapter | CodeActionAdapter | DocumentFormattingAdapter | RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter | RenameAdapter | SuggestAdapter | SignatureHelpAdapter | LinkProviderAdapter | ImplementationAdapter | TypeDefinitionAdapter - | ColorProviderAdapter | FoldingProviderAdapter | CodeInsetAdapter | DeclarationAdapter | SelectionRangeAdapter; + | ColorProviderAdapter | FoldingProviderAdapter | CodeInsetAdapter | DeclarationAdapter | SelectionRangeAdapter | CallHierarchyAdapter; class AdapterData { constructor( @@ -1014,11 +1066,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { } private _transformDocumentSelector(selector: vscode.DocumentSelector): Array { - if (Array.isArray(selector)) { - return coalesce(selector.map(sel => this._doTransformDocumentSelector(sel))); - } - - return coalesce([this._doTransformDocumentSelector(selector)]); + return coalesce(asArray(selector).map(sel => this._doTransformDocumentSelector(sel))); } private _doTransformDocumentSelector(selector: string | vscode.DocumentFilter): ISerializedDocumentFilter | undefined { @@ -1415,6 +1463,22 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape { return this._withAdapter(handle, SelectionRangeAdapter, adapter => adapter.provideSelectionRanges(URI.revive(resource), positions, token)); } + // --- call hierarchy + + registerCallHierarchyProvider(extension: IExtensionDescription, selector: vscode.DocumentSelector, provider: vscode.CallHierarchyItemProvider): vscode.Disposable { + const handle = this._addNewAdapter(new CallHierarchyAdapter(this._documents, provider), extension); + this._proxy.$registerCallHierarchyProvider(handle, this._transformDocumentSelector(selector)); + return this._createDisposable(handle); + } + + $provideCallHierarchyItem(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise { + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.provideCallHierarchyItem(URI.revive(resource), position, token)); + } + + $resolveCallHierarchyItem(handle: number, item: callHierarchy.CallHierarchyItem, direction: callHierarchy.CallHierarchyDirection, token: CancellationToken): Promise<[callHierarchy.CallHierarchyItem, modes.Location[]][]> { + return this._withAdapter(handle, CallHierarchyAdapter, adapter => adapter.resolveCallHierarchyItem(item, direction, token)); + } + // --- configuration private static _serializeRegExp(regExp: RegExp): ISerializedRegExp { diff --git a/src/vs/workbench/api/node/extHostLanguages.ts b/src/vs/workbench/api/node/extHostLanguages.ts index 0d0ad1f423..0eecc843b9 100644 --- a/src/vs/workbench/api/node/extHostLanguages.ts +++ b/src/vs/workbench/api/node/extHostLanguages.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadLanguagesShape, IMainContext } from './extHost.protocol'; +import { MainContext, MainThreadLanguagesShape, IMainContext } from '../common/extHost.protocol'; import * as vscode from 'vscode'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; diff --git a/src/vs/workbench/api/node/extHostLogService.ts b/src/vs/workbench/api/node/extHostLogService.ts index 8f8167bbf9..391fcdf905 100644 --- a/src/vs/workbench/api/node/extHostLogService.ts +++ b/src/vs/workbench/api/node/extHostLogService.ts @@ -6,7 +6,7 @@ import { join } from 'vs/base/common/path'; import { ILogService, DelegatedLogService, LogLevel } from 'vs/platform/log/common/log'; import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; -import { ExtHostLogServiceShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostLogServiceShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtensionHostLogFileName } from 'vs/workbench/services/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/node/extHostMessageService.ts b/src/vs/workbench/api/node/extHostMessageService.ts index e335aa2df9..493bd297a5 100644 --- a/src/vs/workbench/api/node/extHostMessageService.ts +++ b/src/vs/workbench/api/node/extHostMessageService.ts @@ -5,7 +5,7 @@ import Severity from 'vs/base/common/severity'; import * as vscode from 'vscode'; -import { MainContext, MainThreadMessageServiceShape, MainThreadMessageOptions, IMainContext } from './extHost.protocol'; +import { MainContext, MainThreadMessageServiceShape, MainThreadMessageOptions, IMainContext } from '../common/extHost.protocol'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; function isMessageItem(item: any): item is vscode.MessageItem { diff --git a/src/vs/workbench/api/node/extHostOutputService.ts b/src/vs/workbench/api/node/extHostOutputService.ts index 01fb099385..009eecea52 100644 --- a/src/vs/workbench/api/node/extHostOutputService.ts +++ b/src/vs/workbench/api/node/extHostOutputService.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadOutputServiceShape, IMainContext, ExtHostOutputServiceShape } from './extHost.protocol'; +import { MainContext, MainThreadOutputServiceShape, IMainContext, ExtHostOutputServiceShape } from '../common/extHost.protocol'; import * as vscode from 'vscode'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/path'; diff --git a/src/vs/workbench/api/node/extHostProgress.ts b/src/vs/workbench/api/node/extHostProgress.ts index 54413567e3..ac96f113fd 100644 --- a/src/vs/workbench/api/node/extHostProgress.ts +++ b/src/vs/workbench/api/node/extHostProgress.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ProgressOptions } from 'vscode'; -import { MainThreadProgressShape, ExtHostProgressShape } from './extHost.protocol'; +import { MainThreadProgressShape, ExtHostProgressShape } from '../common/extHost.protocol'; import { ProgressLocation } from './extHostTypeConverters'; import { Progress, IProgressStep } from 'vs/platform/progress/common/progress'; import { localize } from 'vs/nls'; diff --git a/src/vs/workbench/api/node/extHostQuickOpen.ts b/src/vs/workbench/api/node/extHostQuickOpen.ts index 06e9606e8f..518a760ede 100644 --- a/src/vs/workbench/api/node/extHostQuickOpen.ts +++ b/src/vs/workbench/api/node/extHostQuickOpen.ts @@ -10,7 +10,7 @@ import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { IExtHostWorkspaceProvider } from 'vs/workbench/api/node/extHostWorkspace'; import { InputBox, InputBoxOptions, QuickInput, QuickInputButton, QuickPick, QuickPickItem, QuickPickOptions, WorkspaceFolder, WorkspaceFolderPickOptions } from 'vscode'; -import { ExtHostQuickOpenShape, IMainContext, MainContext, MainThreadQuickOpenShape, TransferQuickPickItems, TransferQuickInput, TransferQuickInputButton } from './extHost.protocol'; +import { ExtHostQuickOpenShape, IMainContext, MainContext, MainThreadQuickOpenShape, TransferQuickPickItems, TransferQuickInput, TransferQuickInputButton } from '../common/extHost.protocol'; import { URI } from 'vs/base/common/uri'; import { ThemeIcon, QuickInputButtons } from 'vs/workbench/api/node/extHostTypes'; import { isPromiseCanceledError } from 'vs/base/common/errors'; diff --git a/src/vs/workbench/api/node/extHostSCM.ts b/src/vs/workbench/api/node/extHostSCM.ts index fe8c760594..8fdec949f4 100644 --- a/src/vs/workbench/api/node/extHostSCM.ts +++ b/src/vs/workbench/api/node/extHostSCM.ts @@ -9,7 +9,7 @@ import { debounce } from 'vs/base/common/decorators'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { asPromise } from 'vs/base/common/async'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, CommandDto } from './extHost.protocol'; +import { MainContext, MainThreadSCMShape, SCMRawResource, SCMRawResourceSplice, SCMRawResourceSplices, IMainContext, ExtHostSCMShape, CommandDto } from '../common/extHost.protocol'; import { sortedDiff } from 'vs/base/common/arrays'; import { comparePaths } from 'vs/base/common/comparers'; import * as vscode from 'vscode'; diff --git a/src/vs/workbench/api/node/extHostSearch.ts b/src/vs/workbench/api/node/extHostSearch.ts index fea7183c3e..dc4b634050 100644 --- a/src/vs/workbench/api/node/extHostSearch.ts +++ b/src/vs/workbench/api/node/extHostSearch.ts @@ -15,7 +15,7 @@ import { RipgrepSearchProvider } from 'vs/workbench/services/search/node/ripgrep import { OutputChannel } from 'vs/workbench/services/search/node/ripgrepSearchUtils'; import { TextSearchManager } from 'vs/workbench/services/search/node/textSearchManager'; import * as vscode from 'vscode'; -import { ExtHostSearchShape, IMainContext, MainContext, MainThreadSearchShape } from './extHost.protocol'; +import { ExtHostSearchShape, IMainContext, MainContext, MainThreadSearchShape } from '../common/extHost.protocol'; export interface ISchemeTransformer { transformOutgoing(scheme: string): string; diff --git a/src/vs/workbench/api/node/extHostStatusBar.ts b/src/vs/workbench/api/node/extHostStatusBar.ts index 547b6c0886..291334dd84 100644 --- a/src/vs/workbench/api/node/extHostStatusBar.ts +++ b/src/vs/workbench/api/node/extHostStatusBar.ts @@ -6,7 +6,7 @@ import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { StatusBarAlignment as ExtHostStatusBarAlignment, Disposable, ThemeColor } from './extHostTypes'; import { StatusBarItem, StatusBarAlignment } from 'vscode'; -import { MainContext, MainThreadStatusBarShape, IMainContext } from './extHost.protocol'; +import { MainContext, MainThreadStatusBarShape, IMainContext } from '../common/extHost.protocol'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; export class ExtHostStatusBarEntry implements StatusBarItem { diff --git a/src/vs/workbench/api/node/extHostStorage.ts b/src/vs/workbench/api/node/extHostStorage.ts index 228c70b9b2..a95e7e0e2f 100644 --- a/src/vs/workbench/api/node/extHostStorage.ts +++ b/src/vs/workbench/api/node/extHostStorage.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MainContext, MainThreadStorageShape, IMainContext, ExtHostStorageShape } from './extHost.protocol'; +import { MainContext, MainThreadStorageShape, IMainContext, ExtHostStorageShape } from '../common/extHost.protocol'; import { Emitter } from 'vs/base/common/event'; export interface IStorageChangeEvent { diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index 86fbcf87d3..2143b3bc2f 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -12,7 +12,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { win32 } from 'vs/base/node/processes'; -import { MainContext, MainThreadTaskShape, ExtHostTaskShape, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, MainThreadTaskShape, ExtHostTaskShape, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import * as types from 'vs/workbench/api/node/extHostTypes'; import { ExtHostWorkspace, IExtHostWorkspaceProvider } from 'vs/workbench/api/node/extHostWorkspace'; @@ -23,11 +23,9 @@ import { ShellExecutionOptionsDTO, ShellExecutionDTO, CustomExecutionDTO, TaskDTO, TaskHandleDTO, TaskFilterDTO, TaskProcessStartedDTO, TaskProcessEndedDTO, TaskSystemInfoDTO, TaskSetDTO -} from '../shared/tasks'; - +} from '../common/shared/tasks'; // {{SQL CARBON EDIT}} // import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDebugService'; - import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostTerminalService, ExtHostTerminal } from 'vs/workbench/api/node/extHostTerminalService'; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 73de621263..88a9984867 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -10,7 +10,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; import * as terminalEnvironment from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; import { EXT_HOST_CREATION_DELAY, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; @@ -106,7 +106,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi public create( shellPath?: string, - shellArgs?: string[], + shellArgs?: string[] | string, cwd?: string | URI, env?: { [key: string]: string | null }, waitOnExit?: boolean, @@ -363,21 +363,22 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { }); } - public async $acceptTerminalDimensions(id: number, cols: number, rows: number): Promise { - const terminal = this._getTerminalById(id); - if (terminal) { - if (terminal.setDimensions(cols, rows)) { - this._onDidChangeTerminalDimensions.fire({ - terminal: terminal, - dimensions: terminal.dimensions as vscode.TerminalDimensions - }); + public $acceptTerminalDimensions(id: number, cols: number, rows: number): void { + this._getTerminalByIdEventually(id).then(terminal => { + if (terminal) { + if (terminal.setDimensions(cols, rows)) { + this._onDidChangeTerminalDimensions.fire({ + terminal: terminal, + dimensions: terminal.dimensions as vscode.TerminalDimensions + }); + } } - } - // When a terminal's dimensions change, a renderer's _maximum_ dimensions change - const renderer = this._getTerminalRendererById(id); - if (renderer) { - renderer._setMaximumDimensions(cols, rows); - } + // When a terminal's dimensions change, a renderer's _maximum_ dimensions change + const renderer = this._getTerminalRendererById(id); + if (renderer) { + renderer._setMaximumDimensions(cols, rows); + } + }); } public $acceptTerminalRendererInput(id: number, data: string): void { @@ -528,6 +529,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._terminalProcesses[id].getCwd().then(cwd => this._proxy.$sendProcessCwd(id, cwd)); } + public $acceptProcessRequestLatency(id: number): number { + return id; + } + private _onProcessExit(id: number, exitCode: number): void { // Remove listeners this._terminalProcesses[id].dispose(); @@ -564,7 +569,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } else { // This should only be needed immediately after createTerminalRenderer is called as // the ExtHostTerminal has not yet been iniitalized - timeout(200).then(() => c(this._getTerminalByIdEventually(id, retries - 1))); + timeout(200).then(() => c(this._createGetTerminalPromise(id, retries - 1))); } }); } diff --git a/src/vs/workbench/api/node/extHostTextEditor.ts b/src/vs/workbench/api/node/extHostTextEditor.ts index bc479a25ad..fdd4d0148a 100644 --- a/src/vs/workbench/api/node/extHostTextEditor.ts +++ b/src/vs/workbench/api/node/extHostTextEditor.ts @@ -9,7 +9,7 @@ import { IdGenerator } from 'vs/base/common/idGenerator'; import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; import { IRange } from 'vs/editor/common/core/range'; import { ISingleEditOperation } from 'vs/editor/common/model'; -import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import * as TypeConverters from 'vs/workbench/api/node/extHostTypeConverters'; import { EndOfLine, Position, Range, Selection, SnippetString, TextEditorLineNumbersStyle, TextEditorRevealType } from 'vs/workbench/api/node/extHostTypes'; @@ -158,7 +158,7 @@ export class ExtHostTextEditorOptions implements vscode.TextEditorOptions { this._indentSize = source.indentSize; this._insertSpaces = source.insertSpaces; this._cursorStyle = source.cursorStyle; - this._lineNumbers = source.lineNumbers; + this._lineNumbers = TypeConverters.TextEditorLineNumbersStyle.to(source.lineNumbers); } public get tabSize(): number | string { @@ -295,7 +295,7 @@ export class ExtHostTextEditorOptions implements vscode.TextEditorOptions { } this._lineNumbers = value; warnOnError(this._proxy.$trySetOptions(this._id, { - lineNumbers: value + lineNumbers: TypeConverters.TextEditorLineNumbersStyle.from(value) })); } @@ -354,7 +354,7 @@ export class ExtHostTextEditorOptions implements vscode.TextEditorOptions { if (this._lineNumbers !== newOptions.lineNumbers) { this._lineNumbers = newOptions.lineNumbers; hasUpdate = true; - bulkConfigurationUpdate.lineNumbers = newOptions.lineNumbers; + bulkConfigurationUpdate.lineNumbers = TypeConverters.TextEditorLineNumbersStyle.from(newOptions.lineNumbers); } } @@ -607,7 +607,7 @@ export class ExtHostTextEditor implements vscode.TextEditor { }); return this._proxy.$tryApplyEdits(this._id, editData.documentVersionId, edits, { - setEndOfLine: editData.setEndOfLine, + setEndOfLine: editData.setEndOfLine && TypeConverters.EndOfLine.from(editData.setEndOfLine), undoStopBefore: editData.undoStopBefore, undoStopAfter: editData.undoStopAfter }); diff --git a/src/vs/workbench/api/node/extHostTextEditors.ts b/src/vs/workbench/api/node/extHostTextEditors.ts index d93a786e1f..f47b678642 100644 --- a/src/vs/workbench/api/node/extHostTextEditors.ts +++ b/src/vs/workbench/api/node/extHostTextEditors.ts @@ -5,7 +5,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import * as arrays from 'vs/base/common/arrays'; -import { ExtHostEditorsShape, IEditorPropertiesChangeData, IMainContext, ITextDocumentShowOptions, ITextEditorPositionData, MainContext, MainThreadTextEditorsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostEditorsShape, IEditorPropertiesChangeData, IMainContext, ITextDocumentShowOptions, ITextEditorPositionData, MainContext, MainThreadTextEditorsShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { ExtHostTextEditor, TextEditorDecorationType } from 'vs/workbench/api/node/extHostTextEditor'; import * as TypeConverters from 'vs/workbench/api/node/extHostTypeConverters'; @@ -118,7 +118,7 @@ export class ExtHostEditors implements ExtHostEditorsShape { if (data.options) { this._onDidChangeTextEditorOptions.fire({ textEditor: textEditor, - options: data.options + options: { ...data.options, lineNumbers: TypeConverters.TextEditorLineNumbersStyle.to(data.options.lineNumbers) } }); } if (data.selections) { diff --git a/src/vs/workbench/api/node/extHostTreeViews.ts b/src/vs/workbench/api/node/extHostTreeViews.ts index 2424714286..512a74ec7e 100644 --- a/src/vs/workbench/api/node/extHostTreeViews.ts +++ b/src/vs/workbench/api/node/extHostTreeViews.ts @@ -9,7 +9,7 @@ import { basename } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from './extHost.protocol'; +import { ExtHostTreeViewsShape, MainThreadTreeViewsShape } from '../common/extHost.protocol'; import { ITreeItem, TreeViewItemHandleArg, ITreeItemLabel, IRevealOptions } from 'vs/workbench/common/views'; import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHostCommands'; import { asPromise } from 'vs/base/common/async'; diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index a4f7d7dda7..59a4075854 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -7,7 +7,7 @@ import * as modes from 'vs/editor/common/modes'; import * as types from './extHostTypes'; import * as search from 'vs/workbench/contrib/search/common/search'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; import { IDecorationOptions, IThemeDecorationRenderOptions, IDecorationRenderOptions, IContentDecorationRenderOptions } from 'vs/editor/common/editorCommon'; import { EndOfLineSequence, TrackedRangeStickiness } from 'vs/editor/common/model'; import * as vscode from 'vscode'; @@ -19,7 +19,7 @@ import { IRange } from 'vs/editor/common/core/range'; import { ISelection } from 'vs/editor/common/core/selection'; import * as htmlContent from 'vs/base/common/htmlContent'; import * as languageSelector from 'vs/editor/common/modes/languageSelector'; -import { WorkspaceEditDto, ResourceTextEditDto, ResourceFileEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { WorkspaceEditDto, ResourceTextEditDto, ResourceFileEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { MarkerSeverity, IRelatedInformation, IMarkerData, MarkerTag } from 'vs/platform/markers/common/markers'; import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; @@ -29,6 +29,7 @@ import { parse } from 'vs/base/common/marshalling'; import { cloneAndChange } from 'vs/base/common/objects'; import { LogLevel as _MainLogLevel } from 'vs/platform/log/common/log'; import { coalesce } from 'vs/base/common/arrays'; +import { RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; export interface PositionLike { line: number; @@ -883,6 +884,30 @@ export namespace TextDocumentSaveReason { } } +export namespace TextEditorLineNumbersStyle { + export function from(style: vscode.TextEditorLineNumbersStyle): RenderLineNumbersType { + switch (style) { + case types.TextEditorLineNumbersStyle.Off: + return RenderLineNumbersType.Off; + case types.TextEditorLineNumbersStyle.Relative: + return RenderLineNumbersType.Relative; + case types.TextEditorLineNumbersStyle.On: + default: + return RenderLineNumbersType.On; + } + } + export function to(style: RenderLineNumbersType): vscode.TextEditorLineNumbersStyle { + switch (style) { + case RenderLineNumbersType.Off: + return types.TextEditorLineNumbersStyle.Off; + case RenderLineNumbersType.Relative: + return types.TextEditorLineNumbersStyle.Relative; + case RenderLineNumbersType.On: + default: + return types.TextEditorLineNumbersStyle.On; + } + } +} export namespace EndOfLine { diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 61f8bbaf51..ad2f1322cc 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -13,7 +13,7 @@ import { startsWith } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; import { generateUuid } from 'vs/base/common/uuid'; import * as vscode from 'vscode'; - +import { FileSystemProviderErrorCode, markAsFileSystemProviderError } from 'vs/platform/files/common/files'; function es5ClassCompat(target: Function): any { ///@ts-ignore @@ -1111,6 +1111,29 @@ export class SelectionRange { } +export enum CallHierarchyDirection { + CallsFrom = 1, + CallsTo = 2, +} + +export class CallHierarchyItem { + kind: SymbolKind; + name: string; + detail?: string; + uri: URI; + range: Range; + selectionRange: Range; + + constructor(kind: SymbolKind, name: string, detail: string, uri: URI, range: Range, selectionRange: Range) { + this.kind = kind; + this.name = name; + this.detail = detail; + this.uri = uri; + this.range = range; + this.selectionRange = selectionRange; + } +} + @es5ClassCompat export class CodeLens { @@ -2166,27 +2189,30 @@ export enum FileChangeType { export class FileSystemError extends Error { static FileExists(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryExists', FileSystemError.FileExists); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.FileExists, FileSystemError.FileExists); } static FileNotFound(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryNotFound', FileSystemError.FileNotFound); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.FileNotFound, FileSystemError.FileNotFound); } static FileNotADirectory(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryNotADirectory', FileSystemError.FileNotADirectory); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.FileNotADirectory, FileSystemError.FileNotADirectory); } static FileIsADirectory(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'EntryIsADirectory', FileSystemError.FileIsADirectory); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.FileIsADirectory, FileSystemError.FileIsADirectory); } static NoPermissions(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'NoPermissions', FileSystemError.NoPermissions); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.NoPermissions, FileSystemError.NoPermissions); } static Unavailable(messageOrUri?: string | URI): FileSystemError { - return new FileSystemError(messageOrUri, 'Unavailable', FileSystemError.Unavailable); + return new FileSystemError(messageOrUri, FileSystemProviderErrorCode.Unavailable, FileSystemError.Unavailable); } constructor(uriOrMessage?: string | URI, code?: string, terminator?: Function) { super(URI.isUri(uriOrMessage) ? uriOrMessage.toString(true) : uriOrMessage); - this.name = code ? `${code} (FileSystemError)` : `FileSystemError`; + + // mark the error as file system provider error so that + // we can extract the error code on the receiving side + markAsFileSystemProviderError(this); // workaround when extending builtin objects and when compiling to ES5, see: // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work diff --git a/src/vs/workbench/api/node/extHostUrls.ts b/src/vs/workbench/api/node/extHostUrls.ts index 930d05087b..83d767b348 100644 --- a/src/vs/workbench/api/node/extHostUrls.ts +++ b/src/vs/workbench/api/node/extHostUrls.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { MainContext, IMainContext, ExtHostUrlsShape, MainThreadUrlsShape } from './extHost.protocol'; +import { MainContext, IMainContext, ExtHostUrlsShape, MainThreadUrlsShape } from '../common/extHost.protocol'; import { URI, UriComponents } from 'vs/base/common/uri'; import { toDisposable } from 'vs/base/common/lifecycle'; import { onUnexpectedError } from 'vs/base/common/errors'; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index 9f85e1c0d1..a6750dd181 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -6,9 +6,9 @@ import { Emitter, Event } from 'vs/base/common/event'; import { URI } from 'vs/base/common/uri'; import * as typeConverters from 'vs/workbench/api/node/extHostTypeConverters'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; import * as vscode from 'vscode'; -import { ExtHostWebviewsShape, IMainContext, MainContext, MainThreadWebviewsShape, WebviewPanelHandle, WebviewPanelViewState, WebviewInsetHandle } from './extHost.protocol'; +import { ExtHostWebviewsShape, IMainContext, MainContext, MainThreadWebviewsShape, WebviewPanelHandle, WebviewPanelViewState, WebviewInsetHandle } from '../common/extHost.protocol'; import { Disposable } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/api/node/extHostWindow.ts b/src/vs/workbench/api/node/extHostWindow.ts index ea25f6ce67..e7d29e9556 100644 --- a/src/vs/workbench/api/node/extHostWindow.ts +++ b/src/vs/workbench/api/node/extHostWindow.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { ExtHostWindowShape, MainContext, MainThreadWindowShape, IMainContext } from './extHost.protocol'; +import { ExtHostWindowShape, MainContext, MainThreadWindowShape, IMainContext } from '../common/extHost.protocol'; import { WindowState } from 'vscode'; import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 23d61a67ff..de443502a3 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -21,7 +21,7 @@ import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspa import { Range, RelativePattern } from 'vs/workbench/api/node/extHostTypes'; import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import * as vscode from 'vscode'; -import { ExtHostWorkspaceShape, IWorkspaceData, MainThreadMessageServiceShape, MainThreadWorkspaceShape, IMainContext, MainContext, IStaticWorkspaceData } from './extHost.protocol'; +import { ExtHostWorkspaceShape, IWorkspaceData, MainThreadMessageServiceShape, MainThreadWorkspaceShape, IMainContext, MainContext, IStaticWorkspaceData } from '../common/extHost.protocol'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Barrier } from 'vs/base/common/async'; diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 5859a90a8b..85c3589038 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * 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. *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/browser/nodeless.simpleservices.ts b/src/vs/workbench/browser/nodeless.simpleservices.ts index 3ae64bad00..b355bee793 100644 --- a/src/vs/workbench/browser/nodeless.simpleservices.ts +++ b/src/vs/workbench/browser/nodeless.simpleservices.ts @@ -695,6 +695,7 @@ export class SimpleRemoteFileService implements IFileService { readonly onFileChanges = Event.None; readonly onAfterOperation = Event.None; readonly onDidChangeFileSystemProviderRegistrations = Event.None; + readonly onWillActivateFileSystemProvider = Event.None; resolveFile(resource: URI, options?: IResolveFileOptions): Promise { // @ts-ignore @@ -782,8 +783,6 @@ export class SimpleRemoteFileService implements IFileService { return Promise.resolve(createFile(parent, basename(_resource.path))); } - readFolder(_resource: URI) { return Promise.resolve([]); } - createFolder(_resource: URI): Promise { const parent = fileMap.get(dirname(_resource)); if (!parent) { diff --git a/src/vs/workbench/browser/workbench.ts b/src/vs/workbench/browser/workbench.ts index b268bfa885..bfcbae58d6 100644 --- a/src/vs/workbench/browser/workbench.ts +++ b/src/vs/workbench/browser/workbench.ts @@ -23,7 +23,7 @@ import { Position, Parts, IWorkbenchLayoutService } from 'vs/workbench/services/ import { IStorageService } from 'vs/platform/storage/common/storage'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IFileService } from 'vs/platform/files/common/files'; +import { IFileService, ILegacyFileService } from 'vs/platform/files/common/files'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -337,15 +337,16 @@ export class Workbench extends Layout { instantiationService.invokeFunction(accessor => { const lifecycleService = accessor.get(ILifecycleService); - // TODO@Ben TODO@Sandeep debt around cyclic dependencies - const fileService = accessor.get(IFileService); - const configurationService = accessor.get(IConfigurationService) as any; - - if (typeof configurationService.acquireFileService === 'function') { - configurationService.acquireFileService(fileService); + // TODO@Ben legacy file service + const fileService = accessor.get(IFileService) as any; + if (typeof fileService.setImpl === 'function') { + fileService.setImpl(accessor.get(ILegacyFileService)); } - if (typeof configurationService.acquireInstantiationService === 'function') { + // TODO@Sandeep debt around cyclic dependencies + const configurationService = accessor.get(IConfigurationService) as any; + if (typeof configurationService.acquireFileService === 'function') { + configurationService.acquireFileService(fileService); configurationService.acquireInstantiationService(instantiationService); } diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts new file mode 100644 index 0000000000..8eaa17c004 --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution.ts @@ -0,0 +1,160 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { localize } from 'vs/nls'; +import { CallHierarchyProviderRegistry, CallHierarchyDirection } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { CancellationTokenSource } from 'vs/base/common/cancellation'; +import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; +import { CallHierarchyTreePeekWidget } from 'vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek'; +import { Event } from 'vs/base/common/event'; +import { registerEditorContribution, registerEditorAction, EditorAction, registerEditorCommand, EditorCommand } from 'vs/editor/browser/editorExtensions'; +import { IEditorContribution } from 'vs/editor/common/editorCommon'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IContextKeyService, RawContextKey, IContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; +import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; + + +const _ctxHasCompletionItemProvider = new RawContextKey('editorHasCallHierarchyProvider', false); +const _ctxCallHierarchyVisible = new RawContextKey('callHierarchyVisible', false); + +class CallHierarchyController extends Disposable implements IEditorContribution { + + static Id = 'callHierarchy'; + + static get(editor: ICodeEditor): CallHierarchyController { + return editor.getContribution(CallHierarchyController.Id); + } + + private readonly _ctxHasProvider: IContextKey; + private readonly _ctxIsVisible: IContextKey; + + private _sessionDispose: IDisposable[] = []; + + constructor( + private readonly _editor: ICodeEditor, + @IContextKeyService private readonly _contextKeyService: IContextKeyService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(); + + this._ctxIsVisible = _ctxCallHierarchyVisible.bindTo(this._contextKeyService); + this._ctxHasProvider = _ctxHasCompletionItemProvider.bindTo(this._contextKeyService); + this._register(Event.any(_editor.onDidChangeModel, _editor.onDidChangeModelLanguage, CallHierarchyProviderRegistry.onDidChange)(() => { + this._ctxHasProvider.set(_editor.hasModel() && CallHierarchyProviderRegistry.has(_editor.getModel())); + })); + + this._register({ dispose: () => dispose(this._sessionDispose) }); + } + + dispose(): void { + this._ctxHasProvider.reset(); + this._ctxIsVisible.reset(); + super.dispose(); + } + + getId(): string { + return CallHierarchyController.Id; + } + + async startCallHierarchy(): Promise { + this._sessionDispose = dispose(this._sessionDispose); + + if (!this._editor.hasModel()) { + return; + } + + const model = this._editor.getModel(); + const position = this._editor.getPosition(); + const [provider] = CallHierarchyProviderRegistry.ordered(model); + if (!provider) { + return; + } + + Event.any(this._editor.onDidChangeModel, this._editor.onDidChangeModelLanguage)(this.endCallHierarchy, this, this._sessionDispose); + const widget = this._instantiationService.createInstance( + CallHierarchyTreePeekWidget, + this._editor, + position, + provider, + CallHierarchyDirection.CallsTo + ); + + widget.showLoading(); + this._ctxIsVisible.set(true); + + const cancel = new CancellationTokenSource(); + + this._sessionDispose.push(widget.onDidClose(() => this.endCallHierarchy())); + this._sessionDispose.push({ dispose() { cancel.cancel(); } }); + this._sessionDispose.push(widget); + + Promise.resolve(provider.provideCallHierarchyItem(model, position, cancel.token)).then(item => { + if (cancel.token.isCancellationRequested) { + return; + } + if (!item) { + widget.showMessage(localize('no.item', "No results")); + return; + } + + widget.showItem(item); + }); + } + + endCallHierarchy(): void { + this._sessionDispose = dispose(this._sessionDispose); + this._ctxIsVisible.set(false); + this._editor.focus(); + } +} + +registerEditorContribution(CallHierarchyController); + +registerEditorAction(class extends EditorAction { + + constructor() { + super({ + id: 'editor.showCallHierarchy', + label: localize('title', "Call Hierarchy"), + alias: 'Call Hierarchy', + menuOpts: { + group: 'navigation', + order: 111 + }, + kbOpts: { + kbExpr: EditorContextKeys.editorTextFocus, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.Shift + KeyMod.Alt + KeyCode.KEY_H + }, + precondition: _ctxHasCompletionItemProvider + }); + } + + async run(_accessor: ServicesAccessor, editor: ICodeEditor, args: any): Promise { + return CallHierarchyController.get(editor).startCallHierarchy(); + } +}); + + +registerEditorCommand(new class extends EditorCommand { + + constructor() { + super({ + id: 'editor.closeCallHierarchy', + kbOpts: { + weight: KeybindingWeight.WorkbenchContrib + 10, + primary: KeyCode.Escape + }, + precondition: ContextKeyExpr.and(_ctxCallHierarchyVisible, ContextKeyExpr.not('config.editor.stablePeek')) + }); + } + + runEditorCommand(_accessor: ServicesAccessor, editor: ICodeEditor): void { + return CallHierarchyController.get(editor).endCallHierarchy(); + } +}); diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts new file mode 100644 index 0000000000..28f4ad7cec --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -0,0 +1,425 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./media/callHierarchy'; +import { PeekViewWidget } from 'vs/editor/contrib/referenceSearch/peekViewWidget'; +import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { CallHierarchyItem, CallHierarchyProvider, CallHierarchyDirection } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; +import { FuzzyScore } from 'vs/base/common/filters'; +import * as callHTree from 'vs/workbench/contrib/callHierarchy/browser/callHierarchyTree'; +import { IAsyncDataTreeOptions } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { localize } from 'vs/nls'; +import { ScrollType } from 'vs/editor/common/editorCommon'; +import { IRange, Range } from 'vs/editor/common/core/range'; +import { SplitView, Orientation, Sizing } from 'vs/base/browser/ui/splitview/splitview'; +import { Dimension, addClass } from 'vs/base/browser/dom'; +import { Event } from 'vs/base/common/event'; +import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; +import { EmbeddedCodeEditorWidget } from 'vs/editor/browser/widget/embeddedCodeEditorWidget'; +import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; +import { ITextModelService } from 'vs/editor/common/services/resolverService'; +import { dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { TrackedRangeStickiness, IModelDeltaDecoration, IModelDecorationOptions, OverviewRulerLane } from 'vs/editor/common/model'; +import { registerThemingParticipant, themeColorFromId, IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; +import * as referencesWidget from 'vs/editor/contrib/referenceSearch/referencesWidget'; +import { isNonEmptyArray } from 'vs/base/common/arrays'; +import { IPosition } from 'vs/editor/common/core/position'; +import { Action } from 'vs/base/common/actions'; +import { IActionBarOptions, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; +import { ILabelService } from 'vs/platform/label/common/label'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { Color } from 'vs/base/common/color'; + +const enum State { + Loading = 'loading', + Message = 'message', + Data = 'data' +} + +class ToggleHierarchyDirectionAction extends Action { + + constructor(public direction: () => CallHierarchyDirection, callback: () => void) { + super('toggle.dir', undefined, 'call-hierarchy-toggle', true, () => { + callback(); + this._update(); + return Promise.resolve(); + }); + this._update(); + } + + private _update() { + if (this.direction() === CallHierarchyDirection.CallsFrom) { + this.label = localize('toggle.from', "Calls From..."); + this.checked = true; + } else { + this.label = localize('toggle.to', "Calls To..."); + this.checked = false; + } + } +} + +class LayoutInfo { + + static store(info: LayoutInfo, storageService: IStorageService): void { + storageService.store('callHierarchyPeekLayout', JSON.stringify(info), StorageScope.GLOBAL); + } + + static retrieve(storageService: IStorageService): LayoutInfo { + const value = storageService.get('callHierarchyPeekLayout', StorageScope.GLOBAL, '{}'); + const defaultInfo: LayoutInfo = { ratio: 0.7, height: 17 }; + try { + return { ...defaultInfo, ...JSON.parse(value) }; + } catch { + return defaultInfo; + } + } + + constructor( + public ratio: number, + public height: number + ) { } +} + +export class CallHierarchyTreePeekWidget extends PeekViewWidget { + + private _toggleDirection: ToggleHierarchyDirectionAction; + private _parent: HTMLElement; + private _message: HTMLElement; + private _splitView: SplitView; + private _tree: WorkbenchAsyncDataTree; + private _editor: EmbeddedCodeEditorWidget; + private _dim: Dimension; + private _layoutInfo: LayoutInfo; + + constructor( + editor: ICodeEditor, + private readonly _where: IPosition, + private readonly _provider: CallHierarchyProvider, + private _direction: CallHierarchyDirection, + @IThemeService themeService: IThemeService, + @IEditorService private readonly _editorService: IEditorService, + @ITextModelService private readonly _textModelService: ITextModelService, + @ILabelService private readonly _labelService: ILabelService, + @IStorageService private readonly _storageService: IStorageService, + @IInstantiationService private readonly _instantiationService: IInstantiationService, + ) { + super(editor, { showFrame: true, showArrow: true, isResizeable: true, isAccessible: true }); + this.create(); + this._applyTheme(themeService.getTheme()); + themeService.onThemeChange(this._applyTheme, this, this._disposables); + } + + dispose(): void { + LayoutInfo.store(this._layoutInfo, this._storageService); + this._splitView.dispose(); + this._tree.dispose(); + this._editor.dispose(); + super.dispose(); + } + + private _applyTheme(theme: ITheme) { + const borderColor = theme.getColor(referencesWidget.peekViewBorder) || Color.transparent; + this.style({ + arrowColor: borderColor, + frameColor: borderColor, + headerBackgroundColor: theme.getColor(referencesWidget.peekViewTitleBackground) || Color.transparent, + primaryHeadingColor: theme.getColor(referencesWidget.peekViewTitleForeground), + secondaryHeadingColor: theme.getColor(referencesWidget.peekViewTitleInfoForeground) + }); + } + + protected _getActionBarOptions(): IActionBarOptions { + return { + orientation: ActionsOrientation.HORIZONTAL_REVERSE + }; + } + + protected _fillBody(parent: HTMLElement): void { + + this._layoutInfo = LayoutInfo.retrieve(this._storageService); + this._dim = { height: 0, width: 0 }; + + this._parent = parent; + addClass(parent, 'call-hierarchy'); + + const message = document.createElement('div'); + addClass(message, 'message'); + parent.appendChild(message); + this._message = message; + + const container = document.createElement('div'); + addClass(container, 'results'); + parent.appendChild(container); + + this._splitView = new SplitView(container, { orientation: Orientation.HORIZONTAL }); + + // editor stuff + const editorContainer = document.createElement('div'); + addClass(editorContainer, 'editor'); + container.appendChild(editorContainer); + let editorOptions: IEditorOptions = { + scrollBeyondLastLine: false, + scrollbar: { + verticalScrollbarSize: 14, + horizontal: 'auto', + useShadows: true, + verticalHasArrows: false, + horizontalHasArrows: false + }, + overviewRulerLanes: 2, + fixedOverflowWidgets: true, + minimap: { + enabled: false + } + }; + this._editor = this._instantiationService.createInstance( + EmbeddedCodeEditorWidget, + editorContainer, + editorOptions, + this.editor + ); + + // tree stuff + const treeContainer = document.createElement('div'); + addClass(treeContainer, 'tree'); + container.appendChild(treeContainer); + const options: IAsyncDataTreeOptions = { + identityProvider: new callHTree.IdentityProvider(), + ariaLabel: localize('tree.aria', "Call Hierarchy"), + expandOnlyOnTwistieClick: true, + }; + this._tree = this._instantiationService.createInstance( + WorkbenchAsyncDataTree, + treeContainer, + new callHTree.VirtualDelegate(), + [this._instantiationService.createInstance(callHTree.CallRenderer)], + new callHTree.SingleDirectionDataSource(this._provider, () => this._direction), + options + ); + + // split stuff + this._splitView.addView({ + onDidChange: Event.None, + element: editorContainer, + minimumSize: 200, + maximumSize: Number.MAX_VALUE, + layout: (width) => { + this._editor.layout({ height: this._dim.height, width }); + } + }, Sizing.Distribute); + + this._splitView.addView({ + onDidChange: Event.None, + element: treeContainer, + minimumSize: 100, + maximumSize: Number.MAX_VALUE, + layout: (width) => { + this._tree.layout(this._dim.height, width); + } + }, Sizing.Distribute); + + this._splitView.onDidSashChange(() => { + if (this._dim.width) { + this._layoutInfo.ratio = this._splitView.getViewSize(0) / this._dim.width; + } + }, undefined, this._disposables); + + // session state + let localDispose: IDisposable[] = []; + this._disposables.push({ dispose() { dispose(localDispose); } }); + + // update editor + this._tree.onDidChangeFocus(e => { + const [element] = e.elements; + if (element && isNonEmptyArray(element.locations)) { + + localDispose = dispose(localDispose); + + const options: IModelDecorationOptions = { + stickiness: TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges, + className: 'call-decoration', + overviewRuler: { + color: themeColorFromId(referencesWidget.peekViewEditorMatchHighlight), + position: OverviewRulerLane.Center + }, + }; + let decorations: IModelDeltaDecoration[] = []; + let fullRange: IRange | undefined; + for (const { range } of element.locations) { + decorations.push({ range, options }); + fullRange = !fullRange ? range : Range.plusRange(range, fullRange); + } + + this._textModelService.createModelReference(element.item.uri).then(value => { + this._editor.setModel(value.object.textEditorModel); + this._editor.revealRangeInCenter(fullRange!, ScrollType.Smooth); + this._editor.revealLine(element.item.range.startLineNumber, ScrollType.Smooth); + const ids = this._editor.deltaDecorations([], decorations); + localDispose.push({ dispose: () => this._editor.deltaDecorations(ids, []) }); + localDispose.push(value); + }); + } + }, undefined, this._disposables); + + this._editor.onMouseDown(e => { + const { event, target } = e; + if (event.detail !== 2) { + return; + } + const [focus] = this._tree.getFocus(); + if (!focus) { + return; + } + this.dispose(); + this._editorService.openEditor({ + resource: focus.item.uri, + options: { selection: target.range! } + }); + + }, undefined, this._disposables); + + this._tree.onMouseDblClick(e => { + if (e.element && isNonEmptyArray(e.element.locations)) { + this.dispose(); + this._editorService.openEditor({ + resource: e.element.item.uri, + options: { selection: e.element.locations[0].range } + }); + } + }, undefined, this._disposables); + + this._tree.onDidChangeSelection(e => { + const [element] = e.elements; + // don't close on click + if (element && !(e.browserEvent instanceof MouseEvent)) { + this.dispose(); + this._editorService.openEditor({ + resource: element.item.uri, + options: { selection: element.locations[0].range } + }); + } + }); + } + + showLoading(): void { + this._parent.dataset['state'] = State.Loading; + this.setTitle(localize('title.loading', "Loading...")); + this._show(); + } + + showMessage(message: string): void { + this._parent.dataset['state'] = State.Message; + this.setTitle(''); + this.setMetaTitle(''); + this._message.innerText = message; + this._show(); + } + + showItem(item: CallHierarchyItem) { + this._parent.dataset['state'] = State.Data; + + this._show(); + this._tree.setInput(item).then(() => { + + if (!this._tree.getFirstElementChild(item)) { + // + this.showMessage(this._direction === CallHierarchyDirection.CallsFrom + ? localize('empt.callsFrom', "No calls from '{0}'", item.name) + : localize('empt.callsTo', "No calls to '{0}'", item.name)); + + } else { + this._tree.domFocus(); + this._tree.focusFirst(); + this.setTitle( + item.name, + item.detail || this._labelService.getUriLabel(item.uri, { relative: true }), + ); + this.setMetaTitle(this._direction === CallHierarchyDirection.CallsFrom + ? localize('title.from', " – calls from '{0}'", item.name) + : localize('title.to', " – calls to '{0}'", item.name)); + } + }); + + if (!this._toggleDirection) { + this._toggleDirection = new ToggleHierarchyDirectionAction( + () => this._direction, + () => { + let newDirection = this._direction === CallHierarchyDirection.CallsFrom ? CallHierarchyDirection.CallsTo : CallHierarchyDirection.CallsFrom; + this._direction = newDirection; + this.showItem(item); + } + ); + this._actionbarWidget.push(this._toggleDirection, { label: false, icon: true }); + this._disposables.push(this._toggleDirection); + } + } + + private _show() { + if (!this._isShowing) { + this.editor.revealLineInCenterIfOutsideViewport(this._where.lineNumber, ScrollType.Smooth); + super.show(Range.fromPositions(this._where), this._layoutInfo.height); + } + } + + protected _onWidth(width: number) { + if (this._dim) { + this._doLayoutBody(this._dim.height, width); + } + } + + protected _doLayoutBody(height: number, width: number): void { + super._doLayoutBody(height, width); + this._dim = { height, width }; + this._layoutInfo.height = this._viewZone ? this._viewZone.heightInLines : this._layoutInfo.height; + this._splitView.layout(width); + this._splitView.resizeView(0, width * this._layoutInfo.ratio); + } +} + +registerThemingParticipant((theme, collector) => { + const referenceHighlightColor = theme.getColor(referencesWidget.peekViewEditorMatchHighlight); + if (referenceHighlightColor) { + collector.addRule(`.monaco-editor .call-hierarchy .call-decoration { background-color: ${referenceHighlightColor}; }`); + } + const referenceHighlightBorder = theme.getColor(referencesWidget.peekViewEditorMatchHighlightBorder); + if (referenceHighlightBorder) { + collector.addRule(`.monaco-editor .call-hierarchy .call-decoration { border: 2px solid ${referenceHighlightBorder}; box-sizing: border-box; }`); + } + const resultsBackground = theme.getColor(referencesWidget.peekViewResultsBackground); + if (resultsBackground) { + collector.addRule(`.monaco-editor .call-hierarchy .tree { background-color: ${resultsBackground}; }`); + } + const resultsMatchForeground = theme.getColor(referencesWidget.peekViewResultsFileForeground); + if (resultsMatchForeground) { + collector.addRule(`.monaco-editor .call-hierarchy .tree { color: ${resultsMatchForeground}; }`); + } + const resultsSelectedBackground = theme.getColor(referencesWidget.peekViewResultsSelectionBackground); + if (resultsSelectedBackground) { + collector.addRule(`.monaco-editor .call-hierarchy .tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { background-color: ${resultsSelectedBackground}; }`); + } + const resultsSelectedForeground = theme.getColor(referencesWidget.peekViewResultsSelectionForeground); + if (resultsSelectedForeground) { + collector.addRule(`.monaco-editor .call-hierarchy .tree .monaco-list:focus .monaco-list-rows > .monaco-list-row.selected:not(.highlighted) { color: ${resultsSelectedForeground} !important; }`); + } + const editorBackground = theme.getColor(referencesWidget.peekViewEditorBackground); + if (editorBackground) { + collector.addRule( + `.monaco-editor .call-hierarchy .editor .monaco-editor .monaco-editor-background,` + + `.monaco-editor .call-hierarchy .editor .monaco-editor .inputarea.ime-input {` + + ` background-color: ${editorBackground};` + + `}` + ); + } + const editorGutterBackground = theme.getColor(referencesWidget.peekViewEditorGutterBackground); + if (editorGutterBackground) { + collector.addRule( + `.monaco-editor .call-hierarchy .editor .monaco-editor .margin {` + + ` background-color: ${editorGutterBackground};` + + `}` + ); + } +}); diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts new file mode 100644 index 0000000000..1c7a043ab6 --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyTree.ts @@ -0,0 +1,96 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IAsyncDataSource, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/tree/tree'; +import { CallHierarchyItem, CallHierarchyDirection, CallHierarchyProvider } from 'vs/workbench/contrib/callHierarchy/common/callHierarchy'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { IIdentityProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { FuzzyScore, createMatches } from 'vs/base/common/filters'; +import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; +import { symbolKindToCssClass, Location } from 'vs/editor/common/modes'; +import { ILabelService } from 'vs/platform/label/common/label'; + +export class Call { + constructor( + readonly direction: CallHierarchyDirection, + readonly item: CallHierarchyItem, + readonly locations: Location[] + ) { } +} + +export class SingleDirectionDataSource implements IAsyncDataSource { + + constructor( + public provider: CallHierarchyProvider, + public direction: () => CallHierarchyDirection + ) { } + + hasChildren(_element: CallHierarchyItem): boolean { + return true; + } + + async getChildren(element: CallHierarchyItem | Call): Promise { + if (element instanceof Call) { + element = element.item; + } + const direction = this.direction(); + const calls = await this.provider.resolveCallHierarchyItem(element, direction, CancellationToken.None); + return calls + ? calls.map(([item, locations]) => new Call(direction, item, locations)) + : []; + } +} + +export class IdentityProvider implements IIdentityProvider { + getId(element: Call): { toString(): string; } { + return element.item._id; + } +} + +class CallRenderingTemplate { + iconLabel: IconLabel; +} + +export class CallRenderer implements ITreeRenderer { + + static id = 'CallRenderer'; + + templateId: string = CallRenderer.id; + + constructor(@ILabelService private readonly _labelService: ILabelService) { } + + renderTemplate(container: HTMLElement): CallRenderingTemplate { + const iconLabel = new IconLabel(container, { supportHighlights: true }); + return { iconLabel }; + } + renderElement(node: ITreeNode, _index: number, template: CallRenderingTemplate): void { + const { element, filterData } = node; + const detail = element.item.detail || this._labelService.getUriLabel(element.item.uri, { relative: true }); + + template.iconLabel.setLabel( + element.item.name, + detail, + { + labelEscapeNewLines: true, + matches: createMatches(filterData), + extraClasses: [symbolKindToCssClass(element.item.kind, true)] + } + ); + } + disposeTemplate(template: CallRenderingTemplate): void { + template.iconLabel.dispose(); + } +} + +export class VirtualDelegate implements IListVirtualDelegate { + + getHeight(_element: Call): number { + return 22; + } + + getTemplateId(_element: Call): string { + return CallRenderer.id; + } +} diff --git a/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x.svg b/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x.svg new file mode 100644 index 0000000000..7ae4f3a56e --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x_dark.svg b/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x_dark.svg new file mode 100644 index 0000000000..a6f9a99b55 --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/media/CallerOrCalleeView_16x_dark.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/vs/workbench/contrib/callHierarchy/browser/media/callHierarchy.css b/src/vs/workbench/contrib/callHierarchy/browser/media/callHierarchy.css new file mode 100644 index 0000000000..20491c29c1 --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/browser/media/callHierarchy.css @@ -0,0 +1,39 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +.monaco-workbench .call-hierarchy .results, +.monaco-workbench .call-hierarchy .message { + display: none; +} + +.monaco-workbench .call-hierarchy[data-state="data"] .results { + display: inherit; +} + +.monaco-workbench .call-hierarchy[data-state="message"] .message { + display: inherit; + text-align: center; + padding-top: 3em; +} + +.monaco-workbench .call-hierarchy-toggle { + background-image: url(CallerOrCalleeView_16x.svg); + background-size: 14px 14px; + background-repeat: no-repeat; + background-position: left center; +} + +.vs-dark .monaco-workbench .call-hierarchy-toggle, +.hc-dark .monaco-workbench .call-hierarchy-toggle { + background-image: url(CallerOrCalleeView_16x_dark.svg); +} + +.monaco-workbench .call-hierarchy .monaco-split-view2.horizontal > .split-view-container > .split-view-view{ + /* this is a little bizare.. */ + height: unset; +} +.monaco-workbench .call-hierarchy .tree{ + height: 100%; +} diff --git a/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts new file mode 100644 index 0000000000..9587637463 --- /dev/null +++ b/src/vs/workbench/contrib/callHierarchy/common/callHierarchy.ts @@ -0,0 +1,45 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IPosition } from 'vs/editor/common/core/position'; +import { IRange } from 'vs/editor/common/core/range'; +import { SymbolKind, ProviderResult, Location } from 'vs/editor/common/modes'; +import { ITextModel } from 'vs/editor/common/model'; +import { CancellationToken } from 'vs/base/common/cancellation'; +import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureRegistry'; +import { URI } from 'vs/base/common/uri'; + +export const enum CallHierarchyDirection { + CallsFrom = 1, + CallsTo = 2 +} + +export interface CallHierarchyItem { + _id: number; + kind: SymbolKind; + name: string; + detail?: string; + uri: URI; + range: IRange; + selectionRange: IRange; +} + +export interface CallHierarchyProvider { + + provideCallHierarchyItem( + document: ITextModel, + postion: IPosition, + token: CancellationToken + ): ProviderResult; + + resolveCallHierarchyItem( + item: CallHierarchyItem, + direction: CallHierarchyDirection, + token: CancellationToken + ): ProviderResult<[CallHierarchyItem, Location[]][]>; +} + +export const CallHierarchyProviderRegistry = new LanguageFeatureRegistry(); + diff --git a/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts index c7b0cfcaef..39a4d1afe6 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/codeEditor.contribution.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * 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. *--------------------------------------------------------------------------------------------*/ import './menuPreventer'; diff --git a/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts b/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts index 3f120dc512..c037c40ffe 100644 --- a/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts @@ -245,7 +245,7 @@ export class CommentNode extends Disposable { } return this.actionItemProvider(action as Action); }, - this.actionRunner, + this.actionRunner!, undefined, 'toolbar-toggle-pickReactions', () => { return AnchorAlignment.RIGHT; } @@ -625,4 +625,4 @@ export class CommentNode extends Disposable { dispose() { this._toDispose.forEach(disposeable => disposeable.dispose()); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts index afdb632f55..3dc3a056ad 100644 --- a/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts @@ -200,9 +200,16 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._disposables.push(this._actionbarWidget); this._collapseAction = new Action('review.expand', nls.localize('label.collapse', "Collapse"), COLLAPSE_ACTION_CLASS, true, () => { - if (this._commentThread.comments.length === 0 && (this._commentThread as modes.CommentThread2).commentThreadHandle === undefined) { - this.dispose(); - return Promise.resolve(); + if (this._commentThread.comments.length === 0) { + if ((this._commentThread as modes.CommentThread2).commentThreadHandle === undefined) { + this.dispose(); + return Promise.resolve(); + } else { + const deleteCommand = (this._commentThread as modes.CommentThread2).deleteCommand; + if (deleteCommand) { + return this.commandService.executeCommand(deleteCommand.id, ...(deleteCommand.arguments || [])); + } + } } this._isCollapsed = true; @@ -1009,4 +1016,4 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._submitActionsDisposables.forEach(local => local.dispose()); this._onDidClose.fire(undefined); } -} \ No newline at end of file +} diff --git a/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts b/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts index e9f67aff05..278e82288f 100644 --- a/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts @@ -168,6 +168,8 @@ export class ReviewController implements IEditorContribution { private mouseDownInfo: { lineNumber: number } | null = null; private _commentingRangeSpaceReserved = false; private _computePromise: CancelablePromise> | null; + private _addInProgress: boolean; + private _emptyThreadsToAddQueue: number[] = []; private _computeCommentingRangePromise: CancelablePromise | null; private _computeCommentingRangeScheduler: Delayer> | null; private _pendingCommentCache: { [key: number]: { [key: string]: string } }; @@ -434,7 +436,8 @@ export class ReviewController implements IEditorContribution { } }); added.forEach(thread => { - this.displayCommentThread(e.owner, thread, null, draftMode); + const pendingCommentText = this._pendingCommentCache[e.owner] && this._pendingCommentCache[e.owner][thread.threadId]; + this.displayCommentThread(e.owner, thread, pendingCommentText, draftMode); this._commentInfos.filter(info => info.owner === e.owner)[0].threads.push(thread); }); @@ -546,25 +549,41 @@ export class ReviewController implements IEditorContribution { if (e.target.element.className.indexOf('comment-diff-added') >= 0) { const lineNumber = e.target.position!.lineNumber; - this.addCommentAtLine(lineNumber); + this.addOrToggleCommentAtLine(lineNumber); } } - public addOrToggleCommentAtLine(lineNumber: number): void { - // The widget's position is undefined until the widget has been displayed, so rely on the glyph position instead - const existingCommentsAtLine = this._commentWidgets.filter(widget => widget.getGlyphPosition() === lineNumber); - if (existingCommentsAtLine.length) { - existingCommentsAtLine.forEach(widget => widget.toggleExpand(lineNumber)); - return; + public async addOrToggleCommentAtLine(lineNumber: number): Promise { + // If an add is already in progress, queue the next add and process it after the current one finishes to + // prevent empty comment threads from being added to the same line. + if (!this._addInProgress) { + this._addInProgress = true; + // The widget's position is undefined until the widget has been displayed, so rely on the glyph position instead + const existingCommentsAtLine = this._commentWidgets.filter(widget => widget.getGlyphPosition() === lineNumber); + if (existingCommentsAtLine.length) { + existingCommentsAtLine.forEach(widget => widget.toggleExpand(lineNumber)); + this.processNextThreadToAdd(); + return; + } else { + this.addCommentAtLine(lineNumber); + } } else { - this.addCommentAtLine(lineNumber); + this._emptyThreadsToAddQueue.push(lineNumber); } } - public addCommentAtLine(lineNumber: number): void { + private processNextThreadToAdd(): void { + this._addInProgress = false; + const lineNumber = this._emptyThreadsToAddQueue.shift(); + if (lineNumber) { + this.addOrToggleCommentAtLine(lineNumber); + } + } + + public addCommentAtLine(lineNumber: number): Promise { const newCommentInfo = this._commentingRangeDecorator.getMatchedCommentAction(lineNumber); if (!newCommentInfo || !this.editor.hasModel()) { - return; + return Promise.resolve(); } const { replyCommand, ownerId, extensionId, commentingRangesInfo } = newCommentInfo; @@ -579,17 +598,26 @@ export class ReviewController implements IEditorContribution { this._commandService.executeCommand(commandId, ...args); } } else if (commentingRangesInfo.newCommentThreadCallback) { - commentingRangesInfo.newCommentThreadCallback(this.editor.getModel().uri, range); + return commentingRangesInfo.newCommentThreadCallback(this.editor.getModel().uri, range) + .then(_ => { + this.processNextThreadToAdd(); + }) + .catch(e => { + this.notificationService.error(nls.localize('commentThreadAddFailure', "Adding a new comment thread failed: {0}.", e.message)); + this.processNextThreadToAdd(); + }); } } else { const commentInfo = this._commentInfos.filter(info => info.owner === ownerId); if (!commentInfo || !commentInfo.length) { - return; + return Promise.resolve(); } const draftMode = commentInfo[0].draftMode; this.addComment(lineNumber, replyCommand, ownerId, extensionId, draftMode, null); } + + return Promise.resolve(); } @@ -735,8 +763,7 @@ CommandsRegistry.registerCommand({ } const position = activeEditor.getPosition(); - controller.addOrToggleCommentAtLine(position.lineNumber); - return Promise.resolve(); + return controller.addOrToggleCommentAtLine(position.lineNumber); } }); diff --git a/src/vs/workbench/contrib/debug/browser/callStackView.ts b/src/vs/workbench/contrib/debug/browser/callStackView.ts index 7907de3341..c85a209dce 100644 --- a/src/vs/workbench/contrib/debug/browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/browser/callStackView.ts @@ -15,10 +15,8 @@ import { MenuId, IMenu, IMenuService } from 'vs/platform/actions/common/actions' import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { renderViewTree } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { IAction } from 'vs/base/common/actions'; -import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction, TerminateThreadAction, CopyStackTraceAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -264,32 +262,13 @@ export class CallStackView extends ViewletPanel { } private onContextMenu(e: ITreeContextMenuEvent): void { - const actions: IAction[] = []; const element = e.element; if (isDebugSession(element)) { this.callStackItemType.set('session'); - actions.push(this.instantiationService.createInstance(RestartAction, RestartAction.ID, RestartAction.LABEL)); - actions.push(new StopAction(StopAction.ID, StopAction.LABEL, this.debugService, this.keybindingService)); } else if (element instanceof Thread) { this.callStackItemType.set('thread'); - const thread = element; - if (thread.stopped) { - actions.push(new ContinueAction(ContinueAction.ID, ContinueAction.LABEL, this.debugService, this.keybindingService)); - actions.push(new StepOverAction(StepOverAction.ID, StepOverAction.LABEL, this.debugService, this.keybindingService)); - actions.push(new StepIntoAction(StepIntoAction.ID, StepIntoAction.LABEL, this.debugService, this.keybindingService)); - actions.push(new StepOutAction(StepOutAction.ID, StepOutAction.LABEL, this.debugService, this.keybindingService)); - } else { - actions.push(new PauseAction(PauseAction.ID, PauseAction.LABEL, this.debugService, this.keybindingService)); - } - - actions.push(new Separator()); - actions.push(new TerminateThreadAction(TerminateThreadAction.ID, TerminateThreadAction.LABEL, this.debugService, this.keybindingService)); } else if (element instanceof StackFrame) { this.callStackItemType.set('stackFrame'); - if (element.thread.session.capabilities.supportsRestartFrame) { - actions.push(new RestartFrameAction(RestartFrameAction.ID, RestartFrameAction.LABEL, this.debugService, this.keybindingService)); - } - actions.push(this.instantiationService.createInstance(CopyStackTraceAction, CopyStackTraceAction.ID, CopyStackTraceAction.LABEL)); } else { this.callStackItemType.reset(); } @@ -297,7 +276,8 @@ export class CallStackView extends ViewletPanel { this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, getActions: () => { - fillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element) }, actions, this.contextMenuService); + const actions: IAction[] = []; + fillInContextMenuActions(this.contributedContextMenu, { arg: this.getContextForContributedActions(element), shouldForwardArgs: true }, actions, this.contextMenuService); return actions; }, getActionsContext: () => element @@ -315,6 +295,9 @@ export class CallStackView extends ViewletPanel { if (element instanceof Thread) { return element.threadId; } + if (isDebugSession(element)) { + return element.getId(); + } return undefined; } diff --git a/src/vs/workbench/contrib/debug/browser/debugCommands.ts b/src/vs/workbench/contrib/debug/browser/debugCommands.ts index a6e94e5748..f920ed3953 100644 --- a/src/vs/workbench/contrib/debug/browser/debugCommands.ts +++ b/src/vs/workbench/contrib/debug/browser/debugCommands.ts @@ -9,8 +9,8 @@ import { List } from 'vs/base/browser/ui/list/listWidget'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IListService } from 'vs/platform/list/browser/listService'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IDebugService, IEnablement, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED, EDITOR_CONTRIBUTION_ID, IDebugEditorContribution, CONTEXT_IN_DEBUG_MODE, CONTEXT_EXPRESSION_SELECTED, CONTEXT_BREAKPOINT_SELECTED, IConfig } from 'vs/workbench/contrib/debug/common/debug'; -import { Expression, Variable, Breakpoint, FunctionBreakpoint } from 'vs/workbench/contrib/debug/common/debugModel'; +import { IDebugService, IEnablement, CONTEXT_BREAKPOINTS_FOCUSED, CONTEXT_WATCH_EXPRESSIONS_FOCUSED, CONTEXT_VARIABLES_FOCUSED, EDITOR_CONTRIBUTION_ID, IDebugEditorContribution, CONTEXT_IN_DEBUG_MODE, CONTEXT_EXPRESSION_SELECTED, CONTEXT_BREAKPOINT_SELECTED, IConfig, IStackFrame, IThread, IDebugSession, CONTEXT_DEBUG_STATE, REPL_ID } from 'vs/workbench/contrib/debug/common/debug'; +import { Expression, Variable, Breakpoint, FunctionBreakpoint, Thread } from 'vs/workbench/contrib/debug/common/debugModel'; import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ICodeEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; @@ -25,12 +25,188 @@ import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { PanelFocusContext } from 'vs/workbench/common/panel'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { onUnexpectedError } from 'vs/base/common/errors'; +import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { startDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; export const ADD_CONFIGURATION_ID = 'debug.addConfiguration'; export const TOGGLE_INLINE_BREAKPOINT_ID = 'editor.debug.action.toggleInlineBreakpoint'; +export const COPY_STACK_TRACE_ID = 'debug.copyStackTrace'; +export const REVERSE_CONTINUE_ID = 'workbench.action.debug.reverseContinue'; +export const STEP_BACK_ID = 'workbench.action.debug.stepBack'; +export const RESTART_SESSION_ID = 'workbench.action.debug.restart'; +export const TERMINATE_THREAD_ID = 'workbench.action.debug.terminateThread'; +export const STEP_OVER_ID = 'workbench.action.debug.stepOver'; +export const STEP_INTO_ID = 'workbench.action.debug.stepInto'; +export const STEP_OUT_ID = 'workbench.action.debug.stepOut'; +export const PAUSE_ID = 'workbench.action.debug.pause'; +export const DISCONNECT_ID = 'workbench.action.debug.disconnect'; +export const STOP_ID = 'workbench.action.debug.stop'; +export const RESTART_FRAME_ID = 'workbench.action.debug.restartFrame'; +export const CONTINUE_ID = 'workbench.action.debug.continue'; +export const FOCUS_REPL_ID = 'workbench.debug.action.focusRepl'; + +function getThreadAndRun(accessor: ServicesAccessor, thread: IThread | undefined, run: (thread: IThread) => Promise, ): void { + const debugService = accessor.get(IDebugService); + if (!(thread instanceof Thread)) { + thread = debugService.getViewModel().focusedThread; + } + + if (thread) { + run(thread).then(undefined, onUnexpectedError); + } +} export function registerCommands(): void { + CommandsRegistry.registerCommand({ + id: COPY_STACK_TRACE_ID, + handler: (accessor: ServicesAccessor, _: string, frame: IStackFrame) => { + const textResourcePropertiesService = accessor.get(ITextResourcePropertiesService); + const clipboardService = accessor.get(IClipboardService); + const eol = textResourcePropertiesService.getEOL(frame.source.uri); + clipboardService.writeText(frame.thread.getCallStack().map(sf => sf.toString()).join(eol)); + } + }); + + CommandsRegistry.registerCommand({ + id: REVERSE_CONTINUE_ID, + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.reverseContinue()); + } + }); + + CommandsRegistry.registerCommand({ + id: STEP_BACK_ID, + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.stepBack()); + } + }); + + CommandsRegistry.registerCommand({ + id: TERMINATE_THREAD_ID, + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.terminate()); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: RESTART_SESSION_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.Shift | KeyMod.CtrlCmd | KeyCode.F5, + when: CONTEXT_IN_DEBUG_MODE, + handler: (accessor: ServicesAccessor, _: string, session: IDebugSession | undefined) => { + const debugService = accessor.get(IDebugService); + if (!session || !session.getId) { + session = debugService.getViewModel().focusedSession; + } + + if (!session) { + const historyService = accessor.get(IHistoryService); + startDebugging(debugService, historyService, false); + } else { + session.removeReplExpressions(); + debugService.restartSession(session).then(undefined, onUnexpectedError); + } + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: STEP_OVER_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.F10, + when: CONTEXT_DEBUG_STATE.isEqualTo('stopped'), + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.next()); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: STEP_INTO_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.F11, + when: CONTEXT_DEBUG_STATE.isEqualTo('stopped'), + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.stepIn()); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: STEP_OUT_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.Shift | KeyCode.F11, + when: CONTEXT_DEBUG_STATE.isEqualTo('stopped'), + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.stepOut()); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: PAUSE_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.F6, + when: CONTEXT_DEBUG_STATE.isEqualTo('running'), + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.pause()); + } + }); + + CommandsRegistry.registerCommand({ + id: DISCONNECT_ID, + handler: (accessor: ServicesAccessor) => { + const debugService = accessor.get(IDebugService); + const session = debugService.getViewModel().focusedSession; + debugService.stopSession(session).then(undefined, onUnexpectedError); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: STOP_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyMod.Shift | KeyCode.F5, + when: CONTEXT_IN_DEBUG_MODE, + handler: (accessor: ServicesAccessor, _: string, session: IDebugSession | undefined) => { + const debugService = accessor.get(IDebugService); + if (!session || !session.getId) { + session = debugService.getViewModel().focusedSession; + } + + debugService.stopSession(session).then(undefined, onUnexpectedError); + } + }); + + CommandsRegistry.registerCommand({ + id: RESTART_FRAME_ID, + handler: (accessor: ServicesAccessor, _: string, frame: IStackFrame | undefined) => { + const debugService = accessor.get(IDebugService); + if (!frame) { + frame = debugService.getViewModel().focusedStackFrame; + } + + return frame!.restart(); + } + }); + + KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: CONTINUE_ID, + weight: KeybindingWeight.WorkbenchContrib, + primary: KeyCode.F5, + when: CONTEXT_IN_DEBUG_MODE, + handler: (accessor: ServicesAccessor, _: string, thread: IThread | undefined) => { + getThreadAndRun(accessor, thread, thread => thread.continue()); + } + }); + + CommandsRegistry.registerCommand({ + id: FOCUS_REPL_ID, + handler: (accessor) => { + const panelService = accessor.get(IPanelService); + panelService.openPanel(REPL_ID, true); + } + }); + CommandsRegistry.registerCommand({ id: 'debug.startFromConfig', handler: (accessor, config: IConfig) => { diff --git a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts index b31f47a638..eebecb50b5 100644 --- a/src/vs/workbench/contrib/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts @@ -9,8 +9,8 @@ import { IAction } from 'vs/base/common/actions'; import * as DOM from 'vs/base/browser/dom'; import { IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { ViewContainerViewlet } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, VIEWLET_ID, State, BREAKPOINTS_VIEW_ID, IDebugConfiguration } from 'vs/workbench/contrib/debug/common/debug'; -import { StartAction, ToggleReplAction, ConfigureAction, SelectAndStartAction, FocusSessionAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { IDebugService, VIEWLET_ID, State, BREAKPOINTS_VIEW_ID, IDebugConfiguration, REPL_ID } from 'vs/workbench/contrib/debug/common/debug'; +import { StartAction, ConfigureAction, SelectAndStartAction, FocusSessionAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { StartDebugActionItem, FocusSessionActionItem } from 'vs/workbench/contrib/debug/browser/debugActionItems'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -31,6 +31,8 @@ import { IMenu, MenuId, IMenuService, MenuItemAction } from 'vs/platform/actions import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { MenuItemActionItem } from 'vs/platform/actions/browser/menuItemActionItem'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { TogglePanelAction } from 'vs/workbench/browser/panel'; +import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; export class DebugViewlet extends ViewContainerViewlet { @@ -193,3 +195,15 @@ export class DebugViewlet extends ViewContainerViewlet { } } } + +class ToggleReplAction extends TogglePanelAction { + static readonly ID = 'debug.toggleRepl'; + static LABEL = nls.localize({ comment: ['Debug is a noun in this context, not a verb.'], key: 'debugConsoleAction' }, 'Debug Console'); + + constructor(id: string, label: string, + @IWorkbenchLayoutService layoutService: IWorkbenchLayoutService, + @IPanelService panelService: IPanelService + ) { + super(id, label, REPL_ID, panelService, layoutService, 'debug-action toggle-repl'); + } +} diff --git a/src/vs/workbench/contrib/debug/browser/repl.ts b/src/vs/workbench/contrib/debug/browser/repl.ts index a87ec8f2b6..50adf8350a 100644 --- a/src/vs/workbench/contrib/debug/browser/repl.ts +++ b/src/vs/workbench/contrib/debug/browser/repl.ts @@ -52,7 +52,6 @@ import { renderExpressionValue } from 'vs/workbench/contrib/debug/browser/baseDe import { handleANSIOutput } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { ILabelService } from 'vs/platform/label/common/label'; import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; -import { ReplCollapseAllAction, CopyAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { removeAnsiEscapeCodes } from 'vs/base/common/strings'; @@ -452,12 +451,19 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati private onContextMenu(e: ITreeContextMenuEvent): void { const actions: IAction[] = []; - actions.push(new CopyAction(CopyAction.ID, CopyAction.LABEL, this.clipboardService)); + actions.push(new Action('debug.replCopy', nls.localize('copy', "Copy"), undefined, true, () => { + this.clipboardService.writeText(window.getSelection().toString()); + return Promise.resolve(); + })); actions.push(new Action('workbench.debug.action.copyAll', nls.localize('copyAll', "Copy All"), undefined, true, () => { this.clipboardService.writeText(this.getVisibleContent()); return Promise.resolve(undefined); })); - actions.push(new ReplCollapseAllAction(this.tree, this.replInput)); + actions.push(new Action('debug.collapseRepl', nls.localize('collapse', "Collapse All"), undefined, true, () => { + this.tree.collapseAll(); + this.replInput.focus(); + return Promise.resolve(); + })); actions.push(new Separator()); actions.push(this.clearReplAction); diff --git a/src/vs/workbench/contrib/debug/browser/variablesView.ts b/src/vs/workbench/contrib/debug/browser/variablesView.ts index 15bd550a03..09155a6270 100644 --- a/src/vs/workbench/contrib/debug/browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/browser/variablesView.ts @@ -13,8 +13,8 @@ import { Variable, Scope } 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'; -import { IAction } from 'vs/base/common/actions'; -import { SetValueAction, AddToWatchExpressionsAction, CopyValueAction, CopyEvaluatePathAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { IAction, Action } from 'vs/base/common/actions'; +import { CopyValueAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; @@ -27,6 +27,7 @@ import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { onUnexpectedError } from 'vs/base/common/errors'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; import { HighlightedLabel, IHighlight } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; +import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; const $ = dom.$; @@ -45,6 +46,7 @@ export class VariablesView extends ViewletPanel { @IKeybindingService keybindingService: IKeybindingService, @IConfigurationService configurationService: IConfigurationService, @IInstantiationService private readonly instantiationService: IInstantiationService, + @IClipboardService private readonly clipboardService: IClipboardService ) { super({ ...(options as IViewletPanelOptions), ariaHeaderLabel: nls.localize('variablesSection', "Variables Section") }, keybindingService, contextMenuService, configurationService); @@ -129,20 +131,33 @@ export class VariablesView extends ViewletPanel { } private onContextMenu(e: ITreeContextMenuEvent): void { - const element = e.element; - if (element instanceof Variable && !!element.value) { + const variable = e.element; + if (variable instanceof Variable && !!variable.value) { const actions: IAction[] = []; - const variable = element as Variable; - actions.push(new SetValueAction(SetValueAction.ID, SetValueAction.LABEL, variable, this.debugService, this.keybindingService)); + const session = this.debugService.getViewModel().focusedSession; + if (session && session.capabilities.supportsSetVariable) { + actions.push(new Action('workbench.setValue', nls.localize('setValue', "Set Value"), undefined, true, () => { + this.debugService.getViewModel().setSelectedExpression(variable); + return Promise.resolve(); + })); + } actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, variable, 'variables')); - actions.push(this.instantiationService.createInstance(CopyEvaluatePathAction, CopyEvaluatePathAction.ID, CopyEvaluatePathAction.LABEL, variable)); - actions.push(new Separator()); - actions.push(new AddToWatchExpressionsAction(AddToWatchExpressionsAction.ID, AddToWatchExpressionsAction.LABEL, variable, this.debugService, this.keybindingService)); + if (variable.evaluateName) { + actions.push(new Action('debug.copyEvaluatePath', nls.localize('copyAsExpression', "Copy as Expression"), undefined, true, () => { + this.clipboardService.writeText(variable.evaluateName!); + return Promise.resolve(); + })); + actions.push(new Separator()); + actions.push(new Action('debug.addToWatchExpressions', nls.localize('addToWatchExpressions', "Add to Watch"), undefined, true, () => { + this.debugService.addWatchExpression(variable.evaluateName); + return Promise.resolve(undefined); + })); + } this.contextMenuService.showContextMenu({ getAnchor: () => e.anchor, getActions: () => actions, - getActionsContext: () => element + getActionsContext: () => variable }); } } diff --git a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts index db9266c0e5..37f6f2c424 100644 --- a/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/browser/watchExpressionsView.ts @@ -10,11 +10,11 @@ import { CollapseAction } from 'vs/workbench/browser/viewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IDebugService, IExpression, CONTEXT_WATCH_EXPRESSIONS_FOCUSED } from 'vs/workbench/contrib/debug/common/debug'; import { Expression, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; -import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, EditWatchExpressionAction, RemoveWatchExpressionAction, CopyValueAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, CopyValueAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { IAction } from 'vs/base/common/actions'; +import { IAction, Action } from 'vs/base/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { renderExpressionValue, renderViewTree, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -144,13 +144,19 @@ export class WatchExpressionsView extends ViewletPanel { if (element instanceof Expression) { const expression = element; actions.push(new AddWatchExpressionAction(AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); - actions.push(new EditWatchExpressionAction(EditWatchExpressionAction.ID, EditWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new Action('debug.editWatchExpression', nls.localize('editWatchExpression', "Edit Expression"), undefined, true, () => { + this.debugService.getViewModel().setSelectedExpression(expression); + return Promise.resolve(); + })); if (!expression.hasChildren) { actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, expression.value, 'watch', this.debugService)); } actions.push(new Separator()); - actions.push(new RemoveWatchExpressionAction(RemoveWatchExpressionAction.ID, RemoveWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); + actions.push(new Action('debug.removeWatchExpression', nls.localize('removeWatchExpression', "Remove Expression"), undefined, true, () => { + this.debugService.removeWatchExpressions(expression.getId()); + return Promise.resolve(); + })); actions.push(new RemoveAllWatchExpressionsAction(RemoveAllWatchExpressionsAction.ID, RemoveAllWatchExpressionsAction.LABEL, this.debugService, this.keybindingService)); } else { actions.push(new AddWatchExpressionAction(AddWatchExpressionAction.ID, AddWatchExpressionAction.LABEL, this.debugService, this.keybindingService)); diff --git a/src/vs/workbench/contrib/debug/common/abstractDebugAdapter.ts b/src/vs/workbench/contrib/debug/common/abstractDebugAdapter.ts new file mode 100644 index 0000000000..53c93567d9 --- /dev/null +++ b/src/vs/workbench/contrib/debug/common/abstractDebugAdapter.ts @@ -0,0 +1,161 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Emitter, Event } from 'vs/base/common/event'; +import { IDebugAdapter } from 'vs/workbench/contrib/debug/common/debug'; + +/** + * Abstract implementation of the low level API for a debug adapter. + * Missing is how this API communicates with the debug adapter. + */ +export abstract class AbstractDebugAdapter implements IDebugAdapter { + + private sequence: number; + private pendingRequests: Map void>; + private requestCallback: (request: DebugProtocol.Request) => void; + private eventCallback: (request: DebugProtocol.Event) => void; + private messageCallback: (message: DebugProtocol.ProtocolMessage) => void; + protected readonly _onError: Emitter; + protected readonly _onExit: Emitter; + + constructor() { + this.sequence = 1; + this.pendingRequests = new Map(); + this._onError = new Emitter(); + this._onExit = new Emitter(); + } + + abstract startSession(): Promise; + + abstract stopSession(): Promise; + + abstract sendMessage(message: DebugProtocol.ProtocolMessage): void; + + get onError(): Event { + return this._onError.event; + } + + get onExit(): Event { + return this._onExit.event; + } + + onMessage(callback: (message: DebugProtocol.ProtocolMessage) => void): void { + if (this.eventCallback) { + this._onError.fire(new Error(`attempt to set more than one 'Message' callback`)); + } + this.messageCallback = callback; + } + + onEvent(callback: (event: DebugProtocol.Event) => void): void { + if (this.eventCallback) { + this._onError.fire(new Error(`attempt to set more than one 'Event' callback`)); + } + this.eventCallback = callback; + } + + onRequest(callback: (request: DebugProtocol.Request) => void): void { + if (this.requestCallback) { + this._onError.fire(new Error(`attempt to set more than one 'Request' callback`)); + } + this.requestCallback = callback; + } + + sendResponse(response: DebugProtocol.Response): void { + if (response.seq > 0) { + this._onError.fire(new Error(`attempt to send more than one response for command ${response.command}`)); + } + else { + this.internalSend('response', response); + } + } + + sendRequest(command: string, args: any, clb: (result: DebugProtocol.Response) => void, timeout?: number): void { + const request: any = { + command: command + }; + if (args && Object.keys(args).length > 0) { + request.arguments = args; + } + this.internalSend('request', request); + if (typeof timeout === 'number') { + const timer = setTimeout(() => { + clearTimeout(timer); + const clb = this.pendingRequests.get(request.seq); + if (clb) { + this.pendingRequests.delete(request.seq); + const err: DebugProtocol.Response = { + type: 'response', + seq: 0, + request_seq: request.seq, + success: false, + command, + message: `timeout after ${timeout} ms` + }; + clb(err); + } + }, timeout); + } + if (clb) { + // store callback for this request + this.pendingRequests.set(request.seq, clb); + } + } + + acceptMessage(message: DebugProtocol.ProtocolMessage): void { + if (this.messageCallback) { + this.messageCallback(message); + } + else { + switch (message.type) { + case 'event': + if (this.eventCallback) { + this.eventCallback(message); + } + break; + case 'request': + if (this.requestCallback) { + this.requestCallback(message); + } + break; + case 'response': + const response = message; + const clb = this.pendingRequests.get(response.request_seq); + if (clb) { + this.pendingRequests.delete(response.request_seq); + clb(response); + } + break; + } + } + } + + private internalSend(typ: 'request' | 'response' | 'event', message: DebugProtocol.ProtocolMessage): void { + message.type = typ; + message.seq = this.sequence++; + this.sendMessage(message); + } + + protected cancelPending() { + const pending = this.pendingRequests; + this.pendingRequests = new Map(); + setTimeout(_ => { + pending.forEach((callback, request_seq) => { + const err: DebugProtocol.Response = { + type: 'response', + seq: 0, + request_seq, + success: false, + command: 'canceled', + message: 'canceled' + }; + callback(err); + }); + }, 1000); + } + + dispose(): void { + this.cancelPending(); + } +} diff --git a/src/vs/workbench/contrib/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts index 4ece65c5d6..f4179dbaa8 100644 --- a/src/vs/workbench/contrib/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -53,6 +53,7 @@ export const CONTEXT_LOADED_SCRIPTS_SUPPORTED = new RawContextKey('load export const CONTEXT_LOADED_SCRIPTS_ITEM_TYPE = new RawContextKey('loadedScriptsItemType', undefined); export const CONTEXT_FOCUSED_SESSION_IS_ATTACH = new RawContextKey('focusedSessionIsAttach', false); export const CONTEXT_STEP_BACK_SUPPORTED = new RawContextKey('stepBackSupported', false); +export const CONTEXT_RESTART_FRAME_SUPPORTED = new RawContextKey('restartFrameSupported', false); export const EDITOR_CONTRIBUTION_ID = 'editor.contrib.debug'; export const DEBUG_SCHEME = 'debug'; diff --git a/src/vs/workbench/contrib/debug/common/debugUtils.ts b/src/vs/workbench/contrib/debug/common/debugUtils.ts index 2233ef90db..f6fe64250f 100644 --- a/src/vs/workbench/contrib/debug/common/debugUtils.ts +++ b/src/vs/workbench/contrib/debug/common/debugUtils.ts @@ -4,13 +4,32 @@ *--------------------------------------------------------------------------------------------*/ import { equalsIgnoreCase } from 'vs/base/common/strings'; -import { IConfig, IDebuggerContribution } from 'vs/workbench/contrib/debug/common/debug'; +import { IConfig, IDebuggerContribution, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { URI as uri } from 'vs/base/common/uri'; import { isAbsolute } from 'vs/base/common/path'; import { deepClone } from 'vs/base/common/objects'; +import { IHistoryService } from 'vs/workbench/services/history/common/history'; +import { first } from 'vs/base/common/arrays'; const _formatPIIRegexp = /{([^}]+)}/g; +export function startDebugging(debugService: IDebugService, historyService: IHistoryService, noDebug: boolean, ): Promise { + const configurationManager = debugService.getConfigurationManager(); + let launch = configurationManager.selectedConfiguration.launch; + if (!launch || launch.getConfigurationNames().length === 0) { + const rootUri = historyService.getLastActiveWorkspaceRoot(); + launch = configurationManager.getLaunch(rootUri); + if (!launch || launch.getConfigurationNames().length === 0) { + const launches = configurationManager.getLaunches(); + launch = first(launches, l => !!(l && l.getConfigurationNames().length), launch); + } + + configurationManager.selectConfiguration(launch); + } + + return debugService.startDebugging(launch, undefined, noDebug); +} + export function formatPII(value: string, excludePII: boolean, args: { [key: string]: string }): string { return value.replace(_formatPIIRegexp, function (match, group) { if (excludePII && group.length > 0 && group[0] !== '_') { diff --git a/src/vs/workbench/contrib/debug/common/debugViewModel.ts b/src/vs/workbench/contrib/debug/common/debugViewModel.ts index 81c03bf7b8..84b33596ec 100644 --- a/src/vs/workbench/contrib/debug/common/debugViewModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugViewModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event, Emitter } from 'vs/base/common/event'; -import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IDebugSession, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH } from 'vs/workbench/contrib/debug/common/debug'; +import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IDebugSession, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_RESTART_FRAME_SUPPORTED } from 'vs/workbench/contrib/debug/common/debug'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; @@ -26,6 +26,7 @@ export class ViewModel implements IViewModel { private loadedScriptsSupportedContextKey: IContextKey; private stepBackSupportedContextKey: IContextKey; private focusedSessionIsAttach: IContextKey; + private restartFrameSupportedContextKey: IContextKey; constructor(contextKeyService: IContextKeyService) { this._onDidFocusSession = new Emitter(); @@ -37,6 +38,7 @@ export class ViewModel implements IViewModel { this.loadedScriptsSupportedContextKey = CONTEXT_LOADED_SCRIPTS_SUPPORTED.bindTo(contextKeyService); this.stepBackSupportedContextKey = CONTEXT_STEP_BACK_SUPPORTED.bindTo(contextKeyService); this.focusedSessionIsAttach = CONTEXT_FOCUSED_SESSION_IS_ATTACH.bindTo(contextKeyService); + this.restartFrameSupportedContextKey = CONTEXT_RESTART_FRAME_SUPPORTED.bindTo(contextKeyService); } getId(): string { @@ -65,6 +67,7 @@ export class ViewModel implements IViewModel { this.loadedScriptsSupportedContextKey.set(session ? !!session.capabilities.supportsLoadedSourcesRequest : false); this.stepBackSupportedContextKey.set(session ? !!session.capabilities.supportsStepBack : false); + this.restartFrameSupportedContextKey.set(session ? !!session.capabilities.supportsRestartFrame : false); const attach = !!session && session.configuration.request === 'attach' && !isExtensionHostDebugging(session.configuration); this.focusedSessionIsAttach.set(attach); diff --git a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts index 2d1c88b9d4..1005d295c5 100644 --- a/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts @@ -10,7 +10,7 @@ import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { Registry } from 'vs/platform/registry/common/platform'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { KeybindingWeight, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; +import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionRegistryExtensions } from 'vs/workbench/common/actions'; import { ShowViewletAction, Extensions as ViewletExtensions, ViewletRegistry, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; @@ -22,19 +22,16 @@ import { CallStackView } from 'vs/workbench/contrib/debug/browser/callStackView' import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IDebugService, VIEWLET_ID, REPL_ID, CONTEXT_IN_DEBUG_MODE, INTERNAL_CONSOLE_OPTIONS_SCHEMA, - CONTEXT_DEBUG_STATE, VARIABLES_VIEW_ID, CALLSTACK_VIEW_ID, WATCH_VIEW_ID, BREAKPOINTS_VIEW_ID, VIEW_CONTAINER, LOADED_SCRIPTS_VIEW_ID, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_STEP_BACK_SUPPORTED, + CONTEXT_DEBUG_STATE, VARIABLES_VIEW_ID, CALLSTACK_VIEW_ID, WATCH_VIEW_ID, BREAKPOINTS_VIEW_ID, VIEW_CONTAINER, LOADED_SCRIPTS_VIEW_ID, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_CALLSTACK_ITEM_TYPE, CONTEXT_RESTART_FRAME_SUPPORTED, } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { DebugEditorModelManager } from 'vs/workbench/contrib/debug/browser/debugEditorModelManager'; -import { - StepOverAction, FocusReplAction, StepIntoAction, StepOutAction, StartAction, RestartAction, ContinueAction, StopAction, DisconnectAction, PauseAction, AddFunctionBreakpointAction, - ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction, TerminateThreadAction, StepBackAction, ReverseContinueAction, -} from 'vs/workbench/contrib/debug/browser/debugActions'; +import { StartAction, AddFunctionBreakpointAction, ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { DebugToolbar } from 'vs/workbench/contrib/debug/browser/debugToolbar'; import * as service from 'vs/workbench/contrib/debug/electron-browser/debugService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { registerCommands, ADD_CONFIGURATION_ID, TOGGLE_INLINE_BREAKPOINT_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; +import { registerCommands, ADD_CONFIGURATION_ID, TOGGLE_INLINE_BREAKPOINT_ID, COPY_STACK_TRACE_ID, REVERSE_CONTINUE_ID, STEP_BACK_ID, RESTART_SESSION_ID, TERMINATE_THREAD_ID, STEP_OVER_ID, STEP_INTO_ID, STEP_OUT_ID, PAUSE_ID, DISCONNECT_ID, STOP_ID, RESTART_FRAME_ID, CONTINUE_ID, FOCUS_REPL_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { StatusBarColorProvider } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; import { IViewsRegistry, Extensions as ViewExtensions } from 'vs/workbench/common/views'; @@ -119,6 +116,8 @@ viewsRegistry.registerViews([{ id: CALLSTACK_VIEW_ID, name: nls.localize('callSt viewsRegistry.registerViews([{ id: BREAKPOINTS_VIEW_ID, name: nls.localize('breakpoints', "Breakpoints"), ctorDescriptor: { ctor: BreakpointsView }, order: 40, weight: 20, canToggleVisibility: true, focusCommand: { id: 'workbench.debug.action.focusBreakpointsView' } }], VIEW_CONTAINER); viewsRegistry.registerViews([{ id: LOADED_SCRIPTS_VIEW_ID, name: nls.localize('loadedScripts', "Loaded Scripts"), ctorDescriptor: { ctor: LoadedScriptsView }, order: 35, weight: 5, canToggleVisibility: true, collapsed: true, when: CONTEXT_LOADED_SCRIPTS_SUPPORTED }], VIEW_CONTAINER); +registerCommands(); + // register action to open viewlet const registry = Registry.as(WorkbenchActionRegistryExtensions.WorkbenchActions); registry.registerWorkbenchAction(new SyncActionDescriptor(OpenDebugPanelAction, OpenDebugPanelAction.ID, OpenDebugPanelAction.LABEL, openPanelKb), 'View: Debug Console', nls.localize('view', "View")); @@ -132,15 +131,6 @@ Registry.as(WorkbenchExtensions.Workbench).regi const debugCategory = nls.localize('debugCategory', "Debug"); registry.registerWorkbenchAction(new SyncActionDescriptor(StartAction, StartAction.ID, StartAction.LABEL, { primary: KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE.toNegated()), 'Debug: Start Debugging', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(StepOverAction, StepOverAction.ID, StepOverAction.LABEL, { primary: KeyCode.F10 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Step Over', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(StepIntoAction, StepIntoAction.ID, StepIntoAction.LABEL, { primary: KeyCode.F11 }, CONTEXT_IN_DEBUG_MODE, KeybindingWeight.WorkbenchContrib + 1), 'Debug: Step Into', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(StepOutAction, StepOutAction.ID, StepOutAction.LABEL, { primary: KeyMod.Shift | KeyCode.F11 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Step Out', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(RestartAction, RestartAction.ID, RestartAction.LABEL, { primary: KeyMod.Shift | KeyMod.CtrlCmd | KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Restart', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(StopAction, StopAction.ID, StopAction.LABEL, { primary: KeyMod.Shift | KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Stop', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(DisconnectAction, DisconnectAction.ID, DisconnectAction.LABEL), 'Debug: Disconnect', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(ContinueAction, ContinueAction.ID, ContinueAction.LABEL, { primary: KeyCode.F5 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Continue', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(PauseAction, PauseAction.ID, PauseAction.LABEL, { primary: KeyCode.F6 }, CONTEXT_IN_DEBUG_MODE), 'Debug: Pause', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(TerminateThreadAction, TerminateThreadAction.ID, TerminateThreadAction.LABEL, undefined, CONTEXT_IN_DEBUG_MODE), 'Debug: Terminate Thread', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ConfigureAction, ConfigureAction.ID, ConfigureAction.LABEL), 'Debug: Open launch.json', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(AddFunctionBreakpointAction, AddFunctionBreakpointAction.ID, AddFunctionBreakpointAction.LABEL), 'Debug: Add Function Breakpoint', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ReapplyBreakpointsAction, ReapplyBreakpointsAction.ID, ReapplyBreakpointsAction.LABEL), 'Debug: Reapply All Breakpoints', debugCategory); @@ -148,10 +138,38 @@ registry.registerWorkbenchAction(new SyncActionDescriptor(RunAction, RunAction.I registry.registerWorkbenchAction(new SyncActionDescriptor(RemoveAllBreakpointsAction, RemoveAllBreakpointsAction.ID, RemoveAllBreakpointsAction.LABEL), 'Debug: Remove All Breakpoints', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(EnableAllBreakpointsAction, EnableAllBreakpointsAction.ID, EnableAllBreakpointsAction.LABEL), 'Debug: Enable All Breakpoints', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(DisableAllBreakpointsAction, DisableAllBreakpointsAction.ID, DisableAllBreakpointsAction.LABEL), 'Debug: Disable All Breakpoints', debugCategory); -registry.registerWorkbenchAction(new SyncActionDescriptor(FocusReplAction, FocusReplAction.ID, FocusReplAction.LABEL), 'Debug: Focus on Debug Console View', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(SelectAndStartAction, SelectAndStartAction.ID, SelectAndStartAction.LABEL), 'Debug: Select and Start Debugging', debugCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ClearReplAction, ClearReplAction.ID, ClearReplAction.LABEL), 'Debug: Clear Console', debugCategory); +const registerDebugCommandPaletteItem = (id: string, title: string, when?: ContextKeyExpr, precondition?: ContextKeyExpr) => { + MenuRegistry.appendMenuItem(MenuId.CommandPalette, { + when, + command: { + id, + title: `Debug: ${title}`, + precondition + } + }); +}; +const restartLabel = nls.localize('restartDebug', "Restart"); +const stepOverLabel = nls.localize('stepOverDebug', "Step Over"); +const stepIntoLabel = nls.localize('stepIntoDebug', "Step Into"); +const stepOutLabel = nls.localize('stepOutDebug', "Step Out"); +const pauseLabel = nls.localize('pauseDebug', "Pause"); +const disconnectLabel = nls.localize('disconnect', "Disconnect"); +const stopLabel = nls.localize('stop', "Stop"); +const continueLabel = nls.localize('continueDebug', "Continue"); +registerDebugCommandPaletteItem(RESTART_SESSION_ID, restartLabel); +registerDebugCommandPaletteItem(TERMINATE_THREAD_ID, nls.localize('terminateThread', "Terminate Thread"), CONTEXT_IN_DEBUG_MODE); +registerDebugCommandPaletteItem(STEP_OVER_ID, stepOverLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCommandPaletteItem(STEP_INTO_ID, stepIntoLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCommandPaletteItem(STEP_OUT_ID, stepOutLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCommandPaletteItem(PAUSE_ID, pauseLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE.isEqualTo('running')); +registerDebugCommandPaletteItem(DISCONNECT_ID, disconnectLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_FOCUSED_SESSION_IS_ATTACH); +registerDebugCommandPaletteItem(STOP_ID, stopLabel, CONTEXT_IN_DEBUG_MODE, CONTEXT_FOCUSED_SESSION_IS_ATTACH.toNegated()); +registerDebugCommandPaletteItem(CONTINUE_ID, continueLabel, 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')); + // Register Quick Open (Registry.as(QuickOpenExtensions.Quickopen)).registerQuickOpenHandler( new QuickOpenHandlerDescriptor( @@ -235,8 +253,6 @@ configurationRegistry.registerConfiguration({ } }); -registerCommands(); - // Register Debug Status const statusBar = Registry.as(StatusExtensions.Statusbar); statusBar.registerStatusbarItem(new StatusbarItemDescriptor(DebugStatus, StatusbarAlignment.LEFT, 30 /* Low Priority */)); @@ -260,16 +276,40 @@ const registerDebugToolbarItem = (id: string, title: string, icon: string, order }); }; -registerDebugToolbarItem(ContinueAction.ID, ContinueAction.LABEL, 'continue', 10, CONTEXT_DEBUG_STATE.notEqualsTo('running')); -registerDebugToolbarItem(PauseAction.ID, PauseAction.LABEL, 'pause', 10, CONTEXT_DEBUG_STATE.isEqualTo('running')); -registerDebugToolbarItem(StopAction.ID, StopAction.LABEL, 'stop', 70, CONTEXT_FOCUSED_SESSION_IS_ATTACH.toNegated()); -registerDebugToolbarItem(DisconnectAction.ID, DisconnectAction.LABEL, 'disconnect', 70, CONTEXT_FOCUSED_SESSION_IS_ATTACH); -registerDebugToolbarItem(StepOverAction.ID, StepOverAction.LABEL, 'step-over', 20, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); -registerDebugToolbarItem(StepIntoAction.ID, StepIntoAction.LABEL, 'step-into', 30, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); -registerDebugToolbarItem(StepOutAction.ID, StepOutAction.LABEL, 'step-out', 40, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); -registerDebugToolbarItem(RestartAction.ID, RestartAction.LABEL, 'restart', 60); -registerDebugToolbarItem(StepBackAction.ID, StepBackAction.LABEL, 'step-back', 50, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); -registerDebugToolbarItem(ReverseContinueAction.ID, ReverseContinueAction.LABEL, 'reverse-continue', 60, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugToolbarItem(CONTINUE_ID, continueLabel, 'continue', 10, CONTEXT_DEBUG_STATE.notEqualsTo('running')); +registerDebugToolbarItem(PAUSE_ID, pauseLabel, 'pause', 10, CONTEXT_DEBUG_STATE.isEqualTo('running')); +registerDebugToolbarItem(STOP_ID, stopLabel, 'stop', 70, CONTEXT_FOCUSED_SESSION_IS_ATTACH.toNegated()); +registerDebugToolbarItem(DISCONNECT_ID, disconnectLabel, 'disconnect', 70, CONTEXT_FOCUSED_SESSION_IS_ATTACH); +registerDebugToolbarItem(STEP_OVER_ID, stepOverLabel, 'step-over', 20, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugToolbarItem(STEP_INTO_ID, stepIntoLabel, 'step-into', 30, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugToolbarItem(STEP_OUT_ID, stepOutLabel, 'step-out', 40, undefined, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugToolbarItem(RESTART_SESSION_ID, restartLabel, 'restart', 60); +registerDebugToolbarItem(STEP_BACK_ID, nls.localize('stepBackDebug', "Step Back"), 'step-back', 50, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugToolbarItem(REVERSE_CONTINUE_ID, nls.localize('reverseContinue', "Reverse"), 'reverse-continue', 60, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped')); + +// Debug callstack context menu +const registerDebugCallstackItem = (id: string, title: string, order: number, when?: ContextKeyExpr, precondition?: ContextKeyExpr, group = 'navigation') => { + MenuRegistry.appendMenuItem(MenuId.DebugCallStackContext, { + group, + when, + order, + command: { + id, + title, + precondition + } + }); +}; +registerDebugCallstackItem(RESTART_SESSION_ID, restartLabel, 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session')); +registerDebugCallstackItem(STOP_ID, stopLabel, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session')); +registerDebugCallstackItem(PAUSE_ID, pauseLabel, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('running'))); +registerDebugCallstackItem(CONTINUE_ID, continueLabel, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'))); +registerDebugCallstackItem(STEP_OVER_ID, stepOverLabel, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCallstackItem(STEP_INTO_ID, stepIntoLabel, 30, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCallstackItem(STEP_OUT_ID, stepOutLabel, 40, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped')); +registerDebugCallstackItem(TERMINATE_THREAD_ID, nls.localize('terminateThread', "Terminate Thread"), 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), undefined, 'termination'); +registerDebugCallstackItem(RESTART_FRAME_ID, nls.localize('restartFrame', "Restart Frame"), 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'), CONTEXT_RESTART_FRAME_SUPPORTED)); +registerDebugCallstackItem(COPY_STACK_TRACE_ID, nls.localize('copyStackTrace', "Copy Call Stack"), 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame')); // View menu @@ -318,7 +358,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '1_debug', command: { - id: StopAction.ID, + id: STOP_ID, title: nls.localize({ key: 'miStopDebugging', comment: ['&& denotes a mnemonic'] }, "&&Stop Debugging"), precondition: CONTEXT_IN_DEBUG_MODE }, @@ -328,7 +368,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '1_debug', command: { - id: RestartAction.ID, + id: RESTART_SESSION_ID, title: nls.localize({ key: 'miRestart Debugging', comment: ['&& denotes a mnemonic'] }, "&&Restart Debugging"), precondition: CONTEXT_IN_DEBUG_MODE }, @@ -358,7 +398,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '3_step', command: { - id: StepOverAction.ID, + id: STEP_OVER_ID, title: nls.localize({ key: 'miStepOver', comment: ['&& denotes a mnemonic'] }, "Step &&Over"), precondition: CONTEXT_DEBUG_STATE.isEqualTo('stopped') }, @@ -368,7 +408,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '3_step', command: { - id: StepIntoAction.ID, + id: STEP_INTO_ID, title: nls.localize({ key: 'miStepInto', comment: ['&& denotes a mnemonic'] }, "Step &&Into"), precondition: CONTEXT_DEBUG_STATE.isEqualTo('stopped') }, @@ -378,7 +418,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '3_step', command: { - id: StepOutAction.ID, + id: STEP_OUT_ID, title: nls.localize({ key: 'miStepOut', comment: ['&& denotes a mnemonic'] }, "Step O&&ut"), precondition: CONTEXT_DEBUG_STATE.isEqualTo('stopped') }, @@ -388,7 +428,7 @@ MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { MenuRegistry.appendMenuItem(MenuId.MenubarDebugMenu, { group: '3_step', command: { - id: ContinueAction.ID, + id: CONTINUE_ID, title: nls.localize({ key: 'miContinue', comment: ['&& denotes a mnemonic'] }, "&&Continue"), precondition: CONTEXT_DEBUG_STATE.isEqualTo('stopped') }, @@ -502,11 +542,11 @@ if (isMacintosh) { registerTouchBarEntry(StartAction.ID, StartAction.LABEL, 0, CONTEXT_IN_DEBUG_MODE.toNegated(), 'continue-tb.png'); registerTouchBarEntry(RunAction.ID, RunAction.LABEL, 1, CONTEXT_IN_DEBUG_MODE.toNegated(), 'continue-without-debugging-tb.png'); - registerTouchBarEntry(ContinueAction.ID, ContinueAction.LABEL, 0, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'continue-tb.png'); - registerTouchBarEntry(PauseAction.ID, PauseAction.LABEL, 1, ContextKeyExpr.and(CONTEXT_IN_DEBUG_MODE, ContextKeyExpr.notEquals('debugState', 'stopped')), 'pause-tb.png'); - registerTouchBarEntry(StepOverAction.ID, StepOverAction.LABEL, 2, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepover-tb.png'); - registerTouchBarEntry(StepIntoAction.ID, StepIntoAction.LABEL, 3, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepinto-tb.png'); - registerTouchBarEntry(StepOutAction.ID, StepOutAction.LABEL, 4, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepout-tb.png'); - registerTouchBarEntry(RestartAction.ID, RestartAction.LABEL, 5, CONTEXT_IN_DEBUG_MODE, 'restart-tb.png'); - registerTouchBarEntry(StopAction.ID, StopAction.LABEL, 6, CONTEXT_IN_DEBUG_MODE, 'stop-tb.png'); + registerTouchBarEntry(CONTINUE_ID, continueLabel, 0, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'continue-tb.png'); + registerTouchBarEntry(PAUSE_ID, pauseLabel, 1, ContextKeyExpr.and(CONTEXT_IN_DEBUG_MODE, ContextKeyExpr.notEquals('debugState', 'stopped')), 'pause-tb.png'); + registerTouchBarEntry(STEP_OVER_ID, stepOverLabel, 2, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepover-tb.png'); + registerTouchBarEntry(STEP_INTO_ID, stepIntoLabel, 3, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepinto-tb.png'); + registerTouchBarEntry(STEP_OUT_ID, stepOutLabel, 4, CONTEXT_DEBUG_STATE.isEqualTo('stopped'), 'stepout-tb.png'); + registerTouchBarEntry(RESTART_SESSION_ID, restartLabel, 5, CONTEXT_IN_DEBUG_MODE, 'restart-tb.png'); + registerTouchBarEntry(STOP_ID, stopLabel, 6, CONTEXT_IN_DEBUG_MODE, 'stop-tb.png'); } diff --git a/src/vs/workbench/contrib/debug/node/debugAdapter.ts b/src/vs/workbench/contrib/debug/node/debugAdapter.ts index 9c767aae3c..6602ce0c0f 100644 --- a/src/vs/workbench/contrib/debug/node/debugAdapter.ts +++ b/src/vs/workbench/contrib/debug/node/debugAdapter.ts @@ -12,170 +12,11 @@ import * as path from 'vs/base/common/path'; import * as strings from 'vs/base/common/strings'; import * as objects from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; -import { Emitter, Event } from 'vs/base/common/event'; import { ExtensionsChannelId } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IOutputService } from 'vs/workbench/contrib/output/common/output'; -import { IDebugAdapter, IDebugAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IDebugAdapterServer } from 'vs/workbench/contrib/debug/common/debug'; +import { IDebugAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IDebugAdapterServer } from 'vs/workbench/contrib/debug/common/debug'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; - -/** - * Abstract implementation of the low level API for a debug adapter. - * Missing is how this API communicates with the debug adapter. - */ -export abstract class AbstractDebugAdapter implements IDebugAdapter { - - private sequence: number; - private pendingRequests: Map void>; - private requestCallback: (request: DebugProtocol.Request) => void; - private eventCallback: (request: DebugProtocol.Event) => void; - private messageCallback: (message: DebugProtocol.ProtocolMessage) => void; - - protected readonly _onError: Emitter; - protected readonly _onExit: Emitter; - - constructor() { - this.sequence = 1; - this.pendingRequests = new Map(); - - this._onError = new Emitter(); - this._onExit = new Emitter(); - } - - abstract startSession(): Promise; - abstract stopSession(): Promise; - - abstract sendMessage(message: DebugProtocol.ProtocolMessage): void; - - get onError(): Event { - return this._onError.event; - } - - get onExit(): Event { - return this._onExit.event; - } - - onMessage(callback: (message: DebugProtocol.ProtocolMessage) => void): void { - if (this.eventCallback) { - this._onError.fire(new Error(`attempt to set more than one 'Message' callback`)); - } - this.messageCallback = callback; - } - - onEvent(callback: (event: DebugProtocol.Event) => void): void { - if (this.eventCallback) { - this._onError.fire(new Error(`attempt to set more than one 'Event' callback`)); - } - this.eventCallback = callback; - } - - onRequest(callback: (request: DebugProtocol.Request) => void): void { - if (this.requestCallback) { - this._onError.fire(new Error(`attempt to set more than one 'Request' callback`)); - } - this.requestCallback = callback; - } - - sendResponse(response: DebugProtocol.Response): void { - if (response.seq > 0) { - this._onError.fire(new Error(`attempt to send more than one response for command ${response.command}`)); - } else { - this.internalSend('response', response); - } - } - - sendRequest(command: string, args: any, clb: (result: DebugProtocol.Response) => void, timeout?: number): void { - - const request: any = { - command: command - }; - if (args && Object.keys(args).length > 0) { - request.arguments = args; - } - - this.internalSend('request', request); - - if (typeof timeout === 'number') { - const timer = setTimeout(() => { - clearTimeout(timer); - const clb = this.pendingRequests.get(request.seq); - if (clb) { - this.pendingRequests.delete(request.seq); - const err: DebugProtocol.Response = { - type: 'response', - seq: 0, - request_seq: request.seq, - success: false, - command, - message: `timeout after ${timeout} ms` - }; - clb(err); - } - }, timeout); - } - - if (clb) { - // store callback for this request - this.pendingRequests.set(request.seq, clb); - } - } - - acceptMessage(message: DebugProtocol.ProtocolMessage): void { - if (this.messageCallback) { - this.messageCallback(message); - } else { - switch (message.type) { - case 'event': - if (this.eventCallback) { - this.eventCallback(message); - } - break; - case 'request': - if (this.requestCallback) { - this.requestCallback(message); - } - break; - case 'response': - const response = message; - const clb = this.pendingRequests.get(response.request_seq); - if (clb) { - this.pendingRequests.delete(response.request_seq); - clb(response); - } - break; - } - } - } - - private internalSend(typ: 'request' | 'response' | 'event', message: DebugProtocol.ProtocolMessage): void { - - message.type = typ; - message.seq = this.sequence++; - - this.sendMessage(message); - } - - protected cancelPending() { - const pending = this.pendingRequests; - this.pendingRequests = new Map(); - setTimeout(_ => { - pending.forEach((callback, request_seq) => { - const err: DebugProtocol.Response = { - type: 'response', - seq: 0, - request_seq, - success: false, - command: 'canceled', - message: 'canceled' - }; - callback(err); - }); - }, 1000); - } - - dispose(): void { - this.cancelPending(); - } -} +import { AbstractDebugAdapter } from '../common/abstractDebugAdapter'; /** * An implementation that communicates via two streams with the debug adapter. diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts index 32547c6392..930bd9c12f 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts @@ -155,6 +155,7 @@ export class RecommendationWidget extends ExtensionWidget { super(); this.render(); this._register(toDisposable(() => this.clear())); + this._register(this.extensionTipsService.onRecommendationChange(() => this.render())); } private clear(): void { @@ -172,27 +173,22 @@ export class RecommendationWidget extends ExtensionWidget { if (!this.extension) { return; } - const updateRecommendationMarker = () => { - this.clear(); - const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason(); - if (extRecommendations[this.extension.identifier.id.toLowerCase()]) { - this.element = append(this.parent, $('div.bookmark')); - const recommendation = append(this.element, $('.recommendation')); - append(recommendation, $('span.octicon.octicon-star')); - const applyBookmarkStyle = (theme) => { - const bgColor = theme.getColor(extensionButtonProminentBackground); - const fgColor = theme.getColor(extensionButtonProminentForeground); - recommendation.style.borderTopColor = bgColor ? bgColor.toString() : 'transparent'; - recommendation.style.color = fgColor ? fgColor.toString() : 'white'; - }; - applyBookmarkStyle(this.themeService.getTheme()); - this.themeService.onThemeChange(applyBookmarkStyle, this, this.disposables); - this.parent.title = extRecommendations[this.extension.identifier.id.toLowerCase()].reasonText; - this.parent.setAttribute('aria-label', localize('viewRecommendedExtensionDetailsAria', "{0}. {1} Press enter for extension details.", this.extension.displayName, extRecommendations[this.extension.identifier.id.toLowerCase()].reasonText)); - } - }; - updateRecommendationMarker(); - this.extensionTipsService.onRecommendationChange(() => updateRecommendationMarker(), this, this.disposables); + const extRecommendations = this.extensionTipsService.getAllRecommendationsWithReason(); + if (extRecommendations[this.extension.identifier.id.toLowerCase()]) { + this.element = append(this.parent, $('div.bookmark')); + const recommendation = append(this.element, $('.recommendation')); + append(recommendation, $('span.octicon.octicon-star')); + const applyBookmarkStyle = (theme) => { + const bgColor = theme.getColor(extensionButtonProminentBackground); + const fgColor = theme.getColor(extensionButtonProminentForeground); + recommendation.style.borderTopColor = bgColor ? bgColor.toString() : 'transparent'; + recommendation.style.color = fgColor ? fgColor.toString() : 'white'; + }; + applyBookmarkStyle(this.themeService.getTheme()); + this.themeService.onThemeChange(applyBookmarkStyle, this, this.disposables); + this.parent.title = extRecommendations[this.extension.identifier.id.toLowerCase()].reasonText; + this.parent.setAttribute('aria-label', localize('viewRecommendedExtensionDetailsAria', "{0}. {1} Press enter for extension details.", this.extension.displayName, extRecommendations[this.extension.identifier.id.toLowerCase()].reasonText)); + } } } diff --git a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index d049e46469..88b3b31e84 100644 --- a/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -76,7 +76,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor private columnItems: ColumnItem[] = []; private keybindingsListContainer: HTMLElement; - private unAssignedKeybindingItemToRevealAndFocus: IKeybindingItemEntry; + private unAssignedKeybindingItemToRevealAndFocus: IKeybindingItemEntry | null; private listEntries: IListEntry[]; private keybindingsList: List; @@ -109,7 +109,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor ) { super(KeybindingsEditor.ID, telemetryService, themeService, storageService); this.delayedFiltering = new Delayer(300); - this._register(keybindingsService.onDidUpdateKeybindings(() => this.render(true, CancellationToken.None))); + this._register(keybindingsService.onDidUpdateKeybindings(() => this.render(true))); this.keybindingsEditorContextKey = CONTEXT_KEYBINDINGS_EDITOR.bindTo(this.contextKeyService); this.searchFocusContextKey = CONTEXT_KEYBINDINGS_SEARCH_FOCUS.bindTo(this.contextKeyService); @@ -129,7 +129,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor setInput(input: KeybindingsEditorInput, options: EditorOptions, token: CancellationToken): Promise { this.keybindingsEditorContextKey.set(true); return super.setInput(input, options, token) - .then(() => this.render(!!(options && options.preserveFocus), token)); + .then(() => this.render(!!(options && options.preserveFocus))); } clearInput(): void { @@ -173,7 +173,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor } } - get activeKeybindingEntry(): IKeybindingItemEntry { + get activeKeybindingEntry(): IKeybindingItemEntry | null { const focusedElement = this.keybindingsList.getFocusedElements()[0]; return focusedElement && focusedElement.templateId === KEYBINDING_ENTRY_TEMPLATE_ID ? focusedElement : null; } @@ -252,7 +252,7 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor this.selectEntry(keybinding); this.reportKeybindingAction(KEYBINDINGS_EDITOR_COMMAND_COPY, keybinding.keybindingItem.command, keybinding.keybindingItem.keybinding); const userFriendlyKeybinding: IUserFriendlyKeybinding = { - key: keybinding.keybindingItem.keybinding ? keybinding.keybindingItem.keybinding.getUserSettingsLabel() : '', + key: keybinding.keybindingItem.keybinding ? keybinding.keybindingItem.keybinding.getUserSettingsLabel() || '' : '', command: keybinding.keybindingItem.command }; if (keybinding.keybindingItem.when) { @@ -454,45 +454,35 @@ export class KeybindingsEditor extends BaseEditor implements IKeybindingsEditor DOM.removeClass(this.keybindingsList.getHTMLElement(), 'focused'); this.keybindingFocusContextKey.reset(); })); - this._register(this.keybindingsList.onMouseDblClick(() => this.defineKeybinding(this.activeKeybindingEntry))); + this._register(this.keybindingsList.onMouseDblClick(() => { + const activeKeybindingEntry = this.activeKeybindingEntry; + if (activeKeybindingEntry) { + this.defineKeybinding(activeKeybindingEntry); + } + })); this._register(this.keybindingsList.onKeyDown(e => { const event = new StandardKeyboardEvent(e); if (event.keyCode === KeyCode.Enter) { const keybindingEntry = this.activeKeybindingEntry; if (keybindingEntry) { - this.defineKeybinding(this.activeKeybindingEntry); + this.defineKeybinding(keybindingEntry); } e.stopPropagation(); } })); } - private render(preserveFocus: boolean, token: CancellationToken): Promise { + private async render(preserveFocus: boolean): Promise { if (this.input) { - return this.input.resolve() - .then((keybindingsModel: KeybindingsEditorModel) => { - if (token.isCancellationRequested) { - return undefined; - } - - this.keybindingsEditorModel = keybindingsModel; - - const editorActionsLabels: { [id: string]: string; } = EditorExtensionsRegistry.getEditorActions().reduce((editorActions, editorAction) => { - editorActions[editorAction.id] = editorAction.label; - return editorActions; - }, {}); - - return this.keybindingsEditorModel.resolve(editorActionsLabels); - }) - .then(() => { - if (token.isCancellationRequested) { - return undefined; - } - - this.renderKeybindingsEntries(false, preserveFocus); - }); + const input: KeybindingsEditorInput = this.input as KeybindingsEditorInput; + this.keybindingsEditorModel = await input.resolve(); + const editorActionsLabels: { [id: string]: string; } = EditorExtensionsRegistry.getEditorActions().reduce((editorActions, editorAction) => { + editorActions[editorAction.id] = editorAction.label; + return editorActions; + }, {}); + await this.keybindingsEditorModel.resolve(editorActionsLabels); + this.renderKeybindingsEntries(false, preserveFocus); } - return Promise.resolve(); } private filterKeybindings(): void { @@ -1105,7 +1095,7 @@ class WhenColumn extends Column { this.element.title = ''; } this.onDidAccept(() => { - this.keybindingsEditor.updateKeybinding(keybindingItemEntry, keybindingItemEntry.keybindingItem.keybinding ? keybindingItemEntry.keybindingItem.keybinding.getUserSettingsLabel() : '', this.whenInput.value); + this.keybindingsEditor.updateKeybinding(keybindingItemEntry, keybindingItemEntry.keybindingItem.keybinding ? keybindingItemEntry.keybindingItem.keybinding.getUserSettingsLabel() || '' : '', this.whenInput.value); this.keybindingsEditor.selectKeybinding(keybindingItemEntry); }, this, this.disposables); this.onDidReject(() => { diff --git a/src/vs/workbench/contrib/preferences/common/preferences.ts b/src/vs/workbench/contrib/preferences/common/preferences.ts index 86e459eb6a..5df7443e4f 100644 --- a/src/vs/workbench/contrib/preferences/common/preferences.ts +++ b/src/vs/workbench/contrib/preferences/common/preferences.ts @@ -45,7 +45,7 @@ export interface ISearchProvider { export interface IKeybindingsEditor extends IEditor { - readonly activeKeybindingEntry: IKeybindingItemEntry; + readonly activeKeybindingEntry: IKeybindingItemEntry | null; readonly onDefineWhenExpression: Event; readonly onLayout: Event; diff --git a/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts index 91b4060c8c..b0b5b30d98 100644 --- a/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts @@ -227,7 +227,20 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control && control instanceof KeybindingsEditor) { - control.defineKeybinding(control.activeKeybindingEntry); + control.defineKeybinding(control.activeKeybindingEntry!); + } + } +}); + +KeybindingsRegistry.registerCommandAndKeybindingRule({ + id: KEYBINDINGS_EDITOR_COMMAND_DEFINE_WHEN, + weight: KeybindingWeight.WorkbenchContrib, + when: ContextKeyExpr.and(CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDING_FOCUS), + primary: KeyChord(KeyMod.CtrlCmd | KeyCode.KEY_K, KeyMod.CtrlCmd | KeyCode.KEY_E), + handler: (accessor, args: any) => { + const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; + if (control && control instanceof KeybindingsEditor && control.activeKeybindingEntry!.keybindingItem.keybinding) { + control.defineWhenExpression(control.activeKeybindingEntry!); } } }); @@ -256,7 +269,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control && control instanceof KeybindingsEditor) { - control.removeKeybinding(control.activeKeybindingEntry); + control.removeKeybinding(control.activeKeybindingEntry!); } } }); @@ -269,7 +282,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control && control instanceof KeybindingsEditor) { - control.resetKeybinding(control.activeKeybindingEntry); + control.resetKeybinding(control.activeKeybindingEntry!); } } }); @@ -323,7 +336,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control) { - control.showSimilarKeybindings(control.activeKeybindingEntry); + control.showSimilarKeybindings(control.activeKeybindingEntry!); } } }); @@ -336,7 +349,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control) { - control.copyKeybinding(control.activeKeybindingEntry); + control.copyKeybinding(control.activeKeybindingEntry!); } } }); @@ -349,7 +362,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ handler: (accessor, args: any) => { const control = accessor.get(IEditorService).activeControl as IKeybindingsEditor; if (control) { - control.copyKeybindingCommand(control.activeKeybindingEntry); + control.copyKeybindingCommand(control.activeKeybindingEntry!); } } }); diff --git a/src/vs/workbench/contrib/search/browser/media/searchview.css b/src/vs/workbench/contrib/search/browser/media/searchview.css index 19c83963a0..cc9ea5a5cb 100644 --- a/src/vs/workbench/contrib/search/browser/media/searchview.css +++ b/src/vs/workbench/contrib/search/browser/media/searchview.css @@ -393,6 +393,6 @@ line-height: 20px; } -.vs .panel .search-view .monaco-inputbox { +.vs .search-panel .search-view .monaco-inputbox { border: 1px solid #ddd; } diff --git a/src/vs/workbench/contrib/search/browser/search.contribution.ts b/src/vs/workbench/contrib/search/browser/search.contribution.ts index c8f8e0bc47..b4290b8ca3 100644 --- a/src/vs/workbench/contrib/search/browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/browser/search.contribution.ts @@ -3,13 +3,10 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/search.contribution'; - import { Action } from 'vs/base/common/actions'; import { distinct } from 'vs/base/common/arrays'; import { illegalArgument } from 'vs/base/common/errors'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { Schemas } from 'vs/base/common/network'; import * as objects from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; import { dirname } from 'vs/base/common/resources'; @@ -32,32 +29,31 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IListService, WorkbenchListFocusContextKey, WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ISearchConfigurationProperties, ISearchConfiguration, VIEWLET_ID, PANEL_ID, VIEW_ID, VIEW_CONTAINER } from 'vs/workbench/services/search/common/search'; +import { Extensions as PanelExtensions, PanelDescriptor, PanelRegistry } from 'vs/workbench/browser/panel'; import { defaultQuickOpenContextKey } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { Extensions as QuickOpenExtensions, IQuickOpenRegistry, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; +import { Extensions as ViewletExtensions, ViewletDescriptor, ViewletRegistry } from 'vs/workbench/browser/viewlet'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; -import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { ResourceContextKey } from 'vs/workbench/common/resources'; +import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; +import { Extensions as ViewExtensions, IViewsRegistry } from 'vs/workbench/common/views'; import { getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; import { ExplorerFolderContext, ExplorerRootContext, FilesExplorerFocusCondition } from 'vs/workbench/contrib/files/common/files'; import { OpenAnythingHandler } from 'vs/workbench/contrib/search/browser/openAnythingHandler'; import { OpenSymbolHandler } from 'vs/workbench/contrib/search/browser/openSymbolHandler'; import { registerContributions as replaceContributions } from 'vs/workbench/contrib/search/browser/replaceContributions'; import { clearHistoryCommand, ClearSearchResultsAction, CloseReplaceAction, CollapseDeepestExpandedLevelAction, copyAllCommand, copyMatchCommand, copyPathCommand, FindInFilesAction, FocusNextInputAction, FocusNextSearchResultAction, FocusPreviousInputAction, FocusPreviousSearchResultAction, focusSearchListCommand, getSearchView, openSearchView, OpenSearchViewletAction, RefreshAction, RemoveAction, ReplaceAction, ReplaceAllAction, ReplaceAllInFolderAction, ReplaceInFilesAction, toggleCaseSensitiveCommand, toggleRegexCommand, toggleWholeWordCommand } from 'vs/workbench/contrib/search/browser/searchActions'; +import { SearchPanel } from 'vs/workbench/contrib/search/browser/searchPanel'; +import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; +import { SearchViewlet } from 'vs/workbench/contrib/search/browser/searchViewlet'; import { registerContributions as searchWidgetContributions } from 'vs/workbench/contrib/search/browser/searchWidget'; import * as Constants from 'vs/workbench/contrib/search/common/constants'; import { getWorkspaceSymbols } from 'vs/workbench/contrib/search/common/search'; +import { ISearchHistoryService, SearchHistoryService } from 'vs/workbench/contrib/search/common/searchHistoryService'; import { FileMatchOrMatch, ISearchWorkbenchService, RenderableMatch, SearchWorkbenchService } from 'vs/workbench/contrib/search/common/searchModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; +import { ISearchConfiguration, ISearchConfigurationProperties, PANEL_ID, VIEWLET_ID, VIEW_CONTAINER, VIEW_ID } from 'vs/workbench/services/search/common/search'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor } from 'vs/workbench/browser/panel'; -import { ViewletDescriptor, ViewletRegistry, Extensions as ViewletExtensions } from 'vs/workbench/browser/viewlet'; -import { ISearchHistoryService, SearchHistoryService } from 'vs/workbench/contrib/search/common/searchHistoryService'; -import { SearchViewlet } from 'vs/workbench/contrib/search/browser/searchViewlet'; -import { SearchPanel } from 'vs/workbench/contrib/search/browser/searchPanel'; -import { IViewsRegistry, Extensions as ViewExtensions } from 'vs/workbench/common/views'; -import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; registerSingleton(ISearchWorkbenchService, SearchWorkbenchService, true); registerSingleton(ISearchHistoryService, SearchHistoryService, true); @@ -365,15 +361,15 @@ const searchInFolderCommand: ICommandHandler = (accessor, resource?: URI) => { const panelService = accessor.get(IPanelService); const fileService = accessor.get(IFileService); const configurationService = accessor.get(IConfigurationService); - const resources = getMultiSelectedResources(resource, listService, accessor.get(IEditorService)); + const resources = resource && getMultiSelectedResources(resource, listService, accessor.get(IEditorService)); return openSearchView(viewletService, panelService, configurationService, true).then(searchView => { - if (resources && resources.length) { + if (resources && resources.length && searchView) { return fileService.resolveFiles(resources.map(resource => ({ resource }))).then(results => { const folders: URI[] = []; results.forEach(result => { - if (result.success) { + if (result.success && result.stat) { folders.push(result.stat.isDirectory ? result.stat.resource : dirname(result.stat.resource)); } }); @@ -390,7 +386,7 @@ const FIND_IN_FOLDER_ID = 'filesExplorer.findInFolder'; KeybindingsRegistry.registerCommandAndKeybindingRule({ id: FIND_IN_FOLDER_ID, weight: KeybindingWeight.WorkbenchContrib, - when: ContextKeyExpr.and(FilesExplorerFocusCondition, ExplorerFolderContext, ResourceContextKey.Scheme.isEqualTo(Schemas.file)), // todo@remote + when: ContextKeyExpr.and(FilesExplorerFocusCondition, ExplorerFolderContext), primary: KeyMod.Shift | KeyMod.Alt | KeyCode.KEY_F, handler: searchInFolderCommand }); @@ -414,7 +410,9 @@ CommandsRegistry.registerCommand({ id: FIND_IN_WORKSPACE_ID, handler: (accessor) => { return openSearchView(accessor.get(IViewletService), accessor.get(IPanelService), accessor.get(IConfigurationService), true).then(searchView => { - searchView.searchInFolders(null); + if (searchView) { + searchView.searchInFolders(); + } }); } }); @@ -426,7 +424,7 @@ MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { id: FIND_IN_FOLDER_ID, title: nls.localize('findInFolder', "Find in Folder...") }, - when: ContextKeyExpr.and(ExplorerFolderContext, ResourceContextKey.Scheme.isEqualTo(Schemas.file)) // todo@remote + when: ContextKeyExpr.and(ExplorerFolderContext) }); MenuRegistry.appendMenuItem(MenuId.ExplorerContext, { @@ -456,7 +454,7 @@ class ShowAllSymbolsAction extends Action { run(context?: any): Promise { let prefix = ShowAllSymbolsAction.ALL_SYMBOLS_PREFIX; - let inputSelection: { start: number; end: number; } = undefined; + let inputSelection: { start: number; end: number; } | undefined = undefined; const editor = this.editorService.getFocusedCodeEditor(); const word = editor && getSelectionSearchString(editor); if (word) { diff --git a/src/vs/workbench/contrib/search/browser/searchActions.ts b/src/vs/workbench/contrib/search/browser/searchActions.ts index 086b47f878..48a8df8e72 100644 --- a/src/vs/workbench/contrib/search/browser/searchActions.ts +++ b/src/vs/workbench/contrib/search/browser/searchActions.ts @@ -52,14 +52,15 @@ export function appendKeyBindingLabel(label: string, inputKeyBinding: number | R } } -export function openSearchView(viewletService: IViewletService, panelService: IPanelService, configurationService: IConfigurationService, focus?: boolean): Promise { +export function openSearchView(viewletService: IViewletService, panelService: IPanelService, configurationService: IConfigurationService, focus?: boolean): Promise { if (configurationService.getValue().search.location === 'panel') { return Promise.resolve((panelService.openPanel(PANEL_ID, focus) as SearchPanel).getSearchView()); } + return viewletService.openViewlet(VIEWLET_ID, focus).then(viewlet => (viewlet as SearchViewlet).getSearchView()); } -export function getSearchView(viewletService: IViewletService, panelService: IPanelService): SearchView | null { +export function getSearchView(viewletService: IViewletService, panelService: IPanelService): SearchView | undefined { const activeViewlet = viewletService.getActiveViewlet(); if (activeViewlet && activeViewlet.getId() === VIEWLET_ID) { return (activeViewlet as SearchViewlet).getSearchView(); @@ -149,11 +150,13 @@ export abstract class FindOrReplaceInFilesAction extends Action { run(): Promise { return openSearchView(this.viewletService, this.panelService, this.configurationService, false).then(openedView => { - const searchAndReplaceWidget = openedView.searchAndReplaceWidget; - searchAndReplaceWidget.toggleReplace(this.expandSearchReplaceWidget); + if (openedView) { + const searchAndReplaceWidget = openedView.searchAndReplaceWidget; + searchAndReplaceWidget.toggleReplace(this.expandSearchReplaceWidget); - const updatedText = openedView.updateTextFromSelection(!this.expandSearchReplaceWidget); - openedView.searchAndReplaceWidget.focus(undefined, updatedText, updatedText); + const updatedText = openedView.updateTextFromSelection(!this.expandSearchReplaceWidget); + openedView.searchAndReplaceWidget.focus(undefined, updatedText, updatedText); + } }); } } @@ -240,7 +243,7 @@ export class RefreshAction extends Action { static readonly ID: string = 'search.action.refreshSearchResults'; static LABEL: string = nls.localize('RefreshAction.label', "Refresh"); - private searchView: SearchView | null; + private searchView: SearchView | undefined; constructor(id: string, label: string, @IViewletService private readonly viewletService: IViewletService, @@ -394,7 +397,9 @@ export class FocusNextSearchResultAction extends Action { run(): Promise { return openSearchView(this.viewletService, this.panelService, this.configurationService).then(searchView => { - searchView.selectNextMatch(); + if (searchView) { + searchView.selectNextMatch(); + } }); } } @@ -413,7 +418,9 @@ export class FocusPreviousSearchResultAction extends Action { run(): Promise { return openSearchView(this.viewletService, this.panelService, this.configurationService).then(searchView => { - searchView.selectPreviousMatch(); + if (searchView) { + searchView.selectPreviousMatch(); + } }); } } @@ -771,6 +778,8 @@ export const focusSearchListCommand: ICommandHandler = accessor => { const panelService = accessor.get(IPanelService); const configurationService = accessor.get(IConfigurationService); openSearchView(viewletService, panelService, configurationService).then(searchView => { - searchView.moveFocusToResults(); + if (searchView) { + searchView.moveFocusToResults(); + } }); }; diff --git a/src/vs/workbench/contrib/search/browser/searchPanel.ts b/src/vs/workbench/contrib/search/browser/searchPanel.ts index d589eb2c94..c40912b0ae 100644 --- a/src/vs/workbench/contrib/search/browser/searchPanel.ts +++ b/src/vs/workbench/contrib/search/browser/searchPanel.ts @@ -31,7 +31,7 @@ export class SearchPanel extends Panel { } create(parent: HTMLElement): void { - dom.addClass(parent, 'monaco-panel-view'); + dom.addClasses(parent, 'monaco-panel-view', 'search-panel'); this.searchView.render(); dom.append(parent, this.searchView.element); this.searchView.setExpanded(true); @@ -64,7 +64,7 @@ export class SearchPanel extends Panel { super.saveState(); } - getSearchView(): SearchView | null { + getSearchView(): SearchView { return this.searchView; } } diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index 8f940b0a95..aabb27070b 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -115,13 +115,13 @@ export class SearchView extends ViewletPanel { private inputPatternIncludes: PatternInputWidget; private resultsElement: HTMLElement; - private currentSelectedFileMatch: FileMatch; + private currentSelectedFileMatch: FileMatch | undefined; private readonly selectCurrentMatchEmitter: Emitter; private delayedRefresh: Delayer; private changedWhileHidden: boolean; - private searchWithoutFolderMessageElement: HTMLElement; + private searchWithoutFolderMessageElement: HTMLElement | undefined; private currentSearchQ = Promise.resolve(); @@ -474,7 +474,7 @@ export class SearchView extends ViewletPanel { }); } - private createFolderIterator(folderMatch: FolderMatch, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterator> { + private createFolderIterator(folderMatch: BaseFolderMatch, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterator> { const filesIt = Iterator.fromArray( folderMatch.matches() .sort(searchMatchComparer)); @@ -797,7 +797,7 @@ export class SearchView extends ViewletPanel { updateTextFromSelection(allowUnselectedWord = true): boolean { let updatedText = false; - const seedSearchStringFromSelection = this.configurationService.getValue('editor').find.seedSearchStringFromSelection; + const seedSearchStringFromSelection = this.configurationService.getValue('editor').find!.seedSearchStringFromSelection; if (seedSearchStringFromSelection) { let selectedText = this.getSearchTextFromEditor(allowUnselectedWord); if (selectedText) { @@ -1074,7 +1074,7 @@ export class SearchView extends ViewletPanel { } } - searchInFolders(resources: URI[]): void { + searchInFolders(resources?: URI[]): void { const folderPaths: string[] = []; const workspace = this.contextService.getWorkspace(); @@ -1338,7 +1338,7 @@ export class SearchView extends ViewletPanel { const onError = (e: any) => { if (errors.isPromiseCanceledError(e)) { - return onComplete(null); + return onComplete(undefined); } else { this.searching = false; this.updateActions(); @@ -1422,7 +1422,7 @@ export class SearchView extends ViewletPanel { this.openSettings('.exclude'); } - private openSettings(query: string): Promise { + private openSettings(query: string): Promise { const options: ISettingsEditorOptions = { query }; return this.contextService.getWorkbenchState() !== WorkbenchState.EMPTY ? this.preferencesService.openWorkspaceSettings(undefined, options) : @@ -1480,7 +1480,7 @@ export class SearchView extends ViewletPanel { const actionClass = env.isMacintosh ? OpenFileFolderAction : OpenFolderAction; const action = this.instantiationService.createInstance(actionClass, actionClass.ID, actionClass.LABEL); - this.actionRunner.run(action).then(() => { + this.actionRunner!.run(action).then(() => { action.dispose(); }, err => { action.dispose(); @@ -1499,7 +1499,7 @@ export class SearchView extends ViewletPanel { // this.replaceService.disposeAllReplacePreviews(); dom.hide(this.messagesElement); dom.show(this.resultsElement); - this.currentSelectedFileMatch = null; + this.currentSelectedFileMatch = undefined; } private onFocus(lineMatch: any, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { @@ -1514,7 +1514,7 @@ export class SearchView extends ViewletPanel { this.open(lineMatch, preserveFocus, sideBySide, pinned); } - open(element: FileMatchOrMatch, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { + open(element: FileMatchOrMatch, preserveFocus?: boolean, sideBySide?: boolean, pinned?: boolean): Promise { const selection = this.getSelectionFrom(element); const resource = element instanceof Match ? element.parent().resource() : (element).resource(); return this.editorService.openEditor({ @@ -1528,7 +1528,7 @@ export class SearchView extends ViewletPanel { }, sideBySide ? SIDE_GROUP : ACTIVE_GROUP).then(editor => { if (editor && element instanceof Match && preserveFocus) { this.viewModel.searchResult.rangeHighlightDecorations.highlightRange( - (editor.getControl()).getModel(), + (editor.getControl()).getModel()!, element.range() ); } else { @@ -1536,9 +1536,7 @@ export class SearchView extends ViewletPanel { } if (editor) { - return this.editorGroupsService.activateGroup(editor.group); - } else { - return Promise.resolve(null); + this.editorGroupsService.activateGroup(editor.group!); } }, errors.onUnexpectedError); } @@ -1714,4 +1712,4 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (outlineSelectionColor) { collector.addRule(`.monaco-workbench .search-view .monaco-list.element-focused .monaco-list-row.focused.selected:not(.highlighted) .action-label:focus { outline-color: ${outlineSelectionColor} }`); } -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/contrib/search/browser/searchViewlet.ts b/src/vs/workbench/contrib/search/browser/searchViewlet.ts index 04ebc835e1..18f516f416 100644 --- a/src/vs/workbench/contrib/search/browser/searchViewlet.ts +++ b/src/vs/workbench/contrib/search/browser/searchViewlet.ts @@ -38,8 +38,8 @@ export class SearchViewlet extends ViewContainerViewlet { return Registry.as(Extensions.Viewlets).getViewlet(this.getId()).name; } - getSearchView(): SearchView | null { + getSearchView(): SearchView | undefined { const view = super.getView(VIEW_ID); - return view ? view as SearchView : null; + return view ? view as SearchView : undefined; } } diff --git a/src/vs/workbench/contrib/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts index c9f6ec1970..42173f92b3 100644 --- a/src/vs/workbench/contrib/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -56,7 +56,7 @@ class ReplaceAllAction extends Action { return ReplaceAllAction.fgInstance; } - private _searchWidget: SearchWidget | null = null; + private _searchWidget: SearchWidget; constructor() { super(ReplaceAllAction.ID, '', 'action-replace-all', false); @@ -113,8 +113,8 @@ export class SearchWidget extends Widget { private _onReplaceStateChange = this._register(new Emitter()); readonly onReplaceStateChange: Event = this._onReplaceStateChange.event; - private _onReplaceValueChanged = this._register(new Emitter()); - readonly onReplaceValueChanged: Event = this._onReplaceValueChanged.event; + private _onReplaceValueChanged = this._register(new Emitter()); + readonly onReplaceValueChanged: Event = this._onReplaceValueChanged.event; private _onReplaceAll = this._register(new Emitter()); readonly onReplaceAll: Event = this._onReplaceAll.event; @@ -343,7 +343,7 @@ export class SearchWidget extends Widget { this._register(attachInputBoxStyler(this.replaceInput, this.themeService)); this.onkeydown(this.replaceInput.inputElement, (keyboardEvent) => this.onReplaceInputKeyDown(keyboardEvent)); this.replaceInput.value = options.replaceValue || ''; - this._register(this.replaceInput.onDidChange(() => this._onReplaceValueChanged.fire(undefined))); + this._register(this.replaceInput.onDidChange(() => this._onReplaceValueChanged.fire())); this._register(this.replaceInput.onDidHeightChange(() => this._onDidHeightChange.fire())); this.replaceAllAction = ReplaceAllAction.INSTANCE; @@ -532,8 +532,6 @@ export class SearchWidget extends Widget { dispose(): void { this.setReplaceAllActionState(false); - this.replaceAllAction.searchWidget = null; - this.replaceActionBar = null; super.dispose(); } diff --git a/src/vs/workbench/contrib/search/common/queryBuilder.ts b/src/vs/workbench/contrib/search/common/queryBuilder.ts index 9a2e199f1f..d5fccc5624 100644 --- a/src/vs/workbench/contrib/search/common/queryBuilder.ts +++ b/src/vs/workbench/contrib/search/common/queryBuilder.ts @@ -18,6 +18,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { getExcludes, ICommonQueryProps, IFileQuery, IFolderQuery, IPatternInfo, ISearchConfiguration, ITextQuery, ITextSearchPreviewOptions, pathIncludedInQuery, QueryType } from 'vs/workbench/services/search/common/search'; +import { Schemas } from 'vs/base/common/network'; /** * One folder to search and a glob expression that should be applied. @@ -320,6 +321,13 @@ export class QueryBuilder { */ private expandOneSearchPath(searchPath: string): IOneSearchPathPattern[] { if (path.isAbsolute(searchPath)) { + const workspaceFolders = this.workspaceContextService.getWorkspace().folders; + if (workspaceFolders[0] && workspaceFolders[0].uri.scheme !== Schemas.file) { + return [{ + searchPath: workspaceFolders[0].uri.with({ path: searchPath }) + }]; + } + // Currently only local resources can be searched for with absolute search paths. // TODO convert this to a workspace folder + pattern, so excludes will be resolved properly for an absolute path inside a workspace folder return [{ diff --git a/src/vs/workbench/contrib/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts index af0b4b2cfd..a2d0afd756 100644 --- a/src/vs/workbench/contrib/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -389,7 +389,7 @@ export class FileMatch extends Disposable { } export interface IChangeEvent { - elements: (FileMatch | FolderMatch | SearchResult | null)[]; + elements: (FileMatch | FolderMatch | SearchResult)[]; added?: boolean; removed?: boolean; } diff --git a/src/vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts b/src/vs/workbench/contrib/tasks/common/jsonSchemaCommon.ts similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts rename to src/vs/workbench/contrib/tasks/common/jsonSchemaCommon.ts diff --git a/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts b/src/vs/workbench/contrib/tasks/common/jsonSchema_v1.ts similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts rename to src/vs/workbench/contrib/tasks/common/jsonSchema_v1.ts diff --git a/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts similarity index 99% rename from src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts rename to src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts index 2d08ac8950..4def955e7a 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/contrib/tasks/common/jsonSchema_v2.ts @@ -10,7 +10,7 @@ import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import commonSchema from './jsonSchemaCommon'; import { ProblemMatcherRegistry } from 'vs/workbench/contrib/tasks/common/problemMatcher'; -import { TaskDefinitionRegistry } from '../common/taskDefinitionRegistry'; +import { TaskDefinitionRegistry } from './taskDefinitionRegistry'; import * as ConfigurationResolverUtils from 'vs/workbench/services/configurationResolver/common/configurationResolverUtils'; import { inputsSchema } from 'vs/workbench/services/configurationResolver/common/configurationResolverSchema'; @@ -440,6 +440,7 @@ processTask.properties!.type = { description: nls.localize('JsonSchema.tasks.type', 'Defines whether the task is run as a process or as a command inside a shell.') }; processTask.required!.push('command'); +processTask.required!.push('type'); taskDefinitions.push(processTask); diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/configure-inverse.svg b/src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/configure-inverse.svg rename to src/vs/workbench/contrib/tasks/common/media/configure-inverse.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/configure.svg b/src/vs/workbench/contrib/tasks/common/media/configure.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/configure.svg rename to src/vs/workbench/contrib/tasks/common/media/configure.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/status-error.svg b/src/vs/workbench/contrib/tasks/common/media/status-error.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/status-error.svg rename to src/vs/workbench/contrib/tasks/common/media/status-error.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/status-info.svg b/src/vs/workbench/contrib/tasks/common/media/status-info.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/status-info.svg rename to src/vs/workbench/contrib/tasks/common/media/status-info.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/status-warning.svg b/src/vs/workbench/contrib/tasks/common/media/status-warning.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/status-warning.svg rename to src/vs/workbench/contrib/tasks/common/media/status-warning.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/task.contribution.css b/src/vs/workbench/contrib/tasks/common/media/task.contribution.css similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/task.contribution.css rename to src/vs/workbench/contrib/tasks/common/media/task.contribution.css diff --git a/src/vs/workbench/contrib/tasks/electron-browser/media/task.svg b/src/vs/workbench/contrib/tasks/common/media/task.svg similarity index 100% rename from src/vs/workbench/contrib/tasks/electron-browser/media/task.svg rename to src/vs/workbench/contrib/tasks/common/media/task.svg diff --git a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts index faa4d1780b..d9320a61a2 100644 --- a/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts @@ -3,7 +3,7 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!./media/task.contribution'; +import 'vs/css!../common/media/task.contribution'; import * as nls from 'vs/nls'; import * as semver from 'semver'; @@ -2701,8 +2701,8 @@ let schema: IJSONSchema = { } }; -import schemaVersion1 from './jsonSchema_v1'; -import schemaVersion2, { updateProblemMatchers } from './jsonSchema_v2'; +import schemaVersion1 from '../common/jsonSchema_v1'; +import schemaVersion2, { updateProblemMatchers } from '../common/jsonSchema_v2'; schema.definitions = { ...schemaVersion1.definitions, ...schemaVersion2.definitions, diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts index 93c32781c5..24ba122cd5 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts @@ -1,6 +1,6 @@ /*--------------------------------------------------------------------------------------------- * 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. *--------------------------------------------------------------------------------------------*/ import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @@ -262,7 +262,7 @@ configurationRegistry.registerConfiguration({ 'terminal.integrated.windowsEnableConpty': { description: nls.localize('terminal.integrated.windowsEnableConpty', "Whether to use ConPTY for Windows terminal process communication (requires Windows 10 build number 18309+). Winpty will be used if this is false."), type: 'boolean', - default: false + default: true } } }); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index e106a92417..da5298a8c9 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -27,6 +27,11 @@ import { IRemoteEnvironmentService } from 'vs/workbench/services/remote/common/r /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; +/** + * The minimum amount of time between latency requests. + */ +const LATENCY_MEASURING_INTERVAL = 1000; + /** * Holds all state related to the creation and management of terminal processes. * @@ -46,6 +51,9 @@ export class TerminalProcessManager implements ITerminalProcessManager { private _process: ITerminalChildProcess | null = null; private _preLaunchInputQueue: string[] = []; private _disposables: IDisposable[] = []; + private _latency: number = -1; + private _latencyRequest: Promise; + private _latencyLastMeasured: number = 0; private readonly _onProcessReady = new Emitter(); public get onProcessReady(): Event { return this._onProcessReady.event; } @@ -77,6 +85,7 @@ export class TerminalProcessManager implements ITerminalProcessManager { c(undefined); }); }); + this.ptyProcessReady.then(async () => await this.getLatency()); } public dispose(immediate: boolean = false): void { @@ -240,6 +249,18 @@ export class TerminalProcessManager implements ITerminalProcessManager { return this._process.getCwd(); } + public async getLatency(): Promise { + if (!this._process) { + return Promise.resolve(0); + } + if (this._latencyLastMeasured === 0 || this._latencyLastMeasured + LATENCY_MEASURING_INTERVAL < Date.now()) { + this._latencyRequest = this._process.getLatency(); + this._latency = await this._latencyRequest; + this._latencyLastMeasured = Date.now(); + } + return Promise.resolve(this._latency); + } + private _onExit(exitCode: number): void { this._process = null; diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index d0369b096b..8c17c1dd7a 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -654,6 +654,7 @@ export interface ITerminalProcessManager extends IDisposable { getInitialCwd(): Promise; getCwd(): Promise; + getLatency(): Promise; } export const enum ProcessState { @@ -685,12 +686,14 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { emitExit(exitCode: number): void; emitInitialCwd(initialCwd: string): void; emitCwd(cwd: string): void; + emitLatency(latency: number): void; onInput: Event; onResize: Event<{ cols: number, rows: number }>; onShutdown: Event; onRequestInitialCwd: Event; onRequestCwd: Event; + onRequestLatency: Event; } export interface ITerminalProcessExtHostRequest { @@ -733,4 +736,5 @@ export interface ITerminalChildProcess { getInitialCwd(): Promise; getCwd(): Promise; -} \ No newline at end of file + getLatency(): Promise; +} diff --git a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts index 89b3984168..22caa9726c 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalProcessExtHostProxy.ts @@ -31,9 +31,12 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm public get onRequestInitialCwd(): Event { return this._onRequestInitialCwd.event; } private readonly _onRequestCwd = new Emitter(); public get onRequestCwd(): Event { return this._onRequestCwd.event; } + private readonly _onRequestLatency = new Emitter(); + public get onRequestLatency(): Event { return this._onRequestLatency.event; } private _pendingInitialCwdRequests: ((value?: string | Thenable) => void)[] = []; private _pendingCwdRequests: ((value?: string | Thenable) => void)[] = []; + private _pendingLatencyRequests: ((value?: number | Thenable) => void)[] = []; constructor( public terminalId: number, @@ -86,6 +89,12 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm } } + public emitLatency(latency: number): void { + while (this._pendingLatencyRequests.length > 0) { + this._pendingLatencyRequests.pop()!(latency); + } + } + public shutdown(immediate: boolean): void { this._onShutdown.fire(immediate); } @@ -111,4 +120,11 @@ export class TerminalProcessExtHostProxy implements ITerminalChildProcess, ITerm this._pendingCwdRequests.push(resolve); }); } + + public getLatency(): Promise { + return new Promise(resolve => { + this._onRequestLatency.fire(); + this._pendingLatencyRequests.push(resolve); + }); + } } \ No newline at end of file diff --git a/src/vs/workbench/contrib/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts index 6f9105113b..27fa8d85ec 100644 --- a/src/vs/workbench/contrib/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -70,7 +70,7 @@ export abstract class TerminalService implements ITerminalService { @INotificationService protected readonly _notificationService: INotificationService, @IDialogService private readonly _dialogService: IDialogService, @IExtensionService private readonly _extensionService: IExtensionService, - @IFileService private readonly _fileService: IFileService + @IFileService protected readonly _fileService: IFileService ) { this._activeTabIndex = 0; this._isShuttingDown = false; diff --git a/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts index 498c180c88..e602915947 100644 --- a/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import * as pfs from 'vs/base/node/pfs'; import * as platform from 'vs/base/common/platform'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -27,6 +26,7 @@ import { coalesce } from 'vs/base/common/arrays'; import { IFileService } from 'vs/platform/files/common/files'; import { escapeNonWindowsPath } from 'vs/workbench/contrib/terminal/common/terminalEnvironment'; import { execFile } from 'child_process'; +import { URI } from 'vs/base/common/uri'; export class TerminalService extends BrowserTerminalService implements ITerminalService { public get configHelper(): ITerminalConfigHelper { return this._configHelper; } @@ -54,7 +54,8 @@ export class TerminalService extends BrowserTerminalService implements ITerminal // the termProgram variable) and we are instructed to wait for editors close, wait for the // marker file to get deleted and then focus back to the integrated terminal. if (request.termProgram === 'vscode' && request.filesToWait) { - pfs.whenDeleted(request.filesToWait.waitMarkerFilePath).then(() => { + const waitMarkerFileUri = URI.revive(request.filesToWait.waitMarkerFileUri); + this.whenDeleted(waitMarkerFileUri).then(() => { if (this.terminalInstances.length > 0) { const terminal = this.getActiveInstance(); if (terminal) { @@ -73,6 +74,27 @@ export class TerminalService extends BrowserTerminalService implements ITerminal }); } + private whenDeleted(path: URI): Promise { + + // Complete when wait marker file is deleted + return new Promise(resolve => { + let running = false; + const interval = setInterval(() => { + if (!running) { + running = true; + this._fileService.existsFile(path).then(exists => { + running = false; + + if (!exists) { + clearInterval(interval); + resolve(undefined); + } + }); + } + }, 1000); + }); + } + protected _getDefaultShell(p: platform.Platform): string { return getDefaultShell(p); } diff --git a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts index c3fe09d7d7..329bde1d01 100644 --- a/src/vs/workbench/contrib/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -213,4 +213,8 @@ export class TerminalProcess implements ITerminalChildProcess, IDisposable { resolve(this._initialCwd); }); } + + public getLatency(): Promise { + return Promise.resolve(0); + } } diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 2fcebd50c4..720f78278e 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -68,8 +68,10 @@ export class WelcomePageContribution implements IWorkbenchContribution { if (openWithReadme) { return Promise.all(contextService.getWorkspace().folders.map(folder => { const folderUri = folder.uri; - return fileService.readFolder(folderUri) - .then(files => { + return fileService.resolveFile(folderUri) + .then(folder => { + const files = folder.children ? folder.children.map(child => child.name) : []; + const file = arrays.find(files.sort(), file => strings.startsWith(file.toLowerCase(), 'readme')); if (file) { return joinPath(folderUri, file); diff --git a/src/vs/workbench/electron-browser/main.contribution.ts b/src/vs/workbench/electron-browser/main.contribution.ts index 99e62dee19..481e69c9a0 100644 --- a/src/vs/workbench/electron-browser/main.contribution.ts +++ b/src/vs/workbench/electron-browser/main.contribution.ts @@ -25,6 +25,9 @@ import { SupportsWorkspacesContext, IsMacContext, HasMacNativeTabsContext, IsDev import { NoEditorsVisibleContext, SingleEditorGroupsContext } from 'vs/workbench/common/editor'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { LogStorageAction } from 'vs/platform/storage/node/storageService'; +import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; +import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; +import { DiskFileSystemSupport } from 'vs/workbench/services/files2/node/diskFileSystemSupport'; // {{SQL CARBON EDIT}} import { InstallVSIXAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; @@ -703,3 +706,10 @@ import { InstallVSIXAction } from 'vs/workbench/contrib/extensions/electron-brow } }); })(); + +// Disk File System +(function registerFileSystem(): void { + const registry = Registry.as(WorkbenchExtensions.Workbench); + + registry.registerWorkbenchContribution(DiskFileSystemSupport, LifecyclePhase.Starting); +})(); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 1ab0af6979..9433b0d275 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -78,7 +78,8 @@ class CodeRendererMain extends Disposable { this.configuration.workspace = reviveWorkspaceIdentifier(this.configuration.workspace); } - const filesToWaitPaths = this.configuration.filesToWait && this.configuration.filesToWait.paths; + const filesToWait = this.configuration.filesToWait; + const filesToWaitPaths = filesToWait && filesToWait.paths; [filesToWaitPaths, this.configuration.filesToOpen, this.configuration.filesToCreate, this.configuration.filesToDiff].forEach(paths => { if (Array.isArray(paths)) { paths.forEach(path => { @@ -88,6 +89,9 @@ class CodeRendererMain extends Disposable { }); } }); + if (filesToWait) { + filesToWait.waitMarkerFileUri = uri.revive(filesToWait.waitMarkerFileUri); + } } open(): Promise { diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index c1a14a1e25..e64542badd 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -229,7 +229,7 @@ export class ElectronWindow extends Disposable { const filesToWait = this.windowService.getConfiguration().filesToWait; if (filesToWait) { const resourcesToWaitFor = coalesce(filesToWait.paths.map(p => p.fileUri)); - const waitMarkerFile = URI.file(filesToWait.waitMarkerFilePath); + const waitMarkerFile = filesToWait.waitMarkerFileUri; const listenerDispose = this.editorService.onDidCloseEditor(() => this.onEditorClosed(listenerDispose, resourcesToWaitFor, waitMarkerFile)); this._register(listenerDispose); @@ -493,7 +493,7 @@ export class ElectronWindow extends Disposable { // are closed that the user wants to wait for. When this happens we delete // the wait marker file to signal to the outside that editing is done. const resourcesToWaitFor = request.filesToWait.paths.map(p => URI.revive(p.fileUri)); - const waitMarkerFile = URI.file(request.filesToWait.waitMarkerFilePath); + const waitMarkerFile = URI.revive(request.filesToWait.waitMarkerFileUri); const unbind = this.editorService.onDidCloseEditor(() => { if (resourcesToWaitFor.every(resource => !this.editorService.isOpen({ resource }))) { unbind.dispose(); diff --git a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts index 2768adbef3..04035b544a 100644 --- a/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts +++ b/src/vs/workbench/services/configurationResolver/browser/configurationResolverService.ts @@ -37,17 +37,17 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic @IQuickInputService private readonly quickInputService: IQuickInputService ) { super({ - getFolderUri: (folderName: string): uri => { + getFolderUri: (folderName: string): uri | undefined => { const folder = workspaceContextService.getWorkspace().folders.filter(f => f.name === folderName).pop(); return folder ? folder.uri : undefined; }, getWorkspaceFolderCount: (): number => { return workspaceContextService.getWorkspace().folders.length; }, - getConfigurationValue: (folderUri: uri, suffix: string) => { - return configurationService.getValue(suffix, folderUri ? { resource: folderUri } : undefined); + getConfigurationValue: (folderUri: uri, suffix: string): string | undefined => { + return configurationService.getValue(suffix, folderUri ? { resource: folderUri } : {}); }, - getExecPath: () => { + getExecPath: (): string | undefined => { return environmentService['execPath']; }, getFilePath: (): string | undefined => { @@ -72,18 +72,21 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic } return undefined; }, - getLineNumber: (): string => { + getLineNumber: (): string | undefined => { const activeTextEditorWidget = editorService.activeTextEditorWidget; if (isCodeEditor(activeTextEditorWidget)) { - const lineNumber = activeTextEditorWidget.getSelection().positionLineNumber; - return String(lineNumber); + const selection = activeTextEditorWidget.getSelection(); + if (selection) { + const lineNumber = selection.positionLineNumber; + return String(lineNumber); + } } return undefined; } }, windowService.getConfiguration().userEnv); } - public resolveWithInteractionReplace(folder: IWorkspaceFolder, config: any, section?: string, variables?: IStringDictionary): Promise { + public resolveWithInteractionReplace(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise { // resolve any non-interactive variables config = this.resolveAny(folder, config); @@ -100,7 +103,7 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic }); } - public resolveWithInteraction(folder: IWorkspaceFolder, config: any, section?: string, variables?: IStringDictionary): Promise> { + public resolveWithInteraction(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise | undefined> { // resolve any non-interactive variables const resolved = this.resolveAnyMap(folder, config); config = resolved.newConfig; @@ -118,7 +121,7 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic /** * Add all items from newMapping to fullMapping. Returns false if newMapping is undefined. */ - private updateMapping(newMapping: IStringDictionary, fullMapping: Map): boolean { + private updateMapping(newMapping: IStringDictionary | undefined, fullMapping: Map): boolean { if (!newMapping) { return false; } @@ -136,15 +139,15 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic * * @param variableToCommandMap Aliases for commands */ - private async resolveWithInputAndCommands(folder: IWorkspaceFolder, configuration: any, variableToCommandMap: IStringDictionary, section: string): Promise> { + private async resolveWithInputAndCommands(folder: IWorkspaceFolder | undefined, configuration: any, variableToCommandMap?: IStringDictionary, section?: string): Promise | undefined> { if (!configuration) { return Promise.resolve(undefined); } // get all "inputs" - let inputs: ConfiguredInput[] = undefined; - if (folder && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY) { + let inputs: ConfiguredInput[] = []; + if (folder && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY && section) { let result = this.configurationService.getValue(section, { resource: folder.uri }); if (result) { inputs = result.inputs; @@ -222,7 +225,7 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic * @param variable Name of the input variable. * @param inputInfos Information about each possible input variable. */ - private showUserInput(variable: string, inputInfos: ConfiguredInput[]): Promise { + private showUserInput(variable: string, inputInfos: ConfiguredInput[]): Promise { // find info for the given input variable const info = inputInfos.filter(item => item.id === variable).pop(); @@ -290,4 +293,4 @@ export class ConfigurationResolverService extends AbstractVariableResolverServic } } -registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); \ No newline at end of file +registerSingleton(IConfigurationResolverService, ConfigurationResolverService, true); diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index 22b05e3037..88baea5936 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -35,7 +35,7 @@ export interface IConfigurationResolverService { * Similar to resolveWithInteractionReplace, except without the replace. Returns a map of variables and their resolution. * Keys in the map will be of the format input:variableName or command:variableName. */ - resolveWithInteraction(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise>; + resolveWithInteraction(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise | undefined>; } export interface PromptStringInputInfo { @@ -60,4 +60,4 @@ export interface CommandInputInfo { args?: any; } -export type ConfiguredInput = PromptStringInputInfo | PickStringInputInfo | CommandInputInfo; \ No newline at end of file +export type ConfiguredInput = PromptStringInputInfo | PickStringInputInfo | CommandInputInfo; diff --git a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts index 41a379af10..ee89a336a3 100644 --- a/src/vs/workbench/services/configurationResolver/common/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/variableResolver.ts @@ -82,11 +82,11 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe return { newConfig, resolvedVariables }; } - public resolveWithInteractionReplace(folder: IWorkspaceFolder, config: any): Promise { + public resolveWithInteractionReplace(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise { throw new Error('resolveWithInteractionReplace not implemented.'); } - public resolveWithInteraction(folder: IWorkspaceFolder, config: any): Promise { + public resolveWithInteraction(folder: IWorkspaceFolder | undefined, config: any, section?: string, variables?: IStringDictionary): Promise | undefined> { throw new Error('resolveWithInteraction not implemented.'); } 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 c1fab09cb6..e74c16d340 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 @@ -37,7 +37,7 @@ suite('Configuration Resolver Service', () => { uri: uri.parse('file:///VSCode/workspaceLocation'), name: 'hey', index: 0, - toResource: () => null + toResource: (path: string) => uri.file(path) }; configurationResolverService = new ConfigurationResolverService(windowService, editorService, TestEnvironmentService, new MockInputsConfigurationService(), mockCommandService, new TestContextService(), quickInputService); }); @@ -528,7 +528,7 @@ class MockQuickInputService implements IQuickInputService { public pick(picks: Promise[]> | QuickPickInput[], options?: IPickOptions & { canPickMany: true }, token?: CancellationToken): Promise; public pick(picks: Promise[]> | QuickPickInput[], options?: IPickOptions & { canPickMany: false }, token?: CancellationToken): Promise; - public pick(picks: Promise[]> | QuickPickInput[], options?: Omit, 'canPickMany'>, token?: CancellationToken): Promise { + public pick(picks: Promise[]> | QuickPickInput[], options?: Omit, 'canPickMany'>, token?: CancellationToken): Promise { if (Types.isArray(picks)) { return Promise.resolve({ label: 'selectedPick', description: 'pick description' }); } else { @@ -537,7 +537,7 @@ class MockQuickInputService implements IQuickInputService { } public input(options?: IInputOptions, token?: CancellationToken): Promise { - return Promise.resolve('resolved' + options.prompt); + return Promise.resolve(options ? 'resolved' + options.prompt : 'resolved'); } backButton: IQuickInputButton; diff --git a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts index 9d7e0acb21..69e85a4da8 100644 --- a/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts +++ b/src/vs/workbench/services/dialogs/browser/remoteFileDialog.ts @@ -494,7 +494,8 @@ export class RemoteFileDialog { const backDir = this.createBackItem(currentFolder); try { - const fileNames = await this.fileService.readFolder(currentFolder); + const folder = await this.fileService.resolveFile(currentFolder); + const fileNames = folder.children ? folder.children.map(child => child.name) : []; const items = await Promise.all(fileNames.map(fileName => this.createItem(fileName, currentFolder))); for (let item of items) { if (item) { diff --git a/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts b/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts index 8f87e6709f..8a7727d7ef 100644 --- a/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts +++ b/src/vs/workbench/services/extensionManagement/node/multiExtensionManagement.ts @@ -16,7 +16,6 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { CancellationToken } from 'vs/base/common/cancellation'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { getManifest } from 'vs/platform/extensionManagement/node/extensionManagementUtil'; -import { ILogService } from 'vs/platform/log/common/log'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localize } from 'vs/nls'; import { isUIExtension } from 'vs/workbench/services/extensions/node/extensionsUtil'; @@ -37,8 +36,7 @@ export class MultiExtensionManagementService extends Disposable implements IExte @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IConfigurationService private readonly configurationService: IConfigurationService, - @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService, - @ILogService private readonly logService: ILogService + @IRemoteAgentService private readonly remoteAgentService: IRemoteAgentService ) { super(); this.servers = this.extensionManagementServerService.remoteExtensionManagementServer ? [this.extensionManagementServerService.localExtensionManagementServer, this.extensionManagementServerService.remoteExtensionManagementServer] : [this.extensionManagementServerService.localExtensionManagementServer]; @@ -174,8 +172,7 @@ export class MultiExtensionManagementService extends Disposable implements IExte await this.installUIDependencies(manifest); return promise; } else { - this.logService.info('Manifest was not found. Hence installing only in local server'); - return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); + return Promise.reject(localize('Manifest is not found', "Installing Extension {0} failed: Manifest is not found.", gallery.displayName || gallery.name)); } } return this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.installFromGallery(gallery); @@ -221,4 +218,4 @@ export class MultiExtensionManagementService extends Disposable implements IExte } } -registerSingleton(IExtensionManagementService, MultiExtensionManagementService); \ No newline at end of file +registerSingleton(IExtensionManagementService, MultiExtensionManagementService); diff --git a/src/vs/workbench/services/extensions/node/proxyIdentifier.ts b/src/vs/workbench/services/extensions/common/proxyIdentifier.ts similarity index 100% rename from src/vs/workbench/services/extensions/node/proxyIdentifier.ts rename to src/vs/workbench/services/extensions/common/proxyIdentifier.ts diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index c8932a3f91..1be57ac40f 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -20,7 +20,7 @@ import { URI } from 'vs/base/common/uri'; import { IRemoteConsoleLog, log, parse } from 'vs/base/node/console'; import { findFreePort, randomPort } from 'vs/base/node/ports'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; -import { Protocol, generateRandomPipeName, BufferedProtocol } from 'vs/base/parts/ipc/node/ipc.net'; +import { PersistentProtocol, generateRandomPipeName } from 'vs/base/parts/ipc/node/ipc.net'; import { IBroadcast, IBroadcastService } from 'vs/workbench/services/broadcast/electron-browser/broadcastService'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { EXTENSION_ATTACH_BROADCAST_CHANNEL, EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL, EXTENSION_LOG_BROADCAST_CHANNEL, EXTENSION_RELOAD_BROADCAST_CHANNEL, EXTENSION_TERMINATE_BROADCAST_CHANNEL } from 'vs/platform/extensions/common/extensionHost'; @@ -32,7 +32,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; +import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/node/extensionHostProtocol'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; @@ -366,7 +366,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { // using a buffered message protocol here because between now // and the first time a `then` executes some messages might be lost // unless we immediately register a listener for `onMessage`. - resolve(new BufferedProtocol(new Protocol(this._extensionHostConnection))); + resolve(new PersistentProtocol(this._extensionHostConnection)); }); }).then((protocol) => { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts index 14c771a059..0b48056bed 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHostProcessManager.ts @@ -10,12 +10,12 @@ import * as strings from 'vs/base/common/strings'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ExtHostCustomersRegistry } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostCustomersRegistry } from 'vs/workbench/api/common/extHostCustomers'; +import { ExtHostContext, ExtHostExtensionServiceShape, IExtHostContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { ProfileSession } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionHostStarter } from 'vs/workbench/services/extensions/electron-browser/extensionHost'; import { ExtensionHostProfiler } from 'vs/workbench/services/extensions/electron-browser/extensionHostProfiler'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { IRPCProtocolLogger, RPCProtocol, RequestInitiator, ResponsiveState } from 'vs/workbench/services/extensions/node/rpcProtocol'; import { ResolvedAuthority } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 4f1f90b97a..8d1d0d5d3c 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -32,6 +32,7 @@ import { ExtensionHostProcessManager } from 'vs/workbench/services/extensions/el import { ExtensionIdentifier, IExtension, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Schemas } from 'vs/base/common/network'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IFileService } from 'vs/platform/files/common/files'; const hasOwnProperty = Object.hasOwnProperty; const NO_OP_VOID_PROMISE = Promise.resolve(undefined); @@ -99,9 +100,16 @@ export class ExtensionService extends Disposable implements IExtensionService { @IExtensionEnablementService private readonly _extensionEnablementService: IExtensionEnablementService, @IExtensionManagementService private readonly _extensionManagementService: IExtensionManagementService, @IWindowService private readonly _windowService: IWindowService, - @ILifecycleService private readonly _lifecycleService: ILifecycleService + @ILifecycleService private readonly _lifecycleService: ILifecycleService, + @IFileService fileService: IFileService ) { super(); + + // help the file service to activate providers by activating extensions by file system event + this._register(fileService.onWillActivateFileSystemProvider(e => { + e.join(this.activateByEvent(`onFileSystem:${e.scheme}`)); + })); + this._extensionHostLogsLocation = URI.file(path.join(this._environmentService.logsPath, `exthost${this._windowService.getCurrentWindowId()}`)); this._registry = new ExtensionDescriptionRegistry([]); this._installedExtensionsReady = new Barrier(); @@ -127,7 +135,7 @@ export class ExtensionService extends Disposable implements IExtensionService { }]); } - this._extensionEnablementService.onEnablementChanged((extensions) => { + this._register(this._extensionEnablementService.onEnablementChanged((extensions) => { let toAdd: IExtension[] = []; let toRemove: string[] = []; for (const extension of extensions) { @@ -140,23 +148,23 @@ export class ExtensionService extends Disposable implements IExtensionService { } } this._handleDeltaExtensions(new DeltaExtensionsQueueItem(toAdd, toRemove)); - }); + })); - this._extensionManagementService.onDidInstallExtension((event) => { + this._register(this._extensionManagementService.onDidInstallExtension((event) => { if (event.local) { if (this._extensionEnablementService.isEnabled(event.local)) { // an extension has been installed this._handleDeltaExtensions(new DeltaExtensionsQueueItem([event.local], [])); } } - }); + })); - this._extensionManagementService.onDidUninstallExtension((event) => { + this._register(this._extensionManagementService.onDidUninstallExtension((event) => { if (!event.error) { // an extension has been uninstalled this._handleDeltaExtensions(new DeltaExtensionsQueueItem([], [event.identifier.id])); } - }); + })); } private _inHandleDeltaExtensions = false; @@ -834,4 +842,4 @@ export class ExtensionService extends Disposable implements IExtensionService { } } -registerSingleton(IExtensionService, ExtensionService); \ No newline at end of file +registerSingleton(IExtensionService, ExtensionService); diff --git a/src/vs/workbench/services/extensions/node/extensionHostMain.ts b/src/vs/workbench/services/extensions/node/extensionHostMain.ts index cef4fcfb39..05ab0cdf4e 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostMain.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostMain.ts @@ -10,13 +10,14 @@ import { Counter } from 'vs/base/common/numbers'; import { URI, setUriThrowOnMissingScheme } from 'vs/base/common/uri'; import { IURITransformer } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; -import { IEnvironment, IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/node/extHost.protocol'; +import { IEnvironment, IInitData, MainContext, MainThreadConsoleShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { RPCProtocol } from 'vs/workbench/services/extensions/node/rpcProtocol'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; +import { withNullAsUndefined } from 'vs/base/common/types'; // we don't (yet) throw when extensions parse // uris that have no scheme @@ -73,7 +74,7 @@ export class ExtensionHostMain { this.disposables.push(this._extHostLogService); this._searchRequestIdProvider = new Counter(); - const extHostWorkspace = new ExtHostWorkspace(rpcProtocol, this._extHostLogService, this._searchRequestIdProvider, initData.workspace); + const extHostWorkspace = new ExtHostWorkspace(rpcProtocol, this._extHostLogService, this._searchRequestIdProvider, withNullAsUndefined(initData.workspace)); this._extHostLogService.info('extension host started'); this._extHostLogService.trace('initData', initData); diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts index dc0e224b90..0c1f9f3083 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import * as nativeWatchdog from 'native-watchdog'; -import { createConnection } from 'net'; +import * as net from 'net'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; -import { Protocol } from 'vs/base/parts/ipc/node/ipc.net'; +import { PersistentProtocol, ProtocolConstants } from 'vs/base/parts/ipc/node/ipc.net'; import product from 'vs/platform/product/node/product'; -import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; -import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/node/extensionHostProtocol'; +import { IInitData } from 'vs/workbench/api/common/extHost.protocol'; +import { MessageType, createMessageOfType, isMessageOfType, IExtHostSocketMessage, IExtHostReadyMessage } from 'vs/workbench/services/extensions/node/extensionHostProtocol'; import { exit, ExtensionHostMain } from 'vs/workbench/services/extensions/node/extensionHostMain'; // With Electron 2.x and node.js 8.x the "natives" module @@ -43,40 +43,93 @@ let onTerminate = function () { exit(); }; -function createExtHostProtocol(): Promise { +function _createExtHostProtocol(): Promise { + if (process.env.VSCODE_EXTHOST_WILL_SEND_SOCKET) { - const pipeName = process.env.VSCODE_IPC_HOOK_EXTHOST!; + return new Promise((resolve, reject) => { - return new Promise((resolve, reject) => { + let protocol: PersistentProtocol | null = null; - const socket = createConnection(pipeName, () => { - socket.removeListener('error', reject); - resolve(new Protocol(socket)); - }); - socket.once('error', reject); + let timer = setTimeout(() => { + reject(new Error('VSCODE_EXTHOST_IPC_SOCKET timeout')); + }, 60000); - }).then(protocol => { + let disconnectWaitTimer: NodeJS.Timeout | null = null; - return new class implements IMessagePassingProtocol { + process.on('message', (msg: IExtHostSocketMessage, handle: net.Socket) => { + if (msg && msg.type === 'VSCODE_EXTHOST_IPC_SOCKET') { + const initialDataChunk = Buffer.from(msg.initialDataChunk, 'base64'); + if (protocol) { + // reconnection case + if (disconnectWaitTimer) { + clearTimeout(disconnectWaitTimer); + disconnectWaitTimer = null; + } + protocol.beginAcceptReconnection(handle, initialDataChunk); + protocol.endAcceptReconnection(); + } else { + clearTimeout(timer); + protocol = new PersistentProtocol(handle, initialDataChunk); + protocol.onClose(() => onTerminate()); + resolve(protocol); - private _terminating = false; - - readonly onMessage: Event = Event.filter(protocol.onMessage, msg => { - if (!isMessageOfType(msg, MessageType.Terminate)) { - return true; + protocol.onSocketClose(() => { + // The socket has closed, let's give the renderer a certain amount of time to reconnect + disconnectWaitTimer = setTimeout(() => { + disconnectWaitTimer = null; + onTerminate(); + }, ProtocolConstants.ReconnectionGraceTime); + }); + } } - this._terminating = true; - onTerminate(); - return false; }); - send(msg: any): void { - if (!this._terminating) { - protocol.send(msg); - } + // Now that we have managed to install a message listener, ask the other side to send us the socket + const req: IExtHostReadyMessage = { type: 'VSCODE_EXTHOST_IPC_READY' }; + if (process.send) { + process.send(req); } - }; - }); + }); + + } else { + + const pipeName = process.env.VSCODE_IPC_HOOK_EXTHOST!; + + return new Promise((resolve, reject) => { + + const socket = net.createConnection(pipeName, () => { + socket.removeListener('error', reject); + resolve(new PersistentProtocol(socket)); + }); + socket.once('error', reject); + + }); + } +} + +async function createExtHostProtocol(): Promise { + + const protocol = await _createExtHostProtocol(); + + return new class implements IMessagePassingProtocol { + + private _terminating = false; + + readonly onMessage: Event = Event.filter(protocol.onMessage, msg => { + if (!isMessageOfType(msg, MessageType.Terminate)) { + return true; + } + this._terminating = true; + onTerminate(); + return false; + }); + + send(msg: any): void { + if (!this._terminating) { + protocol.send(msg); + } + } + }; } function connectToRenderer(protocol: IMessagePassingProtocol): Promise { diff --git a/src/vs/workbench/services/extensions/node/extensionHostProtocol.ts b/src/vs/workbench/services/extensions/node/extensionHostProtocol.ts index 3e5e78234b..6eb3180398 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProtocol.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProtocol.ts @@ -3,6 +3,15 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +export interface IExtHostReadyMessage { + type: 'VSCODE_EXTHOST_IPC_READY'; +} + +export interface IExtHostSocketMessage { + type: 'VSCODE_EXTHOST_IPC_SOCKET'; + initialDataChunk: string; +} + export const enum MessageType { Initialized, Ready, diff --git a/src/vs/workbench/services/extensions/node/proxyResolver.ts b/src/vs/workbench/services/extensions/node/proxyResolver.ts index 8cc472baa8..b43ce92e61 100644 --- a/src/vs/workbench/services/extensions/node/proxyResolver.ts +++ b/src/vs/workbench/services/extensions/node/proxyResolver.ts @@ -16,7 +16,7 @@ import { endsWith } from 'vs/base/common/strings'; import { IExtHostWorkspaceProvider } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/node/extHostConfiguration'; import { ProxyAgent } from 'vscode-proxy-agent'; -import { MainThreadTelemetryShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadTelemetryShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostLogService } from 'vs/workbench/api/node/extHostLogService'; import { toErrorMessage } from 'vs/base/common/errorMessage'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; @@ -150,7 +150,7 @@ function setupProxyResolution( return; } - if (envNoProxy(hostname, String(parsedUrl.port || (opts.agent).defaultPort))) { + if (typeof hostname === 'string' && envNoProxy(hostname, String(parsedUrl.port || (opts.agent).defaultPort))) { envNoProxyCount++; callback('DIRECT'); extHostLogService.trace('ProxyResolver#resolveProxy envNoProxy', url, 'DIRECT'); @@ -184,8 +184,10 @@ function setupProxyResolution( const start = Date.now(); extHostWorkspace.resolveProxy(url) // Use full URL to ensure it is an actually used one. .then(proxy => { - cacheProxy(key, proxy); - collectResult(results, proxy, parsedUrl.protocol === 'https:' ? 'HTTPS' : 'HTTP', req); + if (proxy) { + cacheProxy(key, proxy); + collectResult(results, proxy, parsedUrl.protocol === 'https:' ? 'HTTPS' : 'HTTP', req); + } callback(proxy); extHostLogService.debug('ProxyResolver#resolveProxy', url, proxy); }).then(() => { @@ -314,7 +316,7 @@ function patches(originals: typeof http | typeof https, resolveProxy: ReturnType }; function patch(original: typeof http.get) { - function patched(url: string | URL, options?: http.RequestOptions, callback?: (res: http.IncomingMessage) => void): http.ClientRequest { + function patched(url?: string | URL | null, options?: http.RequestOptions | null, callback?: (res: http.IncomingMessage) => void): http.ClientRequest { if (typeof url !== 'string' && !(url && (url).searchParams)) { callback = options; options = url; @@ -457,10 +459,10 @@ async function readCaCertificates() { function readWindowsCaCertificates() { const winCA = require.__$__nodeRequire('win-ca-lib'); - let ders = []; + let ders: any[] = []; const store = winCA(); try { - let der; + let der: any; while (der = store.next()) { ders.push(der); } diff --git a/src/vs/workbench/services/extensions/node/rpcProtocol.ts b/src/vs/workbench/services/extensions/node/rpcProtocol.ts index b6c1933480..1964f3c01a 100644 --- a/src/vs/workbench/services/extensions/node/rpcProtocol.ts +++ b/src/vs/workbench/services/extensions/node/rpcProtocol.ts @@ -12,7 +12,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IURITransformer, transformIncomingURIs } from 'vs/base/common/uriIpc'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; import { LazyPromise } from 'vs/workbench/services/extensions/node/lazyPromise'; -import { IRPCProtocol, ProxyIdentifier, getStringIdentifierForProxy } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { IRPCProtocol, ProxyIdentifier, getStringIdentifierForProxy } from 'vs/workbench/services/extensions/common/proxyIdentifier'; export interface JSONStringifyReplacer { (key: string, value: any): any; @@ -274,6 +274,9 @@ export class RPCProtocol extends Disposable implements IRPCProtocol { this._receiveReplyErr(msgLength, req, undefined); break; } + default: + console.error(`received unexpected message`); + console.error(rawmsg); } } diff --git a/src/vs/workbench/services/extensions/test/node/rpcProtocol.test.ts b/src/vs/workbench/services/extensions/test/node/rpcProtocol.test.ts index 30e46348aa..757d77e97e 100644 --- a/src/vs/workbench/services/extensions/test/node/rpcProtocol.test.ts +++ b/src/vs/workbench/services/extensions/test/node/rpcProtocol.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { Emitter, Event } from 'vs/base/common/event'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; -import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { RPCProtocol } from 'vs/workbench/services/extensions/node/rpcProtocol'; suite('RPCProtocol', () => { diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index 907d034cde..842dd3fb8d 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -8,7 +8,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as crypto from 'crypto'; import * as assert from 'assert'; -import { isParent, FileOperation, FileOperationEvent, IContent, IFileService, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot, IFilesConfiguration, IFileSystemProviderRegistrationEvent, IFileSystemProvider } from 'vs/platform/files/common/files'; +import { isParent, FileOperation, FileOperationEvent, IContent, IResolveFileOptions, IResolveFileResult, IResolveContentOptions, IFileStat, IStreamContent, FileOperationError, FileOperationResult, IUpdateContentOptions, FileChangeType, FileChangesEvent, ICreateFileOptions, IContentData, ITextSnapshot, IFilesConfiguration, IFileSystemProviderRegistrationEvent, IFileSystemProvider, ILegacyFileService } from 'vs/platform/files/common/files'; import { MAX_FILE_SIZE, MAX_HEAP_SIZE } from 'vs/platform/files/node/fileConstants'; import { isEqualOrParent } from 'vs/base/common/extpath'; import { ResourceMap } from 'vs/base/common/map'; @@ -48,7 +48,7 @@ export interface IFileServiceTestOptions { encodingOverride?: IEncodingOverride[]; } -export class FileService extends Disposable implements IFileService { +export class FileService extends Disposable implements ILegacyFileService { _serviceBrand: any; @@ -70,6 +70,8 @@ export class FileService extends Disposable implements IFileService { protected readonly _onDidChangeFileSystemProviderRegistrations = this._register(new Emitter()); get onDidChangeFileSystemProviderRegistrations(): Event { return this._onDidChangeFileSystemProviderRegistrations.event; } + readonly onWillActivateFileSystemProvider = Event.None; + private activeWorkspaceFileChangeWatcher: IDisposable | null; private activeFileChangesWatchers: ResourceMap<{ unwatch: Function, count: number }>; private fileChangesWatchDelayer: ThrottledDelayer; @@ -754,29 +756,6 @@ export class FileService extends Disposable implements IFileService { }); } - readFolder(resource: uri): Promise { - const absolutePath = this.toAbsolutePath(resource); - - return pfs.readdir(absolutePath); - } - - createFolder(resource: uri): Promise { - - // 1.) Create folder - const absolutePath = this.toAbsolutePath(resource); - return pfs.mkdirp(absolutePath).then(() => { - - // 2.) Resolve - return this.resolve(resource).then(result => { - - // Events - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); - - return result; - }); - }); - } - private checkFileBeforeWriting(absolutePath: string, options: IUpdateContentOptions = Object.create(null), ignoreReadonly?: boolean): Promise { return pfs.exists(absolutePath).then(exists => { if (exists) { @@ -1107,6 +1086,32 @@ export class FileService extends Disposable implements IFileService { this.activeFileChangesWatchers.forEach(watcher => watcher.unwatch()); this.activeFileChangesWatchers.clear(); } + + + + + + + + + // Tests only + + createFolder(resource: uri): Promise { + + // 1.) Create folder + const absolutePath = this.toAbsolutePath(resource); + return pfs.mkdirp(absolutePath).then(() => { + + // 2.) Resolve + return this.resolve(resource).then(result => { + + // Events + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, result)); + + return result; + }); + }); + } } function etag(stat: fs.Stats): string; diff --git a/src/vs/workbench/services/files/node/remoteFileService.ts b/src/vs/workbench/services/files/node/remoteFileService.ts index d8dba50b47..94923c0561 100644 --- a/src/vs/workbench/services/files/node/remoteFileService.ts +++ b/src/vs/workbench/services/files/node/remoteFileService.ts @@ -14,12 +14,11 @@ import { ITextResourceConfigurationService } from 'vs/editor/common/services/res import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { FileChangesEvent, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileWriteOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions, FileType, IFileService } from 'vs/platform/files/common/files'; +import { FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FileWriteOptions, FileSystemProviderCapabilities, IContent, ICreateFileOptions, IFileStat, IFileSystemProvider, IFilesConfiguration, IResolveContentOptions, IResolveFileOptions, IResolveFileResult, IStat, IStreamContent, ITextSnapshot, IUpdateContentOptions, StringSnapshot, IWatchOptions, FileType, ILegacyFileService, IFileService, toFileOperationResult } from 'vs/platform/files/common/files'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService } from 'vs/platform/notification/common/notification'; 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 { FileService } from 'vs/workbench/services/files/node/fileService'; import { createReadableOfProvider, createReadableOfSnapshot, createWritableOfProvider } from 'vs/workbench/services/files/node/streams'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -162,7 +161,7 @@ export class RemoteFileService extends FileService { private readonly _provider: Map; constructor( - @IExtensionService private readonly _extensionService: IExtensionService, + @IFileService private readonly _fileService: IFileService, @IStorageService storageService: IStorageService, @IEnvironmentService environmentService: IEnvironmentService, @IConfigurationService configurationService: IConfigurationService, @@ -191,53 +190,14 @@ export class RemoteFileService extends FileService { } this._provider.set(scheme, provider); - this._onDidChangeFileSystemProviderRegistrations.fire({ added: true, scheme, provider }); - const reg = provider.onDidChangeFile(changes => { - // forward change events - this._onFileChanges.fire(new FileChangesEvent(changes)); - }); return { dispose: () => { - this._onDidChangeFileSystemProviderRegistrations.fire({ added: false, scheme, provider }); this._provider.delete(scheme); - reg.dispose(); } }; } - activateProvider(scheme: string): Promise { - return this._extensionService.activateByEvent('onFileSystem:' + scheme); - } - - canHandleResource(resource: URI): boolean { - return resource.scheme === Schemas.file || this._provider.has(resource.scheme); - } - - private _tryParseFileOperationResult(err: any): FileOperationResult | undefined { - if (!(err instanceof Error)) { - return undefined; - } - let match = /^(.+) \(FileSystemError\)$/.exec(err.name); - if (!match) { - return undefined; - } - switch (match[1]) { - case 'EntryNotFound': - return FileOperationResult.FILE_NOT_FOUND; - case 'EntryIsADirectory': - return FileOperationResult.FILE_IS_DIRECTORY; - case 'NoPermissions': - return FileOperationResult.FILE_PERMISSION_DENIED; - case 'EntryExists': - return FileOperationResult.FILE_MOVE_CONFLICT; - case 'EntryNotADirectory': - default: - // todo - return undefined; - } - } - // --- stat private _withProvider(resource: URI): Promise { @@ -250,7 +210,7 @@ export class RemoteFileService extends FileService { } return Promise.all([ - this.activateProvider(resource.scheme) + this._fileService.activateProvider(resource.scheme) ]).then(() => { const provider = this._provider.get(resource.scheme); if (!provider) { @@ -449,8 +409,8 @@ export class RemoteFileService extends FileService { return fileStat; }, err => { const message = localize('err.create', "Failed to create file {0}", resource.toString(false)); - const result = this._tryParseFileOperationResult(err); - throw new FileOperationError(message, result || -1, options); + const result = toFileOperationResult(err); + throw new FileOperationError(message, result, options); }); } } @@ -513,33 +473,6 @@ export class RemoteFileService extends FileService { } } - readFolder(resource: URI): Promise { - if (resource.scheme === Schemas.file) { - return super.readFolder(resource); - } else { - return this._withProvider(resource).then(provider => { - return provider.readdir(resource); - }).then(list => list.map(l => l[0])); - } - } - - createFolder(resource: URI): Promise { - if (resource.scheme === Schemas.file) { - return super.createFolder(resource); - } else { - return this._withProvider(resource).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { - return RemoteFileService._mkdirp(provider, resources.dirname(resource)).then(() => { - return provider.mkdir(resource).then(() => { - return this.resolveFile(resource); - }); - }); - }).then(fileStat => { - this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); - return fileStat; - }); - } - } - moveFile(source: URI, target: URI, overwrite?: boolean): Promise { if (source.scheme !== target.scheme) { return this._doMoveAcrossScheme(source, target); @@ -564,7 +497,7 @@ export class RemoteFileService extends FileService { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat)); return fileStat; }, err => { - const result = this._tryParseFileOperationResult(err); + const result = toFileOperationResult(err); if (result === FileOperationResult.FILE_MOVE_CONFLICT) { throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); } @@ -600,7 +533,7 @@ export class RemoteFileService extends FileService { this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat)); return fileStat; }, err => { - const result = this._tryParseFileOperationResult(err); + const result = toFileOperationResult(err); if (result === FileOperationResult.FILE_MOVE_CONFLICT) { throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); } @@ -627,7 +560,7 @@ export class RemoteFileService extends FileService { return fileStat; }); }, err => { - const result = this._tryParseFileOperationResult(err); + const result = toFileOperationResult(err); if (result === FileOperationResult.FILE_MOVE_CONFLICT) { throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result); } else if (err instanceof Error && err.name === 'ENOPRO') { @@ -678,4 +611,4 @@ export class RemoteFileService extends FileService { } } -registerSingleton(IFileService, RemoteFileService); \ No newline at end of file +registerSingleton(ILegacyFileService, RemoteFileService); diff --git a/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts index 282697b74c..d7c5c87db3 100644 --- a/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts +++ b/src/vs/workbench/services/files/test/electron-browser/fileService.test.ts @@ -99,54 +99,6 @@ suite('FileService', () => { }); }); - test('createFolder', () => { - let event: FileOperationEvent; - const toDispose = service.onAfterOperation(e => { - event = e; - }); - - return service.resolveFile(uri.file(testDir)).then(parent => { - const resource = uri.file(path.join(parent.resource.fsPath, 'newFolder')); - - return service.createFolder(resource).then(f => { - assert.equal(f.name, 'newFolder'); - assert.equal(fs.existsSync(f.resource.fsPath), true); - - assert.ok(event); - assert.equal(event.resource.fsPath, resource.fsPath); - assert.equal(event.operation, FileOperation.CREATE); - assert.equal(event.target!.resource.fsPath, resource.fsPath); - assert.equal(event.target!.isDirectory, true); - toDispose.dispose(); - }); - }); - }); - - test('createFolder: creating multiple folders at once', function () { - let event: FileOperationEvent; - const toDispose = service.onAfterOperation(e => { - event = e; - }); - - const multiFolderPaths = ['a', 'couple', 'of', 'folders']; - return service.resolveFile(uri.file(testDir)).then(parent => { - const resource = uri.file(path.join(parent.resource.fsPath, ...multiFolderPaths)); - - return service.createFolder(resource).then(f => { - const lastFolderName = multiFolderPaths[multiFolderPaths.length - 1]; - assert.equal(f.name, lastFolderName); - assert.equal(fs.existsSync(f.resource.fsPath), true); - - assert.ok(event); - assert.equal(event.resource.fsPath, resource.fsPath); - assert.equal(event.operation, FileOperation.CREATE); - assert.equal(event.target!.resource.fsPath, resource.fsPath); - assert.equal(event.target!.isDirectory, true); - toDispose.dispose(); - }); - }); - }); - test('renameFile', () => { let event: FileOperationEvent; const toDispose = service.onAfterOperation(e => { diff --git a/src/vs/workbench/services/files2/common/fileService2.ts b/src/vs/workbench/services/files2/common/fileService2.ts new file mode 100644 index 0000000000..5d9426cd93 --- /dev/null +++ b/src/vs/workbench/services/files2/common/fileService2.ts @@ -0,0 +1,259 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, IDisposable, toDisposable, combinedDisposable } from 'vs/base/common/lifecycle'; +import { IFileService, IResolveFileOptions, IResourceEncodings, FileChangesEvent, FileOperationEvent, IFileSystemProviderRegistrationEvent, IFileSystemProvider, IFileStat, IResolveFileResult, IResolveContentOptions, IContent, IStreamContent, ITextSnapshot, IUpdateContentOptions, ICreateFileOptions, IFileSystemProviderActivationEvent, FileOperationError, FileOperationResult, FileOperation, FileSystemProviderCapabilities, FileType, toFileSystemProviderErrorCode, FileSystemProviderErrorCode } from 'vs/platform/files/common/files'; +import { URI } from 'vs/base/common/uri'; +import { Event, Emitter } from 'vs/base/common/event'; +import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { isAbsolutePath, dirname, basename, joinPath, isEqual } from 'vs/base/common/resources'; +import { localize } from 'vs/nls'; + +export class FileService2 extends Disposable implements IFileService { + + //#region TODO@Ben HACKS + + private _impl: IFileService; + + setImpl(service: IFileService): void { + this._impl = this._register(service); + + this._register(service.onFileChanges(e => this._onFileChanges.fire(e))); + this._register(service.onAfterOperation(e => this._onAfterOperation.fire(e))); + } + + //#endregion + + _serviceBrand: ServiceIdentifier; + + //#region File System Provider + + private _onDidChangeFileSystemProviderRegistrations: Emitter = this._register(new Emitter()); + get onDidChangeFileSystemProviderRegistrations(): Event { return this._onDidChangeFileSystemProviderRegistrations.event; } + + private _onWillActivateFileSystemProvider: Emitter = this._register(new Emitter()); + get onWillActivateFileSystemProvider(): Event { return this._onWillActivateFileSystemProvider.event; } + + private readonly provider = new Map(); + + registerProvider(scheme: string, provider: IFileSystemProvider): IDisposable { + if (this.provider.has(scheme)) { + throw new Error(`A provider for the scheme ${scheme} is already registered.`); + } + + let legacyDisposal: IDisposable; + if (this._impl) { + legacyDisposal = this._impl.registerProvider(scheme, provider); + } else { + legacyDisposal = Disposable.None; + } + + // Add provider with event + this.provider.set(scheme, provider); + this._onDidChangeFileSystemProviderRegistrations.fire({ added: true, scheme, provider }); + + // Forward change events from provider + const providerFileListener = provider.onDidChangeFile(changes => this._onFileChanges.fire(new FileChangesEvent(changes))); + + return combinedDisposable([ + toDisposable(() => { + this._onDidChangeFileSystemProviderRegistrations.fire({ added: false, scheme, provider }); + this.provider.delete(scheme); + + providerFileListener.dispose(); + }), + legacyDisposal + ]); + } + + activateProvider(scheme: string): Promise { + + // Emit an event that we are about to activate a provider with the given scheme. + // Listeners can participate in the activation by registering a provider for it. + const joiners: Promise[] = []; + this._onWillActivateFileSystemProvider.fire({ + scheme, + join(promise) { + if (promise) { + joiners.push(promise); + } + }, + }); + + if (this.provider.has(scheme)) { + return Promise.resolve(); // provider is already here so we can return directly + } + + // If the provider is not yet there, make sure to join on the listeners assuming + // that it takes a bit longer to register the file system provider. + return Promise.all(joiners).then(() => undefined); + } + + canHandleResource(resource: URI): boolean { + return this.provider.has(resource.scheme); + } + + private async withProvider(resource: URI): Promise { + + // Assert path is absolute + if (!isAbsolutePath(resource)) { + throw new FileOperationError( + localize('invalidPath', "The path of resource '{0}' must be absolute", resource.toString(true)), + FileOperationResult.FILE_INVALID_PATH + ); + } + + // Activate provider + await this.activateProvider(resource.scheme); + + // Assert provider + const provider = this.provider.get(resource.scheme); + if (!provider) { + const err = new Error(); + err.name = 'ENOPRO'; + err.message = `no provider for ${resource.toString()}`; + + return Promise.reject(err); + } + + return provider; + } + + //#endregion + + private _onAfterOperation: Emitter = this._register(new Emitter()); + get onAfterOperation(): Event { return this._onAfterOperation.event; } + + //#region File Metadata Resolving + + resolveFile(resource: URI, options?: IResolveFileOptions): Promise { + return this._impl.resolveFile(resource, options); + } + + resolveFiles(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise { + return this._impl.resolveFiles(toResolve); + } + + existsFile(resource: URI): Promise { + return this._impl.existsFile(resource); + } + + //#endregion + + //#region File Reading/Writing + + get encoding(): IResourceEncodings { return this._impl.encoding; } + + createFile(resource: URI, content?: string, options?: ICreateFileOptions): Promise { + return this._impl.createFile(resource, content, options); + } + + resolveContent(resource: URI, options?: IResolveContentOptions): Promise { + return this._impl.resolveContent(resource, options); + } + + resolveStreamContent(resource: URI, options?: IResolveContentOptions): Promise { + return this._impl.resolveStreamContent(resource, options); + } + + updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): Promise { + return this._impl.updateContent(resource, value, options); + } + + //#endregion + + //#region Move/Copy/Delete/Create Folder + + moveFile(source: URI, target: URI, overwrite?: boolean): Promise { + return this._impl.moveFile(source, target, overwrite); + } + + copyFile(source: URI, target: URI, overwrite?: boolean): Promise { + return this._impl.copyFile(source, target, overwrite); + } + + async createFolder(resource: URI): Promise { + const provider = this.throwIfFileSystemIsReadonly(await this.withProvider(resource)); + + // mkdir recursively + await this.mkdirp(provider, resource); + + // events + const fileStat = await this.resolveFile(resource); + this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.CREATE, fileStat)); + + return fileStat; + } + + private async mkdirp(provider: IFileSystemProvider, directory: URI): Promise { + const directoriesToCreate: string[] = []; + + // mkdir until we reach root + while (!isEqual(directory, dirname(directory))) { + try { + const stat = await provider.stat(directory); + if ((stat.type & FileType.Directory) === 0) { + throw new Error(`${directory.toString()} exists, but is not a directory`); + } + + break; // we have hit a directory that exists -> good + } catch (e) { + + // Bubble up any other error that is not file not found + if (toFileSystemProviderErrorCode(e) !== FileSystemProviderErrorCode.FileNotFound) { + throw e; + } + + // Upon error, remember directories that need to be created + directoriesToCreate.push(basename(directory)); + + // Continue up + directory = dirname(directory); + } + } + + // Create directories as needed + for (let i = directoriesToCreate.length - 1; i >= 0; i--) { + directory = joinPath(directory, directoriesToCreate[i]); + await provider.mkdir(directory); + } + } + + del(resource: URI, options?: { useTrash?: boolean; recursive?: boolean; }): Promise { + return this._impl.del(resource, options); + } + + //#endregion + + //#region File Watching + + private _onFileChanges: Emitter = this._register(new Emitter()); + get onFileChanges(): Event { return this._onFileChanges.event; } + + watchFileChanges(resource: URI): void { + this._impl.watchFileChanges(resource); + } + + unwatchFileChanges(resource: URI): void { + this._impl.unwatchFileChanges(resource); + } + + //#endregion + + //#region Helpers + + private throwIfFileSystemIsReadonly(provider: IFileSystemProvider): IFileSystemProvider { + if (provider.capabilities & FileSystemProviderCapabilities.Readonly) { + throw new FileOperationError(localize('err.readonly', "Resource can not be modified."), FileOperationResult.FILE_PERMISSION_DENIED); + } + + return provider; + } + + //#endregion +} + +registerSingleton(IFileService, FileService2); \ No newline at end of file diff --git a/src/vs/workbench/services/files2/node/diskFileSystemProvider.ts b/src/vs/workbench/services/files2/node/diskFileSystemProvider.ts new file mode 100644 index 0000000000..75019caa30 --- /dev/null +++ b/src/vs/workbench/services/files2/node/diskFileSystemProvider.ts @@ -0,0 +1,150 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { mkdir } from 'fs'; +import { promisify } from 'util'; +import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; +import { IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions, FileSystemProviderErrorCode, createFileSystemProviderError, FileSystemProviderError } from 'vs/platform/files/common/files'; +import { URI } from 'vs/base/common/uri'; +import { Event, Emitter } from 'vs/base/common/event'; +import { isLinux } from 'vs/base/common/platform'; +import { statLink } from 'vs/base/node/pfs'; +import { normalize } from 'vs/base/common/path'; + +export class DiskFileSystemProvider extends Disposable implements IFileSystemProvider { + + //#region File Capabilities + + onDidChangeCapabilities: Event = Event.None; + + private _capabilities: FileSystemProviderCapabilities; + get capabilities(): FileSystemProviderCapabilities { + if (!this._capabilities) { + this._capabilities = + FileSystemProviderCapabilities.FileReadWrite | + FileSystemProviderCapabilities.FileOpenReadWriteClose | + FileSystemProviderCapabilities.FileFolderCopy; + + if (isLinux) { + this._capabilities |= FileSystemProviderCapabilities.PathCaseSensitive; + } + } + + return this._capabilities; + } + + //#endregion + + //#region File Metadata Resolving + + async stat(resource: URI): Promise { + try { + const { stat, isSymbolicLink } = await statLink(this.toFilePath(resource)); // cannot use fs.stat() here to support links properly + + return { + type: isSymbolicLink ? FileType.SymbolicLink : stat.isFile() ? FileType.File : stat.isDirectory() ? FileType.Directory : FileType.Unknown, + ctime: stat.ctime.getTime(), + mtime: stat.mtime.getTime(), + size: stat.size + } as IStat; + } catch (error) { + throw this.toFileSystemProviderError(error); + } + } + + readdir(resource: URI): Promise<[string, FileType][]> { + throw new Error('Method not implemented.'); + } + + //#endregion + + //#region File Reading/Writing + + readFile(resource: URI): Promise { + throw new Error('Method not implemented.'); + } + + writeFile(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { + throw new Error('Method not implemented.'); + } + + open(resource: URI, opts: FileOpenOptions): Promise { + throw new Error('Method not implemented.'); + } + + close(fd: number): Promise { + throw new Error('Method not implemented.'); + } + + read(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { + throw new Error('Method not implemented.'); + } + + write(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { + throw new Error('Method not implemented.'); + } + + //#endregion + + //#region Move/Copy/Delete/Create Folder + + mkdir(resource: URI): Promise { + return promisify(mkdir)(resource.fsPath); + } + + delete(resource: URI, opts: FileDeleteOptions): Promise { + throw new Error('Method not implemented.'); + } + + rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { + throw new Error('Method not implemented.'); + } + + copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise { + throw new Error('Method not implemented.'); + } + + //#endregion + + //#region File Watching + + private _onDidChangeFile: Emitter = this._register(new Emitter()); + get onDidChangeFile(): Event { return this._onDidChangeFile.event; } + + watch(resource: URI, opts: IWatchOptions): IDisposable { + throw new Error('Method not implemented.'); + } + + //#endregion + + //#region Helpers + + private toFilePath(resource: URI): string { + return normalize(resource.fsPath); + } + + private toFileSystemProviderError(error: NodeJS.ErrnoException): FileSystemProviderError { + let code: FileSystemProviderErrorCode | undefined = undefined; + switch (error.code) { + case 'ENOENT': + code = FileSystemProviderErrorCode.FileNotFound; + break; + case 'EISDIR': + code = FileSystemProviderErrorCode.FileIsADirectory; + break; + case 'EEXIST': + code = FileSystemProviderErrorCode.FileExists; + break; + case 'EPERM': + case 'EACCESS': + code = FileSystemProviderErrorCode.NoPermissions; + break; + } + + return createFileSystemProviderError(error, code); + } + + //#endregion +} \ No newline at end of file diff --git a/src/vs/workbench/services/files2/node/diskFileSystemSupport.ts b/src/vs/workbench/services/files2/node/diskFileSystemSupport.ts new file mode 100644 index 0000000000..502cfc2db4 --- /dev/null +++ b/src/vs/workbench/services/files2/node/diskFileSystemSupport.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IFileService } from 'vs/platform/files/common/files'; +import { Schemas } from 'vs/base/common/network'; +import { DiskFileSystemProvider } from 'vs/workbench/services/files2/node/diskFileSystemProvider'; +import { Disposable } from 'vs/base/common/lifecycle'; + +export class DiskFileSystemSupport extends Disposable implements IWorkbenchContribution { + + constructor(@IFileService fileService: IFileService) { + super(); + + this._register(fileService.registerProvider(Schemas.file, new DiskFileSystemProvider())); + } +} \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/browser/fileService2.test.ts b/src/vs/workbench/services/files2/test/browser/fileService2.test.ts new file mode 100644 index 0000000000..c12bc5fbc6 --- /dev/null +++ b/src/vs/workbench/services/files2/test/browser/fileService2.test.ts @@ -0,0 +1,59 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { FileService2 } from 'vs/workbench/services/files2/common/fileService2'; +import { URI } from 'vs/base/common/uri'; +import { IFileSystemProviderRegistrationEvent } from 'vs/platform/files/common/files'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import { NullFileSystemProvider } from 'vs/workbench/test/workbenchTestServices'; + +suite('File Service 2', () => { + + test('provider registration', async () => { + const service = new FileService2(); + + assert.equal(service.canHandleResource(URI.parse('test://foo/bar')), false); + + const registrations: IFileSystemProviderRegistrationEvent[] = []; + service.onDidChangeFileSystemProviderRegistrations(e => { + registrations.push(e); + }); + + let registrationDisposable: IDisposable | undefined = undefined; + let callCount = 0; + service.onWillActivateFileSystemProvider(e => { + callCount++; + + if (e.scheme === 'test' && callCount === 1) { + e.join(new Promise(resolve => { + registrationDisposable = service.registerProvider('test', new NullFileSystemProvider()); + + resolve(); + })); + } + }); + + await service.activateProvider('test'); + + assert.equal(service.canHandleResource(URI.parse('test://foo/bar')), true); + + assert.equal(registrations.length, 1); + assert.equal(registrations[0].scheme, 'test'); + assert.equal(registrations[0].added, true); + assert.ok(registrationDisposable); + + await service.activateProvider('test'); + assert.equal(callCount, 2); // activation is called again + + registrationDisposable!.dispose(); + + assert.equal(service.canHandleResource(URI.parse('test://foo/bar')), false); + + assert.equal(registrations.length, 2); + assert.equal(registrations[1].scheme, 'test'); + assert.equal(registrations[1].added, false); + }); +}); \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/node/diskFileService.test.ts b/src/vs/workbench/services/files2/test/node/diskFileService.test.ts new file mode 100644 index 0000000000..f17f255371 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/diskFileService.test.ts @@ -0,0 +1,98 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as assert from 'assert'; +import { tmpdir } from 'os'; +import { FileService2 } from 'vs/workbench/services/files2/common/fileService2'; +import { Schemas } from 'vs/base/common/network'; +import { DiskFileSystemProvider } from 'vs/workbench/services/files2/node/diskFileSystemProvider'; +import { getRandomTestPath } from 'vs/base/test/node/testUtils'; +import { generateUuid } from 'vs/base/common/uuid'; +import { join } from 'vs/base/common/path'; +import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { copy, del } from 'vs/base/node/pfs'; +import { URI } from 'vs/base/common/uri'; +import { existsSync } from 'fs'; +import { FileOperation, FileOperationEvent } from 'vs/platform/files/common/files'; +import { FileService } from 'vs/workbench/services/files/node/fileService'; +import { TestContextService, TestEnvironmentService, TestTextResourceConfigurationService, TestLifecycleService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; +import { Workspace, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace'; +import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; +import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; + +suite('Disk File Service', () => { + + const parentDir = getRandomTestPath(tmpdir(), 'vsctests', 'diskfileservice'); + + let service: FileService2; + let testDir: string; + + setup(async () => { + service = new FileService2(); + service.registerProvider(Schemas.file, new DiskFileSystemProvider()); + + const id = generateUuid(); + testDir = join(parentDir, id); + const sourceDir = getPathFromAmdModule(require, './fixtures/service'); + + await copy(sourceDir, testDir); + + const legacyService = new FileService(new TestContextService(new Workspace(testDir, toWorkspaceFolders([{ path: testDir }]))), TestEnvironmentService, new TestTextResourceConfigurationService(), new TestConfigurationService(), new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true }); + service.setImpl(legacyService); + }); + + teardown(async () => { + service.dispose(); + await del(parentDir, tmpdir()); + }); + + test('createFolder', async () => { + let event: FileOperationEvent; + const toDispose = service.onAfterOperation(e => { + event = e; + }); + + return service.resolveFile(URI.file(testDir)).then(parent => { + const resource = URI.file(join(parent.resource.fsPath, 'newFolder')); + + return service.createFolder(resource).then(f => { + assert.equal(f.name, 'newFolder'); + assert.equal(existsSync(f.resource.fsPath), true); + + assert.ok(event); + assert.equal(event.resource.fsPath, resource.fsPath); + assert.equal(event.operation, FileOperation.CREATE); + assert.equal(event.target!.resource.fsPath, resource.fsPath); + assert.equal(event.target!.isDirectory, true); + toDispose.dispose(); + }); + }); + }); + + test('createFolder: creating multiple folders at once', function () { + let event: FileOperationEvent; + const toDispose = service.onAfterOperation(e => { + event = e; + }); + + const multiFolderPaths = ['a', 'couple', 'of', 'folders']; + return service.resolveFile(URI.file(testDir)).then(parent => { + const resource = URI.file(join(parent.resource.fsPath, ...multiFolderPaths)); + + return service.createFolder(resource).then(f => { + const lastFolderName = multiFolderPaths[multiFolderPaths.length - 1]; + assert.equal(f.name, lastFolderName); + assert.equal(existsSync(f.resource.fsPath), true); + + assert.ok(event); + assert.equal(event.resource.fsPath, resource.fsPath); + assert.equal(event.operation, FileOperation.CREATE); + assert.equal(event.target!.resource.fsPath, resource.fsPath); + assert.equal(event.target!.isDirectory, true); + toDispose.dispose(); + }); + }); + }); +}); \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/company.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/company.js new file mode 100644 index 0000000000..b65b52ade6 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/company.js @@ -0,0 +1,23 @@ +'use strict'; +/// +var Workforce; +(function (Workforce_1) { + var Company = (function () { + function Company() { + } + return Company; + })(); + (function (property, Workforce, IEmployee) { + if (property === undefined) { property = employees; } + if (IEmployee === undefined) { IEmployee = []; } + property; + calculateMonthlyExpenses(); + { + var result = 0; + for (var i = 0; i < employees.length; i++) { + result += employees[i].calculatePay(); + } + return result; + } + }); +})(Workforce || (Workforce = {})); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/conway.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/conway.js new file mode 100644 index 0000000000..96892a1f68 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/conway.js @@ -0,0 +1,117 @@ +'use strict'; +var Conway; +(function (Conway) { + var Cell = (function () { + function Cell() { + } + return Cell; + })(); + (function (property, number, property, number, property, boolean) { + if (property === undefined) { property = row; } + if (property === undefined) { property = col; } + if (property === undefined) { property = live; } + }); + var GameOfLife = (function () { + function GameOfLife() { + } + return GameOfLife; + })(); + (function () { + property; + gridSize = 50; + property; + canvasSize = 600; + property; + lineColor = '#cdcdcd'; + property; + liveColor = '#666'; + property; + deadColor = '#eee'; + property; + initialLifeProbability = 0.5; + property; + animationRate = 60; + property; + cellSize = 0; + property; + context: ICanvasRenderingContext2D; + property; + world = createWorld(); + circleOfLife(); + function createWorld() { + return travelWorld(function (cell) { + cell.live = Math.random() < initialLifeProbability; + return cell; + }); + } + function circleOfLife() { + world = travelWorld(function (cell) { + cell = world[cell.row][cell.col]; + draw(cell); + return resolveNextGeneration(cell); + }); + setTimeout(function () { circleOfLife(); }, animationRate); + } + function resolveNextGeneration(cell) { + var count = countNeighbors(cell); + var newCell = new Cell(cell.row, cell.col, cell.live); + if (count < 2 || count > 3) + newCell.live = false; + else if (count == 3) + newCell.live = true; + return newCell; + } + function countNeighbors(cell) { + var neighbors = 0; + for (var row = -1; row <= 1; row++) { + for (var col = -1; col <= 1; col++) { + if (row == 0 && col == 0) + continue; + if (isAlive(cell.row + row, cell.col + col)) { + neighbors++; + } + } + } + return neighbors; + } + function isAlive(row, col) { + // todo - need to guard with worl[row] exists? + if (row < 0 || col < 0 || row >= gridSize || col >= gridSize) + return false; + return world[row][col].live; + } + function travelWorld(callback) { + var result = []; + for (var row = 0; row < gridSize; row++) { + var rowData = []; + for (var col = 0; col < gridSize; col++) { + rowData.push(callback(new Cell(row, col, false))); + } + result.push(rowData); + } + return result; + } + function draw(cell) { + if (context == null) + context = createDrawingContext(); + if (cellSize == 0) + cellSize = canvasSize / gridSize; + context.strokeStyle = lineColor; + context.strokeRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + context.fillStyle = cell.live ? liveColor : deadColor; + context.fillRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + } + function createDrawingContext() { + var canvas = document.getElementById('conway-canvas'); + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.id = "conway-canvas"; + canvas.width = canvasSize; + canvas.height = canvasSize; + document.body.appendChild(canvas); + } + return canvas.getContext('2d'); + } + }); +})(Conway || (Conway = {})); +var game = new Conway.GameOfLife(); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/employee.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/employee.js new file mode 100644 index 0000000000..69c58aa5c8 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/employee.js @@ -0,0 +1,38 @@ +'use strict'; +var Workforce; +(function (Workforce) { + var Employee = (function () { + function Employee() { + } + return Employee; + })(); + (property); + name: string, property; + basepay: number; + implements; + IEmployee; + { + name; + basepay; + } + var SalesEmployee = (function () { + function SalesEmployee() { + } + return SalesEmployee; + })(); + (); + Employee(name, basepay); + { + function calculatePay() { + var multiplier = (document.getElementById("mult")), as = any, value; + return _super.calculatePay.call(this) * multiplier + bonus; + } + } + var employee = new Employee('Bob', 1000); + var salesEmployee = new SalesEmployee('Jim', 800, 400); + salesEmployee.calclatePay(); // error: No member 'calclatePay' on SalesEmployee +})(Workforce || (Workforce = {})); +extern; +var $; +var s = Workforce.salesEmployee.calculatePay(); +$('#results').text(s); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/small.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/small.js new file mode 100644 index 0000000000..2fb478319a --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/examples/small.js @@ -0,0 +1,24 @@ +'use strict'; +var M; +(function (M) { + var C = (function () { + function C() { + } + return C; + })(); + (function (x, property, number) { + if (property === undefined) { property = w; } + var local = 1; + // unresolved symbol because x is local + //self.x++; + self.w--; // ok because w is a property + property; + f = function (y) { + return y + x + local + w + self.w; + }; + function sum(z) { + return z + f(z) + w + self.w; + } + }); +})(M || (M = {})); +var c = new M.C(12, 5); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/index.html b/src/vs/workbench/services/files2/test/node/fixtures/resolver/index.html new file mode 100644 index 0000000000..bccd24d927 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/index.html @@ -0,0 +1,121 @@ + + + + + Strada + + + + + + + + +

TypeScript

+
+ + +
+ + +
+ +
Press 'run' to execute code...
+
...write your results into #results...
+
+ + + diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/company.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/company.js new file mode 100644 index 0000000000..b65b52ade6 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/company.js @@ -0,0 +1,23 @@ +'use strict'; +/// +var Workforce; +(function (Workforce_1) { + var Company = (function () { + function Company() { + } + return Company; + })(); + (function (property, Workforce, IEmployee) { + if (property === undefined) { property = employees; } + if (IEmployee === undefined) { IEmployee = []; } + property; + calculateMonthlyExpenses(); + { + var result = 0; + for (var i = 0; i < employees.length; i++) { + result += employees[i].calculatePay(); + } + return result; + } + }); +})(Workforce || (Workforce = {})); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/conway.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/conway.js new file mode 100644 index 0000000000..96892a1f68 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/conway.js @@ -0,0 +1,117 @@ +'use strict'; +var Conway; +(function (Conway) { + var Cell = (function () { + function Cell() { + } + return Cell; + })(); + (function (property, number, property, number, property, boolean) { + if (property === undefined) { property = row; } + if (property === undefined) { property = col; } + if (property === undefined) { property = live; } + }); + var GameOfLife = (function () { + function GameOfLife() { + } + return GameOfLife; + })(); + (function () { + property; + gridSize = 50; + property; + canvasSize = 600; + property; + lineColor = '#cdcdcd'; + property; + liveColor = '#666'; + property; + deadColor = '#eee'; + property; + initialLifeProbability = 0.5; + property; + animationRate = 60; + property; + cellSize = 0; + property; + context: ICanvasRenderingContext2D; + property; + world = createWorld(); + circleOfLife(); + function createWorld() { + return travelWorld(function (cell) { + cell.live = Math.random() < initialLifeProbability; + return cell; + }); + } + function circleOfLife() { + world = travelWorld(function (cell) { + cell = world[cell.row][cell.col]; + draw(cell); + return resolveNextGeneration(cell); + }); + setTimeout(function () { circleOfLife(); }, animationRate); + } + function resolveNextGeneration(cell) { + var count = countNeighbors(cell); + var newCell = new Cell(cell.row, cell.col, cell.live); + if (count < 2 || count > 3) + newCell.live = false; + else if (count == 3) + newCell.live = true; + return newCell; + } + function countNeighbors(cell) { + var neighbors = 0; + for (var row = -1; row <= 1; row++) { + for (var col = -1; col <= 1; col++) { + if (row == 0 && col == 0) + continue; + if (isAlive(cell.row + row, cell.col + col)) { + neighbors++; + } + } + } + return neighbors; + } + function isAlive(row, col) { + // todo - need to guard with worl[row] exists? + if (row < 0 || col < 0 || row >= gridSize || col >= gridSize) + return false; + return world[row][col].live; + } + function travelWorld(callback) { + var result = []; + for (var row = 0; row < gridSize; row++) { + var rowData = []; + for (var col = 0; col < gridSize; col++) { + rowData.push(callback(new Cell(row, col, false))); + } + result.push(rowData); + } + return result; + } + function draw(cell) { + if (context == null) + context = createDrawingContext(); + if (cellSize == 0) + cellSize = canvasSize / gridSize; + context.strokeStyle = lineColor; + context.strokeRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + context.fillStyle = cell.live ? liveColor : deadColor; + context.fillRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + } + function createDrawingContext() { + var canvas = document.getElementById('conway-canvas'); + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.id = "conway-canvas"; + canvas.width = canvasSize; + canvas.height = canvasSize; + document.body.appendChild(canvas); + } + return canvas.getContext('2d'); + } + }); +})(Conway || (Conway = {})); +var game = new Conway.GameOfLife(); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/employee.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/employee.js new file mode 100644 index 0000000000..69c58aa5c8 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/employee.js @@ -0,0 +1,38 @@ +'use strict'; +var Workforce; +(function (Workforce) { + var Employee = (function () { + function Employee() { + } + return Employee; + })(); + (property); + name: string, property; + basepay: number; + implements; + IEmployee; + { + name; + basepay; + } + var SalesEmployee = (function () { + function SalesEmployee() { + } + return SalesEmployee; + })(); + (); + Employee(name, basepay); + { + function calculatePay() { + var multiplier = (document.getElementById("mult")), as = any, value; + return _super.calculatePay.call(this) * multiplier + bonus; + } + } + var employee = new Employee('Bob', 1000); + var salesEmployee = new SalesEmployee('Jim', 800, 400); + salesEmployee.calclatePay(); // error: No member 'calclatePay' on SalesEmployee +})(Workforce || (Workforce = {})); +extern; +var $; +var s = Workforce.salesEmployee.calculatePay(); +$('#results').text(s); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/small.js b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/small.js new file mode 100644 index 0000000000..2fb478319a --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/other/deep/small.js @@ -0,0 +1,24 @@ +'use strict'; +var M; +(function (M) { + var C = (function () { + function C() { + } + return C; + })(); + (function (x, property, number) { + if (property === undefined) { property = w; } + var local = 1; + // unresolved symbol because x is local + //self.x++; + self.w--; // ok because w is a property + property; + f = function (y) { + return y + x + local + w + self.w; + }; + function sum(z) { + return z + f(z) + w + self.w; + } + }); +})(M || (M = {})); +var c = new M.C(12, 5); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/resolver/site.css b/src/vs/workbench/services/files2/test/node/fixtures/resolver/site.css new file mode 100644 index 0000000000..f7b51e752b --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/resolver/site.css @@ -0,0 +1,40 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/*---------------------------------------------------------- +The base color for this template is #5c87b2. If you'd like +to use a different color start by replacing all instances of +#5c87b2 with your new color. +----------------------------------------------------------*/ +body +{ + background-color: #5c87b2; + font-size: .75em; + font-family: Segoe UI, Verdana, Helvetica, Sans-Serif; + margin: 8px; + padding: 0; + color: #696969; +} + +h1, h2, h3, h4, h5, h6 +{ + color: #000; + font-size: 40px; + margin: 0px; +} + +textarea +{ + font-family: Consolas +} + +#results +{ + margin-top: 2em; + margin-left: 2em; + color: black; + font-size: medium; +} + diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/binary.txt b/src/vs/workbench/services/files2/test/node/fixtures/service/binary.txt new file mode 100644 index 0000000000000000000000000000000000000000..fc30693d792253bf83b60e6f9bac20311570a186 GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^oNn{1`ISV`@iy0XB4ude`@%$AjKtcBs*NBqf{L-T2REFS;{F0JNg)$>O13e=> zBSSL<4QEY-kc|A?#9{@f#M0cvygUV6g^ZGt0xNy}Vz6qxl+?0f-TXYgywnn%7SXFf zBSSo0978H@y*=+J$iTqEq;UDB{Up_Iw;Y)-?SJ%)JW!Uhl4UK2&W{}$K=T +var Workforce; +(function (Workforce_1) { + var Company = (function () { + function Company() { + } + return Company; + })(); + (function (property, Workforce, IEmployee) { + if (property === undefined) { property = employees; } + if (IEmployee === undefined) { IEmployee = []; } + property; + calculateMonthlyExpenses(); + { + var result = 0; + for (var i = 0; i < employees.length; i++) { + result += employees[i].calculatePay(); + } + return result; + } + }); +})(Workforce || (Workforce = {})); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/deep/conway.js b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/conway.js new file mode 100644 index 0000000000..96892a1f68 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/conway.js @@ -0,0 +1,117 @@ +'use strict'; +var Conway; +(function (Conway) { + var Cell = (function () { + function Cell() { + } + return Cell; + })(); + (function (property, number, property, number, property, boolean) { + if (property === undefined) { property = row; } + if (property === undefined) { property = col; } + if (property === undefined) { property = live; } + }); + var GameOfLife = (function () { + function GameOfLife() { + } + return GameOfLife; + })(); + (function () { + property; + gridSize = 50; + property; + canvasSize = 600; + property; + lineColor = '#cdcdcd'; + property; + liveColor = '#666'; + property; + deadColor = '#eee'; + property; + initialLifeProbability = 0.5; + property; + animationRate = 60; + property; + cellSize = 0; + property; + context: ICanvasRenderingContext2D; + property; + world = createWorld(); + circleOfLife(); + function createWorld() { + return travelWorld(function (cell) { + cell.live = Math.random() < initialLifeProbability; + return cell; + }); + } + function circleOfLife() { + world = travelWorld(function (cell) { + cell = world[cell.row][cell.col]; + draw(cell); + return resolveNextGeneration(cell); + }); + setTimeout(function () { circleOfLife(); }, animationRate); + } + function resolveNextGeneration(cell) { + var count = countNeighbors(cell); + var newCell = new Cell(cell.row, cell.col, cell.live); + if (count < 2 || count > 3) + newCell.live = false; + else if (count == 3) + newCell.live = true; + return newCell; + } + function countNeighbors(cell) { + var neighbors = 0; + for (var row = -1; row <= 1; row++) { + for (var col = -1; col <= 1; col++) { + if (row == 0 && col == 0) + continue; + if (isAlive(cell.row + row, cell.col + col)) { + neighbors++; + } + } + } + return neighbors; + } + function isAlive(row, col) { + // todo - need to guard with worl[row] exists? + if (row < 0 || col < 0 || row >= gridSize || col >= gridSize) + return false; + return world[row][col].live; + } + function travelWorld(callback) { + var result = []; + for (var row = 0; row < gridSize; row++) { + var rowData = []; + for (var col = 0; col < gridSize; col++) { + rowData.push(callback(new Cell(row, col, false))); + } + result.push(rowData); + } + return result; + } + function draw(cell) { + if (context == null) + context = createDrawingContext(); + if (cellSize == 0) + cellSize = canvasSize / gridSize; + context.strokeStyle = lineColor; + context.strokeRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + context.fillStyle = cell.live ? liveColor : deadColor; + context.fillRect(cell.row * cellSize, cell.col * cellSize, cellSize, cellSize); + } + function createDrawingContext() { + var canvas = document.getElementById('conway-canvas'); + if (canvas == null) { + canvas = document.createElement('canvas'); + canvas.id = "conway-canvas"; + canvas.width = canvasSize; + canvas.height = canvasSize; + document.body.appendChild(canvas); + } + return canvas.getContext('2d'); + } + }); +})(Conway || (Conway = {})); +var game = new Conway.GameOfLife(); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/deep/employee.js b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/employee.js new file mode 100644 index 0000000000..69c58aa5c8 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/employee.js @@ -0,0 +1,38 @@ +'use strict'; +var Workforce; +(function (Workforce) { + var Employee = (function () { + function Employee() { + } + return Employee; + })(); + (property); + name: string, property; + basepay: number; + implements; + IEmployee; + { + name; + basepay; + } + var SalesEmployee = (function () { + function SalesEmployee() { + } + return SalesEmployee; + })(); + (); + Employee(name, basepay); + { + function calculatePay() { + var multiplier = (document.getElementById("mult")), as = any, value; + return _super.calculatePay.call(this) * multiplier + bonus; + } + } + var employee = new Employee('Bob', 1000); + var salesEmployee = new SalesEmployee('Jim', 800, 400); + salesEmployee.calclatePay(); // error: No member 'calclatePay' on SalesEmployee +})(Workforce || (Workforce = {})); +extern; +var $; +var s = Workforce.salesEmployee.calculatePay(); +$('#results').text(s); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/deep/small.js b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/small.js new file mode 100644 index 0000000000..2fb478319a --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/deep/small.js @@ -0,0 +1,24 @@ +'use strict'; +var M; +(function (M) { + var C = (function () { + function C() { + } + return C; + })(); + (function (x, property, number) { + if (property === undefined) { property = w; } + var local = 1; + // unresolved symbol because x is local + //self.x++; + self.w--; // ok because w is a property + property; + f = function (y) { + return y + x + local + w + self.w; + }; + function sum(z) { + return z + f(z) + w + self.w; + } + }); +})(M || (M = {})); +var c = new M.C(12, 5); diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/index.html b/src/vs/workbench/services/files2/test/node/fixtures/service/index.html new file mode 100644 index 0000000000..bccd24d927 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/index.html @@ -0,0 +1,121 @@ + + + + + Strada + + + + + + + + +

TypeScript

+
+ + +
+ + +
+ +
Press 'run' to execute code...
+
...write your results into #results...
+
+ + + diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/lorem.txt b/src/vs/workbench/services/files2/test/node/fixtures/service/lorem.txt new file mode 100644 index 0000000000..9d348ac090 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/lorem.txt @@ -0,0 +1,283 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur vulputate, ipsum quis interdum fermentum, lorem sem fermentum eros, vitae auctor neque lacus in nisi. Suspendisse potenti. Maecenas et scelerisque elit, in tincidunt quam. Sed eu tincidunt quam. Nullam justo ex, imperdiet a imperdiet et, fermentum sit amet eros. Aenean quis tempus sem. Pellentesque accumsan magna mi, ut mollis velit sagittis id. Etiam quis ipsum orci. Fusce purus ante, accumsan a lobortis at, venenatis eu nisl. Praesent ornare sed ante placerat accumsan. Suspendisse tempus dignissim fermentum. Nunc a leo ac lacus sodales iaculis eu vitae mi. In feugiat ante at massa finibus cursus. Suspendisse posuere fringilla ornare. Mauris elementum ac quam id convallis. Vestibulum non elit quis urna volutpat aliquam a eu lacus. + +Aliquam vestibulum imperdiet neque, suscipit aliquam elit ultrices bibendum. Suspendisse ultrices pulvinar cursus. Morbi risus nisi, cursus consequat rutrum vitae, molestie sed dui. Fusce posuere, augue quis dignissim aliquam, nisi ipsum porttitor ante, quis fringilla nisl turpis ac nisi. Nulla varius enim eget lorem vehicula gravida. Donec finibus malesuada leo nec semper. Proin ac enim eros. Vivamus non tincidunt nisi, vel tristique lorem. + +Nunc consequat ex id eros dignissim, id rutrum risus laoreet. Sed euismod non erat eu ultricies. Etiam vehicula gravida lacus ut porta. Vestibulum eu eros quis nunc aliquet luctus. Cras quis semper ligula. Nullam gravida vehicula quam sed porta. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In porta cursus vulputate. Quisque porta a nisi eget cursus. Aliquam risus leo, luctus ac magna in, efficitur cursus magna. In condimentum non mi id semper. Donec interdum ante eget commodo maximus. + +Vivamus sit amet vestibulum lectus. Fusce tincidunt mi sapien, dictum sollicitudin diam vulputate in. Integer fringilla consequat mollis. Cras aliquet consequat felis eget feugiat. Nunc tempor cursus arcu, vitae ornare nunc varius et. Vestibulum et tortor vel ante viverra porttitor. Nam at tortor ullamcorper, facilisis augue quis, tristique erat. Aenean ut euismod nibh. Quisque eu tincidunt est, nec euismod eros. + +Proin vehicula nibh non viverra egestas. Phasellus sem dolor, ultricies ac sagittis tristique, lacinia a purus. Vestibulum in ante eros. Pellentesque lacus nulla, tristique vitae interdum vel, malesuada ac diam. Aenean bibendum posuere turpis in accumsan. Ut est nulla, ullamcorper quis turpis at, viverra sagittis mauris. Sed in interdum purus. Praesent scelerisque nibh eget sem euismod, ut imperdiet mi venenatis. Vivamus pulvinar orci sed dapibus auctor. Nulla facilisi. Vestibulum tincidunt erat nec porttitor egestas. Mauris quis risus ante. Nulla facilisi. + +Aliquam ullamcorper ornare lobortis. Phasellus quis sem et ipsum mollis malesuada sed in ex. Ut aliquam ex eget metus finibus maximus. Proin suscipit mauris eu nibh lacinia, quis feugiat dui dapibus. Nam sed libero est. Aenean vulputate orci sit amet diam faucibus, eu sagittis sapien volutpat. Nam imperdiet felis turpis, at pretium odio pulvinar in. Sed vestibulum id eros nec ultricies. Sed quis aliquam tortor, vitae ullamcorper tellus. Donec egestas laoreet eros, id suscipit est rutrum nec. Sed auctor nulla eget metus aliquam, ut condimentum enim elementum. + +Aliquam suscipit non turpis sit amet bibendum. Fusce velit ligula, euismod et maximus at, luctus sed neque. Quisque pretium, nisl at ullamcorper finibus, lectus leo mattis sapien, vel euismod mauris diam ullamcorper ex. Nulla ut risus finibus, lacinia ligula at, auctor erat. Mauris consectetur sagittis ligula vel dapibus. Nullam libero libero, lobortis aliquam libero vel, venenatis ultricies leo. Duis porttitor, nibh congue fermentum posuere, erat libero pulvinar tortor, a pellentesque nunc ipsum vel sem. Nullam volutpat, eros sit amet facilisis consectetur, ipsum est vehicula massa, non vestibulum neque elit in mauris. Nunc hendrerit ipsum non enim bibendum, vitae rhoncus mi egestas. Etiam ullamcorper massa vel nisl sagittis, nec bibendum arcu malesuada. Aenean aliquet turpis justo, a consectetur arcu mollis convallis. Etiam tellus ipsum, ultricies vitae lorem et, ornare facilisis orci. Praesent fringilla justo urna, vel mollis neque pulvinar vestibulum. + +Donec non iaculis erat. Aliquam et mi sed nunc pulvinar ultricies in ut ipsum. Interdum et malesuada fames ac ante ipsum primis in faucibus. Praesent feugiat lacus ac dignissim semper. Phasellus vitae quam nisi. Morbi vel diam ultricies risus lobortis ornare. Fusce maximus et ligula quis iaculis. Sed congue ex eget felis convallis, sit amet hendrerit elit tempor. Donec vehicula blandit ante eget commodo. Vestibulum eleifend diam at feugiat euismod. Etiam magna tellus, dignissim eget fermentum vel, vestibulum vitae mauris. Nam accumsan et erat id sagittis. Donec lacinia, odio ut ornare ultricies, dolor velit accumsan tortor, non finibus erat tellus quis ligula. Nunc quis metus in leo volutpat ornare vulputate eu nisl. + +Donec quis viverra ex. Nullam id feugiat mauris, eu fringilla nulla. Vestibulum id maximus elit. Cras elementum elit sed felis lobortis, eget sagittis nisi hendrerit. Vivamus vitae elit neque. Donec vulputate lacus ut libero ultrices accumsan. Vivamus accumsan nulla orci, in dignissim est laoreet sagittis. Proin at commodo velit. Curabitur in velit felis. Aliquam erat volutpat. Sed consequat, nulla et cursus sodales, nisi lacus mattis risus, quis eleifend erat ex nec turpis. Sed suscipit ultrices lorem in hendrerit. + +Morbi vitae lacus nec libero ornare tempus eu et diam. Suspendisse magna ipsum, fermentum vel odio quis, molestie aliquam urna. Fusce mollis turpis a eros accumsan porttitor. Pellentesque rhoncus dolor sit amet magna rutrum, et dapibus justo tempor. Sed purus nisi, maximus vitae fringilla eu, molestie nec urna. Fusce malesuada finibus pretium. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec sed aliquet eros. Pellentesque luctus diam ante, eget euismod nisl aliquet eu. Sed accumsan elit purus, tempor varius ligula tempus nec. Curabitur ornare leo suscipit suscipit fermentum. Morbi eget nulla est. Maecenas faucibus interdum tristique. + +Etiam ut elit eros. Nulla pharetra suscipit molestie. Nulla facilisis bibendum nisl non molestie. Curabitur turpis lectus, facilisis vel diam non, vulputate ultrices mauris. Aenean placerat aliquam convallis. Suspendisse sed scelerisque tellus. Vivamus lacinia neque eget risus cursus suscipit. Proin consequat dolor vel neque tempor, eu aliquam sem scelerisque. Duis non eros a purus malesuada pharetra non et nulla. Suspendisse potenti. Mauris libero eros, finibus vel nulla id, sagittis dapibus ante. Proin iaculis sed nunc et cursus. + +Quisque accumsan lorem sit amet lorem aliquet euismod. Curabitur fermentum rutrum posuere. Etiam ultricies, sem id pellentesque suscipit, urna magna lacinia eros, quis efficitur risus nisl at lacus. Nulla quis lacus tortor. Mauris placerat ex in dolor tincidunt, vel aliquet nisi pretium. Cras iaculis risus vitae pellentesque aliquet. Quisque a enim imperdiet, ullamcorper arcu vitae, rutrum risus. Nullam consectetur libero at felis fringilla, nec congue nibh dignissim. Nam et lobortis felis, eu pellentesque ligula. Aenean facilisis, ligula non imperdiet maximus, massa orci gravida sapien, at sagittis lacus nisl in lacus. Nulla quis mauris luctus, scelerisque felis consequat, tempus risus. Fusce auctor nisl non nulla luctus molestie. Maecenas sapien nisl, auctor non dolor et, iaculis scelerisque lorem. Suspendisse egestas enim aliquet, accumsan mauris nec, posuere quam. Nulla iaculis dui dui, sit amet vestibulum erat ultricies ac. + +Cras eget dolor erat. Proin at nisl ut leo consectetur ultricies vel ut arcu. Nulla in felis malesuada, ullamcorper tortor et, convallis massa. Nunc urna justo, ornare in nibh vitae, hendrerit condimentum libero. Etiam vitae libero in purus venenatis fringilla. Nullam velit nulla, consequat ut turpis non, egestas hendrerit nibh. Duis tortor turpis, interdum non ante ac, cursus accumsan lectus. Cras pharetra bibendum augue quis dictum. Sed euismod vestibulum justo. Proin porta lobortis purus. Duis venenatis diam tortor, sit amet condimentum eros rhoncus a. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc at magna nec diam lobortis efficitur sit amet ut lacus. Nulla quis orci tortor. Pellentesque tempus velit a odio finibus porta. + +Proin feugiat mauris a tellus scelerisque convallis. Maecenas libero magna, blandit nec ultrices id, congue vel mi. Aliquam lacinia, quam vel condimentum convallis, tortor turpis aliquam odio, sed blandit libero lacus et eros. In eleifend iaculis magna ac finibus. Praesent auctor facilisis tellus in congue. Sed molestie lobortis dictum. Nam quis dignissim augue, vel euismod lorem. Curabitur posuere dapibus luctus. Donec ultricies dictum lectus, quis blandit arcu commodo ac. Aenean tincidunt ligula in nunc imperdiet dignissim. Curabitur egestas sollicitudin sapien ut semper. Aenean nec dignissim lacus. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec aliquam dictum vehicula. Donec tortor est, volutpat non nisi nec, varius gravida ex. Nunc vel tristique nunc, vitae mattis nisi. Nunc nec luctus ex, vitae tincidunt lectus. In hac habitasse platea dictumst. Curabitur lobortis ex eget tincidunt tempor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut a vehicula mi. + +Fusce eu libero finibus, interdum nulla a, placerat neque. Cras bibendum tempor libero nec feugiat. Cras ut sodales eros. Proin viverra, massa sit amet viverra egestas, neque nisl porta ex, sit amet hendrerit libero ligula vel urna. Mauris suscipit lacus id justo rhoncus suscipit. Etiam vel libero tellus. Maecenas non diam molestie, condimentum tellus a, bibendum enim. Mauris aliquet imperdiet tellus, eget sagittis dolor. Sed blandit in neque et luctus. Cras elementum sagittis nunc, vel mollis lorem euismod et. Donec posuere at lacus eget suscipit. + +Nulla nunc mi, pretium non massa vel, tempor semper magna. Nunc a leo pulvinar, tincidunt nunc at, dignissim mi. Aliquam erat volutpat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut viverra nulla a nisl finibus, at hendrerit ligula ullamcorper. Donec a lorem semper, tempor magna et, lobortis libero. Mauris id sapien leo. Donec dignissim, quam vitae porttitor dignissim, quam justo mattis dui, vel consequat odio elit quis orci. Etiam nec pretium neque, sit amet pretium orci. Duis ac tortor venenatis, feugiat purus non, feugiat nunc. Proin scelerisque nisl in turpis aliquam vulputate. + +Praesent sed est semper, fringilla lorem vitae, tincidunt nibh. Cras eros metus, auctor at mauris sit amet, sodales semper orci. Nunc a ornare ex. Curabitur bibendum arcu congue urna vulputate egestas. Vestibulum finibus id risus et accumsan. Aenean ut volutpat tellus. Aenean tincidunt malesuada urna sit amet vestibulum. Mauris vel tellus dictum, varius lacus quis, dictum arcu. + +Aenean quis metus eu erat feugiat cursus vel at ligula. Proin dapibus sodales urna, id euismod lectus tempus id. Pellentesque ex ligula, convallis et erat vel, vulputate condimentum nisl. Pellentesque pharetra nulla quis massa eleifend hendrerit. Praesent sed massa ipsum. Maecenas vehicula dolor massa, id sodales urna faucibus et. Mauris ac quam non massa tincidunt feugiat et at lacus. Fusce libero massa, vulputate vel scelerisque non, mollis in leo. Ut sit amet ultricies odio. Suspendisse in sapien viverra, facilisis purus ut, pretium libero. + +Vivamus tristique pharetra molestie. Nam a volutpat purus. Praesent consequat gravida nisi, ac blandit nisi suscipit ut. Quisque posuere, ligula a ultrices laoreet, ligula nunc vulputate libero, ut rutrum erat odio tincidunt justo. Sed vitae leo at leo fringilla bibendum. Vestibulum ut augue nec dolor auctor accumsan. Praesent laoreet id eros pulvinar commodo. Suspendisse potenti. Ut pharetra, mauris vitae blandit fringilla, odio ante tincidunt lorem, sit amet tempor metus diam ut turpis. + +Praesent quis egestas arcu. Nullam at porta arcu. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi vulputate ligula malesuada ligula luctus, vulputate tempus erat bibendum. Nunc ullamcorper non lectus at euismod. Etiam nibh felis, tincidunt a metus vel, pellentesque rhoncus neque. Etiam at diam in erat luctus interdum. Nunc vel ipsum pulvinar, sollicitudin lacus ac, tempus urna. Etiam vel lacinia sapien. Pellentesque sagittis velit vel mi efficitur iaculis. Integer euismod sit amet urna in sagittis. Cras eleifend ut nibh in facilisis. Donec et lacus vitae nunc placerat sodales. Nulla sed hendrerit ligula, at dapibus sapien. + +Praesent at iaculis ex. Curabitur est purus, cursus a faucibus quis, dictum id velit. Donec dignissim fringilla viverra. Nunc mauris felis, laoreet sit amet sagittis at, vestibulum in libero. Maecenas quis orci turpis. Quisque ut nibh vitae magna mollis consequat id at mauris. Aliquam eu odio eget nulla bibendum sodales. Quisque vel orci eleifend nisi pretium lacinia. Suspendisse eget risus eget mi volutpat molestie eget quis lacus. Duis nisi libero, tincidunt nec nulla id, faucibus cursus felis. + +Donec tempor eget risus pellentesque molestie. Phasellus porta neque vel arcu egestas, nec blandit velit fringilla. Nullam porta faucibus justo vitae laoreet. Pellentesque viverra id nunc eu varius. Nulla pulvinar lobortis iaculis. Etiam vestibulum odio nec velit tristique, a tristique nisi mattis. In sed fringilla orci, vitae efficitur odio. Quisque dui odio, ornare eget velit at, lacinia consequat libero. Quisque lectus nulla, aliquet eu leo in, porta rutrum diam. Donec nec mattis neque. Nam rutrum, odio ac eleifend bibendum, dolor arcu rutrum neque, eget porta elit tellus a lacus. Sed massa metus, sollicitudin et sapien eu, finibus tempus orci. Proin et sapien sit amet erat molestie interdum. In quis rutrum velit, faucibus ultrices tellus. + +Sed sagittis sed justo eget tincidunt. Maecenas ut leo sagittis, feugiat magna et, viverra velit. Maecenas ex arcu, feugiat at consequat vitae, auctor eu massa. Integer egestas, enim vitae maximus convallis, est lectus pretium mauris, ac posuere lectus nisl quis quam. Aliquam tempus laoreet mi, vitae dapibus dolor varius dapibus. Suspendisse potenti. Donec sit amet purus nec libero dapibus tristique. Pellentesque viverra bibendum ligula. Donec sed felis et ex lobortis laoreet. Phasellus a fringilla libero, vitae malesuada nulla. Pellentesque blandit mattis lacus, et blandit tortor laoreet consequat. Suspendisse libero nunc, viverra sed fermentum in, accumsan egestas arcu. Proin in placerat elit. Sed interdum imperdiet malesuada. Suspendisse aliquet quis mauris eget sollicitudin. + +Vivamus accumsan tellus non erat volutpat, quis dictum dolor feugiat. Praesent rutrum nunc ac est mollis cursus. Fusce semper volutpat dui ut egestas. Curabitur sit amet posuere massa. Cras tincidunt nulla et mi mollis imperdiet. Suspendisse scelerisque ex id sodales vulputate. In nunc augue, pharetra in placerat eu, mattis id tellus. Vivamus cursus efficitur vehicula. Nulla aliquet vehicula aliquet. + +Sed cursus tellus sed porta pulvinar. Sed vitae nisi neque. Nullam aliquet, lorem et efficitur scelerisque, arcu diam aliquam felis, sed pulvinar lorem odio et turpis. Praesent convallis pulvinar turpis eu iaculis. Aliquam nec gravida mi. Curabitur eu nibh tempor, blandit justo in, ultrices felis. Fusce placerat metus non mi sagittis rutrum. Morbi sed dui fringilla, sagittis mauris eget, imperdiet nunc. Phasellus hendrerit sem elit, id hendrerit libero auctor sit amet. Integer sodales elit sit amet consequat cursus. + +Nam semper est eget nunc mollis, in pellentesque lectus fringilla. In finibus vel diam id semper. Nunc mattis quis erat eu consectetur. In hac habitasse platea dictumst. Nullam et ipsum vestibulum ex pulvinar ultricies sit amet id velit. Aenean suscipit mi tortor, a lobortis magna viverra non. Nulla condimentum aliquet ante et ullamcorper. Pellentesque porttitor arcu a posuere tempus. Aenean lacus quam, imperdiet eu justo vitae, pretium efficitur ex. Duis id purus id magna rhoncus ultrices id eu risus. Nunc dignissim et libero id dictum. + +Quisque a tincidunt neque. Phasellus commodo mi sit amet tempor fringilla. Ut rhoncus, neque non porttitor elementum, libero nulla egestas augue, sed fringilla sapien felis ac velit. Phasellus viverra rhoncus mollis. Nam ullamcorper leo vel erat laoreet luctus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus semper a metus a cursus. Nulla sed orci egestas, efficitur purus ac, malesuada tellus. Aenean rutrum velit at tellus fermentum mollis. Aliquam eleifend euismod metus. + +In hac habitasse platea dictumst. Vestibulum volutpat neque vitae porttitor laoreet. Nam at tellus consequat, sodales quam in, pulvinar arcu. Maecenas varius convallis diam, ac lobortis tellus pellentesque quis. Maecenas eget augue massa. Nullam volutpat nibh ac justo rhoncus, ut iaculis tellus rutrum. Fusce efficitur efficitur libero quis condimentum. Curabitur congue neque non tincidunt tristique. Fusce eget tempor ex, at pellentesque odio. Praesent luctus dictum vestibulum. Etiam non orci nunc. Vivamus vitae laoreet purus, a lobortis velit. Curabitur tincidunt purus ac lectus elementum pellentesque. Quisque sed tincidunt est. + +Sed vel ultrices massa, vitae ultricies justo. Cras finibus mauris nec lacus tempus dignissim. Cras faucibus maximus velit, eget faucibus orci luctus vehicula. Nulla massa nunc, porta ac consequat eget, rhoncus non tellus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Fusce sed maximus metus, vel imperdiet ipsum. Ut scelerisque lectus at blandit porttitor. Ut vulputate nunc pharetra, aliquet sapien ac, sollicitudin sapien. Aenean eget ante lorem. Nam accumsan venenatis tellus id dignissim. + +Curabitur fringilla, magna non maximus dapibus, nulla sapien vestibulum lectus, sit amet semper dolor neque vitae nisl. Nunc ultrices vehicula augue sed iaculis. Maecenas nec diam mollis, suscipit orci et, vestibulum ante. Pellentesque eu nisl tortor. Nunc eleifend, lacus quis volutpat volutpat, nisi mi molestie sem, quis mollis ipsum libero a tellus. Ut viverra dolor mattis convallis interdum. Sed tempus nisl at nunc scelerisque aliquet. Quisque tempor tempor lorem id feugiat. Nullam blandit lectus velit, vitae porta lacus tincidunt a. Vivamus sit amet arcu ultrices, tincidunt mi quis, viverra quam. Aenean fringilla libero elementum lorem semper, quis pulvinar eros gravida. Nullam sodales blandit mauris, sed fermentum velit fermentum sit amet. Donec malesuada mauris in augue sodales vulputate. Vestibulum gravida turpis id elit rhoncus dignissim. Integer non congue lorem, eu viverra orci. + +Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Donec at dolor magna. Aliquam consectetur erat augue, id iaculis velit pharetra ac. Integer rutrum venenatis dignissim. Integer non sodales elit. Curabitur ut magna ut nibh feugiat aliquam ac ut risus. Morbi nibh quam, aliquam id placerat nec, vestibulum eget velit. Suspendisse at dignissim quam. Vivamus aliquet sem sed nisl volutpat, ut cursus orci ultrices. Aliquam ultrices lacinia enim, vitae aliquet neque. + +Quisque scelerisque finibus diam in mattis. Cras cursus auctor velit. Aliquam sem leo, fermentum et maximus et, molestie a libero. Aenean justo elit, rutrum a ornare id, egestas eget enim. Aenean auctor tristique erat. Curabitur condimentum libero lacus, nec consequat orci vestibulum sed. Fusce elit ligula, blandit vitae sapien vitae, dictum ultrices risus. Nam laoreet suscipit sapien, at interdum velit faucibus sit amet. Duis quis metus egestas lectus elementum posuere non nec libero. Aliquam a dolor bibendum, facilisis nunc a, maximus diam. Vestibulum suscipit tristique magna, non dignissim turpis sodales sed. Nunc ornare, velit ac facilisis fringilla, dolor mi consectetur lorem, vitae finibus erat justo suscipit urna. Maecenas sit amet eros erat. Nunc non arcu ornare, suscipit lorem eget, sodales mauris. Aliquam tincidunt, quam nec mollis lacinia, nisi orci fermentum libero, consequat eleifend lectus quam et sapien. Vestibulum a quam urna. + +Cras arcu leo, euismod ac ullamcorper at, faucibus sed massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus porttitor velit in enim interdum, non commodo metus ornare. Morbi vel lorem quis nisl luctus tristique quis vitae nisl. Suspendisse condimentum tortor enim, nec eleifend ipsum euismod et. Sed gravida quam ut tristique lacinia. Mauris eu interdum ipsum, ac ultrices odio. Nullam auctor tellus a risus porttitor vehicula. Nulla blandit euismod dictum. In pharetra, enim iaculis pulvinar interdum, dui nunc placerat nunc, sit amet pretium lectus nulla vitae quam. Phasellus quis enim sollicitudin, varius nulla id, ornare purus. Donec quam lacus, vestibulum quis nunc ac, mollis dictum nisi. Cras ut mollis elit. Maecenas ultrices ligula at risus faucibus scelerisque. Etiam vitae porttitor purus. Curabitur blandit lectus urna, ut hendrerit tortor feugiat ut. + +Phasellus fringilla, sapien pellentesque commodo pharetra, ante libero aliquam tellus, ut consectetur augue libero a sapien. Maecenas blandit luctus nisl eget aliquet. Maecenas vitae porta dolor, faucibus laoreet sapien. Suspendisse lobortis, ipsum sed vehicula aliquam, elit purus scelerisque dui, rutrum consectetur diam odio et lorem. In nec lacinia metus. Donec viverra libero est, vel bibendum erat condimentum quis. Donec feugiat purus leo. In laoreet vitae felis a porttitor. Mauris ullamcorper, lacus id condimentum suscipit, neque magna pellentesque arcu, eget cursus neque tellus id metus. Curabitur volutpat ac orci vel ultricies. + +Sed ut finibus erat. Sed diam purus, varius non tincidunt quis, ultrices sit amet ipsum. Donec et egestas nulla. Suspendisse placerat nisi at dui laoreet iaculis. Aliquam aliquet leo at augue faucibus molestie. Nullam lacus augue, hendrerit sed nisi eu, faucibus porta est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam ut leo aliquet sem fermentum rutrum quis ac justo. Integer placerat aliquam nisl ut sagittis. Proin erat orci, lobortis et sem eget, eleifend fringilla augue. Mauris varius laoreet arcu, sed tincidunt felis. Pellentesque venenatis lorem odio, id pulvinar velit molestie feugiat. Donec mattis lacus sed eleifend pulvinar. + +Sed condimentum ex in tincidunt hendrerit. Etiam eget risus lacinia, euismod nibh eu, pellentesque quam. Proin elit eros, convallis id mauris ac, bibendum ultrices lectus. Morbi venenatis, purus id fermentum consequat, nunc libero tincidunt ligula, non dictum ligula orci nec quam. Nulla nec ultrices lorem. Aenean maximus augue vel dictum pharetra. Etiam turpis urna, pellentesque quis malesuada eu, molestie faucibus felis. + +Vestibulum pharetra augue ut quam blandit congue in nec risus. Proin eu nibh eu dui eleifend porta vitae id lectus. Proin lacus nibh, lobortis sed ligula vitae, interdum lobortis erat. Suspendisse potenti. In sollicitudin quis sapien ut aliquet. Mauris ac nulla arcu. Fusce tristique justo quis lectus mollis, eu volutpat lectus finibus. Vivamus venenatis facilisis ex ut vestibulum. + +Etiam varius lobortis purus, in hendrerit elit tristique at. In tempus, augue vestibulum fermentum gravida, ligula tellus vulputate arcu, eu molestie ex sapien at purus. Vestibulum nec egestas metus. Duis pulvinar quam nec consequat interdum. Aenean non dapibus lacus. Aliquam sit amet aliquet nulla. Sed venenatis volutpat purus nec convallis. Phasellus aliquet semper sodales. Cras risus sapien, condimentum auctor urna a, pulvinar ornare nisl. Sed tincidunt felis elit, ut elementum est bibendum ac. Morbi interdum justo vel dui faucibus condimentum. + +Sed convallis eu sem at tincidunt. Nullam at auctor est, et ullamcorper ipsum. Pellentesque eget ante ante. Interdum et malesuada fames ac ante ipsum primis in faucibus. Integer euismod, sapien sed dapibus ornare, nibh enim maximus lacus, lacinia placerat urna quam quis felis. Morbi accumsan id nisl ut condimentum. Donec bibendum nisi est, sed volutpat lorem rhoncus in. Vestibulum ac lacinia nunc, eget volutpat magna. Integer aliquam pharetra ipsum, id placerat nunc volutpat quis. Etiam urna diam, rhoncus sit amet varius vel, euismod vel sem. Nullam vel molestie urna. Vivamus ornare erat at venenatis euismod. Suspendisse potenti. Fusce diam justo, tincidunt vel sem at, commodo faucibus nisl. Duis gravida efficitur diam, vel sagittis erat pulvinar ut. + +Quisque vel pharetra felis. Duis efficitur tortor dolor, vitae porttitor erat fermentum sed. Sed eu mi purus. Etiam dignissim tortor eu tempus molestie. Aenean pretium erat enim, in hendrerit ante hendrerit at. Sed ut risus vel nunc venenatis ultricies quis in lacus. Pellentesque vitae purus euismod, placerat risus non, ullamcorper augue. Quisque varius quam ligula, nec aliquet ex faucibus vitae. Quisque rhoncus sit amet leo tincidunt mattis. Cras id mauris eget purus pretium gravida sit amet eu augue. Aliquam dapibus odio augue, id lacinia velit pulvinar eu. + +Mauris fringilla, tellus nec pharetra iaculis, neque nisi ultrices massa, et tincidunt sem dui sed mi. Curabitur erat lorem, venenatis quis tempus lacinia, tempus sit amet nunc. Aliquam at neque ac metus commodo dictum quis vitae justo. Phasellus eget lacus tempus, blandit lorem vel, rutrum est. Aenean pharetra sem ut augue lobortis dignissim. Sed rhoncus at nulla id ultrices. Cras id condimentum felis. In suscipit luctus vulputate. Donec tincidunt lacus nec enim tincidunt sollicitudin ut quis enim. Nam at libero urna. Praesent sit amet massa vitae massa ullamcorper vehicula. + +Nullam bibendum augue ut turpis condimentum bibendum. Proin sit amet urna hendrerit, sodales tortor a, lobortis lectus. Integer sagittis velit turpis, et tincidunt nisi commodo eget. Duis tincidunt elit finibus accumsan cursus. Aenean dignissim scelerisque felis vel lacinia. Nunc lacinia maximus luctus. In hac habitasse platea dictumst. Vestibulum eget urna et enim tempor tempor. Nam feugiat, felis vel vestibulum tempus, orci justo viverra diam, id dapibus lorem justo in ligula. + +Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. In ac pellentesque sem. Vestibulum lacinia magna dui, eu lacinia augue placerat et. Maecenas pulvinar congue est. Pellentesque commodo dui non pulvinar scelerisque. Etiam interdum est posuere sem bibendum, ac commodo magna dictum. Cras ipsum turpis, rhoncus nec posuere vitae, laoreet a arcu. Integer ac massa sit amet enim placerat lacinia sed ultrices arcu. Suspendisse sem nibh, luctus sit amet volutpat in, pellentesque eu metus. Ut gravida neque eget mi accumsan tempus. Nam sit amet aliquet nibh. + +Pellentesque a purus cursus nulla hendrerit congue quis et odio. Aenean hendrerit, leo ullamcorper sagittis hendrerit, erat dui molestie quam, sed condimentum lacus risus sed tellus. Morbi a dapibus lectus, ut feugiat ex. Phasellus pretium quam et sapien mollis, vel iaculis dui dignissim. Sed ullamcorper est turpis, a viverra lorem consectetur in. Aenean aliquet nibh non cursus rutrum. Suspendisse at tristique urna, id lobortis urna. In hac habitasse platea dictumst. Phasellus libero velit, rutrum sed tellus nec, dapibus tincidunt ligula. Quisque vel dui venenatis, consequat nisl ut, lacinia ipsum. Phasellus vitae magna pellentesque, lobortis est id, faucibus quam. Nam eleifend faucibus dui vel pellentesque. + +Etiam ut est non lacus tincidunt interdum. Maecenas sed massa urna. Quisque ut nibh tortor. Pellentesque felis ipsum, tempor finibus ipsum et, euismod pretium metus. Donec sit amet est ipsum. Quisque rhoncus justo non finibus elementum. Nulla nec lectus ac tortor placerat fringilla. Phasellus ac ultrices nunc, eu efficitur nisl. Nulla rhoncus nunc vitae ante dictum tincidunt. Nunc ultrices, massa sit amet malesuada dignissim, lectus lacus consequat sapien, non eleifend metus sem in eros. Phasellus mauris ante, dictum sit amet suscipit ac, rhoncus eget nisi. Phasellus at orci mollis, imperdiet neque eget, faucibus nulla. In at purus massa. Pellentesque quis rutrum lectus. + +Integer eu faucibus turpis, sit amet mollis massa. Vestibulum id nulla commodo, rutrum ipsum sed, semper ante. Phasellus condimentum orci nec nibh convallis, ac maximus orci ullamcorper. Maecenas vitae sollicitudin mi. Integer et finibus lectus, et condimentum ligula. Donec elementum tristique quam vitae dapibus. Morbi euismod ipsum in tristique ullamcorper. + +Duis fermentum non enim eu auctor. Quisque lacinia nibh vehicula nibh posuere, eu volutpat turpis facilisis. Ut ac faucibus nulla. Sed eleifend quis ex et pellentesque. Vestibulum sollicitudin in libero id fringilla. Phasellus dignissim purus consequat, condimentum dui sit amet, condimentum ante. Pellentesque ac consectetur massa, quis sagittis est. Nulla maximus tristique risus accumsan convallis. Curabitur imperdiet ac lacus a ultrices. Nulla facilisi. Sed quis quam quis lectus placerat lobortis vel sed turpis. In mollis dui id neque iaculis, ut aliquet tellus malesuada. Proin at luctus odio, vel blandit sapien. Praesent dignissim tortor vehicula libero fringilla, nec ultrices erat suscipit. Maecenas scelerisque purus in dapibus fermentum. + +Curabitur magna odio, mattis in tortor ut, porttitor congue est. Vestibulum mollis lacinia elementum. Fusce maximus erat vitae nunc rutrum lobortis. Integer ligula eros, auctor vel elit non, posuere luctus lacus. Maecenas quis auctor massa. Ut ipsum lacus, efficitur posuere euismod et, hendrerit efficitur est. Phasellus fringilla, quam id tincidunt pretium, nunc dui sollicitudin orci, eu dignissim nisi metus ut magna. Integer lobortis interdum dolor, non bibendum purus posuere et. Donec non lectus aliquet, pretium dolor eu, cursus massa. Sed ut dui sapien. In sed vestibulum massa. Pellentesque blandit, dui non sodales vehicula, orci metus mollis nunc, non pharetra ex tellus ac est. Mauris sagittis metus et fermentum pretium. Nulla facilisi. Quisque quis ante ut nulla placerat mattis ut quis nisi. + +Sed quis nulla ligula. Quisque dignissim ligula urna, sed aliquam purus semper at. Suspendisse potenti. Nunc massa lectus, pharetra vehicula arcu bibendum, imperdiet sodales ipsum. Nam ac sapien diam. Mauris iaculis fringilla mattis. Pellentesque tempus eros sit amet justo volutpat mollis. Phasellus ac turpis ipsum. Morbi vel ante elit. Aenean posuere quam consequat velit varius suscipit. Donec tempor quam ut nibh cursus efficitur. + +Morbi molestie dolor nec sem egestas suscipit. Etiam placerat pharetra lectus, et ullamcorper risus tristique in. Sed faucibus ullamcorper lectus eget fringilla. Maecenas malesuada hendrerit congue. Sed eget neque a erat placerat tincidunt. Aliquam vitae dignissim turpis. Fusce at placerat magna, a laoreet lectus. Maecenas a purus nec diam gravida fringilla. Nam malesuada euismod ante non vehicula. In faucibus bibendum leo, faucibus posuere nisl pretium quis. Fusce finibus bibendum finibus. Vestibulum eu justo maximus, hendrerit diam nec, dignissim sapien. Aenean dolor lacus, malesuada quis vestibulum ac, venenatis ac ipsum. Cras a est id nunc finibus facilisis. Cras lacinia neque et interdum vehicula. Suspendisse vulputate tellus elit, eget tempor dui finibus vel. + +Cras sed pretium odio. Proin hendrerit elementum felis in tincidunt. Nam sed turpis vel justo molestie accumsan condimentum eu nunc. Praesent lobortis euismod rhoncus. Nulla vitae euismod nibh, quis mattis mi. Fusce ultrices placerat porttitor. Duis sem ipsum, pellentesque sit amet odio a, molestie vulputate mauris. + +Duis blandit mollis ligula, sit amet mattis ligula finibus sit amet. Nunc a leo molestie, placerat diam et, vestibulum leo. Suspendisse facilisis neque purus, nec pellentesque ligula fermentum nec. Aenean malesuada mauris lorem, eu blandit arcu pulvinar quis. Duis laoreet urna lacus, non maximus arcu rutrum ultricies. Nulla augue dolor, suscipit eu mollis eu, aliquam condimentum diam. Ut semper orci luctus, pharetra turpis at, euismod mi. Nulla leo diam, finibus sit amet purus sed, maximus dictum lorem. Integer eu mi id turpis laoreet rhoncus. + +Integer a mauris tincidunt, finibus orci ut, pretium mauris. Nulla molestie nunc mi, id finibus lorem elementum sed. Proin quis laoreet ante. Integer nulla augue, commodo id molestie quis, rutrum ut turpis. Suspendisse et tortor turpis. Sed ut pharetra massa. Pellentesque elementum blandit sem, ut elementum tellus egestas a. Fusce eu purus nibh. + +Cras dignissim ligula scelerisque magna faucibus ullamcorper. Proin at condimentum risus, auctor malesuada quam. Nullam interdum interdum egestas. Nulla aliquam nisi vitae felis mollis dictum. Suspendisse dapibus consectetur tortor. Ut ut nisi non sem bibendum tincidunt. Vivamus suscipit leo quis gravida dignissim. + +Aliquam interdum, leo id vehicula mollis, eros eros rhoncus diam, non mollis ligula mi eu mauris. Sed ultrices vel velit sollicitudin tincidunt. Nunc auctor metus at ligula gravida elementum. Praesent interdum eu elit et mollis. Duis egestas quam sit amet velit dignissim consequat. Aliquam ac turpis nec nunc convallis sagittis. Fusce blandit, erat ac fringilla consectetur, dolor eros sodales leo, vel aliquet risus nisl et diam. Aliquam luctus felis vitae est eleifend euismod facilisis et lacus. Sed leo tellus, auctor eu arcu in, volutpat sagittis nisl. Pellentesque nisl ligula, placerat vel ullamcorper at, vulputate ac odio. Morbi ac faucibus orci, et tempus nulla. Proin rhoncus rutrum dolor, in venenatis mauris. Suspendisse a fermentum augue, non semper mi. Nunc eget pretium neque. Phasellus augue erat, feugiat ac aliquam congue, rutrum non sapien. Pellentesque ac diam gravida, consectetur felis at, ornare neque. + +Nullam interdum mattis sapien quis porttitor. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus aliquet rutrum ipsum id euismod. Maecenas consectetur massa et mi porta viverra. Nunc quam nibh, dignissim vitae maximus et, ullamcorper nec lorem. Nunc vitae justo dapibus, luctus lacus vitae, pretium elit. Maecenas et efficitur leo. Curabitur mauris lectus, placerat quis vehicula vitae, auctor ut urna. Quisque rhoncus pharetra luctus. In hac habitasse platea dictumst. Integer sit amet metus nec eros malesuada aliquam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Morbi hendrerit mi ac leo aliquam, sit amet ultricies libero commodo. Mauris dapibus purus metus, sit amet viverra nibh imperdiet et. Nullam porta nulla tellus, quis vehicula diam imperdiet non. Vivamus enim massa, bibendum in fermentum in, ultrices at ex. + +Suspendisse fermentum id nibh eget accumsan. Duis dapibus bibendum erat ut sollicitudin. Aliquam nec felis risus. Pellentesque rhoncus ligula id sem maximus mollis sed nec massa. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ipsum ipsum, sodales sed enim id, convallis faucibus eros. Donec ultricies dictum tincidunt. Cras vitae nibh arcu. Pellentesque cursus, sapien nec consequat fermentum, ipsum ante suscipit dui, imperdiet hendrerit est nisl eu massa. Quisque vitae sem ligula. Aenean iaculis metus ut mauris interdum laoreet. Vivamus sed gravida dolor. + +Morbi nulla metus, porttitor sed eros sit amet, efficitur efficitur est. In vel nisl urna. Ut aliquet tellus at congue convallis. Phasellus imperdiet lobortis sollicitudin. Integer sodales, sem eu ultricies pharetra, erat erat porttitor odio, eget dapibus libero ipsum eget velit. Phasellus gravida nulla nisl, eu pharetra mi auctor vel. Sed blandit pharetra velit, ut egestas libero placerat non. Aliquam a interdum quam. Proin at tortor nec dui sollicitudin tempus sed vestibulum elit. Nunc non sollicitudin velit. + +Aenean consequat diam velit, sed rutrum tortor faucibus dictum. Quisque at semper augue. Duis ut est eget mi ornare bibendum id et ligula. Phasellus consequat tortor non leo pulvinar posuere. Proin vestibulum eleifend felis, in hendrerit tortor sollicitudin eu. Phasellus hendrerit, lacus vel laoreet interdum, dui tortor consequat justo, commodo ultricies arcu felis vitae enim. Vivamus eu sapien at leo suscipit rutrum eu at justo. Aenean et dolor a libero ullamcorper posuere. Integer laoreet placerat nisi in vulputate. Mauris laoreet eget risus sed cursus. Donec scelerisque neque a libero eleifend hendrerit. Nulla varius condimentum nunc sit amet fermentum. Aliquam lorem ex, varius nec mollis ut, ultrices in neque. Morbi sit amet porta leo. Integer iaculis fermentum lacus in vestibulum. + +Ut gravida, tellus ut maximus ultrices, erat est venenatis nisl, vitae pretium massa ex ac magna. Sed non purus eget ligula aliquet volutpat non quis arcu. Nam aliquam tincidunt risus, sit amet fringilla sapien vulputate ut. Mauris luctus suscipit pellentesque. Nunc porttitor dapibus ex quis tempus. Ut ullamcorper metus a eros vulputate, vitae viverra lectus convallis. Mauris semper imperdiet augue quis tincidunt. Integer porta pretium magna, sed cursus sem scelerisque sollicitudin. Nam efficitur, nibh pretium eleifend vestibulum, purus diam posuere sem, in egestas mauris augue sit amet urna. + +Vestibulum tincidunt euismod massa in congue. Duis interdum metus non laoreet fringilla. Donec at ligula congue, tincidunt nunc non, scelerisque nunc. Donec bibendum magna non est scelerisque feugiat at nec neque. Ut orci tortor, tempus eget massa non, dignissim faucibus dolor. Nam odio risus, accumsan pretium neque eget, accumsan dignissim dui. In ut neque auctor, scelerisque tellus sed, ullamcorper nisi. Suspendisse varius cursus quam at hendrerit. Vivamus elit libero, sagittis vitae sem ac, vulputate iaculis ligula. + +Sed lobortis laoreet purus sit amet rutrum. Pellentesque feugiat non leo vel lacinia. Quisque feugiat nisl a orci bibendum vestibulum. In et sollicitudin urna. Morbi a arcu ac metus faucibus tempus. Nam eu imperdiet sapien, suscipit mattis tortor. Aenean blandit ipsum nisi, a eleifend ligula euismod at. Integer tincidunt pharetra felis, mollis placerat mauris hendrerit at. Curabitur convallis, est sit amet luctus volutpat, massa lacus cursus augue, sed eleifend magna quam et risus. Aliquam lobortis tincidunt metus vitae porttitor. Suspendisse potenti. Aenean ullamcorper, neque id commodo luctus, nulla nunc lobortis quam, id dapibus neque dui nec mauris. Etiam quis lorem quis elit commodo ornare. Ut pharetra purus ultricies enim ultrices efficitur. Proin vehicula tincidunt molestie. Mauris et placerat sem. + +Aliquam erat volutpat. Suspendisse velit turpis, posuere ac lacus eu, lacinia laoreet velit. Sed interdum felis neque, id blandit sem malesuada sit amet. Ut sagittis justo erat, efficitur semper orci tempor sed. Donec enim massa, posuere varius lectus egestas, pellentesque posuere mi. Cras tincidunt ut libero sed mattis. Suspendisse quis magna et tellus posuere interdum vel at purus. Pellentesque fringilla tristique neque, id aliquet tellus ultricies non. Duis ut tellus vel odio lobortis vulputate. + +Integer at magna ac erat convallis vestibulum. Sed lobortis porttitor mauris. Fusce varius lorem et volutpat pulvinar. Aenean ac vulputate lectus, vitae consequat velit. Suspendisse ex dui, varius ut risus ut, dictum scelerisque sem. Vivamus urna orci, volutpat ut convallis ac, venenatis vitae urna. In hac habitasse platea dictumst. Etiam eu purus arcu. Aenean vulputate leo urna, vel tristique dui sagittis euismod. Suspendisse non tellus efficitur ante rhoncus volutpat at et sapien. + +Sed dapibus accumsan porttitor. Phasellus facilisis lectus finibus ligula dignissim, id pulvinar lectus feugiat. Nullam egestas commodo nisi posuere aliquet. Morbi sit amet tortor sagittis, rutrum dui nec, dapibus sapien. Sed posuere tortor tortor, interdum auctor magna varius vitae. Vestibulum id sagittis augue. Curabitur fermentum arcu sem, eu condimentum quam rutrum non. Phasellus rutrum nibh quis lectus rhoncus pretium. Curabitur dictum interdum elit. Vestibulum maximus sodales imperdiet. Mauris auctor nec purus sed venenatis. In in urna purus. + +Duis placerat molestie suscipit. Morbi a elit id purus efficitur consequat. Nunc ac commodo turpis. Etiam sit amet lacus a ipsum tempus venenatis sed vel nibh. Duis elementum aliquam mi sed tristique. Morbi ligula tortor, semper ac est vel, lobortis maximus erat. Curabitur ipsum felis, laoreet vel condimentum eget, ullamcorper sit amet mauris. Nulla facilisi. Nam at purus sed mi egestas placerat vitae vel magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse at dignissim diam. Phasellus consectetur eget neque vel viverra. Donec sollicitudin mattis dolor vel malesuada. Vivamus vehicula leo neque, vitae fermentum leo posuere et. Praesent dui est, finibus sit amet tristique quis, pharetra vel nibh. + +Duis nulla leo, accumsan eu odio eget, sagittis semper orci. Quisque ullamcorper ligula quam, commodo porttitor mauris ullamcorper eu. Cras varius sagittis felis in aliquam. Duis sodales risus ac justo vehicula, nec mattis diam lacinia. Cras eget lectus ipsum. Ut commodo, enim vitae malesuada hendrerit, ex dolor egestas lectus, sit amet hendrerit metus diam nec est. Vestibulum tortor metus, lobortis sit amet ante eget, tempor molestie lacus. In molestie et urna et semper. Mauris mollis, sem non hendrerit condimentum, sapien nisi cursus est, non suscipit quam justo non metus. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam enim est, porta ac feugiat vitae, rutrum in lorem. Duis vehicula tortor ut posuere maximus. + +Nullam vestibulum non tellus sed commodo. Quisque mattis elit sit amet sapien sollicitudin, ut condimentum nisl congue. Aenean sagittis massa vel elit faucibus fermentum. Donec tincidunt nisi nec nisl sodales pellentesque. Mauris congue congue ligula ut suscipit. Vivamus velit tortor, tempor et gravida eget, fermentum sit amet ante. Nullam fringilla, lorem at ultrices cursus, urna neque ornare dolor, eu lacinia orci enim sed nibh. Ut a ullamcorper lectus, id mattis purus. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aenean maximus sollicitudin posuere. Nunc at augue lacus. Aenean efficitur leo sit amet lacinia efficitur. + +Quisque venenatis quam mi, in pharetra odio vulputate eu. In vel nisl pulvinar, pulvinar ligula ut, sodales risus. Sed efficitur lectus at vestibulum tincidunt. Vestibulum eu ullamcorper elit. Fusce vestibulum magna enim, et tempor lacus posuere vitae. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Integer leo elit, luctus nec mattis sit amet, sollicitudin in turpis. + +Proin convallis venenatis leo, vitae tristique erat iaculis nec. Nulla facilisi. Duis porttitor, sapien et bibendum vulputate, sem libero sodales lacus, non malesuada felis erat ut libero. Nam non felis semper, finibus est a, mattis mauris. Praesent nec eros quam. Nulla hendrerit, augue consectetur eleifend ultricies, purus mi condimentum nulla, eget dapibus est nunc sed libero. Nullam elementum dui erat, vitae luctus libero sollicitudin et. Nulla odio magna, placerat in augue eu, dapibus imperdiet odio. Suspendisse imperdiet metus sit amet rhoncus dapibus. Cras at enim et urna vehicula cursus eu a mauris. Integer magna ante, eleifend ac placerat vitae, porta at nisi. Cras eget malesuada orci. Curabitur nunc est, vulputate id viverra et, dignissim sed odio. Curabitur non mattis sem. Sed bibendum, turpis vitae vehicula faucibus, nunc quam ultricies lectus, vitae viverra felis turpis at libero. + +Nullam ut egestas ligula. Proin hendrerit justo a lectus commodo venenatis. Nulla facilisi. Ut cursus lorem quis est bibendum condimentum. Aenean in tristique odio. Fusce tempor hendrerit ipsum. Curabitur mollis felis justo, quis dapibus erat auctor vel. Sed augue lectus, finibus ut urna quis, ullamcorper vestibulum dui. Etiam molestie aliquam tempor. Integer mattis sollicitudin erat, et tristique elit varius vel. Mauris a ex justo. + +Nam eros est, imperdiet non volutpat rutrum, pellentesque accumsan ligula. Duis sit amet turpis metus. Aenean in rhoncus metus, ac fringilla ex. Suspendisse condimentum egestas purus, ut pharetra odio vulputate vel. Duis tincidunt massa a placerat ultrices. Mauris ultricies nibh sit amet condimentum malesuada. Duis tincidunt id ipsum sed congue. + +Praesent eu ex augue. Nullam in porta ligula. In tincidunt accumsan arcu, in pellentesque magna tristique in. Mauris eleifend libero ac nisl viverra faucibus. Nam sollicitudin dolor in commodo hendrerit. Cras at orci metus. Ut quis laoreet orci. Vivamus ultrices leo pellentesque tempor aliquet. Maecenas ut eros vitae purus placerat vestibulum. Etiam vitae gravida dolor, quis rhoncus diam. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. + +Suspendisse fringilla lacinia sagittis. Integer tincidunt consectetur tristique. Morbi non orci convallis, congue sapien quis, vulputate nunc. Donec a libero vel magna elementum facilisis non quis mi. Mauris posuere tellus non ipsum ultrices elementum. Vivamus massa velit, facilisis quis placerat aliquet, aliquet nec leo. Praesent a maximus sem. Sed neque elit, feugiat vel quam non, molestie sagittis nunc. Etiam luctus nunc ac mauris scelerisque, nec rhoncus lacus convallis. Nunc pharetra, nunc ac pulvinar aliquam, ex ipsum euismod augue, nec porttitor lacus turpis vitae neque. Fusce bibendum odio id tortor faucibus pellentesque. Sed ac porta nibh, eu gravida erat. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Aliquam quis ullamcorper felis. Nulla mattis sagittis ante ac tincidunt. Integer ac felis efficitur, viverra libero et, facilisis ligula. Suspendisse a metus a massa rhoncus posuere. Phasellus suscipit ligula ut lacus facilisis, ac pellentesque ex tempor. Quisque consectetur massa mi, ac molestie libero dictum quis. Proin porttitor ligula quis erat tincidunt venenatis. Proin congue nunc sed elit gravida, nec consectetur lectus sodales. Etiam tincidunt convallis ipsum at vestibulum. Quisque maximus enim et mauris porttitor, et molestie magna tristique. Morbi vitae metus elit. Maecenas sed volutpat turpis. Aliquam vitae dolor vestibulum, elementum purus eget, dapibus nibh. Nullam egestas dui ac rutrum semper. + +Etiam hendrerit est metus, et condimentum metus aliquam ac. Pellentesque id neque id ipsum rhoncus vulputate. Aliquam erat nisl, posuere sit amet ligula ac, fermentum blandit felis. Vivamus fermentum mi risus, non lacinia purus viverra id. Aenean ac sapien consequat, finibus mauris nec, porta sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed quis consectetur ex, dignissim bibendum nulla. Phasellus ac libero at quam vehicula euismod non eu leo. Phasellus a sapien augue. + +Maecenas ligula dui, bibendum vitae mauris et, auctor laoreet felis. Duis non libero a mi semper mattis. Quisque consequat luctus massa, quis tristique eros auctor feugiat. Maecenas sodales euismod neque vitae facilisis. Nullam laoreet imperdiet velit at pellentesque. Etiam massa odio, facilisis a consequat vitae, placerat vel magna. Nunc sagittis eros nec urna fringilla, pulvinar vestibulum nibh scelerisque. Sed magna metus, cursus eu consequat et, pharetra a est. Suspendisse elementum neque a dui malesuada lacinia. Donec sed ipsum volutpat, cursus urna id, ullamcorper arcu. Maecenas laoreet nisl eget velit egestas sollicitudin. Etiam nisl turpis, mollis id dignissim vitae, tristique vehicula ante. Maecenas eget placerat est, at rutrum augue. Vivamus faucibus lacinia ullamcorper. Sed pulvinar urna sodales ante sodales, at gravida leo dictum. + +Morbi maximus, quam a lobortis bibendum, enim felis varius elit, ac vehicula elit nisl ut lacus. Quisque ut arcu augue. Praesent id turpis quam. Sed sed arcu eros. Maecenas at cursus lorem, ac eleifend nisi. Fusce mattis felis at commodo pharetra. Praesent ac commodo ipsum. Quisque finibus et eros vitae tincidunt. In hac habitasse platea dictumst. Praesent purus ipsum, luctus lobortis ornare quis, auctor eget justo. Nam vel enim sollicitudin, faucibus tortor eu, sagittis eros. Ut nec consectetur erat. Donec ultricies malesuada ligula, a hendrerit sapien volutpat in. Maecenas sed enim vitae sapien pulvinar faucibus. + +Proin semper nunc nibh, non consequat neque ullamcorper vel. Maecenas lobortis sagittis blandit. Aenean et arcu ultricies turpis malesuada malesuada. Ut quam ex, laoreet ut blandit cursus, feugiat vitae dolor. Etiam ex lacus, scelerisque vel erat vel, efficitur tincidunt magna. Morbi tristique lacinia dolor, in egestas magna ultrices vitae. Integer ultrices leo ac tempus venenatis. Praesent ac porta tortor. Vivamus ornare blandit tristique. Nulla rutrum finibus pellentesque. In non dui elementum, fermentum ipsum vel, varius magna. Pellentesque euismod tortor risus, ac pellentesque nisl faucibus eget. + +Vivamus eu enim purus. Cras ultrices rutrum egestas. Sed mollis erat nibh, at posuere nisl luctus nec. Nunc vulputate, sapien id auctor molestie, nisi diam tristique ante, non convallis tellus nibh at orci. Morbi a posuere purus, in ullamcorper ligula. Etiam elementum sit amet dui imperdiet iaculis. Proin vitae tincidunt ipsum, sit amet placerat lectus. Curabitur commodo sapien quam, et accumsan lectus fringilla non. Nullam eget accumsan enim, ac pharetra mauris. Sed quis tristique velit, vitae commodo nisi. Duis turpis dui, maximus ut risus at, finibus consequat nunc. Maecenas sed est accumsan, aliquet diam in, facilisis risus. Curabitur vehicula rutrum auctor. Nam iaculis risus pulvinar maximus viverra. Nulla vel augue et ex sagittis blandit. + +Ut sem nulla, porta ac ante ac, posuere laoreet eros. Donec sodales posuere justo a auctor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras mollis at orci hendrerit porta. Nullam sodales tortor tortor, non lacinia diam finibus id. Duis libero orci, suscipit ac odio et, dictum consequat ipsum. Pellentesque eu ligula sagittis, volutpat eros at, lacinia lorem. Cras euismod tellus in iaculis tempor. Quisque accumsan, magna a congue venenatis, ante ipsum aliquam lectus, at egestas enim nunc at justo. Quisque sem purus, viverra ut tristique ut, maximus id enim. Etiam quis placerat sem. In sollicitudin, lacus eu rutrum mollis, nulla eros luctus elit, vel dapibus urna purus nec urna. Phasellus egestas massa quam, ac molestie erat hendrerit a. Praesent ultrices neque ut turpis molestie auctor. Etiam molestie placerat purus, et euismod erat aliquam in. Morbi id suscipit justo. + +Proin est ante, consequat at varius a, mattis quis felis. Sed accumsan nibh sit amet ipsum elementum posuere. Vestibulum bibendum id diam sit amet gravida. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Morbi nec dolor vel ipsum dignissim hendrerit vel non ipsum. Praesent facilisis orci quis elit auctor lobortis. Phasellus cursus risus lectus, vel lobortis libero dapibus in. Quisque tristique tempus leo a pulvinar. Pellentesque a magna tincidunt, pellentesque massa nec, laoreet orci. Morbi congue ornare dolor quis commodo. Phasellus massa nisi, tincidunt at eros dictum, hendrerit lobortis urna. Maecenas porta, magna id mattis molestie, nibh tellus lobortis sem, eget tincidunt ipsum quam eu turpis. + +Ut gravida orci risus, vel rutrum mauris vehicula id. Etiam bibendum, neque a placerat condimentum, ex orci imperdiet lectus, quis dapibus arcu lacus eget lectus. Sed consequat non mi sit amet venenatis. Fusce vestibulum erat libero, eget hendrerit risus vulputate sollicitudin. Integer sed eleifend felis. Donec commodo, sem eu mattis placerat, urna odio aliquam tellus, et laoreet justo tellus eget erat. Fusce sed suscipit tortor. Nam hendrerit nibh ac nunc auctor lacinia. Pellentesque placerat condimentum ipsum, eget semper tortor hendrerit vel. Nullam non urna eu lacus pellentesque congue ut id eros. + +Nunc finibus leo in rhoncus tristique. Sed eu ipsum nec nisl egestas faucibus eget a felis. Pellentesque vitae nisi in nulla accumsan fermentum. Sed venenatis feugiat eleifend. Fusce porttitor varius placerat. Aliquam aliquet lacus sit amet mattis mollis. Sed vel nulla quis dolor suscipit vehicula ac viverra lorem. Duis viverra ipsum eget nulla ullamcorper fermentum. Mauris tincidunt arcu quis quam fringilla ornare. Donec et iaculis tortor. Nam ultricies libero vel ipsum aliquet efficitur. Morbi eget dolor aliquam, tempus sapien eget, viverra ante. Donec varius mollis ex, sed efficitur purus euismod interdum. Quisque vel sapien non neque tincidunt semper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Suspendisse sit amet purus leo. Fusce lectus lorem, aliquam ac nulla eget, imperdiet ornare eros. Nullam sem augue, varius in nisi non, sollicitudin pellentesque ante. Etiam eu odio condimentum, tempor libero et, egestas arcu. Cras pellentesque eleifend aliquet. Pellentesque non blandit ligula. Ut congue viverra rhoncus. Phasellus mattis mi ac eros placerat, eu feugiat tellus ultrices. Aenean mollis laoreet libero eu imperdiet. Cras sed pulvinar mi, ac vehicula ligula. Vestibulum sit amet ex massa. In a egestas eros. + +Mauris pretium ipsum risus, venenatis cursus ante imperdiet id. Praesent eu turpis nec risus feugiat maximus ullamcorper ac lectus. Integer placerat at mi vel dapibus. Vestibulum fermentum turpis sit amet turpis viverra, id aliquet diam suscipit. Nam nec ex sed ante ullamcorper pharetra quis sit amet risus. Sed ac faucibus velit, id feugiat nibh. Nullam eget ipsum ex. Vivamus tincidunt non nunc non faucibus. Quisque bibendum viverra facilisis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur at nisi hendrerit quam suscipit egestas. Curabitur laoreet maximus ultricies. Duis ut tellus ac augue molestie dictum. + +Suspendisse rhoncus iaculis erat, ut ullamcorper est tristique eget. Donec auctor nec risus at gravida. Vivamus volutpat vulputate tellus, vel ultricies eros suscipit eget. Ut pulvinar id mi eu tempus. Morbi malesuada augue in dui varius, nec blandit neque vehicula. Donec ornare nec nisl in mollis. Morbi enim nisi, rhoncus nec est id, dapibus tempus urna. Ut id elit a felis vestibulum consectetur. Duis lectus quam, pharetra sit amet diam sed, posuere vestibulum erat. Fusce vitae maximus massa. Nullam id metus tempus, iaculis risus eu, lobortis urna. Quisque in congue urna. Pellentesque placerat neque in augue dapibus, non varius ex malesuada. Curabitur ut eleifend libero. Fusce vitae ligula luctus, fermentum enim vitae, ultrices erat. + +Sed viverra augue turpis, scelerisque egestas sapien mattis eu. Duis laoreet magna at ex pharetra dapibus. Praesent eget odio vel quam venenatis dictum. Nulla in sollicitudin dolor. Mauris lobortis nec eros vel rhoncus. Vestibulum porta viverra venenatis. Curabitur vel scelerisque quam, a egestas velit. Praesent volutpat tincidunt magna at laoreet. + +Cras nec lorem odio. Pellentesque quis dui urna. Praesent at tellus ac lectus scelerisque placerat nec eu risus. Vestibulum sit amet mattis ligula. Vivamus sed nisi at leo elementum accumsan at sit amet arcu. Aenean mattis tellus nec leo gravida, eget hendrerit nisl faucibus. Mauris pellentesque luctus condimentum. Maecenas pretium sapien nunc, eget commodo dolor maximus id. Mauris vestibulum accumsan massa a dictum. Phasellus interdum quam ligula, ut maximus diam blandit aliquam. Nunc vitae ex eu erat condimentum consectetur. Maecenas interdum condimentum volutpat. + +Donec et enim a libero rutrum laoreet. Praesent a condimentum sem, at tincidunt quam. In vel molestie risus. Sed urna dui, molestie vitae mollis laoreet, tempor quis lectus. Praesent vitae auctor est, et aliquet nunc. Curabitur vulputate blandit nulla, at gravida metus. Maecenas gravida dui eu iaculis tristique. Pellentesque posuere turpis nec auctor eleifend. Suspendisse bibendum diam eu tellus lobortis, et laoreet quam congue. In hac habitasse platea dictumst. Morbi dictum neque velit, eget rutrum eros ultrices sit amet. + +Phasellus fermentum risus pharetra consectetur bibendum. Donec magna tortor, lacinia vitae nibh quis, aliquet pretium lorem. Donec turpis nisi, pretium eu enim volutpat, mattis malesuada augue. Nullam vel tellus iaculis, sollicitudin elit eget, tincidunt lacus. Fusce elementum elementum felis et iaculis. Suspendisse porta eros nec neque malesuada, in malesuada ante sollicitudin. Vivamus bibendum viverra molestie. + +Integer feugiat, erat nec convallis aliquam, velit felis congue erat, molestie eleifend tellus erat in tellus. Nunc et justo purus. Donec egestas fermentum dui non feugiat. Quisque in sapien sagittis, gravida quam id, iaculis lectus. Cras sagittis rhoncus bibendum. Fusce quis metus in velit scelerisque tincidunt at non ipsum. Vivamus efficitur ante eu odio vulputate, vitae ultricies risus vehicula. Proin eget odio eu sem tincidunt feugiat vel id lorem. + +Vestibulum sit amet nulla dignissim, euismod mi in, fermentum tortor. Donec ut aliquet libero, lacinia accumsan velit. Donec et nulla quam. Nullam laoreet odio nec nunc imperdiet, a congue eros venenatis. Quisque nec tellus sit amet neque interdum posuere. Duis quis mi gravida, tincidunt diam convallis, ultricies augue. Mauris consequat risus non porttitor congue. Ut in ligula consequat, viverra nunc a, eleifend enim. Duis ligula urna, imperdiet nec facilisis et, ornare eu ex. Proin lobortis lectus a lobortis porttitor. Nulla leo metus, egestas eu libero sed, pretium faucibus felis. Vestibulum non sem tortor. Nam cursus est leo. Vivamus luctus enim odio, non interdum sem dapibus a. Aenean accumsan consequat lectus in imperdiet. + +Donec vehicula laoreet ipsum in posuere. Quisque vel quam imperdiet, sollicitudin nisi quis, suscipit velit. Morbi id sodales mauris. Curabitur tellus arcu, feugiat sed dui sit amet, sodales sagittis libero. Aenean vel suscipit metus, non placerat leo. Vestibulum quis nulla elit. Proin scelerisque non ante ut commodo. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Sed non urna dolor. Suspendisse convallis mi porta pulvinar ultrices. Suspendisse quam ipsum, hendrerit non scelerisque molestie, interdum dictum nunc. Morbi condimentum condimentum turpis eu luctus. Pellentesque sagittis sollicitudin odio, sed ultricies felis ornare sit amet. Sed ultrices ex leo, a tincidunt nisl gravida sed. Nullam ornare accumsan porta. Praesent consectetur id est nec sollicitudin. + +In hac habitasse platea dictumst. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sed ultrices nibh. Duis accumsan suscipit eros, a dictum odio tempus sit amet. Aenean imperdiet erat ac lacus finibus, scelerisque cursus massa imperdiet. Mauris molestie risus ut lacinia posuere. Nulla et sodales purus. Maecenas orci erat, placerat in tristique quis, placerat in mi. + +Donec sollicitudin pellentesque odio in feugiat. Morbi eu dolor ut mauris congue sollicitudin. Aliquam erat volutpat. Nulla id varius dui. Curabitur finibus urna ante, consectetur interdum nisi volutpat a. Quisque quis mi tristique, consequat tellus eget, rutrum sapien. Vivamus vitae tellus vulputate, rutrum ex eu, vulputate sem. Suspendisse viverra lorem tellus, vel interdum orci gravida quis. Ut laoreet arcu at mi ullamcorper finibus. Duis porta sagittis vestibulum. Sed commodo nisl vitae urna sollicitudin, nec lacinia est sodales. Curabitur imperdiet sodales dui sed iaculis. Sed ac tellus maximus, eleifend quam sit amet, feugiat elit. Aenean viverra, dui at mattis varius, est odio vestibulum sapien, sit amet mollis libero massa nec velit. Etiam quis sodales justo. + +Ut ultricies, sem eget sodales feugiat, nunc arcu congue elit, ac tempor justo massa nec purus. Maecenas enim nunc, pharetra eget dictum sit amet, tempus pellentesque velit. Suspendisse venenatis ligula in nulla mattis, et imperdiet ex tincidunt. Etiam vulputate, tellus et ultrices suscipit, enim velit laoreet massa, vitae congue odio enim ac urna. Morbi quam lorem, iaculis ac varius sagittis, euismod quis dolor. In ut dui eu purus feugiat consectetur. Vestibulum cursus velit quis lacus pellentesque iaculis. Cras in risus sed mauris porta rutrum. Nulla facilisi. Nullam eu bibendum est, non pellentesque lectus. Sed imperdiet feugiat lorem, quis convallis ante auctor in. Maecenas justo magna, scelerisque sit amet tellus eget, varius elementum risus. Duis placerat et quam sed varius. + +Duis nec nibh vitae nibh dignissim mollis quis sed felis. Curabitur vitae quam placerat, venenatis purus ut, euismod nisl. Curabitur porttitor nibh eu pulvinar ullamcorper. Suspendisse posuere nec ipsum ac dapibus. Cras convallis consectetur urna. Phasellus a nibh in dolor lacinia posuere id eget augue. In eu pharetra lorem, vitae cursus lacus. Aliquam tincidunt nibh lectus. Aenean facilisis ultricies posuere. Sed ut placerat orci. Curabitur scelerisque gravida blandit. Maecenas placerat ligula eget suscipit fringilla. Mauris a tortor justo. Aliquam hendrerit semper mollis. Phasellus et tincidunt libero. Etiam vel quam libero. + +Quisque aliquet tempor ex. Ut ante sem, vehicula at enim vel, gravida porta elit. Etiam vitae lacus a neque lobortis consectetur. Mauris sed interdum odio. Mauris elementum ex blandit tempor cursus. Integer in enim in leo viverra elementum. Fusce consectetur metus et sem rutrum, mattis euismod diam semper. Nunc sed ipsum vel urna consequat vehicula. Donec cursus pretium lorem, vestibulum pretium felis commodo sit amet. Nam blandit felis enim, eget gravida ex faucibus a. In nec neque massa. Etiam laoreet posuere ipsum. Praesent volutpat nunc dolor, ac vulputate magna facilisis non. Aenean congue turpis vel lectus sollicitudin tristique. Sed nec consequat purus, non vehicula quam. Etiam ultricies, est ac dictum tincidunt, turpis turpis pretium massa, a vulputate libero justo at nibh. + +Aliquam erat volutpat. Cras ultrices augue ac sollicitudin lobortis. Curabitur et aliquet purus. Duis feugiat semper facilisis. Phasellus lobortis cursus velit, a sollicitudin tortor. Nam feugiat sapien non dapibus condimentum. Morbi at mi bibendum, commodo quam at, laoreet enim. Integer eu ultrices enim. Sed vestibulum eu urna ut dictum. Curabitur at mattis leo, sed cursus massa. Aliquam porttitor, felis quis fermentum porttitor, justo velit feugiat nulla, eget condimentum sem dui ut sapien. + +In fringilla elit eu orci aliquam consequat. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut eget fringilla tellus. Curabitur fermentum, mi et condimentum suscipit, elit neque bibendum dui, et hendrerit nunc metus id ipsum. Morbi placerat mi in hendrerit congue. Ut feugiat mauris eget scelerisque viverra. Vivamus sit amet erat dictum, sagittis lectus nec, pulvinar lorem. Sed non enim ac dui sollicitudin aliquet. Quisque ut lacus dolor. Fusce hendrerit malesuada euismod. Nulla faucibus vel mauris eu mollis. Mauris est diam, fringilla ac arcu feugiat, efficitur volutpat turpis. Aliquam venenatis cursus massa sed porttitor. Ut ac finibus enim, in tincidunt sapien. + +Nunc faucibus semper turpis a lacinia. Phasellus gravida, libero vel pulvinar ornare, ex sem tincidunt lectus, sit amet convallis augue risus at tortor. Quisque sit amet ipsum id nulla posuere vestibulum. Pellentesque scelerisque mauris vel leo viverra sodales. Nulla viverra aliquam ex, ut rutrum enim fermentum venenatis. Aenean eget dapibus ex, eget faucibus metus. Vestibulum volutpat leo in diam semper, eget porta magna suscipit. Sed sit amet nulla blandit, aliquam dolor ac, gravida velit. Sed vel velit viverra, maximus est id, convallis justo. + +Curabitur nulla ante, vulputate at libero vel, ullamcorper rutrum nibh. Pellentesque porttitor eu mauris id mattis. Duis vulputate augue elit, eget interdum justo pretium vel. Maecenas eu vulputate arcu, eget posuere purus. Suspendisse viverra a velit dictum eleifend. Suspendisse vitae dapibus diam. Donec vehicula justo in ante interdum, eu luctus diam placerat. Vivamus convallis ipsum eu orci suscipit, sed fermentum enim euismod. Maecenas faucibus elit vitae ex ornare tristique. Donec vestibulum nec elit sit amet porttitor. Aenean tempor lectus eget tortor hendrerit luctus. Nullam interdum vitae lectus vel feugiat. Cras in risus non magna consectetur lobortis. Sed faucibus enim quis gravida convallis. + +Phasellus eget massa sit amet libero ultrices suscipit. Vivamus at risus sapien. Nam mollis nunc eget velit dictum maximus. Sed pellentesque, nunc ac fringilla lacinia, quam enim mattis ex, sed euismod tortor metus eu neque. Ut mattis nisl ut lectus rhoncus, sodales bibendum eros porta. Nulla porttitor enim nec diam sagittis, eget porta velit efficitur. Vestibulum ultricies eros neque. Phasellus rutrum suscipit enim, in interdum ante gravida vitae. Sed in sagittis diam, non commodo velit. + +Morbi hendrerit odio orci, nec tincidunt odio rhoncus nec. Mauris neque velit, vehicula a lorem at, suscipit tristique dui. Sed finibus, nisl in mattis convallis, turpis neque sodales lacus, eu porta enim magna non diam. Nam commodo sodales risus consectetur malesuada. In eget elementum justo. Phasellus sit amet massa imperdiet, dapibus nunc sit amet, suscipit orci. Fusce condimentum laoreet feugiat. Ut ut viverra ante. Praesent bibendum interdum commodo. Nulla mollis nisi a est ornare volutpat. Sed at ligula eu nisi dapibus tempus. Proin cursus vestibulum justo, nec efficitur justo dignissim vel. Nunc quis maximus eros. + +Cras viverra, diam a tristique mattis, libero felis vulputate tellus, a ornare felis leo a dui. Nulla ante nulla, finibus ut tellus ut, blandit pharetra nibh. Proin eleifend fermentum ex, eget auctor libero vulputate in. Nullam ultricies, mauris placerat pretium placerat, leo urna lobortis leo, vel placerat arcu libero sed mauris. Aliquam mauris ligula, ornare at urna at, eleifend gravida ligula. Vestibulum consectetur ut nulla non scelerisque. Donec ornare, sem nec elementum aliquam, urna nulla bibendum metus, eu euismod dui ligula ac est. Fusce laoreet erat eu ex lobortis, quis bibendum ligula interdum. Sed vel mi erat. Vivamus id lacus ac enim mattis tempor. Nunc ultricies pellentesque enim sed euismod. Fusce tincidunt convallis elit quis aliquam. Mauris nulla ipsum, sollicitudin quis diam ac, feugiat volutpat tellus. In nibh nibh, vulputate quis tincidunt quis, pulvinar eget magna. Pellentesque quis finibus dolor. Suspendisse viverra vitae lectus non eleifend. + +Nunc ut orci et sapien maximus semper. Nulla dignissim sem urna, ac varius lectus ultricies id. Quisque aliquet pulvinar pretium. In ultricies molestie tellus vehicula porta. Nam enim lorem, aliquam eget ex et, hendrerit volutpat quam. Maecenas diam lacus, pellentesque eget tempus ac, pharetra eu elit. Donec vel eros a sem facilisis vulputate. Nullam ac nisi vulputate, laoreet nisl ac, eleifend sem. Nullam mi massa, rhoncus sed pharetra interdum, tincidunt eget nunc. Aliquam viverra mattis posuere. Mauris et dui sed nisl sollicitudin fermentum quis ut arcu. Nam placerat eget orci at tincidunt. Curabitur vel turpis metus. Phasellus nibh nulla, fermentum scelerisque sem vel, gravida tincidunt velit. Pellentesque vel quam tempor, finibus massa pellentesque, condimentum dui. + +Donec at mattis neque. Etiam velit diam, consequat auctor mauris id, hendrerit faucibus metus. Maecenas ullamcorper eros a est sodales, ac consectetur odio scelerisque. Donec leo metus, imperdiet at pellentesque vel, feugiat id erat. Suspendisse at magna enim. Vestibulum placerat sodales lorem id sollicitudin. Aenean at euismod ligula, eget mollis diam. Phasellus pulvinar, orci nec pretium condimentum, est erat facilisis purus, quis feugiat augue elit aliquam nulla. Aenean vitae tortor id risus congue tincidunt. Sed dolor enim, mattis a ullamcorper id, volutpat ac leo. + +Proin vehicula feugiat augue, id feugiat quam sodales quis. Donec et ultricies massa, a lacinia nulla. Duis aliquam augue ornare euismod viverra. Ut lectus risus, rutrum sit amet efficitur a, luctus nec nisl. Cras volutpat ullamcorper congue. Sed vitae odio metus. Phasellus aliquet euismod varius. + +Nullam sem ex, malesuada ut magna ut, pretium mollis arcu. Nam porttitor eros cursus mi lacinia faucibus. Suspendisse aliquet eleifend iaculis. Maecenas sit amet viverra tortor. Nunc a mollis risus. Etiam tempus dolor in tortor malesuada mattis. Ut tincidunt venenatis est sit amet dignissim. Vestibulum massa enim, tristique sed scelerisque eu, fringilla ac velit. Donec efficitur quis urna sit amet malesuada. Vestibulum consequat ac ligula in dapibus. Maecenas massa massa, molestie non posuere nec, elementum ut magna. In nisi erat, mollis non venenatis eu, faucibus in justo. Morbi gravida non ex non egestas. Pellentesque finibus laoreet diam, eu commodo augue congue vitae. + +Aenean sem mi, ullamcorper dapibus lobortis vitae, interdum tincidunt tortor. Vivamus eget vulputate libero. Ut bibendum posuere lectus, vel tincidunt tortor aliquet at. Phasellus malesuada orci et bibendum accumsan. Aliquam quis libero vel leo mollis porta. Sed sagittis leo ac lacus dictum, ac malesuada elit finibus. Suspendisse pharetra luctus commodo. Vivamus ultricies a odio non interdum. Vivamus scelerisque tincidunt turpis quis tempor. Pellentesque tortor ligula, varius non nunc eu, blandit sollicitudin neque. Nunc imperdiet, diam et tristique luctus, ipsum ex condimentum nunc, sit amet aliquam justo velit sed libero. Duis vel suscipit ligula. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed tincidunt neque vel massa ultricies, id dictum leo consequat. Curabitur lobortis ultricies tellus, eget mattis nisl aliquam sit amet. + +Proin at suscipit justo. Vivamus ut vestibulum nisl. Pellentesque enim odio, pharetra non magna sed, efficitur auctor magna. Praesent tincidunt ante quis ante hendrerit viverra. Pellentesque vel ipsum id magna vulputate efficitur. Sed nec neque accumsan, pulvinar sapien quis, euismod mauris. Donec condimentum laoreet sapien quis gravida. Quisque sed mattis purus. Vestibulum placerat vel neque maximus scelerisque. + +Vestibulum mattis quam quis efficitur elementum. Duis dictum dolor ac scelerisque commodo. Fusce sollicitudin nisi sit amet dictum placerat. Suspendisse euismod pharetra eleifend. In eros nisl, porttitor sed mauris at, consectetur aliquet mauris. Donec euismod viverra neque sed fermentum. Phasellus libero magna, accumsan ut ultricies vitae, dignissim eget metus. Donec tellus turpis, interdum eget maximus nec, hendrerit eget massa. Curabitur auctor ligula in iaculis auctor. In ultrices quam suscipit cursus finibus. Aenean id mi at dolor interdum iaculis vitae ut lorem. Nullam sed nibh fringilla, lacinia odio nec, placerat erat. In dui libero, viverra ac viverra ac, pellentesque sit amet turpis. + +Nulla in enim ex. Sed feugiat est et consectetur venenatis. Cras varius facilisis dui vel convallis. Vestibulum et elit eget tellus feugiat pellentesque. In ut ante eu purus aliquet posuere. Nulla nec ornare sem, sed luctus lorem. Nam varius iaculis odio, eget faucibus nisl ullamcorper in. Sed eget cursus felis, nec efficitur nisi. + +Vivamus commodo et sem quis pulvinar. Pellentesque libero ante, venenatis vitae ligula sit amet, ornare sollicitudin nulla. Mauris eget tellus hendrerit, pulvinar metus quis, tempor nisi. Proin magna ex, laoreet sed tortor quis, varius fermentum enim. Integer eu dolor dictum, vulputate tortor et, aliquet ligula. Vestibulum vitae justo id mauris luctus sollicitudin. Suspendisse eget auctor neque, sodales egestas lorem. Vestibulum lacinia egestas metus vitae euismod. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Vivamus ex tellus, volutpat nec pulvinar sit amet, condimentum vitae dui. Curabitur vel felis sodales, lacinia nunc iaculis, ullamcorper augue. Pellentesque consequat dolor quis eros efficitur malesuada. Nulla ut malesuada lectus. + +Morbi et tristique ante. Aliquam erat volutpat. Vivamus vitae dui nec turpis pellentesque fermentum. Quisque eget velit massa. Pellentesque tristique aliquam nisl, eu sollicitudin justo venenatis sed. Duis eleifend sem eros, ut aliquam libero porttitor id. Sed non nunc consequat, rhoncus diam eu, commodo erat. Praesent fermentum in lectus id blandit. Donec quis ipsum at justo volutpat finibus. Nulla blandit justo nulla, at mollis lacus consequat eget. Aenean sollicitudin quis eros ut ullamcorper. + +Pellentesque venenatis nulla ut mi aliquet feugiat. Cras semper vel magna nec pharetra. Integer mattis felis et sapien commodo imperdiet. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis quis luctus felis. Vestibulum justo nibh, aliquam non lectus vitae, molestie placerat justo. Donec lorem nibh, gravida sit amet hendrerit ac, maximus id ipsum. Nunc ac libero sodales risus eleifend sagittis. Phasellus est massa, lobortis elementum ex sed, scelerisque consectetur neque. Nunc faucibus neque id lorem malesuada, eget convallis ex mattis. + +Sed turpis tortor, fermentum non turpis id, posuere varius nibh. Donec iaculis lorem dui. Etiam eros ante, sodales eget venenatis at, consectetur eget risus. Curabitur non aliquam ante, a pretium justo. Maecenas tempor nisl tortor, vitae dictum nisi ultrices eu. Duis eget dui ultrices, porttitor lacus sed, lobortis purus. Quisque mattis elit nec neque sagittis, sed commodo leo blandit. Mauris sodales interdum eleifend. Vestibulum condimentum consectetur augue, id luctus diam convallis et. + +Nunc suscipit risus in justo accumsan, a placerat magna tincidunt. Proin a nisl ipsum. Sed libero dui, tristique in augue quis, auctor tristique risus. Sed porttitor ex augue, eu porta augue molestie a. Duis rhoncus purus libero, eu tempus turpis condimentum at. Sed mollis nisi id lectus placerat tincidunt. Maecenas non scelerisque elit, quis rutrum orci. Donec in tellus pharetra urna ornare lobortis. Phasellus id risus at nisi varius rutrum eu ut turpis. + +Duis dictum justo quis nisl porta, eget tincidunt magna suscipit. Sed velit massa, ullamcorper eu sodales ac, pretium a massa. Duis et rutrum tortor. Nulla accumsan hendrerit sapien, cursus volutpat eros egestas eget. Donec sollicitudin at ante quis sollicitudin. Aenean blandit feugiat diam, id feugiat eros faucibus eget. Donec viverra dolor vel justo scelerisque dignissim. Nulla semper sem nunc, rhoncus semper tellus ultricies sed. Duis in ornare diam. Donec vehicula feugiat varius. Maecenas ut suscipit est. Vivamus sem sem, finibus at dolor sit amet, euismod dapibus ligula. Vestibulum fringilla odio dapibus, congue massa eget, congue sem. Donec feugiat magna eget tortor lacinia scelerisque non et ipsum. + +Suspendisse potenti. Nunc convallis sollicitudin ex eget venenatis. Sed iaculis nibh ex, vel ornare ligula congue dignissim. Quisque sollicitudin dolor ac dui vestibulum, sit amet molestie nisi aliquet. Donec at risus felis. Aenean sollicitudin metus a feugiat porta. Aenean a tortor ut dolor cursus sagittis. Vivamus consectetur porttitor nunc in facilisis. Proin sit amet mi vel lectus consectetur ultrices. + +Sed cursus lectus vitae nunc tristique, nec commodo turpis dapibus. Pellentesque luctus ex id facilisis ornare. Morbi quis placerat dolor. Donec in lectus in arcu mattis porttitor ac sit amet metus. Cras congue mauris non risus sodales, vitae feugiat ipsum bibendum. Nulla venenatis urna sed libero elementum, a cursus lorem commodo. Mauris faucibus lobortis eros nec commodo. + +Nullam suscipit ligula ullamcorper lorem commodo blandit. Nulla porta nibh quis pulvinar placerat. Vivamus eu arcu justo. Vestibulum imperdiet est ut fermentum porttitor. Pellentesque consectetur libero in sapien efficitur scelerisque. Curabitur ac erat sit amet odio aliquet dignissim. Pellentesque mi sem, rhoncus et luctus at, porttitor rutrum lectus. Vestibulum sollicitudin sollicitudin suscipit. Aenean efficitur dolor non ultrices imperdiet. Donec vel sem ex. + +Sed convallis mauris aliquam rutrum cursus. Ut tempor porttitor sodales. Etiam eu risus ac augue gravida egestas et eu dolor. Proin id magna ex. Suspendisse quis lectus quis lorem ultricies tempus. Donec porttitor velit vitae tincidunt faucibus. Aliquam vitae semper nisi. Morbi ultrices, leo non pretium dapibus, dui libero pellentesque ex, vel placerat enim ante vitae dui. Nunc varius, sem sit amet sagittis lobortis, lectus odio scelerisque mauris, ut vestibulum orci magna quis neque. Sed id congue justo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris congue nisi est, malesuada mollis elit tincidunt sed. Curabitur sed ex sit amet felis tristique elementum vitae vel nibh. + +Etiam mollis pretium lobortis. Mauris augue lacus, efficitur at lacus sed, mollis tincidunt lectus. Aliquam erat volutpat. Donec at euismod elit, et mattis felis. Sed id lobortis urna. Morbi imperdiet vestibulum leo, sed maximus leo blandit eu. Aliquam semper lorem neque, nec euismod turpis mattis mollis. Quisque lobortis urna ultrices odio pretium, ac venenatis orci faucibus. Suspendisse bibendum odio ligula, sed lobortis massa pharetra nec. Donec turpis justo, iaculis at dictum ac, finibus eu libero. Maecenas quis porttitor mi, sit amet aliquet neque. + +Vivamus auctor vulputate ante, at egestas lorem. Donec eu risus in nulla mollis ultricies at et urna. Duis accumsan porta egestas. Ut vel euismod augue. Fusce convallis nulla ante, nec fringilla velit aliquet at. Nam malesuada dapibus ligula, a aliquam nibh scelerisque ac. Praesent malesuada neque et pellentesque interdum. Curabitur volutpat at turpis vitae tristique. Vivamus porttitor semper congue. Quisque suscipit lacus mi, rhoncus ultrices tortor auctor quis. Maecenas neque neque, molestie ac facilisis eget, luctus ac lorem. In ut odio ut lacus suscipit pulvinar vitae sed elit. Nulla imperdiet, sem quis euismod sagittis, dui erat luctus dolor, faucibus faucibus erat sem eget nunc. Nam accumsan placerat malesuada. Maecenas convallis finibus pulvinar. + +Cras at placerat tortor. Morbi facilisis auctor felis sit amet molestie. Donec sodales sed lorem vitae suscipit. Etiam fermentum pharetra ipsum, nec luctus orci gravida eu. Pellentesque gravida, est non condimentum tempus, mauris ligula molestie est, in congue dolor nisl vel sapien. Duis congue tempor augue, id rutrum eros porta dapibus. Etiam rutrum eget est eget vestibulum. Aenean mollis arcu vel consequat varius. Praesent at condimentum felis. Duis nec interdum nisl. Donec commodo lorem sed sapien scelerisque malesuada non eu urna. In blandit non ipsum at porta. Nam lobortis leo vitae dui auctor, non feugiat quam bibendum. Donec auctor lectus sagittis laoreet maximus. Maecenas rhoncus laoreet porttitor. Vestibulum porttitor augue ut lectus hendrerit, eget posuere mi gravida. + +Sed mattis ex in erat pulvinar, eu imperdiet magna dapibus. Etiam nisi nibh, tempus non tellus sit amet, mattis tempor odio. Quisque nec lorem feugiat, lobortis odio et, commodo nunc. Maecenas semper purus nisi, nec vehicula nibh eleifend vitae. Nulla fermentum a lectus at maximus. Phasellus finibus metus non euismod ultrices. Etiam a pulvinar ante. Quisque convallis nec metus sit amet facilisis. Praesent laoreet massa et sollicitudin laoreet. Vestibulum in mauris aliquet, convallis mi ut, elementum purus. Nulla purus nulla, sodales at hendrerit quis, tempus sed lectus. + +Nam ut laoreet neque, ut maximus nibh. Maecenas quis justo pellentesque, sollicitudin elit at, venenatis velit. Aenean nunc velit, vehicula scelerisque odio at, consectetur laoreet purus. Duis dui purus, malesuada quis ipsum sit amet, tempor interdum libero. Curabitur porta scelerisque sapien, vitae cursus diam condimentum eu. Phasellus sed orci quam. Nullam vitae dui quis purus tincidunt vestibulum. Curabitur quis nulla porta, cursus arcu non, auctor enim. Etiam sollicitudin ex id sem vehicula mollis. Morbi viverra laoreet tincidunt. Praesent ut semper dui. Nam sit amet pretium neque. Mauris vitae luctus diam, in lacinia purus. Maecenas ut placerat justo, ut porta felis. Integer eu mauris ante. + +Aenean porttitor tellus diam, tempor consequat metus efficitur id. Suspendisse ut felis at erat tempor dictum at nec sapien. Sed vestibulum interdum felis, ac mattis mauris porta in. Nunc et condimentum massa. Sed cursus dictum justo et luctus. Integer convallis enim nisl, a rutrum lectus ultricies in. Donec dapibus lacus at nulla dapibus, id sollicitudin velit hendrerit. Fusce a magna at orci mollis rutrum ac a dolor. Aliquam erat volutpat. Morbi varius porta nunc, sit amet sodales ex hendrerit commodo. Donec tincidunt tortor sapien, vitae egestas sapien vehicula eget. + +Suspendisse potenti. Donec pulvinar felis nec leo malesuada interdum. Integer posuere placerat maximus. Donec nibh ipsum, tincidunt vitae luctus vitae, bibendum at leo. Sed cursus nisl ut ex faucibus aliquet sed nec eros. Curabitur molestie posuere felis. Integer faucibus velit eget consequat iaculis. Mauris sed vulputate odio. Phasellus maximus, elit a pharetra egestas, lorem magna semper tellus, vestibulum semper diam felis at sapien. Suspendisse facilisis, nisl sit amet euismod vehicula, libero nulla vehicula dolor, quis fermentum nibh elit sit amet diam. + +Morbi lorem enim, euismod eu varius ut, scelerisque quis odio. Nam tempus vitae eros id molestie. Nunc pretium in nulla eget accumsan. Quisque mattis est ut semper aliquet. Maecenas eget diam elementum, fermentum ipsum a, euismod sapien. Duis quam ligula, cursus et velit nec, ullamcorper tincidunt magna. Donec vulputate nisl est, et ullamcorper urna tempor sit amet. + +Proin lacinia dui non turpis congue pretium. Morbi posuere metus vel purus imperdiet interdum. Morbi venenatis vel eros non ultricies. Nulla vel semper elit. Ut quis purus tincidunt, auctor justo ut, faucibus turpis. Proin quis mattis erat, at faucibus ligula. Mauris in mauris enim. Donec facilisis enim at est feugiat hendrerit. Nam vel nisi lorem. Fusce ultricies convallis diam, in feugiat tortor luctus quis. Donec tempor, leo vitae volutpat aliquam, magna elit feugiat leo, quis placerat sapien felis eget arcu. Donec ornare fermentum eleifend. Integer a est orci. + +Proin rhoncus egestas leo. Nulla ultricies porta elit quis ornare. Nunc fermentum interdum vehicula. In in ligula lorem. Donec nec arcu sit amet orci lobortis iaculis. Mauris at mollis erat, sit amet mollis tortor. Mauris laoreet justo ullamcorper porttitor auctor. Aenean sit amet aliquam lectus, id fermentum eros. Praesent urna sem, vehicula ac fermentum id, dapibus ut purus. Vestibulum vitae tempus nunc. Donec at nunc ornare metus volutpat porta at eget magna. Donec varius aliquet metus, eu lobortis risus aliquam sed. Ut dapibus fermentum velit, ac tincidunt libero faucibus at. + +In in purus auctor, feugiat massa quis, facilisis nisi. Donec dolor purus, gravida eget dolor ac, porttitor imperdiet urna. Donec faucibus placerat erat, a sagittis ante finibus ac. Sed venenatis dignissim elit, in iaculis felis posuere faucibus. Praesent sed viverra dolor. Mauris sed nulla consectetur nunc laoreet molestie in ut metus. Proin ac ex sit amet magna vulputate hendrerit ac condimentum urna. Proin ligula metus, gravida et sollicitudin facilisis, iaculis ut odio. Cras tincidunt urna et augue varius, ut facilisis urna consequat. Aenean vehicula finibus quam. Ut iaculis eu diam ac mollis. Nam mi lorem, tristique eget varius at, sodales at urna. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Proin vitae dictum erat, et auctor ipsum. Nullam nunc nunc, sollicitudin quis magna a, vestibulum fermentum mauris. Praesent at erat dolor. Proin laoreet tristique nulla vel efficitur. Nam sed ultrices nibh, id rutrum nunc. Curabitur eleifend a erat sit amet sollicitudin. Nullam metus quam, laoreet vitae dapibus id, placerat sed leo. Aliquam erat volutpat. Donec turpis nisl, cursus eu ex sit amet, lacinia pellentesque nisl. Sed id ipsum massa. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Donec interdum scelerisque lorem eu mattis. + +Vivamus ac tristique massa, nec facilisis nisl. Nam ipsum neque, tincidunt vel urna in, cursus imperdiet enim. Nam pellentesque egestas tempus. Morbi facilisis imperdiet libero vitae fringilla. Nam lacinia ligula at sapien facilisis malesuada. Nullam accumsan pulvinar sem, et cursus libero porta sit amet. Curabitur vulputate erat elit, ut pulvinar erat maximus vel. + +Cras aliquet metus ut purus sagittis, vel venenatis ante consectetur. Pellentesque nulla lacus, viverra viverra mattis non, placerat vitae nibh. Donec enim turpis, accumsan sit amet tincidunt eu, imperdiet non metus. Morbi ipsum eros, tincidunt vel est ac, tristique porttitor nibh. Praesent ut ullamcorper mauris. Sed laoreet sit amet diam congue venenatis. Integer porta purus nec orci sagittis posuere. + +Donec vehicula mauris eget lacus mollis venenatis et sed nibh. Nam sodales ligula ipsum, scelerisque lacinia ligula sagittis in. Nam sit amet ipsum at erat malesuada congue. Aenean ut sollicitudin sapien. Etiam at tempor odio. Mauris vitae purus ut magna suscipit consequat. Vivamus quis sapien neque. Nulla vulputate sem sit amet massa pellentesque, eleifend tristique ligula egestas. Suspendisse tincidunt gravida mi, in pulvinar lectus egestas non. Aenean imperdiet ex sit amet nunc sollicitudin porta. Integer justo odio, ultricies at interdum in, rhoncus vitae sem. Sed porttitor arcu quis purus aliquet hendrerit. Praesent tempor tortor at dolor dictum pulvinar. Nulla aliquet nunc non ligula scelerisque accumsan. Donec nulla justo, congue vitae massa in, faucibus hendrerit magna. Donec non egestas purus. + +Vivamus iaculis, lacus efficitur faucibus porta, dui nulla facilisis ligula, ut sodales odio nunc id sapien. Cras viverra auctor ipsum, dapibus mattis neque dictum sed. Sed convallis fermentum molestie. Nulla facilisi turpis duis. \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/small.txt b/src/vs/workbench/services/files2/test/node/fixtures/service/small.txt new file mode 100644 index 0000000000..da2e8042fb --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/small.txt @@ -0,0 +1 @@ +Small File \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/small_umlaut.txt b/src/vs/workbench/services/files2/test/node/fixtures/service/small_umlaut.txt new file mode 100644 index 0000000000..a01c1626b3 --- /dev/null +++ b/src/vs/workbench/services/files2/test/node/fixtures/service/small_umlaut.txt @@ -0,0 +1 @@ +Small File with Ümlaut \ No newline at end of file diff --git a/src/vs/workbench/services/files2/test/node/fixtures/service/some_utf16le.css b/src/vs/workbench/services/files2/test/node/fixtures/service/some_utf16le.css new file mode 100644 index 0000000000000000000000000000000000000000..aea04aa2cd17f11ccadedd0f133fcdbc3e797790 GIT binary patch literal 1408 zcmc(fNl(K-429nriT^NC4@ihEEG^rS3!GW*X_~YZNs5}5vWUM9e4Yf-r1XqN8BaXV z_Vbc_eRj34_CKs$?dVPuMRFP{Q0`BmW=eSGXyZ~YKux)KT7XIQ1S0TfSL$2pE7X}z z@pPmP$Q!JkUh%Nho<^J#u#ebV+y#2aO%XHTJmNNHMMRF2fpB=Nxa4R8?o2<#uk*Nq zNr-KxF}i>#3DVvRiwrN3=RU)`#jbO8T7k9iXD2sxcyS z%i-Pc4u-a@dm*(QQxmIq2Cluv{Q^uq>&u$G_1P-krcP76k-J%R=w_dDs%_|)xG5G1 ztjyvT^cY_@QTI&10rG*jIeY>l1YUEECebtd0^6|E-g-n12lF!LCT_${LCo=Qy|rj( z%;8G|^8{wZD(1mZy#}J{sNJ?S(E0CE> { if (!this._connection) { - this._connection = this._remoteAuthorityResolverService.resolveAuthority(this.remoteAuthority).then((resolvedAuthority) => { - return connectRemoteAgentManagement(this.remoteAuthority, resolvedAuthority.host, resolvedAuthority.port, `renderer`, this._environmentService.isBuilt); - }); + this._connection = this._createConnection(); } return this._connection; } + + private async _createConnection(): Promise> { + const resolvedAuthority = await this._remoteAuthorityResolverService.resolveAuthority(this.remoteAuthority); + const connection = await connectRemoteAgentManagement(this.remoteAuthority, resolvedAuthority.host, resolvedAuthority.port, `renderer`, this._environmentService.isBuilt); + this._register(connection); + return connection.client; + } } registerSingleton(IRemoteAgentService, RemoteAgentService); \ No newline at end of file diff --git a/src/vs/workbench/services/search/common/search.ts b/src/vs/workbench/services/search/common/search.ts index cd7fc49094..ba65310d20 100644 --- a/src/vs/workbench/services/search/common/search.ts +++ b/src/vs/workbench/services/search/common/search.ts @@ -417,7 +417,7 @@ export interface ISearchEngine { export interface ISerializedSearchSuccess { type: 'success'; limitHit: boolean; - stats: IFileSearchStats | ITextSearchStats | null; + stats?: IFileSearchStats | ITextSearchStats; } export interface ISearchEngineSuccess { @@ -454,7 +454,7 @@ export function isSerializedFileMatch(arg: ISerializedSearchProgressItem): arg i } export interface ISerializedFileMatch { - path?: string; + path: string; results?: ITextSearchResult[]; numMatches?: number; } diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index 5db60a1eb5..1b08c1cbce 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -29,6 +29,7 @@ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/un import { SearchChannelClient } from './searchIpc'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; export class SearchService extends Disposable implements ISearchService { _serviceBrand: any; @@ -176,7 +177,7 @@ export class SearchService extends Disposable implements ISearchService { const fqs = this.groupFolderQueriesByScheme(query); keys(fqs).forEach(scheme => { - const schemeFQs = fqs.get(scheme); + const schemeFQs = fqs.get(scheme)!; const provider = query.type === QueryType.File ? this.fileSearchProviders.get(scheme) : this.textSearchProviders.get(scheme); @@ -226,7 +227,7 @@ export class SearchService extends Disposable implements ISearchService { const endToEndTime = e2eSW.elapsed(); this.logService.trace(`SearchService#search: ${endToEndTime}ms`); const searchError = deserializeSearchError(err.message); - this.sendTelemetry(query, endToEndTime, null, searchError); + this.sendTelemetry(query, endToEndTime, undefined, searchError); throw searchError; }); @@ -352,8 +353,8 @@ export class SearchService extends Disposable implements ISearchService { } } - private getLocalResults(query: ITextQuery): ResourceMap { - const localResults = new ResourceMap(); + private getLocalResults(query: ITextQuery): ResourceMap { + const localResults = new ResourceMap(); if (query.type === QueryType.Text) { const models = this.modelService.getModels(); @@ -374,11 +375,8 @@ export class SearchService extends Disposable implements ISearchService { } } - // Don't support other resource schemes than files for now - // todo@remote - // why is that? we should search for resources from other - // schemes - else if (resource.scheme !== Schemas.file) { + // Block walkthrough, webview, etc. + else if (resource.scheme !== Schemas.file && resource.scheme !== REMOTE_HOST_SCHEME) { return; } @@ -387,7 +385,7 @@ export class SearchService extends Disposable implements ISearchService { } // Use editor API to find matches - const matches = model.findMatches(query.contentPattern.pattern, false, query.contentPattern.isRegExp, query.contentPattern.isCaseSensitive, query.contentPattern.isWordMatch ? query.contentPattern.wordSeparators : null, false, query.maxResults); + const matches = model.findMatches(query.contentPattern.pattern, false, !!query.contentPattern.isRegExp, !!query.contentPattern.isCaseSensitive, query.contentPattern.isWordMatch ? query.contentPattern.wordSeparators! : null, false, query.maxResults); if (matches.length) { const fileMatch = new FileMatch(resource); localResults.set(resource, fileMatch); @@ -583,4 +581,4 @@ export class DiskSearch implements ISearchResultProvider { } } -registerSingleton(ISearchService, SearchService, true); \ No newline at end of file +registerSingleton(ISearchService, SearchService, true); diff --git a/src/vs/workbench/services/search/node/textSearchAdapter.ts b/src/vs/workbench/services/search/node/textSearchAdapter.ts index 76d25147c7..22ce6f7ccd 100644 --- a/src/vs/workbench/services/search/node/textSearchAdapter.ts +++ b/src/vs/workbench/services/search/node/textSearchAdapter.ts @@ -39,7 +39,7 @@ export class TextSearchEngineAdapter { }, token) .then( - c => resolve({ limitHit: c.limitHit, stats: null, type: 'success' } as ISerializedSearchSuccess), + c => resolve({ limitHit: c.limitHit, type: 'success' } as ISerializedSearchSuccess), reject); }); } @@ -47,7 +47,7 @@ export class TextSearchEngineAdapter { function fileMatchToSerialized(match: IFileMatch): ISerializedFileMatch { return { - path: match.resource ? match.resource.fsPath : undefined, + path: match.resource && match.resource.fsPath, results: match.results, numMatches: (match.results || []).reduce((sum, r) => { if (!!(r).ranges) { diff --git a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts index 69e55e8691..5ed4a83ae7 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -20,10 +20,10 @@ import { IHeapService } from 'vs/workbench/api/electron-browser/mainThreadHeapSe import { ExtHostApiCommands } from 'vs/workbench/api/node/extHostApiCommands'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; -import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; -import { MainContext, ExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts index 730d7849ce..24ac41c342 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostCommands.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { MainThreadCommandsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadCommandsShape } from 'vs/workbench/api/common/extHost.protocol'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts index 0b89cb156d..1253767271 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostConfigProvider } from 'vs/workbench/api/node/extHostConfiguration'; -import { MainThreadConfigurationShape, IConfigurationInitData } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadConfigurationShape, IConfigurationInitData } from 'vs/workbench/api/common/extHost.protocol'; import { ConfigurationModel } from 'vs/platform/configuration/common/configurationModels'; import { TestRPCProtocol } from './testRPCProtocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts index 3187cdc555..17d1fa8c97 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDiagnostics.test.ts @@ -7,7 +7,7 @@ import * as assert from 'assert'; import { URI, UriComponents } from 'vs/base/common/uri'; import { DiagnosticCollection, ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import { Diagnostic, DiagnosticSeverity, Range, DiagnosticRelatedInformation, Location } from 'vs/workbench/api/node/extHostTypes'; -import { MainThreadDiagnosticsShape, IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadDiagnosticsShape, IMainContext } from 'vs/workbench/api/common/extHost.protocol'; import { IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { Emitter, Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts index ab2b2b7ba6..c4dfa82c00 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentData.test.ts @@ -8,7 +8,7 @@ import { URI } from 'vs/base/common/uri'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import { Position } from 'vs/workbench/api/node/extHostTypes'; import { Range } from 'vs/editor/common/core/range'; -import { MainThreadDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { IModelChangedEvent } from 'vs/editor/common/model/mirrorTextModel'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts index 73e72f4489..f725636054 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostDocumentSaveParticipant.test.ts @@ -7,7 +7,7 @@ import { URI } from 'vs/base/common/uri'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; import { TextDocumentSaveReason, TextEdit, Position, EndOfLine } from 'vs/workbench/api/node/extHostTypes'; -import { MainThreadTextEditorsShape, WorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadTextEditorsShape, WorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDocumentSaveParticipant } from 'vs/workbench/api/node/extHostDocumentSaveParticipant'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { SaveReason } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts b/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts index cfba8455cd..38ae798de8 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostFileSystemEventService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { ExtHostFileSystemEventService } from 'vs/workbench/api/node/extHostFileSystemEventService'; -import { IMainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IMainContext } from 'vs/workbench/api/common/extHost.protocol'; suite('ExtHostFileSystemEventService', () => { diff --git a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts index c0ca6dab0e..3801ede318 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -17,7 +17,7 @@ import { MarkerService } from 'vs/platform/markers/common/markerService'; import { ExtHostLanguageFeatures } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { MainThreadLanguageFeatures } from 'vs/workbench/api/electron-browser/mainThreadLanguageFeatures'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { IHeapService } from 'vs/workbench/api/electron-browser/mainThreadHeapService'; import { ExtHostDocuments } from 'vs/workbench/api/node/extHostDocuments'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; @@ -35,7 +35,7 @@ import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSi import { provideSuggestionItems, CompletionOptions } from 'vs/editor/contrib/suggest/suggest'; import { getDocumentFormattingEdits, getDocumentRangeFormattingEdits, getOnTypeFormattingEdits, FormatMode } from 'vs/editor/contrib/format/format'; import { getLinks } from 'vs/editor/contrib/links/getLinks'; -import { MainContext, ExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, ExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; import * as vscode from 'vscode'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts b/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts index f511c269e1..ded16713f2 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostMessagerService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { MainThreadMessageService } from 'vs/workbench/api/electron-browser/mainThreadMessageService'; +import { MainThreadMessageService } from 'vs/workbench/api/browser/mainThreadMessageService'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService, INotification, NoOpNotification, INotificationHandle, Severity, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; import { ICommandService } from 'vs/platform/commands/common/commands'; 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 72b1838fcc..7224ca1281 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostSearch.test.ts @@ -11,7 +11,7 @@ import { joinPath } from 'vs/base/common/resources'; import { URI, UriComponents } from 'vs/base/common/uri'; import * as extfs from 'vs/base/node/extfs'; import { IFileMatch, IFileQuery, IPatternInfo, IRawFileMatch2, ISearchCompleteStats, ISearchQuery, ITextQuery, QueryType, resultIsMatch } from 'vs/workbench/services/search/common/search'; -import { MainContext, MainThreadSearchShape } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, MainThreadSearchShape } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostSearch } from 'vs/workbench/api/node/extHostSearch'; import { Range } from 'vs/workbench/api/node/extHostTypes'; import { extensionResultIsMatch } from 'vs/workbench/services/search/node/textSearchManager'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts index a3a9d8555a..086ee14685 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTextEditor.test.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { TextEditorLineNumbersStyle, Range } from 'vs/workbench/api/node/extHostTypes'; -import { TextEditorCursorStyle } from 'vs/editor/common/config/editorOptions'; -import { MainThreadTextEditorsShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/node/extHost.protocol'; +import { TextEditorCursorStyle, RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; +import { MainThreadTextEditorsShape, IResolvedTextEditorConfiguration, ITextEditorConfigurationUpdate } from 'vs/workbench/api/common/extHost.protocol'; import { ExtHostTextEditorOptions, ExtHostTextEditor } from 'vs/workbench/api/node/extHostTextEditor'; import { ExtHostDocumentData } from 'vs/workbench/api/node/extHostDocumentData'; import { URI } from 'vs/base/common/uri'; @@ -91,7 +91,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); }); @@ -118,7 +118,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -130,7 +130,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 1 }]); }); @@ -142,7 +142,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 2 }]); }); @@ -154,7 +154,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 2 }]); }); @@ -166,7 +166,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 'auto' }]); }); @@ -178,7 +178,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -190,7 +190,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -202,7 +202,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -214,7 +214,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -226,7 +226,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -238,7 +238,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 1, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ indentSize: 1 }]); }); @@ -250,7 +250,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 2, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ indentSize: 2 }]); }); @@ -262,7 +262,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 2, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ indentSize: 2 }]); }); @@ -274,7 +274,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ indentSize: 'tabSize' }]); }); @@ -286,7 +286,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -298,7 +298,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -310,7 +310,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -322,7 +322,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -334,7 +334,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -346,7 +346,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -358,7 +358,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: true, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ insertSpaces: true }]); }); @@ -370,7 +370,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -382,7 +382,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: true, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ insertSpaces: true }]); }); @@ -394,7 +394,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ insertSpaces: 'auto' }]); }); @@ -406,7 +406,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -418,7 +418,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Block, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ cursorStyle: TextEditorCursorStyle.Block }]); }); @@ -430,7 +430,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -442,9 +442,9 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.Off + lineNumbers: RenderLineNumbersType.Off }); - assert.deepEqual(calls, [{ lineNumbers: TextEditorLineNumbersStyle.Off }]); + assert.deepEqual(calls, [{ lineNumbers: RenderLineNumbersType.Off }]); }); test('can do bulk updates 0', () => { @@ -459,7 +459,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, []); }); @@ -474,7 +474,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: true, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 'auto', insertSpaces: true }]); }); @@ -489,7 +489,7 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Line, - lineNumbers: TextEditorLineNumbersStyle.On + lineNumbers: RenderLineNumbersType.On }); assert.deepEqual(calls, [{ tabSize: 3, insertSpaces: 'auto' }]); }); @@ -504,9 +504,9 @@ suite('ExtHostTextEditorOptions', () => { indentSize: 4, insertSpaces: false, cursorStyle: TextEditorCursorStyle.Block, - lineNumbers: TextEditorLineNumbersStyle.Relative + lineNumbers: RenderLineNumbersType.Relative }); - assert.deepEqual(calls, [{ cursorStyle: TextEditorCursorStyle.Block, lineNumbers: TextEditorLineNumbersStyle.Relative }]); + assert.deepEqual(calls, [{ cursorStyle: TextEditorCursorStyle.Block, lineNumbers: RenderLineNumbersType.Relative }]); }); }); diff --git a/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts index 410d7f0bb8..4b4ce1b9e5 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTextEditors.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import * as extHostTypes from 'vs/workbench/api/node/extHostTypes'; -import { MainContext, MainThreadTextEditorsShape, WorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; +import { MainContext, MainThreadTextEditorsShape, WorkspaceEditDto } from 'vs/workbench/api/common/extHost.protocol'; import { URI } from 'vs/base/common/uri'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts index 4c0b26683e..8cc5b14b6f 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTreeViews.test.ts @@ -8,12 +8,12 @@ import * as sinon from 'sinon'; import { Emitter } from 'vs/base/common/event'; import { ExtHostTreeViews } from 'vs/workbench/api/node/extHostTreeViews'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; -import { MainThreadTreeViewsShape, MainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadTreeViewsShape, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { TreeDataProvider, TreeItem } from 'vscode'; import { TestRPCProtocol } from './testRPCProtocol'; import { ExtHostHeapService } from 'vs/workbench/api/node/extHostHeapService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { TreeItemCollapsibleState, ITreeItem } from 'vs/workbench/common/views'; diff --git a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts index 5b6d806abc..81eb58df72 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWebview.test.ts @@ -9,7 +9,7 @@ import { ExtHostWebviews } from 'vs/workbench/api/node/extHostWebview'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import * as vscode from 'vscode'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; -import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; +import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor'; suite('ExtHostWebview', function () { diff --git a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts index 4b95db5c91..bb7057ec51 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -11,8 +11,8 @@ import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { ILogService, NullLogService } from 'vs/platform/log/common/log'; import { IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace'; -import { MainThreadWorkspace } from 'vs/workbench/api/electron-browser/mainThreadWorkspace'; -import { IMainContext, IWorkspaceData, MainContext } from 'vs/workbench/api/node/extHost.protocol'; +import { MainThreadWorkspace } from 'vs/workbench/api/browser/mainThreadWorkspace'; +import { IMainContext, IWorkspaceData, MainContext } from 'vs/workbench/api/common/extHost.protocol'; import { RelativePattern } from 'vs/workbench/api/node/extHostTypes'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts index 8910ceb664..937aee6244 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { MainThreadCommands } from 'vs/workbench/api/electron-browser/mainThreadCommands'; +import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts index 10b34b6d6e..83a7bb023b 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadConfiguration.test.ts @@ -10,7 +10,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions, IConfigurationRegistry, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { MainThreadConfiguration } from 'vs/workbench/api/electron-browser/mainThreadConfiguration'; +import { MainThreadConfiguration } from 'vs/workbench/api/browser/mainThreadConfiguration'; import { SingleProxyRPCProtocol } from './testRPCProtocol'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { WorkspaceService } from 'vs/workbench/services/configuration/node/configurationService'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts index bfbb50cc7b..b79a3a725c 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { MarkerService } from 'vs/platform/markers/common/markerService'; -import { MainThreadDiagnostics } from 'vs/workbench/api/electron-browser/mainThreadDiagnostics'; +import { MainThreadDiagnostics } from 'vs/workbench/api/browser/mainThreadDiagnostics'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentContentProviders.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentContentProviders.test.ts index 69488d9420..1ae36a493b 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentContentProviders.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentContentProviders.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; -import { MainThreadDocumentContentProviders } from 'vs/workbench/api/electron-browser/mainThreadDocumentContentProviders'; +import { MainThreadDocumentContentProviders } from 'vs/workbench/api/browser/mainThreadDocumentContentProviders'; import { TextModel } from 'vs/editor/common/model/textModel'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { IModelService } from 'vs/editor/common/services/modelService'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts index d565969f15..1c8cd4f721 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadDocumentsAndEditors.test.ts @@ -10,7 +10,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostDocumentsAndEditorsShape, IDocumentsAndEditorsDelta } from 'vs/workbench/api/common/extHost.protocol'; import { createTestCodeEditor, TestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { TestEditorService, TestEditorGroupsService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts index 81aa62625c..fb1b609feb 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadEditors.test.ts @@ -10,7 +10,7 @@ import { TestConfigurationService } from 'vs/platform/configuration/test/common/ import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { TestCodeEditorService } from 'vs/editor/test/browser/editorTestServices'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { ExtHostDocumentsAndEditorsShape, ExtHostContext, ExtHostDocumentsShape } from 'vs/workbench/api/node/extHost.protocol'; +import { ExtHostDocumentsAndEditorsShape, ExtHostContext, ExtHostDocumentsShape } from 'vs/workbench/api/common/extHost.protocol'; import { mock } from 'vs/workbench/test/electron-browser/api/mock'; import { Event } from 'vs/base/common/event'; import { MainThreadTextEditors } from 'vs/workbench/api/electron-browser/mainThreadEditors'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts index 6e1a75deb0..5d25c6672c 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadSaveParticipant.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { FinalNewLineParticipant, TrimFinalNewLinesParticipant } from 'vs/workbench/api/electron-browser/mainThreadSaveParticipant'; +import { FinalNewLineParticipant, TrimFinalNewLinesParticipant } from 'vs/workbench/api/browser/mainThreadSaveParticipant'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; import { toResource } from 'vs/base/test/common/utils'; diff --git a/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts index 3282e10c55..f9ddf13d57 100644 --- a/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/mainThreadWorkspace.test.ts @@ -6,7 +6,7 @@ import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { ISearchService, IFileQuery } from 'vs/workbench/services/search/common/search'; -import { MainThreadWorkspace } from 'vs/workbench/api/electron-browser/mainThreadWorkspace'; +import { MainThreadWorkspace } from 'vs/workbench/api/browser/mainThreadWorkspace'; import * as assert from 'assert'; import { SingleProxyRPCProtocol } from 'vs/workbench/test/electron-browser/api/testRPCProtocol'; import { CancellationTokenSource } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts b/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts index bbf2f8066a..fe4523346e 100644 --- a/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts +++ b/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts @@ -3,9 +3,9 @@ * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ProxyIdentifier } from 'vs/workbench/services/extensions/node/proxyIdentifier'; +import { ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'; import { CharCode } from 'vs/base/common/charCode'; -import { IExtHostContext } from 'vs/workbench/api/node/extHost.protocol'; +import { IExtHostContext } from 'vs/workbench/api/common/extHost.protocol'; import { isThenable } from 'vs/base/common/async'; export function SingleProxyRPCProtocol(thing: any): IExtHostContext { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index c34c2f62a7..a9a183cb94 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -26,7 +26,7 @@ import { IWorkspaceContextService, IWorkspace as IWorkbenchWorkspace, WorkbenchS import { ILifecycleService, BeforeShutdownEvent, ShutdownReason, StartupKind, LifecyclePhase, WillShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { TextFileService } from 'vs/workbench/services/textfile/common/textFileService'; -import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncodings, IResourceEncoding } from 'vs/platform/files/common/files'; +import { FileOperationEvent, IFileService, IResolveContentOptions, FileOperationError, IFileStat, IResolveFileResult, FileChangesEvent, IResolveFileOptions, IContent, IUpdateContentOptions, IStreamContent, ICreateFileOptions, ITextSnapshot, IResourceEncodings, IResourceEncoding, IFileSystemProvider, FileSystemProviderCapabilities, IFileChange, IWatchOptions, IStat, FileType, FileDeleteOptions, FileOverwriteOptions, FileWriteOptions, FileOpenOptions } from 'vs/platform/files/common/files'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; @@ -899,6 +899,8 @@ export class TestFileService implements IFileService { private readonly _onFileChanges: Emitter; private readonly _onAfterOperation: Emitter; + readonly onWillActivateFileSystemProvider = Event.None; + private content = 'Hello Html'; constructor() { @@ -1003,10 +1005,6 @@ export class TestFileService implements IFileService { throw new Error('not implemented'); } - readFolder(_resource: URI) { - return Promise.resolve([]); - } - createFolder(_resource: URI): Promise { throw new Error('not implemented'); } @@ -1578,4 +1576,26 @@ export class TestSharedProcessService implements ISharedProcessService { } registerChannel(channelName: string, channel: any): void { } -} \ No newline at end of file +} + +export class NullFileSystemProvider implements IFileSystemProvider { + + capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.Readonly; + + onDidChangeCapabilities: Event = Event.None; + onDidChangeFile: Event = Event.None; + + watch(resource: URI, opts: IWatchOptions): IDisposable { return Disposable.None; } + stat(resource: URI): Promise { return Promise.resolve(undefined!); } + mkdir(resource: URI): Promise { return Promise.resolve(undefined!); } + readdir(resource: URI): Promise<[string, FileType][]> { return Promise.resolve(undefined!); } + delete(resource: URI, opts: FileDeleteOptions): Promise { return Promise.resolve(undefined!); } + rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return Promise.resolve(undefined!); } + copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return Promise.resolve(undefined!); } + readFile?(resource: URI): Promise { return Promise.resolve(undefined!); } + writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { return Promise.resolve(undefined!); } + open?(resource: URI, opts: FileOpenOptions): Promise { return Promise.resolve(undefined!); } + close?(fd: number): Promise { return Promise.resolve(undefined!); } + read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return Promise.resolve(undefined!); } + write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return Promise.resolve(undefined!); } +} diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 1c8180d9da..be4f4abb87 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -117,6 +117,7 @@ import 'vs/workbench/services/backup/node/backupFileService'; import 'vs/workbench/services/editor/browser/editorService'; import 'vs/workbench/services/history/browser/history'; import 'vs/workbench/services/files/node/remoteFileService'; +import 'vs/workbench/services/files2/common/fileService2'; import 'vs/workbench/services/activity/browser/activityService'; import 'vs/workbench/browser/parts/views/views'; import 'vs/workbench/services/keybinding/electron-browser/keybindingService'; @@ -310,6 +311,9 @@ import 'vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStar import 'vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay'; import 'vs/workbench/contrib/welcome/page/browser/welcomePage.contribution'; +// Call Hierarchy +import 'vs/workbench/contrib/callHierarchy/browser/callHierarchy.contribution'; + // Outline import 'vs/workbench/contrib/outline/browser/outline.contribution'; diff --git a/test/smoke/src/areas/debug/debugSmoke.ts b/test/smoke/src/areas/debug/debugSmoke.ts index 8c87a1d34c..14b28b4427 100644 --- a/test/smoke/src/areas/debug/debugSmoke.ts +++ b/test/smoke/src/areas/debug/debugSmoke.ts @@ -13,14 +13,14 @@ import { IElement } from '../../vscode/driver'; const VIEWLET = 'div[id="workbench.view.debug"]'; const DEBUG_VIEW = `${VIEWLET} .debug-view-content`; const CONFIGURE = `div[id="workbench.parts.sidebar"] .actions-container .configure`; -const STOP = `.debug-toolbar .debug-action.stop`; -const STEP_OVER = `.debug-toolbar .debug-action.step-over`; -const STEP_IN = `.debug-toolbar .debug-action.step-into`; -const STEP_OUT = `.debug-toolbar .debug-action.step-out`; -const CONTINUE = `.debug-toolbar .debug-action.continue`; +const STOP = `.debug-toolbar .action-label[title*="Stop"]`; +const STEP_OVER = `.debug-toolbar .action-label[title*="Step Over"]`; +const STEP_IN = `.debug-toolbar .action-label[title*="Step Into"]`; +const STEP_OUT = `.debug-toolbar .action-label[title*="Step Out"]`; +const CONTINUE = `.debug-toolbar .action-label[title*="Continue"]`; const GLYPH_AREA = '.margin-view-overlays>:nth-child'; const BREAKPOINT_GLYPH = '.debug-breakpoint'; -const PAUSE = `.debug-toolbar .debug-action.pause`; +const PAUSE = `.debug-toolbar .action-label[title*="Pause"]`; const DEBUG_STATUS_BAR = `.statusbar.debugging`; const NOT_DEBUG_STATUS_BAR = `.statusbar:not(debugging)`; const TOOLBAR_HIDDEN = `.debug-toolbar[aria-hidden="true"]`; diff --git a/yarn.lock b/yarn.lock index 9e05f661c5..630a5d8ec6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -421,6 +421,16 @@ ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" +ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + ajv@^6.1.0: version "6.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360" @@ -441,16 +451,6 @@ ajv@^6.5.3, ajv@^6.6.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -2567,7 +2567,7 @@ duplexify@^3.2.0: readable-stream "^2.0.0" stream-shift "^1.0.0" -duplexify@^3.4.2: +duplexify@^3.4.2, duplexify@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" integrity sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== @@ -2577,16 +2577,6 @@ duplexify@^3.4.2: readable-stream "^2.0.0" stream-shift "^1.0.0" -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" - each-props@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/each-props/-/each-props-1.3.2.tgz#ea45a414d16dd5cfa419b1a81720d5ca06892333" @@ -3044,7 +3034,7 @@ event-emitter@~0.3.5: event-stream@3.3.4, event-stream@^3.3.4: version "3.3.4" - resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE= dependencies: duplexer "~0.1.1" @@ -3450,9 +3440,9 @@ first-chunk-stream@^1.0.0: integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= flagged-respawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" - integrity sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c= + version "1.0.1" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" + integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== flat-cache@^1.2.1: version "1.3.0" @@ -3539,12 +3529,12 @@ form-data@~2.3.1: mime-types "^2.1.12" form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + integrity sha1-SXBJi+YEwgwAXU9cI67NIda0kJk= dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "1.0.6" mime-types "^2.1.12" formatio@1.1.1: @@ -3939,16 +3929,11 @@ glogg@^1.0.0: dependencies: sparkles "^1.0.0" -graceful-fs@4.1.11, graceful-fs@^4.0.0, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@4.1.11, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@^4.1.11: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== - "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -4254,11 +4239,11 @@ har-validator@~5.0.3: har-schema "^2.0.0" har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA== dependencies: - ajv "^6.5.5" + ajv "^5.3.0" har-schema "^2.0.0" has-ansi@^2.0.0: @@ -5905,10 +5890,10 @@ mime-db@~1.30.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" integrity sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE= -mime-db@~1.37.0: - version "1.37.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" - integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== +mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + integrity sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw== mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" @@ -5918,11 +5903,11 @@ mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-db "~1.30.0" mime-types@~2.1.19: - version "2.1.21" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" - integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + integrity sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A== dependencies: - mime-db "~1.37.0" + mime-db "~1.36.0" mime@1.4.1, mime@^1.3.4: version "1.4.1" @@ -6167,11 +6152,6 @@ nan@^2.0.0: resolved "https://registry.yarnpkg.com/nan/-/nan-2.9.2.tgz#f564d75f5f8f36a6d9456cca7a6c4fe488ab7866" integrity sha512-ltW65co7f3PQWBDbqVvaU1WtFJUsNW7sWWm4HINhbMQIyVyzIeyZ8toX5TC5eeooE6piZoaEh4cZkueSKG3KYw== -nan@^2.0.9: - version "2.13.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.1.tgz#a15bee3790bde247e8f38f1d446edcdaeb05f2dd" - integrity sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA== - nan@^2.10.0: version "2.11.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" @@ -6619,11 +6599,11 @@ onetime@^2.0.0: mimic-fn "^1.0.0" oniguruma@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/oniguruma/-/oniguruma-7.0.0.tgz#cf258a8b1a2ec1d0d68964d6336df264008ebf4c" - integrity sha512-VcMkJvwl3rycLzgh5yhefMEGlSfMEuxnhwmMus/UCqAKlOdzE0Z46exkgLfe6ISX4XuLbqWvSXvkK26eJ/2jIw== + version "7.0.2" + resolved "https://registry.yarnpkg.com/oniguruma/-/oniguruma-7.0.2.tgz#a5c922cf7066da1dbcc60f6385a90437a83f8d0b" + integrity sha512-zCsdNxTrrB4yVPMxhcIODGv1p4NVBu9WvsWnIGhMpu5djO4MQWXrC7YKjtza+OyoRqqgy27CqYWa1h5e2DDbig== dependencies: - nan "^2.0.9" + nan "^2.10.0" optimist@0.3.5: version "0.3.5" @@ -7568,9 +7548,9 @@ queue@^3.0.10, queue@^3.1.0: inherits "~2.0.0" queue@^4.2.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/queue/-/queue-4.5.1.tgz#6e4290a2d7e99dc75b34494431633fe5437b0dac" - integrity sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw== + version "4.5.0" + resolved "https://registry.yarnpkg.com/queue/-/queue-4.5.0.tgz#0f125191a983e3c38fcc0c0c75087d358d0857f4" + integrity sha512-DwxpAnqJuoQa+wyDgQuwkSshkhlqIlWEvwvdAY27fDPunZ2cVJzXU4JyjY+5l7zs7oGLaYAQm4MbLOVFAHFBzA== dependencies: inherits "~2.0.0" @@ -8936,13 +8916,20 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -supports-color@^5.2.0, supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.2.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" +supports-color@^5.3.0, supports-color@^5.4.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" + integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== + dependencies: + has-flag "^3.0.0" + supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" @@ -9688,9 +9675,9 @@ v8-inspect-profiler@^0.0.20: chrome-remote-interface "0.26.1" v8flags@^3.0.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.1.tgz#42259a1461c08397e37fe1d4f1cfb59cad85a053" - integrity sha512-iw/1ViSEaff8NJ3HLyEjawk/8hjJib3E7pvG4pddVXfUg1983s3VGsiClDjhK64MQVDGqc1Q8r18S4VKQZS9EQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.2.tgz#fc5cd0c227428181e6c29b2992e4f8f1da5e0c9f" + integrity sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw== dependencies: homedir-polyfill "^1.0.1" @@ -10271,7 +10258,7 @@ xmlbuilder@0.4.3: xmlbuilder@^9.0.7: version "9.0.7" - resolved "http://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmlbuilder@~9.0.1: