diff --git a/.yarnrc b/.yarnrc index 190252d15da..fe7090fa356 100644 --- a/.yarnrc +++ b/.yarnrc @@ -1,3 +1,3 @@ disturl "https://atom.io/download/electron" -target "3.1.2" +target "3.1.3" runtime "electron" diff --git a/build/azure-pipelines/darwin/continuous-build-darwin.yml b/build/azure-pipelines/darwin/continuous-build-darwin.yml index 99e17e940a6..5ecc7992b66 100644 --- a/build/azure-pipelines/darwin/continuous-build-darwin.yml +++ b/build/azure-pipelines/darwin/continuous-build-darwin.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: versionSpec: "1.10.1" diff --git a/build/azure-pipelines/darwin/product-build-darwin.yml b/build/azure-pipelines/darwin/product-build-darwin.yml index cdd8dfb9c89..40b4eb98f87 100644 --- a/build/azure-pipelines/darwin/product-build-darwin.yml +++ b/build/azure-pipelines/darwin/product-build-darwin.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: @@ -24,6 +24,8 @@ steps: VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ yarn gulp -- vscode-darwin-min + VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \ + AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \ yarn gulp -- upload-vscode-sourcemaps displayName: Build diff --git a/build/azure-pipelines/linux/continuous-build-linux.yml b/build/azure-pipelines/linux/continuous-build-linux.yml index fc124c5bf45..1b7b2d30700 100644 --- a/build/azure-pipelines/linux/continuous-build-linux.yml +++ b/build/azure-pipelines/linux/continuous-build-linux.yml @@ -9,7 +9,7 @@ steps: sudo service xvfb start - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: versionSpec: "1.10.1" diff --git a/build/azure-pipelines/linux/product-build-linux.yml b/build/azure-pipelines/linux/product-build-linux.yml index 6cf126af1e4..be321a474ed 100644 --- a/build/azure-pipelines/linux/product-build-linux.yml +++ b/build/azure-pipelines/linux/product-build-linux.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: diff --git a/build/azure-pipelines/linux/snap-build-linux.yml b/build/azure-pipelines/linux/snap-build-linux.yml index 29252107f46..08843f4ecd3 100644 --- a/build/azure-pipelines/linux/snap-build-linux.yml +++ b/build/azure-pipelines/linux/snap-build-linux.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: diff --git a/build/azure-pipelines/win32/continuous-build-win32.yml b/build/azure-pipelines/win32/continuous-build-win32.yml index 7145e67e2ad..21e18b7357e 100644 --- a/build/azure-pipelines/win32/continuous-build-win32.yml +++ b/build/azure-pipelines/win32/continuous-build-win32.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: versionSpec: "1.10.1" diff --git a/build/azure-pipelines/win32/product-build-win32.yml b/build/azure-pipelines/win32/product-build-win32.yml index 418af9e10a9..ca028b0048c 100644 --- a/build/azure-pipelines/win32/product-build-win32.yml +++ b/build/azure-pipelines/win32/product-build-win32.yml @@ -1,7 +1,7 @@ steps: - task: NodeTool@0 inputs: - versionSpec: "8.12.0" + versionSpec: "10.15.1" - task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2 inputs: diff --git a/build/gulpfile.compile.js b/build/gulpfile.compile.js new file mode 100644 index 00000000000..521a13a440d --- /dev/null +++ b/build/gulpfile.compile.js @@ -0,0 +1,20 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +const util = require('./lib/util'); +const compilation = require('./lib/compilation'); +const { compileExtensionsBuildTask } = require('./gulpfile.extensions'); + +// Full compile, including nls and inline sources in sourcemaps, for build +const compileClientBuildTask = util.task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true)); +compileClientBuildTask.displayName = 'compile-client-build'; + +// All Build +const compileBuildTask = util.task.parallel(compileClientBuildTask, compileExtensionsBuildTask); +compileBuildTask.displayName = 'compile-build'; + +exports.compileBuildTask = compileBuildTask; \ No newline at end of file diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js index e9bb8cddf52..f1aa8e77ff1 100644 --- a/build/gulpfile.editor.js +++ b/build/gulpfile.editor.js @@ -48,9 +48,6 @@ var editorResources = [ '!**/test/**' ]; -var editorOtherSources = [ -]; - var BUNDLED_FILE_HEADER = [ '/*!-----------------------------------------------------------', ' * Copyright (c) Microsoft Corporation. All rights reserved.', @@ -63,7 +60,7 @@ var BUNDLED_FILE_HEADER = [ const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []); -gulp.task('extract-editor-src', util.task.series(util.rimraf('out-editor-src'), function () { +const extractEditorSrcTask = function () { console.log(`If the build fails, consider tweaking shakeLevel below to a lower value.`); const apiusages = monacoapi.execute().usageContent; const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString(); @@ -98,17 +95,15 @@ gulp.task('extract-editor-src', util.task.series(util.rimraf('out-editor-src'), importIgnorePattern: /(^vs\/css!)|(promise-polyfill\/polyfill)/, destRoot: path.join(root, 'out-editor-src') }); -})); +}; +extractEditorSrcTask.displayName = 'extract-editor-src'; -// Full compile, including nls and inline sources in sourcemaps, for build -gulp.task('clean-editor-build', util.rimraf('out-editor-build')); -gulp.task('compile-editor-build', ['clean-editor-build', 'extract-editor-src'], compilation.compileTask('out-editor-src', 'out-editor-build', true)); +const compileEditorAMDTask = compilation.compileTask('out-editor-src', 'out-editor-build', true); +compileEditorAMDTask.displayName = 'compile-editor-amd'; -gulp.task('clean-optimized-editor', util.rimraf('out-editor')); -gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-editor-build'], common.optimizeTask({ +const optimizeEditorAMDTask = common.optimizeTask({ src: 'out-editor-build', entryPoints: editorEntryPoints, - otherSources: editorOtherSources, resources: editorResources, loaderConfig: { paths: { @@ -123,13 +118,13 @@ gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-editor-build'], bundleInfo: true, out: 'out-editor', languages: languages -})); +}); +optimizeEditorAMDTask.displayName = 'optimize-editor-amd'; -gulp.task('clean-minified-editor', util.rimraf('out-editor-min')); -gulp.task('minify-editor', ['clean-minified-editor', 'optimize-editor'], common.minifyTask('out-editor')); +const minifyEditorAMDTask = common.minifyTask('out-editor'); +minifyEditorAMDTask.displayName = 'minify-editor-amd'; -gulp.task('clean-editor-esm', util.rimraf('out-editor-esm')); -gulp.task('extract-editor-esm', ['clean-editor-esm', 'clean-editor-distro', 'extract-editor-src'], function () { +const createESMSourcesAndResourcesTask = function () { standalone.createESMSourcesAndResources2({ srcFolder: './out-editor-src', outFolder: './out-editor-esm', @@ -150,8 +145,10 @@ gulp.task('extract-editor-esm', ['clean-editor-esm', 'clean-editor-distro', 'ext 'vs/nls.mock.ts': 'vs/nls.ts' } }); -}); -gulp.task('compile-editor-esm', ['extract-editor-esm', 'clean-editor-distro'], function () { +}; +createESMSourcesAndResourcesTask.displayName = 'extract-editor-esm'; + +const compileEditorESMTask = function () { if (process.platform === 'win32') { const result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, { cwd: path.join(__dirname, '../out-editor-esm') @@ -165,7 +162,8 @@ gulp.task('compile-editor-esm', ['extract-editor-esm', 'clean-editor-distro'], f console.log(result.stdout.toString()); console.log(result.stderr.toString()); } -}); +}; +compileEditorESMTask.displayName = 'compile-editor-esm'; function toExternalDTS(contents) { let lines = contents.split('\n'); @@ -202,8 +200,16 @@ function toExternalDTS(contents) { return lines.join('\n'); } -gulp.task('clean-editor-distro', util.rimraf('out-monaco-editor-core')); -gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify-editor', 'optimize-editor'], function () { +function filterStream(testFunc) { + return es.through(function (data) { + if (!testFunc(data.relative)) { + return; + } + this.emit('data', data); + }); +} + +const finalEditorResourcesTask = function () { return es.merge( // other assets es.merge( @@ -266,7 +272,7 @@ gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify var strContents = data.contents.toString(); var newStr = '//# sourceMappingURL=' + relativePathToMap.replace(/\\/g, '/'); - strContents = strContents.replace(/\/\/\# sourceMappingURL=[^ ]+$/, newStr); + strContents = strContents.replace(/\/\/# sourceMappingURL=[^ ]+$/, newStr); data.contents = Buffer.from(strContents); this.emit('data', data); @@ -280,61 +286,34 @@ gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify return /\.js\.map$/.test(path); })).pipe(gulp.dest('out-monaco-editor-core/min-maps')) ); -}); - -gulp.task('analyze-editor-distro', function () { - // @ts-ignore - var bundleInfo = require('../out-editor/bundleInfo.json'); - var graph = bundleInfo.graph; - var bundles = bundleInfo.bundles; - - var inverseGraph = {}; - Object.keys(graph).forEach(function (module) { - var dependencies = graph[module]; - dependencies.forEach(function (dep) { - inverseGraph[dep] = inverseGraph[dep] || []; - inverseGraph[dep].push(module); - }); - }); - - var detailed = {}; - Object.keys(bundles).forEach(function (entryPoint) { - var included = bundles[entryPoint]; - var includedMap = {}; - included.forEach(function (included) { - includedMap[included] = true; - }); - - var explanation = []; - included.map(function (included) { - if (included.indexOf('!') >= 0) { - return; - } - - var reason = (inverseGraph[included] || []).filter(function (mod) { - return !!includedMap[mod]; - }); - explanation.push({ - module: included, - reason: reason - }); - }); - - detailed[entryPoint] = explanation; - }); - - console.log(JSON.stringify(detailed, null, '\t')); -}); - -function filterStream(testFunc) { - return es.through(function (data) { - if (!testFunc(data.relative)) { - return; - } - this.emit('data', data); - }); -} +}; +finalEditorResourcesTask.displayName = 'final-editor-resources'; +gulp.task('editor-distro', + util.task.series( + util.task.parallel( + util.rimraf('out-editor-src'), + util.rimraf('out-editor-build'), + util.rimraf('out-editor-esm'), + util.rimraf('out-monaco-editor-core'), + util.rimraf('out-editor'), + util.rimraf('out-editor-min') + ), + extractEditorSrcTask, + util.task.parallel( + util.task.series( + compileEditorAMDTask, + optimizeEditorAMDTask, + minifyEditorAMDTask + ), + util.task.series( + createESMSourcesAndResourcesTask, + compileEditorESMTask + ) + ), + finalEditorResourcesTask + ) +); //#region monaco type checking @@ -354,6 +333,7 @@ function createTscCompileTask(watch) { let errors = []; let reporter = createReporter(); let report; + // eslint-disable-next-line no-control-regex let magic = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings child.stdout.on('data', data => { @@ -387,7 +367,12 @@ function createTscCompileTask(watch) { }; } -gulp.task('monaco-typecheck-watch', createTscCompileTask(true)); -gulp.task('monaco-typecheck', createTscCompileTask(false)); +const monacoTypecheckWatchTask = createTscCompileTask(true); +monacoTypecheckWatchTask.displayName = 'monaco-typecheck-watch'; +exports.monacoTypecheckWatchTask = monacoTypecheckWatchTask; + +const monacoTypecheckTask = createTscCompileTask(false); +monacoTypecheckTask.displayName = 'monaco-typecheck'; +exports.monacoTypecheckTask = monacoTypecheckTask; //#endregion diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js index 64d5c213cc6..3a780a22e8d 100644 --- a/build/gulpfile.extensions.js +++ b/build/gulpfile.extensions.js @@ -141,6 +141,16 @@ const tasks = compilations.map(function (tsconfigFile) { }; }); -gulp.task('compile-extensions', util.task.parallel(...tasks.map(t => t.compileTask))); -gulp.task('watch-extensions', util.task.parallel(...tasks.map(t => t.watchTask))); -gulp.task('compile-extensions-build', util.task.parallel(...tasks.map(t => t.compileBuildTask))); +const compileExtensionsTask = util.task.parallel(...tasks.map(t => t.compileTask)); +compileExtensionsTask.displayName = 'compile-extensions'; +gulp.task(compileExtensionsTask.displayName, compileExtensionsTask); +exports.compileExtensionsTask = compileExtensionsTask; + +const watchExtensionsTask = util.task.parallel(...tasks.map(t => t.watchTask)); +watchExtensionsTask.displayName = 'watch-extensions'; +gulp.task(watchExtensionsTask.displayName, watchExtensionsTask); +exports.watchExtensionsTask = watchExtensionsTask; + +const compileExtensionsBuildTask = util.task.parallel(...tasks.map(t => t.compileBuildTask)); +compileExtensionsBuildTask.displayName = 'compile-extensions-build'; +exports.compileExtensionsBuildTask = compileExtensionsBuildTask; diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index e81b0925f64..dbddf5215dd 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -33,6 +33,7 @@ const deps = require('./dependencies'); const getElectronVersion = require('./lib/electron').getElectronVersion; const createAsar = require('./lib/asar').createAsar; const minimist = require('minimist'); +const { compileBuildTask } = require('./gulpfile.compile'); const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname)); // @ts-ignore @@ -65,12 +66,12 @@ const vscodeResources = [ 'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh}', 'out-build/vs/base/browser/ui/octiconLabel/octicons/**', 'out-build/vs/workbench/browser/media/*-theme.css', - 'out-build/vs/workbench/parts/debug/**/*.json', - 'out-build/vs/workbench/parts/execution/**/*.scpt', - 'out-build/vs/workbench/parts/webview/electron-browser/webview-pre.js', + 'out-build/vs/workbench/contrib/debug/**/*.json', + 'out-build/vs/workbench/contrib/execution/**/*.scpt', + 'out-build/vs/workbench/contrib/webview/electron-browser/webview-pre.js', 'out-build/vs/**/markdown.css', - 'out-build/vs/workbench/parts/tasks/**/*.json', - 'out-build/vs/workbench/parts/welcome/walkThrough/**/*.md', + 'out-build/vs/workbench/contrib/tasks/**/*.json', + 'out-build/vs/workbench/contrib/welcome/walkThrough/**/*.md', 'out-build/vs/workbench/services/files/**/*.exe', 'out-build/vs/workbench/services/files/**/*.md', 'out-build/vs/code/electron-browser/workbench/**', @@ -86,29 +87,44 @@ const BUNDLED_FILE_HEADER = [ ' *--------------------------------------------------------*/' ].join('\n'); -gulp.task('clean-optimized-vscode', util.rimraf('out-vscode')); -gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({ - src: 'out-build', - entryPoints: vscodeEntryPoints, - otherSources: [], - resources: vscodeResources, - loaderConfig: common.loaderConfig(nodeModules), - header: BUNDLED_FILE_HEADER, - out: 'out-vscode', - bundleInfo: undefined -})); +const optimizeVSCodeTask = util.task.series( + util.task.parallel( + util.rimraf('out-vscode'), + compileBuildTask + ), + common.optimizeTask({ + src: 'out-build', + entryPoints: vscodeEntryPoints, + resources: vscodeResources, + loaderConfig: common.loaderConfig(nodeModules), + header: BUNDLED_FILE_HEADER, + out: 'out-vscode', + bundleInfo: undefined + }) +); +optimizeVSCodeTask.displayName = 'optimize-vscode'; -gulp.task('optimize-index-js', ['optimize-vscode'], () => { - const fullpath = path.join(process.cwd(), 'out-vscode/bootstrap-window.js'); - const contents = fs.readFileSync(fullpath).toString(); - const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules)); - fs.writeFileSync(fullpath, newContents); -}); +const optimizeIndexJSTask = util.task.series( + optimizeVSCodeTask, + () => { + const fullpath = path.join(process.cwd(), 'out-vscode/bootstrap-window.js'); + const contents = fs.readFileSync(fullpath).toString(); + const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules)); + fs.writeFileSync(fullpath, newContents); + } +); +optimizeIndexJSTask.displayName = 'optimize-index-js'; const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`; -gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min')); -gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-index-js'], common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`)); +const minifyVSCodeTask = util.task.series( + util.task.parallel( + util.rimraf('out-vscode-min'), + optimizeIndexJSTask + ), + common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`) +); +minifyVSCodeTask.displayName = 'minify-vscode'; // Package @@ -238,14 +254,14 @@ function computeChecksum(filename) { return hash; } -function packageTask(platform, arch, opts) { +function packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) { opts = opts || {}; - const destination = path.join(path.dirname(root), 'VSCode') + (platform ? '-' + platform : '') + (arch ? '-' + arch : ''); + const destination = path.join(path.dirname(root), destinationFolderName); platform = platform || process.platform; return () => { - const out = opts.minified ? 'out-vscode-min' : 'out-vscode'; + const out = sourceFolderName; const checksums = computeChecksums(out, [ 'vs/workbench/workbench.main.js', @@ -294,7 +310,7 @@ function packageTask(platform, arch, opts) { const productJsonStream = gulp.src(['product.json'], { base: '.' }) .pipe(json(productJsonUpdate)); - const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.' }); + const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.', allowEmpty: true }); const watermark = gulp.src(['resources/letterpress.svg', 'resources/letterpress-dark.svg', 'resources/letterpress-hc.svg'], { base: '.' }); @@ -387,7 +403,7 @@ function packageTask(platform, arch, opts) { // result = es.merge(result, gulp.src('resources/completions/**', { base: '.' })); if (platform === 'win32') { - result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32' })); + result = es.merge(result, gulp.src('resources/win32/bin/code.js', { base: 'resources/win32', allowEmpty: true })); result = es.merge(result, gulp.src('resources/win32/bin/code.cmd', { base: 'resources/win32' }) .pipe(replace('@@NAME@@', product.nameShort)) @@ -422,29 +438,36 @@ function packageTask(platform, arch, opts) { const buildRoot = path.dirname(root); -gulp.task('clean-vscode-win32-ia32', util.rimraf(path.join(buildRoot, 'VSCode-win32-ia32'))); -gulp.task('clean-vscode-win32-x64', util.rimraf(path.join(buildRoot, 'VSCode-win32-x64'))); -gulp.task('clean-vscode-darwin', util.rimraf(path.join(buildRoot, 'VSCode-darwin'))); -gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(buildRoot, 'VSCode-linux-ia32'))); -gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(buildRoot, 'VSCode-linux-x64'))); -gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(buildRoot, 'VSCode-linux-arm'))); -gulp.task('clean-vscode-linux-arm64', util.rimraf(path.join(buildRoot, 'VSCode-linux-arm64'))); +const BUILD_TARGETS = [ + { platform: 'win32', arch: 'ia32' }, + { platform: 'win32', arch: 'x64' }, + { platform: 'darwin', arch: null, opts: { stats: true } }, + { platform: 'linux', arch: 'ia32' }, + { platform: 'linux', arch: 'x64' }, + { platform: 'linux', arch: 'arm' }, + { platform: 'linux', arch: 'arm64' }, +]; +BUILD_TARGETS.forEach(buildTarget => { + const dashed = (str) => (str ? `-${str}` : ``); + const platform = buildTarget.platform; + const arch = buildTarget.arch; + const opts = buildTarget.opts; -gulp.task('vscode-win32-ia32', ['optimize-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32')); -gulp.task('vscode-win32-x64', ['optimize-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64')); -gulp.task('vscode-darwin', ['optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { stats: true })); -gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32')); -gulp.task('vscode-linux-x64', ['optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64')); -gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm')); -gulp.task('vscode-linux-arm64', ['optimize-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64')); + ['', 'min'].forEach(minified => { + const sourceFolderName = `out-vscode${dashed(minified)}`; + const destinationFolderName = `VSCode${dashed(platform)}${dashed(arch)}`; -gulp.task('vscode-win32-ia32-min', ['minify-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32', { minified: true })); -gulp.task('vscode-win32-x64-min', ['minify-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64', { minified: true })); -gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true, stats: true })); -gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true })); -gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true })); -gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true })); -gulp.task('vscode-linux-arm64-min', ['minify-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64', { minified: true })); + const vscodeTask = util.task.series( + util.task.parallel( + minified ? minifyVSCodeTask : optimizeVSCodeTask, + util.rimraf(path.join(buildRoot, destinationFolderName)) + ), + packageTask(platform, arch, sourceFolderName, destinationFolderName, opts) + ); + vscodeTask.displayName = `vscode${dashed(platform)}${dashed(arch)}${dashed(minified)}`; + gulp.task(vscodeTask.displayName, vscodeTask); + }); +}); // Transifex Localizations @@ -467,30 +490,40 @@ const apiHostname = process.env.TRANSIFEX_API_URL; const apiName = process.env.TRANSIFEX_API_NAME; const apiToken = process.env.TRANSIFEX_API_TOKEN; -gulp.task('vscode-translations-push', ['optimize-vscode'], function () { - const pathToMetadata = './out-vscode/nls.metadata.json'; - const pathToExtensions = './extensions/*'; - const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}'; +gulp.task('vscode-translations-push', + util.task.series( + optimizeVSCodeTask, + function () { + const pathToMetadata = './out-vscode/nls.metadata.json'; + const pathToExtensions = './extensions/*'; + const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}'; - return es.merge( - gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()), - gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()), - gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions()) - ).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken) - ).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken)); -}); + return es.merge( + gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()), + gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()), + gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions()) + ).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken) + ).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken)); + } + ) +); -gulp.task('vscode-translations-export', ['optimize-vscode'], function () { - const pathToMetadata = './out-vscode/nls.metadata.json'; - const pathToExtensions = './extensions/*'; - const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}'; +gulp.task('vscode-translations-export', + util.task.series( + optimizeVSCodeTask, + function () { + const pathToMetadata = './out-vscode/nls.metadata.json'; + const pathToExtensions = './extensions/*'; + const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}'; - return es.merge( - gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()), - gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()), - gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions()) - ).pipe(vfs.dest('../vscode-translations-export')); -}); + return es.merge( + gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()), + gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()), + gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions()) + ).pipe(vfs.dest('../vscode-translations-export')); + } + ) +); gulp.task('vscode-translations-pull', function () { return es.merge([...i18n.defaultLanguages, ...i18n.extraLanguages].map(language => { @@ -540,57 +573,8 @@ gulp.task('upload-vscode-sourcemaps', () => { })); }); -const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json'); -gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => { - if (!shouldSetupSettingsSearch()) { - const branch = process.env.BUILD_SOURCEBRANCH; - console.log(`Only runs on master and release branches, not ${branch}`); - return; - } - - if (!fs.existsSync(allConfigDetailsPath)) { - throw new Error(`configuration file at ${allConfigDetailsPath} does not exist`); - } - - const settingsSearchBuildId = getSettingsSearchBuildId(packageJson); - if (!settingsSearchBuildId) { - throw new Error('Failed to compute build number'); - } - - return gulp.src(allConfigDetailsPath) - .pipe(azure.upload({ - account: process.env.AZURE_STORAGE_ACCOUNT, - key: process.env.AZURE_STORAGE_ACCESS_KEY, - container: 'configuration', - prefix: `${settingsSearchBuildId}/${commit}/` - })); -}); - -function shouldSetupSettingsSearch() { - const branch = process.env.BUILD_SOURCEBRANCH; - return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0); -} - -function getSettingsSearchBuildId(packageJson) { - try { - const branch = process.env.BUILD_SOURCEBRANCH; - const branchId = branch.indexOf('/release/') >= 0 ? 0 : - /\/master$/.test(branch) ? 1 : - 2; // Some unexpected branch - - const out = cp.execSync(`git rev-list HEAD --count`); - const count = parseInt(out.toString()); - - // - // 1.25.1, 1,234,567 commits, master = 1250112345671 - return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId; - } catch (e) { - throw new Error('Could not determine build number: ' + e.toString()); - } -} - // This task is only run for the MacOS build -gulp.task('generate-vscode-configuration', () => { +const generateVSCodeConfigurationTask = () => { return new Promise((resolve, reject) => { const buildDir = process.env['AGENT_BUILDDIRECTORY']; if (!buildDir) { @@ -625,4 +609,60 @@ gulp.task('generate-vscode-configuration', () => { reject(err); }); }); -}); +}; +generateVSCodeConfigurationTask.displayName = 'generate-vscode-configuration'; + +const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json'); +gulp.task('upload-vscode-configuration', + util.task.series( + generateVSCodeConfigurationTask, + () => { + if (!shouldSetupSettingsSearch()) { + const branch = process.env.BUILD_SOURCEBRANCH; + console.log(`Only runs on master and release branches, not ${branch}`); + return; + } + + if (!fs.existsSync(allConfigDetailsPath)) { + throw new Error(`configuration file at ${allConfigDetailsPath} does not exist`); + } + + const settingsSearchBuildId = getSettingsSearchBuildId(packageJson); + if (!settingsSearchBuildId) { + throw new Error('Failed to compute build number'); + } + + return gulp.src(allConfigDetailsPath) + .pipe(azure.upload({ + account: process.env.AZURE_STORAGE_ACCOUNT, + key: process.env.AZURE_STORAGE_ACCESS_KEY, + container: 'configuration', + prefix: `${settingsSearchBuildId}/${commit}/` + })); + } + ) +); + +function shouldSetupSettingsSearch() { + const branch = process.env.BUILD_SOURCEBRANCH; + return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0); +} + +function getSettingsSearchBuildId(packageJson) { + try { + const branch = process.env.BUILD_SOURCEBRANCH; + const branchId = branch.indexOf('/release/') >= 0 ? 0 : + /\/master$/.test(branch) ? 1 : + 2; // Some unexpected branch + + const out = cp.execSync(`git rev-list HEAD --count`); + const count = parseInt(out.toString()); + + // + // 1.25.1, 1,234,567 commits, master = 1250112345671 + return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId; + } catch (e) { + throw new Error('Could not determine build number: ' + e.toString()); + } +} + diff --git a/build/gulpfile.vscode.linux.js b/build/gulpfile.vscode.linux.js index 6728a0ce640..b3599cbe39d 100644 --- a/build/gulpfile.vscode.linux.js +++ b/build/gulpfile.vscode.linux.js @@ -229,29 +229,42 @@ function buildSnapPackage(arch) { return shell.task(`cd ${snapBuildPath} && snapcraft build`); } -gulp.task('vscode-linux-ia32-prepare-deb', util.task.series(util.rimraf('.build/linux/deb/i386'), prepareDebPackage('ia32'))); -gulp.task('vscode-linux-x64-prepare-deb', util.task.series(util.rimraf('.build/linux/deb/amd64'), prepareDebPackage('x64'))); -gulp.task('vscode-linux-arm-prepare-deb', util.task.series(util.rimraf('.build/linux/deb/armhf'), prepareDebPackage('arm'))); -gulp.task('vscode-linux-arm64-prepare-deb', util.task.series(util.rimraf('.build/linux/deb/arm64'), prepareDebPackage('arm64'))); -gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32')); -gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64')); -gulp.task('vscode-linux-arm-build-deb', ['vscode-linux-arm-prepare-deb'], buildDebPackage('arm')); -gulp.task('vscode-linux-arm64-build-deb', ['vscode-linux-arm64-prepare-deb'], buildDebPackage('arm64')); +const BUILD_TARGETS = [ + { arch: 'ia32' }, + { arch: 'x64' }, + { arch: 'arm' }, + { arch: 'arm64' }, +]; -gulp.task('vscode-linux-ia32-prepare-rpm', util.task.series(util.rimraf('.build/linux/rpm/i386'), prepareRpmPackage('ia32'))); -gulp.task('vscode-linux-x64-prepare-rpm', util.task.series(util.rimraf('.build/linux/rpm/x86_64'), prepareRpmPackage('x64'))); -gulp.task('vscode-linux-arm-prepare-rpm', util.task.series(util.rimraf('.build/linux/rpm/armhf'), prepareRpmPackage('arm'))); -gulp.task('vscode-linux-arm64-prepare-rpm', util.task.series(util.rimraf('.build/linux/rpm/arm64'), prepareRpmPackage('arm64'))); -gulp.task('vscode-linux-ia32-build-rpm', ['vscode-linux-ia32-prepare-rpm'], buildRpmPackage('ia32')); -gulp.task('vscode-linux-x64-build-rpm', ['vscode-linux-x64-prepare-rpm'], buildRpmPackage('x64')); -gulp.task('vscode-linux-arm-build-rpm', ['vscode-linux-arm-prepare-rpm'], buildRpmPackage('arm')); -gulp.task('vscode-linux-arm64-build-rpm', ['vscode-linux-arm64-prepare-rpm'], buildRpmPackage('arm64')); +BUILD_TARGETS.forEach((buildTarget) => { + const arch = buildTarget.arch; -gulp.task('vscode-linux-ia32-prepare-snap', util.task.series(util.rimraf('.build/linux/snap/x64'), prepareSnapPackage('ia32'))); -gulp.task('vscode-linux-x64-prepare-snap', util.task.series(util.rimraf('.build/linux/snap/x64'), prepareSnapPackage('x64'))); -gulp.task('vscode-linux-arm-prepare-snap', util.task.series(util.rimraf('.build/linux/snap/x64'), prepareSnapPackage('arm'))); -gulp.task('vscode-linux-arm64-prepare-snap', util.task.series(util.rimraf('.build/linux/snap/x64'), prepareSnapPackage('arm64'))); -gulp.task('vscode-linux-ia32-build-snap', ['vscode-linux-ia32-prepare-snap'], buildSnapPackage('ia32')); -gulp.task('vscode-linux-x64-build-snap', ['vscode-linux-x64-prepare-snap'], buildSnapPackage('x64')); -gulp.task('vscode-linux-arm-build-snap', ['vscode-linux-arm-prepare-snap'], buildSnapPackage('arm')); -gulp.task('vscode-linux-arm64-build-snap', ['vscode-linux-arm64-prepare-snap'], buildSnapPackage('arm64')); + { + const debArch = getDebPackageArch(arch); + const prepareDebTask = util.task.series(util.rimraf(`.build/linux/deb/${debArch}`), prepareDebPackage(arch)); + prepareDebTask.displayName = `vscode-linux-${arch}-prepare-deb`; + // gulp.task(prepareDebTask.displayName, prepareDebTask); + const buildDebTask = util.task.series(prepareDebTask, buildDebPackage(arch)); + buildDebTask.displayName = `vscode-linux-${arch}-build-deb`; + gulp.task(buildDebTask.displayName, buildDebTask); + } + + { + const rpmArch = getRpmPackageArch(arch); + const prepareRpmTask = util.task.series(util.rimraf(`.build/linux/rpm/${rpmArch}`), prepareRpmPackage(arch)); + prepareRpmTask.displayName = `vscode-linux-${arch}-prepare-rpm`; + // gulp.task(prepareRpmTask.displayName, prepareRpmTask); + const buildRpmTask = util.task.series(prepareRpmTask, buildRpmPackage(arch)); + buildRpmTask.displayName = `vscode-linux-${arch}-build-rpm`; + gulp.task(buildRpmTask.displayName, buildRpmTask); + } + + { + const prepareSnapTask = util.task.series(util.rimraf(`.build/linux/snap/${arch}`), prepareSnapPackage(arch)); + prepareSnapTask.displayName = `vscode-linux-${arch}-prepare-snap`; + gulp.task(prepareSnapTask.displayName, prepareSnapTask); + const buildSnapTask = util.task.series(prepareSnapTask, buildSnapPackage(arch)); + buildSnapTask.displayName = `vscode-linux-${arch}-build-snap`; + gulp.task(buildSnapTask.displayName, buildSnapTask); + } +}); diff --git a/build/gulpfile.vscode.win32.js b/build/gulpfile.vscode.win32.js index 3b3a21c1b69..b49fcbabcfc 100644 --- a/build/gulpfile.vscode.win32.js +++ b/build/gulpfile.vscode.win32.js @@ -134,9 +134,6 @@ function copyInnoUpdater(arch) { }; } -gulp.task('vscode-win32-ia32-copy-inno-updater', copyInnoUpdater('ia32')); -gulp.task('vscode-win32-x64-copy-inno-updater', copyInnoUpdater('x64')); - function patchInnoUpdater(arch) { return cb => { const icon = path.join(repoPath, 'resources', 'win32', 'code.ico'); @@ -144,5 +141,5 @@ function patchInnoUpdater(arch) { }; } -gulp.task('vscode-win32-ia32-inno-updater', ['vscode-win32-ia32-copy-inno-updater'], patchInnoUpdater('ia32')); -gulp.task('vscode-win32-x64-inno-updater', ['vscode-win32-x64-copy-inno-updater'], patchInnoUpdater('x64')); \ No newline at end of file +gulp.task('vscode-win32-ia32-inno-updater', util.task.series(copyInnoUpdater('ia32'), patchInnoUpdater('ia32'))); +gulp.task('vscode-win32-x64-inno-updater', util.task.series(copyInnoUpdater('x64'), patchInnoUpdater('x64'))); \ No newline at end of file diff --git a/build/lib/builtInExtensions.js b/build/lib/builtInExtensions.js index c5797c78b61..a687bbccb4c 100644 --- a/build/lib/builtInExtensions.js +++ b/build/lib/builtInExtensions.js @@ -14,7 +14,8 @@ const es = require('event-stream'); const rename = require('gulp-rename'); const vfs = require('vinyl-fs'); const ext = require('./extensions'); -const util = require('gulp-util'); +const fancyLog = require('fancy-log'); +const ansiColors = require('ansi-colors'); const root = path.dirname(path.dirname(__dirname)); const builtInExtensions = require('../builtInExtensions.json'); @@ -43,7 +44,7 @@ function isUpToDate(extension) { function syncMarketplaceExtension(extension) { if (isUpToDate(extension)) { - util.log(util.colors.blue('[marketplace]'), `${extension.name}@${extension.version}`, util.colors.green('✔︎')); + fancyLog(ansiColors.blue('[marketplace]'), `${extension.name}@${extension.version}`, ansiColors.green('✔︎')); return es.readArray([]); } @@ -52,13 +53,13 @@ function syncMarketplaceExtension(extension) { return ext.fromMarketplace(extension.name, extension.version, extension.metadata) .pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`)) .pipe(vfs.dest('.build/builtInExtensions')) - .on('end', () => util.log(util.colors.blue('[marketplace]'), extension.name, util.colors.green('✔︎'))); + .on('end', () => fancyLog(ansiColors.blue('[marketplace]'), extension.name, ansiColors.green('✔︎'))); } function syncExtension(extension, controlState) { switch (controlState) { case 'disabled': - util.log(util.colors.blue('[disabled]'), util.colors.gray(extension.name)); + fancyLog(ansiColors.blue('[disabled]'), ansiColors.gray(extension.name)); return es.readArray([]); case 'marketplace': @@ -66,15 +67,15 @@ function syncExtension(extension, controlState) { default: if (!fs.existsSync(controlState)) { - util.log(util.colors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`)); + fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but that path does not exist.`)); return es.readArray([]); } else if (!fs.existsSync(path.join(controlState, 'package.json'))) { - util.log(util.colors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`)); + fancyLog(ansiColors.red(`Error: Built-in extension '${extension.name}' is configured to run from '${controlState}' but there is no 'package.json' file in that directory.`)); return es.readArray([]); } - util.log(util.colors.blue('[local]'), `${extension.name}: ${util.colors.cyan(controlState)}`, util.colors.green('✔︎')); + fancyLog(ansiColors.blue('[local]'), `${extension.name}: ${ansiColors.cyan(controlState)}`, ansiColors.green('✔︎')); return es.readArray([]); } } @@ -93,8 +94,8 @@ function writeControlFile(control) { } function main() { - util.log('Syncronizing built-in extensions...'); - util.log(`You can manage built-in extensions with the ${util.colors.cyan('--builtin')} flag`); + fancyLog('Syncronizing built-in extensions...'); + fancyLog(`You can manage built-in extensions with the ${ansiColors.cyan('--builtin')} flag`); const control = readControlFile(); const streams = []; diff --git a/build/lib/compilation.js b/build/lib/compilation.js index f0468121d7a..592a5d087ce 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -16,7 +16,8 @@ const monacodts = require("../monaco/api"); const nls = require("./nls"); const reporter_1 = require("./reporter"); const util = require("./util"); -const util2 = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const watch = require('./watch'); const reporter = reporter_1.createReporter(); function getTypeScriptCompilerOptions(src) { @@ -179,7 +180,7 @@ class MonacoGenerator { return r; } _log(message, ...rest) { - util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest); + fancyLog(ansiColors.cyan('[monaco.d.ts]'), message, ...rest); } execute() { const startTime = Date.now(); diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index fede9e74492..b431a134f6c 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -17,7 +17,9 @@ import * as monacodts from '../monaco/api'; import * as nls from './nls'; import { createReporter } from './reporter'; import * as util from './util'; -import * as util2 from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; + const watch = require('./watch'); const reporter = createReporter(); @@ -218,7 +220,7 @@ class MonacoGenerator { } private _log(message: any, ...rest: any[]): void { - util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest); + fancyLog(ansiColors.cyan('[monaco.d.ts]'), message, ...rest); } public execute(): void { diff --git a/build/lib/extensions.js b/build/lib/extensions.js index 994d1336e6b..3554fabc230 100644 --- a/build/lib/extensions.js +++ b/build/lib/extensions.js @@ -17,7 +17,8 @@ const remote = require("gulp-remote-src"); const vzip = require('gulp-vinyl-zip'); const filter = require("gulp-filter"); const rename = require("gulp-rename"); -const util = require('gulp-util'); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const buffer = require('gulp-buffer'); const json = require("gulp-json-editor"); const webpack = require('webpack'); @@ -79,7 +80,7 @@ function fromLocalWebpack(extensionPath, sourceMappingURLBase) { .pipe(packageJsonFilter.restore); const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => { const webpackDone = (err, stats) => { - util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); + fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); if (err) { result.emit('error', err); } @@ -157,7 +158,7 @@ const baseHeaders = { function fromMarketplace(extensionName, version, metadata) { const [publisher, name] = extensionName.split('.'); const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`; - util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...'); + fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...'); const options = { base: url, requestOptions: { diff --git a/build/lib/extensions.ts b/build/lib/extensions.ts index 844b711a829..7b89942753f 100644 --- a/build/lib/extensions.ts +++ b/build/lib/extensions.ts @@ -17,7 +17,8 @@ import remote = require('gulp-remote-src'); const vzip = require('gulp-vinyl-zip'); import filter = require('gulp-filter'); import rename = require('gulp-rename'); -const util = require('gulp-util'); +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; const buffer = require('gulp-buffer'); import json = require('gulp-json-editor'); const webpack = require('webpack'); @@ -93,7 +94,7 @@ function fromLocalWebpack(extensionPath: string, sourceMappingURLBase: string | const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => { const webpackDone = (err: any, stats: any) => { - util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); + fancyLog(`Bundled extension: ${ansiColors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`); if (err) { result.emit('error', err); } @@ -187,7 +188,7 @@ export function fromMarketplace(extensionName: string, version: string, metadata const [publisher, name] = extensionName.split('.'); const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`; - util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...'); + fancyLog('Downloading extension:', ansiColors.yellow(`${extensionName}@${version}`), '...'); const options = { base: url, diff --git a/build/lib/i18n.js b/build/lib/i18n.js index 1fc6b060e9c..bf32ebf3676 100644 --- a/build/lib/i18n.js +++ b/build/lib/i18n.js @@ -13,11 +13,12 @@ const xml2js = require("xml2js"); const glob = require("glob"); const https = require("https"); const gulp = require("gulp"); -const util = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const iconv = require("iconv-lite"); const NUMBER_OF_CONCURRENT_DOWNLOADS = 4; function log(message, ...rest) { - util.log(util.colors.green('[i18n]'), message, ...rest); + fancyLog(ansiColors.green('[i18n]'), message, ...rest); } exports.defaultLanguages = [ { id: 'zh-tw', folderName: 'cht', transifexId: 'zh-hant' }, @@ -488,7 +489,7 @@ function getResource(sourceFile) { else if (/^vs\/code/.test(sourceFile)) { return { name: 'vs/code', project: workbenchProject }; } - else if (/^vs\/workbench\/parts/.test(sourceFile)) { + else if (/^vs\/workbench\/contrib/.test(sourceFile)) { resource = sourceFile.split('/', 4).join('/'); return { name: resource, project: workbenchProject }; } diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index f8a57d73f6b..5adbf22d988 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -27,135 +27,135 @@ "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/cli", + "name": "vs/workbench/contrib/cli", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/codeEditor", + "name": "vs/workbench/contrib/codeEditor", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/comments", + "name": "vs/workbench/contrib/comments", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/debug", + "name": "vs/workbench/contrib/debug", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/emmet", + "name": "vs/workbench/contrib/emmet", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/execution", + "name": "vs/workbench/contrib/execution", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/extensions", + "name": "vs/workbench/contrib/extensions", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/feedback", + "name": "vs/workbench/contrib/feedback", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/files", + "name": "vs/workbench/contrib/files", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/html", + "name": "vs/workbench/contrib/html", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/markers", + "name": "vs/workbench/contrib/markers", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/localizations", + "name": "vs/workbench/contrib/localizations", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/logs", + "name": "vs/workbench/contrib/logs", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/output", + "name": "vs/workbench/contrib/output", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/performance", + "name": "vs/workbench/contrib/performance", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/preferences", + "name": "vs/workbench/contrib/preferences", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/quickopen", + "name": "vs/workbench/contrib/quickopen", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/relauncher", + "name": "vs/workbench/contrib/relauncher", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/scm", + "name": "vs/workbench/contrib/scm", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/search", + "name": "vs/workbench/contrib/search", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/snippets", + "name": "vs/workbench/contrib/snippets", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/stats", + "name": "vs/workbench/contrib/stats", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/surveys", + "name": "vs/workbench/contrib/surveys", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/tasks", + "name": "vs/workbench/contrib/tasks", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/terminal", + "name": "vs/workbench/contrib/terminal", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/themes", + "name": "vs/workbench/contrib/themes", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/trust", + "name": "vs/workbench/contrib/trust", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/update", + "name": "vs/workbench/contrib/update", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/url", + "name": "vs/workbench/contrib/url", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/watermark", + "name": "vs/workbench/contrib/watermark", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/webview", + "name": "vs/workbench/contrib/webview", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/welcome", + "name": "vs/workbench/contrib/welcome", "project": "vscode-workbench" }, { - "name": "vs/workbench/parts/outline", + "name": "vs/workbench/contrib/outline", "project": "vscode-workbench" }, { diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts index 81ba0c0939e..6f6139ad388 100644 --- a/build/lib/i18n.ts +++ b/build/lib/i18n.ts @@ -13,14 +13,14 @@ import * as xml2js from 'xml2js'; import * as glob from 'glob'; import * as https from 'https'; import * as gulp from 'gulp'; - -import * as util from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; import * as iconv from 'iconv-lite'; const NUMBER_OF_CONCURRENT_DOWNLOADS = 4; function log(message: any, ...rest: any[]): void { - util.log(util.colors.green('[i18n]'), message, ...rest); + fancyLog(ansiColors.green('[i18n]'), message, ...rest); } export interface Language { @@ -602,7 +602,7 @@ export function getResource(sourceFile: string): Resource { return { name: 'vs/base', project: editorProject }; } else if (/^vs\/code/.test(sourceFile)) { return { name: 'vs/code', project: workbenchProject }; - } else if (/^vs\/workbench\/parts/.test(sourceFile)) { + } else if (/^vs\/workbench\/contrib/.test(sourceFile)) { resource = sourceFile.split('/', 4).join('/'); return { name: resource, project: workbenchProject }; } else if (/^vs\/workbench\/services/.test(sourceFile)) { diff --git a/build/lib/optimize.js b/build/lib/optimize.js index 07cdebe30ee..bc2b5b12aea 100644 --- a/build/lib/optimize.js +++ b/build/lib/optimize.js @@ -13,7 +13,8 @@ const flatmap = require("gulp-flatmap"); const sourcemaps = require("gulp-sourcemaps"); const uglify = require("gulp-uglify"); const composer = require("gulp-uglify/composer"); -const gulpUtil = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const path = require("path"); const pump = require("pump"); const uglifyes = require("uglify-es"); @@ -24,7 +25,7 @@ const stats_1 = require("./stats"); const util = require("./util"); const REPO_ROOT_PATH = path.join(__dirname, '../..'); function log(prefix, message) { - gulpUtil.log(gulpUtil.colors.cyan('[' + prefix + ']'), message); + fancyLog(ansiColors.cyan('[' + prefix + ']'), message); } function loaderConfig(emptyPaths) { const result = { @@ -113,7 +114,6 @@ function toBundleStream(src, bundledFileHeader, bundles) { function optimizeTask(opts) { const src = opts.src; const entryPoints = opts.entryPoints; - const otherSources = opts.otherSources; const resources = opts.resources; const loaderConfig = opts.loaderConfig; const bundledFileHeader = opts.header; @@ -136,7 +136,7 @@ function optimizeTask(opts) { } filteredResources.push('!' + resource); }); - gulp.src(filteredResources, { base: `${src}` }).pipe(resourcesStream); + gulp.src(filteredResources, { base: `${src}`, allowEmpty: true }).pipe(resourcesStream); const bundleInfoArray = []; if (opts.bundleInfo) { bundleInfoArray.push(new VinylFile({ @@ -147,20 +147,7 @@ function optimizeTask(opts) { } es.readArray(bundleInfoArray).pipe(bundleInfoStream); }); - const otherSourcesStream = es.through(); - const otherSourcesStreamArr = []; - gulp.src(otherSources, { base: `${src}` }) - .pipe(es.through(function (data) { - otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative)); - }, function () { - if (!otherSourcesStreamArr.length) { - setTimeout(function () { otherSourcesStream.emit('end'); }, 0); - } - else { - es.merge(otherSourcesStreamArr).pipe(otherSourcesStream); - } - })); - const result = es.merge(loader(src, bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, bundleInfoStream); + const result = es.merge(loader(src, bundledFileHeader, bundleLoader), bundlesStream, resourcesStream, bundleInfoStream); return result .pipe(sourcemaps.write('./', { sourceRoot: undefined, diff --git a/build/lib/optimize.ts b/build/lib/optimize.ts index 85d15b23543..cb26dac7c2e 100644 --- a/build/lib/optimize.ts +++ b/build/lib/optimize.ts @@ -14,7 +14,8 @@ import * as flatmap from 'gulp-flatmap'; import * as sourcemaps from 'gulp-sourcemaps'; import * as uglify from 'gulp-uglify'; import * as composer from 'gulp-uglify/composer'; -import * as gulpUtil from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; import * as path from 'path'; import * as pump from 'pump'; import * as sm from 'source-map'; @@ -28,7 +29,7 @@ import * as util from './util'; const REPO_ROOT_PATH = path.join(__dirname, '../..'); function log(prefix: string, message: string): void { - gulpUtil.log(gulpUtil.colors.cyan('[' + prefix + ']'), message); + fancyLog(ansiColors.cyan('[' + prefix + ']'), message); } export function loaderConfig(emptyPaths?: string[]) { @@ -141,10 +142,6 @@ export interface IOptimizeTaskOpts { * (for AMD files, will get bundled and get Copyright treatment) */ entryPoints: bundle.IEntryPoint[]; - /** - * (for non-AMD files that should get Copyright treatment) - */ - otherSources: string[]; /** * (svg, etc.) */ @@ -175,7 +172,6 @@ export interface IOptimizeTaskOpts { export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream { const src = opts.src; const entryPoints = opts.entryPoints; - const otherSources = opts.otherSources; const resources = opts.resources; const loaderConfig = opts.loaderConfig; const bundledFileHeader = opts.header; @@ -200,7 +196,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr } filteredResources.push('!' + resource); }); - gulp.src(filteredResources, { base: `${src}` }).pipe(resourcesStream); + gulp.src(filteredResources, { base: `${src}`, allowEmpty: true }).pipe(resourcesStream); const bundleInfoArray: VinylFile[] = []; if (opts.bundleInfo) { @@ -213,24 +209,9 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr es.readArray(bundleInfoArray).pipe(bundleInfoStream); }); - const otherSourcesStream = es.through(); - const otherSourcesStreamArr: NodeJS.ReadWriteStream[] = []; - - gulp.src(otherSources, { base: `${src}` }) - .pipe(es.through(function (data) { - otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative)); - }, function () { - if (!otherSourcesStreamArr.length) { - setTimeout(function () { otherSourcesStream.emit('end'); }, 0); - } else { - es.merge(otherSourcesStreamArr).pipe(otherSourcesStream); - } - })); - const result = es.merge( loader(src, bundledFileHeader, bundleLoader), bundlesStream, - otherSourcesStream, resourcesStream, bundleInfoStream ); diff --git a/build/lib/reporter.js b/build/lib/reporter.js index 598aabec244..e0461dc6d9d 100644 --- a/build/lib/reporter.js +++ b/build/lib/reporter.js @@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const es = require("event-stream"); const _ = require("underscore"); -const util = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const fs = require("fs"); const path = require("path"); const allErrors = []; @@ -17,7 +18,7 @@ function onStart() { return; } startTime = new Date().getTime(); - util.log(`Starting ${util.colors.green('compilation')}...`); + fancyLog(`Starting ${ansiColors.green('compilation')}...`); } function onEnd() { if (--count > 0) { @@ -38,7 +39,7 @@ function log() { errors.map(err => { if (!seen.has(err)) { seen.add(err); - util.log(`${util.colors.red('Error')}: ${err}`); + fancyLog(`${ansiColors.red('Error')}: ${err}`); } }); const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/; @@ -53,7 +54,7 @@ function log() { catch (err) { //noop } - util.log(`Finished ${util.colors.green('compilation')} with ${errors.length} errors after ${util.colors.magenta((new Date().getTime() - startTime) + ' ms')}`); + fancyLog(`Finished ${ansiColors.green('compilation')} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - startTime) + ' ms')}`); } function createReporter() { const errors = []; diff --git a/build/lib/reporter.ts b/build/lib/reporter.ts index 68e037e9224..ec908817518 100644 --- a/build/lib/reporter.ts +++ b/build/lib/reporter.ts @@ -7,7 +7,8 @@ import * as es from 'event-stream'; import * as _ from 'underscore'; -import * as util from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; import * as fs from 'fs'; import * as path from 'path'; @@ -21,7 +22,7 @@ function onStart(): void { } startTime = new Date().getTime(); - util.log(`Starting ${util.colors.green('compilation')}...`); + fancyLog(`Starting ${ansiColors.green('compilation')}...`); } function onEnd(): void { @@ -47,7 +48,7 @@ function log(): void { errors.map(err => { if (!seen.has(err)) { seen.add(err); - util.log(`${util.colors.red('Error')}: ${err}`); + fancyLog(`${ansiColors.red('Error')}: ${err}`); } }); @@ -65,7 +66,7 @@ function log(): void { //noop } - util.log(`Finished ${util.colors.green('compilation')} with ${errors.length} errors after ${util.colors.magenta((new Date().getTime() - startTime!) + ' ms')}`); + fancyLog(`Finished ${ansiColors.green('compilation')} with ${errors.length} errors after ${ansiColors.magenta((new Date().getTime() - startTime!) + ' ms')}`); } export interface IReporter { diff --git a/build/lib/stats.js b/build/lib/stats.js index c08cd57b3bc..99ad665f223 100644 --- a/build/lib/stats.js +++ b/build/lib/stats.js @@ -5,7 +5,8 @@ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); const es = require("event-stream"); -const util = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const appInsights = require("applicationinsights"); class Entry { constructor(name, totalCount, totalSize) { @@ -24,13 +25,13 @@ class Entry { } else { if (this.totalCount === 1) { - return `Stats for '${util.colors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`; + return `Stats for '${ansiColors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`; } else { const count = this.totalCount < 100 - ? util.colors.green(this.totalCount.toString()) - : util.colors.red(this.totalCount.toString()); - return `Stats for '${util.colors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`; + ? ansiColors.green(this.totalCount.toString()) + : ansiColors.red(this.totalCount.toString()); + return `Stats for '${ansiColors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`; } } } @@ -57,13 +58,13 @@ function createStatsStream(group, log) { }, function () { if (log) { if (entry.totalCount === 1) { - util.log(`Stats for '${util.colors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`); + fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`); } else { const count = entry.totalCount < 100 - ? util.colors.green(entry.totalCount.toString()) - : util.colors.red(entry.totalCount.toString()); - util.log(`Stats for '${util.colors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`); + ? ansiColors.green(entry.totalCount.toString()) + : ansiColors.red(entry.totalCount.toString()); + fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`); } } this.emit('end'); diff --git a/build/lib/stats.ts b/build/lib/stats.ts index 7f5548dc1c4..a94b1c9ae1a 100644 --- a/build/lib/stats.ts +++ b/build/lib/stats.ts @@ -6,7 +6,8 @@ 'use strict'; import * as es from 'event-stream'; -import * as util from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; import * as File from 'vinyl'; import * as appInsights from 'applicationinsights'; @@ -22,14 +23,14 @@ class Entry { } } else { if (this.totalCount === 1) { - return `Stats for '${util.colors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`; + return `Stats for '${ansiColors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`; } else { const count = this.totalCount < 100 - ? util.colors.green(this.totalCount.toString()) - : util.colors.red(this.totalCount.toString()); + ? ansiColors.green(this.totalCount.toString()) + : ansiColors.red(this.totalCount.toString()); - return `Stats for '${util.colors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`; + return `Stats for '${ansiColors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`; } } } @@ -58,14 +59,14 @@ export function createStatsStream(group: string, log?: boolean): es.ThroughStrea }, function () { if (log) { if (entry.totalCount === 1) { - util.log(`Stats for '${util.colors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`); + fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`); } else { const count = entry.totalCount < 100 - ? util.colors.green(entry.totalCount.toString()) - : util.colors.red(entry.totalCount.toString()); + ? ansiColors.green(entry.totalCount.toString()) + : ansiColors.red(entry.totalCount.toString()); - util.log(`Stats for '${util.colors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`); + fancyLog(`Stats for '${ansiColors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`); } } diff --git a/build/lib/test/i18n.test.js b/build/lib/test/i18n.test.js index 8044a5eb711..298104865ab 100644 --- a/build/lib/test/i18n.test.js +++ b/build/lib/test/i18n.test.js @@ -27,13 +27,13 @@ suite('XLF Parser Tests', () => { }); test('JSON file source path to Transifex resource match', () => { const editorProject = 'vscode-editor', workbenchProject = 'vscode-workbench'; - const platform = { name: 'vs/platform', project: editorProject }, editorContrib = { name: 'vs/editor/contrib', project: editorProject }, editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject }; + const platform = { name: 'vs/platform', project: editorProject }, editorContrib = { name: 'vs/editor/contrib', project: editorProject }, editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, workbenchParts = { name: 'vs/workbench/contrib/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject }; assert.deepEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform); assert.deepEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib); assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor); assert.deepEqual(i18n.getResource('vs/base/common/errorMessage'), base); assert.deepEqual(i18n.getResource('vs/code/electron-main/window'), code); - assert.deepEqual(i18n.getResource('vs/workbench/parts/html/browser/webview'), workbenchParts); + assert.deepEqual(i18n.getResource('vs/workbench/contrib/html/browser/webview'), workbenchParts); assert.deepEqual(i18n.getResource('vs/workbench/services/files/node/fileService'), workbenchServices); assert.deepEqual(i18n.getResource('vs/workbench/browser/parts/panel/panelActions'), workbench); }); diff --git a/build/lib/test/i18n.test.ts b/build/lib/test/i18n.test.ts index cfc1041974b..eebc7742457 100644 --- a/build/lib/test/i18n.test.ts +++ b/build/lib/test/i18n.test.ts @@ -38,7 +38,7 @@ suite('XLF Parser Tests', () => { editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, - workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, + workbenchParts = { name: 'vs/workbench/contrib/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject}; @@ -47,7 +47,7 @@ suite('XLF Parser Tests', () => { assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor); assert.deepEqual(i18n.getResource('vs/base/common/errorMessage'), base); assert.deepEqual(i18n.getResource('vs/code/electron-main/window'), code); - assert.deepEqual(i18n.getResource('vs/workbench/parts/html/browser/webview'), workbenchParts); + assert.deepEqual(i18n.getResource('vs/workbench/contrib/html/browser/webview'), workbenchParts); assert.deepEqual(i18n.getResource('vs/workbench/services/files/node/fileService'), workbenchServices); assert.deepEqual(i18n.getResource('vs/workbench/browser/parts/panel/panelActions'), workbench); }); diff --git a/build/lib/tslint/translationRemindRule.js b/build/lib/tslint/translationRemindRule.js index 45bbd4688f6..2234094421b 100644 --- a/build/lib/tslint/translationRemindRule.js +++ b/build/lib/tslint/translationRemindRule.js @@ -33,7 +33,7 @@ class TranslationRemindRuleWalker extends Lint.RuleWalker { visitImportLikeDeclaration(node) { const currentFile = node.getSourceFile().fileName; const matchService = currentFile.match(/vs\/workbench\/services\/\w+/); - const matchPart = currentFile.match(/vs\/workbench\/parts\/\w+/); + const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/); if (!matchService && !matchPart) { return; } diff --git a/build/lib/tslint/translationRemindRule.ts b/build/lib/tslint/translationRemindRule.ts index 559b782c6da..e2671599d3c 100644 --- a/build/lib/tslint/translationRemindRule.ts +++ b/build/lib/tslint/translationRemindRule.ts @@ -42,7 +42,7 @@ class TranslationRemindRuleWalker extends Lint.RuleWalker { private visitImportLikeDeclaration(node: ts.ImportDeclaration | ts.ImportEqualsDeclaration) { const currentFile = node.getSourceFile().fileName; const matchService = currentFile.match(/vs\/workbench\/services\/\w+/); - const matchPart = currentFile.match(/vs\/workbench\/parts\/\w+/); + const matchPart = currentFile.match(/vs\/workbench\/contrib\/\w+/); if (!matchService && !matchPart) { return; } diff --git a/build/lib/util.js b/build/lib/util.js index 90b1e622cb1..b6228ad4cf9 100644 --- a/build/lib/util.js +++ b/build/lib/util.js @@ -209,21 +209,28 @@ var task; async function _execute(task) { // Always invoke as if it were a callback task return new Promise((resolve, reject) => { - const taskResult = task((err) => { - if (err) { - return reject(err); - } - resolve(); - }); + if (task.length === 1) { + // this is a calback task + task((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + return; + } + const taskResult = task(); if (typeof taskResult === 'undefined') { - // this was a callback task + // this is a sync task + resolve(); return; } if (_isPromise(taskResult)) { - // this was a promise returning task + // this is a promise returning task taskResult.then(resolve, reject); return; } + // this is a stream returning task taskResult.on('end', _ => resolve()); taskResult.on('error', err => reject(err)); }); diff --git a/build/lib/util.ts b/build/lib/util.ts index e0d56b59e77..42d3aba2fee 100644 --- a/build/lib/util.ts +++ b/build/lib/util.ts @@ -254,7 +254,7 @@ export function primraf(dir: string): Promise { export type PromiseTask = () => Promise; export type StreamTask = () => NodeJS.ReadWriteStream; -export type CallbackTask = (cb: (err?: any) => void) => void; +export type CallbackTask = (cb?: (err?: any) => void) => void; export type Task = PromiseTask | StreamTask | CallbackTask; export namespace task { @@ -269,30 +269,38 @@ export namespace task { async function _execute(task: Task): Promise { // Always invoke as if it were a callback task return new Promise((resolve, reject) => { - const taskResult = task((err) => { - if (err) { - return reject(err); - } - resolve(); - }); + if (task.length === 1) { + // this is a calback task + task((err) => { + if (err) { + return reject(err); + } + resolve(); + }); + return; + } + + const taskResult = task(); if (typeof taskResult === 'undefined') { - // this was a callback task + // this is a sync task + resolve(); return; } if (_isPromise(taskResult)) { - // this was a promise returning task + // this is a promise returning task taskResult.then(resolve, reject); return; } + // this is a stream returning task taskResult.on('end', _ => resolve()); taskResult.on('error', err => reject(err)); }); } - export function series(...tasks: Task[]): () => Promise { + export function series(...tasks: Task[]): PromiseTask { return async () => { for (let i = 0; i < tasks.length; i++) { await _execute(tasks[i]); @@ -300,7 +308,7 @@ export namespace task { }; } - export function parallel(...tasks: Task[]): () => Promise { + export function parallel(...tasks: Task[]): PromiseTask { return async () => { await Promise.all(tasks.map(t => _execute(t))); }; diff --git a/build/monaco/api.js b/build/monaco/api.js index 5c03df4088d..297510d14c1 100644 --- a/build/monaco/api.js +++ b/build/monaco/api.js @@ -7,14 +7,15 @@ Object.defineProperty(exports, "__esModule", { value: true }); const fs = require("fs"); const ts = require("typescript"); const path = require("path"); -const util = require("gulp-util"); +const fancyLog = require("fancy-log"); +const ansiColors = require("ansi-colors"); const dtsv = '2'; const tsfmt = require('../../tsfmt.json'); const SRC = path.join(__dirname, '../../src'); exports.RECIPE_PATH = path.join(__dirname, './monaco.d.ts.recipe'); const DECLARATION_PATH = path.join(__dirname, '../../src/vs/monaco.d.ts'); function logErr(message, ...rest) { - util.log(util.colors.yellow(`[monaco.d.ts]`), message, ...rest); + fancyLog(ansiColors.yellow(`[monaco.d.ts]`), message, ...rest); } function isDeclaration(a) { return (a.kind === ts.SyntaxKind.InterfaceDeclaration diff --git a/build/monaco/api.ts b/build/monaco/api.ts index 1bdc612d6a2..7672188160b 100644 --- a/build/monaco/api.ts +++ b/build/monaco/api.ts @@ -6,7 +6,8 @@ import * as fs from 'fs'; import * as ts from 'typescript'; import * as path from 'path'; -import * as util from 'gulp-util'; +import * as fancyLog from 'fancy-log'; +import * as ansiColors from 'ansi-colors'; const dtsv = '2'; @@ -17,7 +18,7 @@ export const RECIPE_PATH = path.join(__dirname, './monaco.d.ts.recipe'); const DECLARATION_PATH = path.join(__dirname, '../../src/vs/monaco.d.ts'); function logErr(message: any, ...rest: any[]): void { - util.log(util.colors.yellow(`[monaco.d.ts]`), message, ...rest); + fancyLog(ansiColors.yellow(`[monaco.d.ts]`), message, ...rest); } type SourceFileGetter = (moduleId: string) => ts.SourceFile | null; diff --git a/build/monaco/monaco.usage.recipe b/build/monaco/monaco.usage.recipe index e75b8585a2d..fad1e8ee724 100644 --- a/build/monaco/monaco.usage.recipe +++ b/build/monaco/monaco.usage.recipe @@ -10,6 +10,7 @@ import { CountBadge } from './vs/base/browser/ui/countBadge/countBadge'; import { SimpleWorkerClient, create as create1 } from './vs/base/common/worker/simpleWorker'; import { create as create2 } from './vs/editor/common/services/editorSimpleWorker'; import { QuickOpenWidget } from './vs/base/parts/quickopen/browser/quickOpenWidget'; +import { WorkbenchAsyncDataTree } from './vs/platform/list/browser/listService'; import { SyncDescriptor0, SyncDescriptor1, SyncDescriptor2, SyncDescriptor3, SyncDescriptor4, SyncDescriptor5, SyncDescriptor6, SyncDescriptor7, SyncDescriptor8 } from './vs/platform/instantiation/common/descriptors'; import { DiffNavigator } from './vs/editor/browser/widget/diffNavigator'; import * as editorAPI from './vs/editor/editor.api'; @@ -22,6 +23,7 @@ import * as editorAPI from './vs/editor/editor.api'; a = (b).getWorkspace; // IWorkspaceFolderProvider a = (b).style; // IThemable a = (b).style; // IThemable + a = (>b).style; // IThemable a = (b).userHome; // IUserHomeProvider a = (b).previous; // IDiffNavigator a = (>b).type; diff --git a/build/npm/preinstall.js b/build/npm/preinstall.js index a2029c364fa..3b0d7dc538f 100644 --- a/build/npm/preinstall.js +++ b/build/npm/preinstall.js @@ -7,8 +7,8 @@ let err = false; const majorNodeVersion = parseInt(/^(\d+)\./.exec(process.versions.node)[1]); -if (majorNodeVersion < 8 || majorNodeVersion >= 9) { - console.error('\033[1;31m*** Please use node >=8 and <9.\033[0;0m'); +if (majorNodeVersion < 8 || majorNodeVersion >= 11) { + console.error('\033[1;31m*** Please use node >=8 and <11.\033[0;0m'); err = true; } diff --git a/build/npm/update-grammar.js b/build/npm/update-grammar.js index b4f94044419..522b2941218 100644 --- a/build/npm/update-grammar.js +++ b/build/npm/update-grammar.js @@ -12,6 +12,8 @@ var cson = require('cson-parser'); var https = require('https'); var url = require('url'); +let commitDate = '0000-00-00'; + /** * @param {string} urlString */ @@ -120,30 +122,35 @@ exports.update = function (repoId, repoPath, dest, modifyGrammar, version = 'mas try { fs.writeFileSync(dest, JSON.stringify(result, null, '\t').replace(/\n/g, '\r\n')); - // Add commit sha to cgmanifest let cgmanifestRead = JSON.parse(fs.readFileSync('./cgmanifest.json').toString()); let promises = new Array(); - let packageJsonPath = 'https://raw.githubusercontent.com/' + repoId + `/${info.commitSha}/package.json`; - for (let i = 0; i < cgmanifestRead.registrations.length; i++) { - if (cgmanifestRead.registrations[i].component.git.repositoryUrl.substr(cgmanifestRead.registrations[i].component.git.repositoryUrl.length - repoId.length, repoId.length) === repoId) { - cgmanifestRead.registrations[i].component.git.commitHash = info.commitSha; - promises.push(download(packageJsonPath).then(function (packageJson) { - if (packageJson) { - try { - cgmanifestRead.registrations[i].version = JSON.parse(packageJson).version; - } catch (e) { - console.log('File does not exist at' + packageJsonPath); - } - } - })); - break; + const currentCommitDate = info.commitDate.substr(0, 10); + + // Add commit sha to cgmanifest. + if (currentCommitDate > commitDate) { + let packageJsonPath = 'https://raw.githubusercontent.com/' + repoId + `/${info.commitSha}/package.json`; + for (let i = 0; i < cgmanifestRead.registrations.length; i++) { + if (cgmanifestRead.registrations[i].component.git.repositoryUrl.substr(cgmanifestRead.registrations[i].component.git.repositoryUrl.length - repoId.length, repoId.length) === repoId) { + cgmanifestRead.registrations[i].component.git.commitHash = info.commitSha; + commitDate = currentCommitDate; + promises.push(download(packageJsonPath).then(function (packageJson) { + if (packageJson) { + try { + cgmanifestRead.registrations[i].version = JSON.parse(packageJson).version; + } catch (e) { + console.log('Cannot get version. File does not exist at ' + packageJsonPath); + } + } + })); + break; + } } } Promise.all(promises).then(function (allResult) { fs.writeFileSync('./cgmanifest.json', JSON.stringify(cgmanifestRead, null, '\t').replace(/\n/g, '\r\n')); }); if (info) { - console.log('Updated ' + path.basename(dest) + ' to ' + repoId + '@' + info.commitSha.substr(0, 7) + ' (' + info.commitDate.substr(0, 10) + ')'); + console.log('Updated ' + path.basename(dest) + ' to ' + repoId + '@' + info.commitSha.substr(0, 7) + ' (' + currentCommitDate + ')'); } else { console.log('Updated ' + path.basename(dest)); } diff --git a/build/package.json b/build/package.json index 4ad039a7e21..a05a6b9a622 100644 --- a/build/package.json +++ b/build/package.json @@ -2,9 +2,11 @@ "name": "code-oss-dev-build", "version": "1.0.0", "devDependencies": { + "@types/ansi-colors": "^3.2.0", "@types/azure": "0.9.19", "@types/debounce": "^1.0.0", "@types/documentdb": "1.10.2", + "@types/fancy-log": "^1.3.0", "@types/glob": "^7.1.1", "@types/gulp": "^4.0.5", "@types/gulp-concat": "^0.0.32", @@ -13,7 +15,6 @@ "@types/gulp-rename": "^0.0.33", "@types/gulp-sourcemaps": "^0.0.32", "@types/gulp-uglify": "^3.0.5", - "@types/gulp-util": "^3.0.34", "@types/mime": "0.0.29", "@types/minimatch": "^3.0.3", "@types/minimist": "^1.2.0", diff --git a/build/win32/code.iss b/build/win32/code.iss index 43572199eb5..ea31a50c9bf 100644 --- a/build/win32/code.iss +++ b/build/win32/code.iss @@ -1,7 +1,7 @@ #define LocalizedLanguageFile(Language = "") \ DirExists(RepoDir + "\licenses") && Language != "" \ - ? ('; LicenseFile: "' + RepoDir + '\licenses\LICENSE-' + Language + '.txt"') \ - : '; LicenseFile: "' + RepoDir + '\LICENSE.txt"' + ? ('; LicenseFile: "' + RepoDir + '\licenses\LICENSE-' + Language + '.rtf"') \ + : '; LicenseFile: "' + RepoDir + '\LICENSE.rtf"' [Setup] AppId={#AppId} diff --git a/build/yarn.lock b/build/yarn.lock index c9384fe6d54..d5816c98f02 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -10,6 +10,11 @@ normalize-path "^2.0.1" through2 "^2.0.3" +"@types/ansi-colors@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@types/ansi-colors/-/ansi-colors-3.2.0.tgz#3e4fe85d9131ce1c6994f3040bd0b25306c16a6e" + integrity sha512-0caWAhXht9N2lOdMzJLXybsSkYCx1QOdxx6pae48tswI9QV3DFX26AoOpy0JxwhCb+zISTqmd6H8t9Zby9BoZg== + "@types/azure@0.9.19": version "0.9.19" resolved "https://registry.yarnpkg.com/@types/azure/-/azure-0.9.19.tgz#1a6a9bd856b437ddecf3f9fc8407a683c869ba02" @@ -47,6 +52,11 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== +"@types/fancy-log@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" + integrity sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw== + "@types/form-data@*": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-2.2.1.tgz#ee2b3b8eaa11c0938289953606b745b738c54b1e" @@ -117,16 +127,6 @@ "@types/node" "*" "@types/uglify-js" "^2" -"@types/gulp-util@^3.0.34": - version "3.0.34" - resolved "https://registry.yarnpkg.com/@types/gulp-util/-/gulp-util-3.0.34.tgz#d1291ebf706d93f46eb8df11344bbfd96247697e" - integrity sha512-E06WN1OfqL5UsMwJ1T7ClgnaXgaPipb7Ee8euMc3KRHLNqxdvWrDir9KA6uevgzBgT7XbjgmzZA2pkzDqBBX7A== - dependencies: - "@types/node" "*" - "@types/through2" "*" - "@types/vinyl" "*" - chalk "^2.2.0" - "@types/gulp@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/gulp/-/gulp-4.0.5.tgz#f5f498d5bf9538364792de22490a12c0e6bc5eb4" @@ -196,7 +196,7 @@ "@types/glob" "*" "@types/node" "*" -"@types/through2@*", "@types/through2@^2.0.34": +"@types/through2@^2.0.34": version "2.0.34" resolved "https://registry.yarnpkg.com/@types/through2/-/through2-2.0.34.tgz#9c2a259a238dace2a05a2f8e94b786961bc27ac4" integrity sha512-nhRG8+RuG/L+0fAZBQYaRflXKjTrHOKH8MFTChnf+dNVMxA3wHYYrfj0tztK0W51ABXjGfRCDc0vRkecCOrsow== @@ -512,7 +512,7 @@ chalk@^1.0.0, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.2.0, chalk@^2.3.0: +chalk@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== diff --git a/cgmanifest.json b/cgmanifest.json index b7e74e39456..21d78500903 100644 --- a/cgmanifest.json +++ b/cgmanifest.json @@ -73,12 +73,12 @@ "git": { "name": "electron", "repositoryUrl": "https://github.com/electron/electron", - "commitHash": "bb28fa8e8e797db249a66405146ad0501eaf411a" + "commitHash": "72ff292302f95bfe5b4e02085a7be56254b42b0e" } }, "isOnlyProductionDependency": true, "license": "MIT", - "version": "3.1.2" + "version": "3.1.3" }, { "component": { diff --git a/extensions/configuration-editing/package.json b/extensions/configuration-editing/package.json index 46f4eba3a95..9a1a95f5fb0 100644 --- a/extensions/configuration-editing/package.json +++ b/extensions/configuration-editing/package.json @@ -96,6 +96,6 @@ ] }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" } } diff --git a/extensions/configuration-editing/yarn.lock b/extensions/configuration-editing/yarn.lock index 752f2a3a6f9..49c47166066 100644 --- a/extensions/configuration-editing/yarn.lock +++ b/extensions/configuration-editing/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== jsonc-parser@2.0.2: version "2.0.2" diff --git a/extensions/cpp/cgmanifest.json b/extensions/cpp/cgmanifest.json index 7bab26bfa11..e6666933f61 100644 --- a/extensions/cpp/cgmanifest.json +++ b/extensions/cpp/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "atom/language-c", "repositoryUrl": "https://github.com/atom/language-c", - "commitHash": "3a269f88b12e512fb9495dc006a1dabf325d3d7f" + "commitHash": "9c0c5f202741a5647025db8d5df5fefba47b036c" } }, "license": "MIT", - "version": "0.58.0", + "version": "0.58.1", "description": "The files syntaxes/c.json and syntaxes/c++.json were derived from the Atom package https://atom.io/packages/language-c which was originally converted from the C TextMate bundle https://github.com/textmate/c.tmbundle." }, { diff --git a/extensions/css-language-features/package.json b/extensions/css-language-features/package.json index 79b32dd352b..99b022469d6 100644 --- a/extensions/css-language-features/package.json +++ b/extensions/css-language-features/package.json @@ -730,7 +730,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "mocha": "^5.2.0" } } diff --git a/extensions/css-language-features/server/package.json b/extensions/css-language-features/server/package.json index 6666da57282..9bc32c0a788 100644 --- a/extensions/css-language-features/server/package.json +++ b/extensions/css-language-features/server/package.json @@ -14,7 +14,7 @@ }, "devDependencies": { "@types/mocha": "2.2.33", - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "glob": "^7.1.2", "mocha": "^5.2.0", "mocha-junit-reporter": "^1.17.0", diff --git a/extensions/css-language-features/server/yarn.lock b/extensions/css-language-features/server/yarn.lock index 3e3e40f4a1d..a2fa388731d 100644 --- a/extensions/css-language-features/server/yarn.lock +++ b/extensions/css-language-features/server/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.33.tgz#d79a0061ec270379f4d9e225f4096fb436669def" integrity sha1-15oAYewnA3n02eIl9AlvtDZmne8= -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== ansi-regex@^3.0.0: version "3.0.0" diff --git a/extensions/css-language-features/yarn.lock b/extensions/css-language-features/yarn.lock index d626f86f433..6314214090a 100644 --- a/extensions/css-language-features/yarn.lock +++ b/extensions/css-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== balanced-match@^1.0.0: version "1.0.0" diff --git a/extensions/extension-editing/package.json b/extensions/extension-editing/package.json index 8ceab79d04e..52159b965bb 100644 --- a/extensions/extension-editing/package.json +++ b/extensions/extension-editing/package.json @@ -53,6 +53,6 @@ }, "devDependencies": { "@types/markdown-it": "0.0.2", - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" } } diff --git a/extensions/extension-editing/yarn.lock b/extensions/extension-editing/yarn.lock index d82f7c212a0..720c84f0656 100644 --- a/extensions/extension-editing/yarn.lock +++ b/extensions/extension-editing/yarn.lock @@ -7,16 +7,16 @@ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz#5d9ad19e6e6508cdd2f2596df86fd0aade598660" integrity sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA= +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== + "@types/node@^6.0.46": version "6.0.78" resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.78.tgz#5d4a3f579c1524e01ee21bf474e6fba09198f470" integrity sha512-+vD6E8ixntRzzZukoF3uP1iV+ZjVN3koTcaeK+BEoc/kSfGbLDIGC7RmCaUgVpUfN6cWvfczFRERCyKM9mkvXg== -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== - argparse@^1.0.7: version "1.0.9" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" diff --git a/extensions/git/cgmanifest.json b/extensions/git/cgmanifest.json index 8b62f6fbb0c..d0bdb9ac443 100644 --- a/extensions/git/cgmanifest.json +++ b/extensions/git/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "textmate/git.tmbundle", "repositoryUrl": "https://github.com/textmate/git.tmbundle", - "commitHash": "93897a78c6e52bef13dadc0d4091d203c5facb40" + "commitHash": "3f6ad2138200db14b57a090ecb2d2e733275ca3e" } }, "licenseDetail": [ diff --git a/extensions/git/package.json b/extensions/git/package.json index fdc08df06a8..435a8053c7b 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1425,7 +1425,7 @@ "@types/byline": "4.2.31", "@types/file-type": "^5.2.1", "@types/mocha": "2.2.43", - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "@types/which": "^1.0.28", "mocha": "^3.2.0" } diff --git a/extensions/git/src/askpass.ts b/extensions/git/src/askpass.ts index b0dc28f8dd6..03000c7290d 100644 --- a/extensions/git/src/askpass.ts +++ b/extensions/git/src/askpass.ts @@ -65,7 +65,7 @@ export class Askpass implements Disposable { return ipcHandlePath; } - private onRequest(req: http.ServerRequest, res: http.ServerResponse): void { + private onRequest(req: http.IncomingMessage, res: http.ServerResponse): void { const chunks: string[] = []; req.setEncoding('utf8'); req.on('data', (d: string) => chunks.push(d)); diff --git a/extensions/git/yarn.lock b/extensions/git/yarn.lock index 1d859c5e73b..f13ef93c34f 100644 --- a/extensions/git/yarn.lock +++ b/extensions/git/yarn.lock @@ -26,10 +26,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" integrity sha512-El3+WJk2D/ppWNd2X05aiP5l2k4EwF7KwheknQZls+I26eSICoWRhRIJ56jGgw2dqNGQ5LtNajmBU2ajS28EvQ== -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== "@types/which@^1.0.28": version "1.0.28" diff --git a/extensions/grunt/package.json b/extensions/grunt/package.json index dc2520b4982..74fa452028a 100644 --- a/extensions/grunt/package.json +++ b/extensions/grunt/package.json @@ -19,7 +19,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/grunt/yarn.lock b/extensions/grunt/yarn.lock index 5e39a356be6..1bcd757b8a1 100644 --- a/extensions/grunt/yarn.lock +++ b/extensions/grunt/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/gulp/package.json b/extensions/gulp/package.json index 0c78e7fada0..a9139780f7a 100644 --- a/extensions/gulp/package.json +++ b/extensions/gulp/package.json @@ -19,7 +19,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/gulp/yarn.lock b/extensions/gulp/yarn.lock index 5e39a356be6..1bcd757b8a1 100644 --- a/extensions/gulp/yarn.lock +++ b/extensions/gulp/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/html-language-features/package.json b/extensions/html-language-features/package.json index 9449c662605..29be30d1cea 100644 --- a/extensions/html-language-features/package.json +++ b/extensions/html-language-features/package.json @@ -137,20 +137,6 @@ ], "description": "%html.format.wrapAttributes.desc%" }, - "html.suggest.angular1": { - "deprecationMessage": "Angular 1 is obsolete and Angular completion will be removed.", - "type": "boolean", - "scope": "resource", - "default": false, - "description": "%html.suggest.angular1.desc%" - }, - "html.suggest.ionic": { - "deprecationMessage": "Ionic 1 is obsolete and Ionic completion will be removed.", - "type": "boolean", - "scope": "resource", - "default": false, - "description": "%html.suggest.ionic.desc%" - }, "html.suggest.html5": { "type": "boolean", "scope": "resource", @@ -195,6 +181,6 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" } } diff --git a/extensions/html-language-features/package.nls.json b/extensions/html-language-features/package.nls.json index 343a5a7e2d9..9c172ebcb7f 100644 --- a/extensions/html-language-features/package.nls.json +++ b/extensions/html-language-features/package.nls.json @@ -19,8 +19,6 @@ "html.format.wrapAttributes.alignedmultiple": "Wrap when line length is exceeded, align attributes vertically.", "html.format.wrapAttributes.preserve": "Preserve wrapping of attributes", "html.format.wrapAttributes.preservealigned": "Preserve wrapping of attributes but align.", - "html.suggest.angular1.desc": "Controls whether the built-in HTML language support suggests Angular V1 tags and properties.", - "html.suggest.ionic.desc": "Controls whether the built-in HTML language support suggests Ionic tags, properties and values.", "html.suggest.html5.desc": "Controls whether the built-in HTML language support suggests HTML5 tags, properties and values.", "html.trace.server.desc": "Traces the communication between VS Code and the HTML language server.", "html.validate.scripts": "Controls whether the built-in HTML language support validates embedded scripts.", diff --git a/extensions/html-language-features/server/package.json b/extensions/html-language-features/server/package.json index ce5845b7345..4a1951e41e7 100644 --- a/extensions/html-language-features/server/package.json +++ b/extensions/html-language-features/server/package.json @@ -18,7 +18,7 @@ }, "devDependencies": { "@types/mocha": "2.2.33", - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "glob": "^7.1.2", "mocha": "^5.2.0", "mocha-junit-reporter": "^1.17.0", diff --git a/extensions/html-language-features/server/yarn.lock b/extensions/html-language-features/server/yarn.lock index 056fdd468ad..e70561f1a73 100644 --- a/extensions/html-language-features/server/yarn.lock +++ b/extensions/html-language-features/server/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.33.tgz#d79a0061ec270379f4d9e225f4096fb436669def" integrity sha1-15oAYewnA3n02eIl9AlvtDZmne8= -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== ansi-regex@^3.0.0: version "3.0.0" diff --git a/extensions/html-language-features/yarn.lock b/extensions/html-language-features/yarn.lock index ee9e450ed7c..2737f409efa 100644 --- a/extensions/html-language-features/yarn.lock +++ b/extensions/html-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== applicationinsights@1.0.8: version "1.0.8" diff --git a/extensions/html/cgmanifest.json b/extensions/html/cgmanifest.json index fb7007ddb31..78125476f1e 100644 --- a/extensions/html/cgmanifest.json +++ b/extensions/html/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "textmate/html.tmbundle", "repositoryUrl": "https://github.com/textmate/html.tmbundle", - "commitHash": "390c8870273a2ae80244dae6db6ba064a802f407" + "commitHash": "0c3d5ee54de3a993f747f54186b73a4d2d3c44a2" } }, "licenseDetail": [ diff --git a/extensions/jake/package.json b/extensions/jake/package.json index f35e49fee26..30962bd7616 100644 --- a/extensions/jake/package.json +++ b/extensions/jake/package.json @@ -19,7 +19,7 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/jake/yarn.lock b/extensions/jake/yarn.lock index 5e39a356be6..1bcd757b8a1 100644 --- a/extensions/jake/yarn.lock +++ b/extensions/jake/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/json-language-features/package.json b/extensions/json-language-features/package.json index 6e982dac417..47d1f7bf32d 100644 --- a/extensions/json-language-features/package.json +++ b/extensions/json-language-features/package.json @@ -106,6 +106,6 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" } } \ No newline at end of file diff --git a/extensions/json-language-features/server/package.json b/extensions/json-language-features/server/package.json index 0868d9aa049..69c21ae84a9 100644 --- a/extensions/json-language-features/server/package.json +++ b/extensions/json-language-features/server/package.json @@ -21,7 +21,7 @@ }, "devDependencies": { "@types/mocha": "2.2.33", - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" }, "scripts": { "prepublishOnly": "npm run clean && npm run test", diff --git a/extensions/json-language-features/server/yarn.lock b/extensions/json-language-features/server/yarn.lock index 1c933ebfb3c..2e1f8085f6d 100644 --- a/extensions/json-language-features/server/yarn.lock +++ b/extensions/json-language-features/server/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.33.tgz#d79a0061ec270379f4d9e225f4096fb436669def" integrity sha1-15oAYewnA3n02eIl9AlvtDZmne8= -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== agent-base@4, agent-base@^4.1.0: version "4.1.2" diff --git a/extensions/json-language-features/yarn.lock b/extensions/json-language-features/yarn.lock index 019393942b3..e49fc01bd24 100644 --- a/extensions/json-language-features/yarn.lock +++ b/extensions/json-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== applicationinsights@1.0.8: version "1.0.8" diff --git a/extensions/json/package.json b/extensions/json/package.json index 517346cd347..0ee9501609f 100644 --- a/extensions/json/package.json +++ b/extensions/json/package.json @@ -29,6 +29,7 @@ ".css.map" ], "filenames": [ + "composer.lock", ".watchmanconfig", ".ember-cli" ], diff --git a/extensions/make/cgmanifest.json b/extensions/make/cgmanifest.json index e575c65097b..6f4432b66da 100644 --- a/extensions/make/cgmanifest.json +++ b/extensions/make/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "fadeevab/make.tmbundle", "repositoryUrl": "https://github.com/fadeevab/make.tmbundle", - "commitHash": "d01ce3404f9e2eed0fd4d07b5e24094c03599241" + "commitHash": "21e9108e9dce13b798667806bb105d852ac0a58c" } }, "licenseDetail": [ diff --git a/extensions/make/syntaxes/make.tmLanguage.json b/extensions/make/syntaxes/make.tmLanguage.json index 79a3082a0bb..878e78767e8 100644 --- a/extensions/make/syntaxes/make.tmLanguage.json +++ b/extensions/make/syntaxes/make.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/fadeevab/make.tmbundle/commit/d01ce3404f9e2eed0fd4d07b5e24094c03599241", + "version": "https://github.com/fadeevab/make.tmbundle/commit/21e9108e9dce13b798667806bb105d852ac0a58c", "name": "Makefile", "scopeName": "source.makefile", "patterns": [ @@ -342,7 +342,12 @@ "begin": "(^[ ]*|\\G\\s*)([^\\s]+)\\s*((? { + logger.updateConfiguration(); + previewManager.updateConfiguration(); + })); +} + +function registerMarkdownLanguageFeatures( + symbolProvider: MDDocumentSymbolProvider, + engine: MarkdownEngine +): vscode.Disposable { + const selector: vscode.DocumentSelector = [ + { language: 'markdown', scheme: 'file' }, + { language: 'markdown', scheme: 'untitled' } + ]; + + return vscode.Disposable.from( + vscode.languages.setLanguageConfiguration('markdown', { + wordPattern: new RegExp('(\\p{Alphabetic}|\\p{Number})+', 'ug'), + }), + vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider), + vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider()), + vscode.languages.registerFoldingRangeProvider(selector, new MarkdownFoldingProvider(engine)), + vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider)) + ); +} + +function registerMarkdownCommands( + previewManager: MarkdownPreviewManager, + telemetryReporter: TelemetryReporter, + cspArbiter: ContentSecurityPolicyArbiter, + engine: MarkdownEngine +): vscode.Disposable { const previewSecuritySelector = new PreviewSecuritySelector(cspArbiter, previewManager); const commandManager = new CommandManager(); - context.subscriptions.push(commandManager); commandManager.register(new commands.ShowPreviewCommand(previewManager, telemetryReporter)); commandManager.register(new commands.ShowPreviewToSideCommand(previewManager, telemetryReporter)); commandManager.register(new commands.ShowLockedPreviewToSideCommand(previewManager, telemetryReporter)); @@ -61,9 +83,6 @@ export function activate(context: vscode.ExtensionContext) { commandManager.register(new commands.ShowPreviewSecuritySelectorCommand(previewSecuritySelector, previewManager)); commandManager.register(new commands.OpenDocumentLinkCommand(engine)); commandManager.register(new commands.ToggleLockCommand(previewManager)); - - context.subscriptions.push(vscode.workspace.onDidChangeConfiguration(() => { - logger.updateConfiguration(); - previewManager.updateConfiguration(); - })); + return commandManager; } + diff --git a/extensions/markdown-language-features/src/features/preview.ts b/extensions/markdown-language-features/src/features/preview.ts index c82cee6c7d7..d9bcd0bb00d 100644 --- a/extensions/markdown-language-features/src/features/preview.ts +++ b/extensions/markdown-language-features/src/features/preview.ts @@ -8,12 +8,12 @@ import * as path from 'path'; import { Logger } from '../logger'; import { MarkdownContentProvider } from './previewContentProvider'; -import { disposeAll } from '../util/dispose'; +import { Disposable } from '../util/dispose'; import * as nls from 'vscode-nls'; import { getVisibleLine, MarkdownFileTopmostLineMonitor } from '../util/topmostLineMonitor'; import { MarkdownPreviewConfigurationManager } from './previewConfig'; -import { MarkdownContributions } from '../markdownExtensions'; +import { MarkdownContributionProvider, MarkdownContributions } from '../markdownExtensions'; import { isMarkdownFile } from '../util/file'; import { resolveLinkToMarkdownFile } from '../commands/openDocumentLink'; const localize = nls.loadMessageBundle(); @@ -60,7 +60,7 @@ interface PreviewStyleLoadErrorMessage extends WebviewMessage { }; } -export class MarkdownPreview { +export class MarkdownPreview extends Disposable { public static viewType = 'markdown.preview'; @@ -70,7 +70,6 @@ export class MarkdownPreview { private readonly editor: vscode.WebviewPanel; private throttleTimer: any; private line: number | undefined = undefined; - private readonly disposables: vscode.Disposable[] = []; private firstUpdate = true; private currentVersion?: { resource: vscode.Uri, version: number }; private forceUpdate = false; @@ -85,7 +84,7 @@ export class MarkdownPreview { previewConfigurations: MarkdownPreviewConfigurationManager, logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor, - contributions: MarkdownContributions, + contributionProvider: MarkdownContributionProvider, ): Promise { const resource = vscode.Uri.parse(state.resource); const locked = state.locked; @@ -99,9 +98,9 @@ export class MarkdownPreview { previewConfigurations, logger, topmostLineMonitor, - contributions); + contributionProvider); - preview.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, contributions); + preview.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions); if (!isNaN(line)) { preview.line = line; @@ -118,14 +117,14 @@ export class MarkdownPreview { previewConfigurations: MarkdownPreviewConfigurationManager, logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor, - contributions: MarkdownContributions + contributionProvider: MarkdownContributionProvider ): MarkdownPreview { const webview = vscode.window.createWebviewPanel( MarkdownPreview.viewType, MarkdownPreview.getPreviewTitle(resource, locked), previewColumn, { enableFindWidget: true, - ...MarkdownPreview.getWebviewOptions(resource, contributions) + ...MarkdownPreview.getWebviewOptions(resource, contributionProvider.contributions) }); return new MarkdownPreview( @@ -136,7 +135,7 @@ export class MarkdownPreview { previewConfigurations, logger, topmostLineMonitor, - contributions); + contributionProvider); } private constructor( @@ -147,19 +146,24 @@ export class MarkdownPreview { private readonly _previewConfigurations: MarkdownPreviewConfigurationManager, private readonly _logger: Logger, topmostLineMonitor: MarkdownFileTopmostLineMonitor, - private readonly _contributions: MarkdownContributions, + private readonly _contributionProvider: MarkdownContributionProvider, ) { + super(); this._resource = resource; this._locked = locked; this.editor = webview; this.editor.onDidDispose(() => { this.dispose(); - }, null, this.disposables); + }, null, this._disposables); this.editor.onDidChangeViewState(e => { this._onDidChangeViewStateEmitter.fire(e); - }, null, this.disposables); + }, null, this._disposables); + + _contributionProvider.onContributionsChanged(() => { + setImmediate(() => this.refresh()); + }, null, this._disposables); this.editor.webview.onDidReceiveMessage((e: CacheImageSizesMessage | RevealLineMessage | DidClickMessage | ClickLinkMessage | ShowPreviewSecuritySelectorMessage | PreviewStyleLoadErrorMessage) => { if (e.source !== this._resource.toString()) { @@ -191,19 +195,19 @@ export class MarkdownPreview { vscode.window.showWarningMessage(localize('onPreviewStyleLoadError', "Could not load 'markdown.styles': {0}", e.body.unloadedStyles.join(', '))); break; } - }, null, this.disposables); + }, null, this._disposables); vscode.workspace.onDidChangeTextDocument(event => { if (this.isPreviewOf(event.document.uri)) { this.refresh(); } - }, null, this.disposables); + }, null, this._disposables); topmostLineMonitor.onDidChangeTopmostLine(event => { if (this.isPreviewOf(event.resource)) { this.updateForView(event.resource, event.line); } - }, null, this.disposables); + }, null, this._disposables); vscode.window.onDidChangeTextEditorSelection(event => { if (this.isPreviewOf(event.textEditor.document.uri)) { @@ -213,13 +217,13 @@ export class MarkdownPreview { source: this.resource.toString() }); } - }, null, this.disposables); + }, null, this._disposables); vscode.window.onDidChangeActiveTextEditor(editor => { if (editor && isMarkdownFile(editor.document) && !this._locked) { this.update(editor.document.uri); } - }, null, this.disposables); + }, null, this._disposables); } private readonly _onDisposeEmitter = new vscode.EventEmitter(); @@ -242,18 +246,17 @@ export class MarkdownPreview { } public dispose() { + super.dispose(); if (this._disposed) { return; } this._disposed = true; this._onDisposeEmitter.fire(); - this._onDisposeEmitter.dispose(); + this._onDidChangeViewStateEmitter.dispose(); this.editor.dispose(); - - disposeAll(this.disposables); } public update(resource: vscode.Uri) { @@ -328,7 +331,7 @@ export class MarkdownPreview { } private get iconPath() { - const root = path.join(this._contributions.extensionPath, 'media'); + const root = path.join(this._contributionProvider.extensionPath, 'media'); return { light: vscode.Uri.file(path.join(root, 'Preview.svg')), dark: vscode.Uri.file(path.join(root, 'Preview_inverse.svg')) @@ -392,7 +395,7 @@ export class MarkdownPreview { if (this._resource === resource) { this.editor.title = MarkdownPreview.getPreviewTitle(this._resource, this._locked); this.editor.iconPath = this.iconPath; - this.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, this._contributions); + this.editor.webview.options = MarkdownPreview.getWebviewOptions(resource, this._contributionProvider.contributions); this.editor.webview.html = content; } } @@ -410,7 +413,7 @@ export class MarkdownPreview { private static getLocalResourceRoots( resource: vscode.Uri, contributions: MarkdownContributions - ): vscode.Uri[] { + ): ReadonlyArray { const baseRoots = contributions.previewResourceRoots; const folder = vscode.workspace.getWorkspaceFolder(resource); diff --git a/extensions/markdown-language-features/src/features/previewContentProvider.ts b/extensions/markdown-language-features/src/features/previewContentProvider.ts index c5efa00ac3c..88e9cea04f9 100644 --- a/extensions/markdown-language-features/src/features/previewContentProvider.ts +++ b/extensions/markdown-language-features/src/features/previewContentProvider.ts @@ -13,7 +13,7 @@ const localize = nls.loadMessageBundle(); import { Logger } from '../logger'; import { ContentSecurityPolicyArbiter, MarkdownPreviewSecurityLevel } from '../security'; import { MarkdownPreviewConfigurationManager, MarkdownPreviewConfiguration } from './previewConfig'; -import { MarkdownContributions } from '../markdownExtensions'; +import { MarkdownContributionProvider } from '../markdownExtensions'; /** * Strings used inside the markdown preview. @@ -40,7 +40,7 @@ export class MarkdownContentProvider { private readonly engine: MarkdownEngine, private readonly context: vscode.ExtensionContext, private readonly cspArbiter: ContentSecurityPolicyArbiter, - private readonly contributions: MarkdownContributions, + private readonly contributionProvider: MarkdownContributionProvider, private readonly logger: Logger ) { } @@ -163,7 +163,7 @@ export class MarkdownContentProvider { } private getStyles(resource: vscode.Uri, nonce: string, config: MarkdownPreviewConfiguration, state?: any): string { - const baseStyles = this.contributions.previewStyles + const baseStyles = this.contributionProvider.contributions.previewStyles .map(resource => ``) .join('\n'); @@ -174,7 +174,7 @@ export class MarkdownContentProvider { } private getScripts(nonce: string): string { - return this.contributions.previewScripts + return this.contributionProvider.contributions.previewScripts .map(resource => ``) .join('\n'); } diff --git a/extensions/markdown-language-features/src/features/previewManager.ts b/extensions/markdown-language-features/src/features/previewManager.ts index 15e414f762e..aed62942826 100644 --- a/extensions/markdown-language-features/src/features/previewManager.ts +++ b/extensions/markdown-language-features/src/features/previewManager.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode'; import { Logger } from '../logger'; -import { MarkdownContributions } from '../markdownExtensions'; +import { MarkdownContributionProvider } from '../markdownExtensions'; import { disposeAll } from '../util/dispose'; import { MarkdownFileTopmostLineMonitor } from '../util/topmostLineMonitor'; import { MarkdownPreview, PreviewSettings } from './preview'; @@ -25,7 +25,7 @@ export class MarkdownPreviewManager implements vscode.WebviewPanelSerializer { public constructor( private readonly _contentProvider: MarkdownContentProvider, private readonly _logger: Logger, - private readonly _contributions: MarkdownContributions + private readonly _contributions: MarkdownContributionProvider ) { this._disposables.push(vscode.window.registerWebviewPanelSerializer(MarkdownPreview.viewType, this)); } diff --git a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts index 12e51c75d76..73e04269fce 100644 --- a/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/features/workspaceSymbolProvider.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as vscode from 'vscode'; -import { disposeAll } from '../util/dispose'; +import { Disposable } from '../util/dispose'; import { isMarkdownFile } from '../util/file'; import { Lazy, lazy } from '../util/lazy'; import MDDocumentSymbolProvider from './documentSymbolProvider'; @@ -18,25 +18,13 @@ export interface WorkspaceMarkdownDocumentProvider { readonly onDidDeleteMarkdownDocument: vscode.Event; } -class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocumentProvider { +class VSCodeWorkspaceMarkdownDocumentProvider extends Disposable implements WorkspaceMarkdownDocumentProvider { - private readonly _onDidChangeMarkdownDocumentEmitter = new vscode.EventEmitter(); - private readonly _onDidCreateMarkdownDocumentEmitter = new vscode.EventEmitter(); - private readonly _onDidDeleteMarkdownDocumentEmitter = new vscode.EventEmitter(); + private readonly _onDidChangeMarkdownDocumentEmitter = this._register(new vscode.EventEmitter()); + private readonly _onDidCreateMarkdownDocumentEmitter = this._register(new vscode.EventEmitter()); + private readonly _onDidDeleteMarkdownDocumentEmitter = this._register(new vscode.EventEmitter()); private _watcher: vscode.FileSystemWatcher | undefined; - private _disposables: vscode.Disposable[] = []; - - public dispose() { - this._onDidChangeMarkdownDocumentEmitter.dispose(); - this._onDidDeleteMarkdownDocumentEmitter.dispose(); - - if (this._watcher) { - this._watcher.dispose(); - } - - disposeAll(this._disposables); - } async getAllMarkdownDocuments() { const resources = await vscode.workspace.findFiles('**/*.md', '**/node_modules/**'); @@ -64,7 +52,7 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume return; } - this._watcher = vscode.workspace.createFileSystemWatcher('**/*.md'); + this._watcher = this._register(vscode.workspace.createFileSystemWatcher('**/*.md')); this._watcher.onDidChange(async resource => { const document = await this.getMarkdownDocument(resource); @@ -98,15 +86,16 @@ class VSCodeWorkspaceMarkdownDocumentProvider implements WorkspaceMarkdownDocume } -export default class MarkdownWorkspaceSymbolProvider implements vscode.WorkspaceSymbolProvider { +export default class MarkdownWorkspaceSymbolProvider extends Disposable implements vscode.WorkspaceSymbolProvider { private _symbolCache = new Map>>(); private _symbolCachePopulated: boolean = false; - private _disposables: vscode.Disposable[] = []; public constructor( private _symbolProvider: MDDocumentSymbolProvider, private _workspaceMarkdownDocumentProvider: WorkspaceMarkdownDocumentProvider = new VSCodeWorkspaceMarkdownDocumentProvider() - ) { } + ) { + super(); + } public async provideWorkspaceSymbols(query: string): Promise { if (!this._symbolCachePopulated) { @@ -130,10 +119,6 @@ export default class MarkdownWorkspaceSymbolProvider implements vscode.Workspace } } - public dispose(): void { - disposeAll(this._disposables); - } - private getSymbols(document: SkinnyTextDocument): Lazy> { return lazy(async () => { return this._symbolProvider.provideDocumentSymbolInformation(document); diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 25ac8f33b09..c26eb4834b8 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -7,7 +7,7 @@ import * as crypto from 'crypto'; import { MarkdownIt, Token } from 'markdown-it'; import * as path from 'path'; import * as vscode from 'vscode'; -import { MarkdownContributions } from './markdownExtensions'; +import { MarkdownContributionProvider as MarkdownContributionProvider } from './markdownExtensions'; import { Slugifier } from './slugify'; import { SkinnyTextDocument } from './tableOfContentsProvider'; import { getUriForLinkWithKnownExternalScheme } from './util/links'; @@ -57,16 +57,21 @@ export class MarkdownEngine { private _tokenCache = new TokenCache(); public constructor( - private readonly extensionPreviewResourceProvider: MarkdownContributions, + private readonly contributionProvider: MarkdownContributionProvider, private readonly slugifier: Slugifier, - ) { } + ) { + contributionProvider.onContributionsChanged(() => { + // Markdown plugin contributions may have changed + this.md = undefined; + }); + } private async getEngine(config: MarkdownItConfig): Promise { if (!this.md) { this.md = import('markdown-it').then(async markdownIt => { let md: MarkdownIt = markdownIt(await getMarkdownOptions(() => md)); - for (const plugin of this.extensionPreviewResourceProvider.markdownItPlugins) { + for (const plugin of this.contributionProvider.contributions.markdownItPlugins.values()) { try { md = (await plugin)(md); } catch { diff --git a/extensions/markdown-language-features/src/markdownExtensions.ts b/extensions/markdown-language-features/src/markdownExtensions.ts index 55c8d76e7a4..65899874f5a 100644 --- a/extensions/markdown-language-features/src/markdownExtensions.ts +++ b/extensions/markdown-language-features/src/markdownExtensions.ts @@ -5,13 +5,15 @@ import * as vscode from 'vscode'; import * as path from 'path'; +import { Disposable } from './util/dispose'; +import * as arrays from './util/arrays'; const resolveExtensionResource = (extension: vscode.Extension, resourcePath: string): vscode.Uri => { return vscode.Uri.file(path.join(extension.extensionPath, resourcePath)) .with({ scheme: 'vscode-resource' }); }; -const resolveExtensionResources = (extension: vscode.Extension, resourcePaths: any): vscode.Uri[] => { +const resolveExtensionResources = (extension: vscode.Extension, resourcePaths: unknown): vscode.Uri[] => { const result: vscode.Uri[] = []; if (Array.isArray(resourcePaths)) { for (const resource of resourcePaths) { @@ -26,96 +28,135 @@ const resolveExtensionResources = (extension: vscode.Extension, resourcePat }; export interface MarkdownContributions { - readonly extensionPath: string; - readonly previewScripts: vscode.Uri[]; - readonly previewStyles: vscode.Uri[]; - readonly markdownItPlugins: Thenable<(md: any) => any>[]; - readonly previewResourceRoots: vscode.Uri[]; + readonly previewScripts: ReadonlyArray; + readonly previewStyles: ReadonlyArray; + readonly previewResourceRoots: ReadonlyArray; + readonly markdownItPlugins: Map any>>; } -class MarkdownExtensionContributions implements MarkdownContributions { - private readonly _scripts: vscode.Uri[] = []; - private readonly _styles: vscode.Uri[] = []; - private readonly _previewResourceRoots: vscode.Uri[] = []; - private readonly _plugins: Thenable<(md: any) => any>[] = []; +export namespace MarkdownContributions { + export const Empty: MarkdownContributions = { + previewScripts: [], + previewStyles: [], + previewResourceRoots: [], + markdownItPlugins: new Map() + }; - private _loaded = false; - - public constructor( - public readonly extensionPath: string, - ) { } - - public get previewScripts(): vscode.Uri[] { - this.ensureLoaded(); - return this._scripts; + export function merge(a: MarkdownContributions, b: MarkdownContributions): MarkdownContributions { + return { + previewScripts: [...a.previewScripts, ...b.previewScripts], + previewStyles: [...a.previewStyles, ...b.previewStyles], + previewResourceRoots: [...a.previewResourceRoots, ...b.previewResourceRoots], + markdownItPlugins: new Map([...a.markdownItPlugins.entries(), ...b.markdownItPlugins.entries()]), + }; } - public get previewStyles(): vscode.Uri[] { - this.ensureLoaded(); - return this._styles; + function uriEqual(a: vscode.Uri, b: vscode.Uri): boolean { + return a.toString() === b.toString(); } - public get previewResourceRoots(): vscode.Uri[] { - this.ensureLoaded(); - return this._previewResourceRoots; + export function equal(a: MarkdownContributions, b: MarkdownContributions): boolean { + return arrays.equals(a.previewScripts, b.previewScripts, uriEqual) + && arrays.equals(a.previewStyles, b.previewStyles, uriEqual) + && arrays.equals(a.previewResourceRoots, b.previewResourceRoots, uriEqual) + && arrays.equals(Array.from(a.markdownItPlugins.keys()), Array.from(b.markdownItPlugins.keys())); } - public get markdownItPlugins(): Thenable<(md: any) => any>[] { - this.ensureLoaded(); - return this._plugins; - } - - private ensureLoaded() { - if (this._loaded) { - return; + export function fromExtension( + extension: vscode.Extension + ): MarkdownContributions { + const contributions = extension.packageJSON && extension.packageJSON.contributes; + if (!contributions) { + return MarkdownContributions.Empty; } - this._loaded = true; - for (const extension of vscode.extensions.all) { - const contributes = extension.packageJSON && extension.packageJSON.contributes; - if (!contributes) { - continue; - } + const previewStyles = getContributedStyles(contributions, extension); + const previewScripts = getContributedScripts(contributions, extension); + const previewResourceRoots = previewStyles.length || previewScripts.length ? [vscode.Uri.file(extension.extensionPath)] : []; + const markdownItPlugins = getContributedMarkdownItPlugins(contributions, extension); - this.tryLoadPreviewStyles(contributes, extension); - this.tryLoadPreviewScripts(contributes, extension); - this.tryLoadMarkdownItPlugins(contributes, extension); - - if (contributes['markdown.previewScripts'] || contributes['markdown.previewStyles']) { - this._previewResourceRoots.push(vscode.Uri.file(extension.extensionPath)); - } - } + return { + previewScripts, + previewStyles, + previewResourceRoots, + markdownItPlugins + }; } - private tryLoadMarkdownItPlugins( + function getContributedMarkdownItPlugins( contributes: any, extension: vscode.Extension - ) { + ): Map any>> { + const map = new Map any>>(); if (contributes['markdown.markdownItPlugins']) { - this._plugins.push(extension.activate().then(() => { + map.set(extension.id, extension.activate().then(() => { if (extension.exports && extension.exports.extendMarkdownIt) { return (md: any) => extension.exports.extendMarkdownIt(md); } return (md: any) => md; })); } + return map; } - private tryLoadPreviewScripts( + function getContributedScripts( contributes: any, extension: vscode.Extension ) { - this._scripts.push(...resolveExtensionResources(extension, contributes['markdown.previewScripts'])); + return resolveExtensionResources(extension, contributes['markdown.previewScripts']); } - private tryLoadPreviewStyles( + function getContributedStyles( contributes: any, extension: vscode.Extension ) { - this._styles.push(...resolveExtensionResources(extension, contributes['markdown.previewStyles'])); + return resolveExtensionResources(extension, contributes['markdown.previewStyles']); } } -export function getMarkdownExtensionContributions(context: vscode.ExtensionContext): MarkdownContributions { - return new MarkdownExtensionContributions(context.extensionPath); +export interface MarkdownContributionProvider { + readonly extensionPath: string; + readonly contributions: MarkdownContributions; + readonly onContributionsChanged: vscode.Event; + + dispose(): void; +} + +class VSCodeExtensionMarkdownContributionProvider extends Disposable implements MarkdownContributionProvider { + private _contributions?: MarkdownContributions; + + public constructor( + public readonly extensionPath: string, + ) { + super(); + + vscode.extensions.onDidChange(() => { + const currentContributions = this.getCurrentContributions(); + const existingContributions = this._contributions || MarkdownContributions.Empty; + if (!MarkdownContributions.equal(existingContributions, currentContributions)) { + this._contributions = currentContributions; + this._onContributionsChanged.fire(this); + } + }, undefined, this._disposables); + } + + private readonly _onContributionsChanged = this._register(new vscode.EventEmitter()); + public readonly onContributionsChanged = this._onContributionsChanged.event; + + public get contributions(): MarkdownContributions { + if (!this._contributions) { + this._contributions = this.getCurrentContributions(); + } + return this._contributions; + } + + private getCurrentContributions(): MarkdownContributions { + return vscode.extensions.all + .map(MarkdownContributions.fromExtension) + .reduce(MarkdownContributions.merge, MarkdownContributions.Empty); + } +} + +export function getMarkdownExtensionContributions(context: vscode.ExtensionContext): MarkdownContributionProvider { + return new VSCodeExtensionMarkdownContributionProvider(context.extensionPath); } \ No newline at end of file diff --git a/extensions/markdown-language-features/src/test/engine.ts b/extensions/markdown-language-features/src/test/engine.ts index a1834e057a2..cb74a5b695f 100644 --- a/extensions/markdown-language-features/src/test/engine.ts +++ b/extensions/markdown-language-features/src/test/engine.ts @@ -5,15 +5,14 @@ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; -import { MarkdownContributions } from '../markdownExtensions'; +import { MarkdownContributionProvider, MarkdownContributions } from '../markdownExtensions'; import { githubSlugifier } from '../slugify'; +import { Disposable } from '../util/dispose'; -const emptyContributions = new class implements MarkdownContributions { +const emptyContributions = new class extends Disposable implements MarkdownContributionProvider { readonly extensionPath = ''; - readonly previewScripts: vscode.Uri[] = []; - readonly previewStyles: vscode.Uri[] = []; - readonly previewResourceRoots: vscode.Uri[] = []; - readonly markdownItPlugins: Promise<(md: any) => any>[] = []; + readonly contributions = MarkdownContributions.Empty; + readonly onContributionsChanged = this._register(new vscode.EventEmitter()).event; }; export function createNewMarkdownEngine(): MarkdownEngine { diff --git a/build/gulpfile.test.js b/extensions/markdown-language-features/src/util/arrays.ts similarity index 52% rename from build/gulpfile.test.js rename to extensions/markdown-language-features/src/util/arrays.ts index ff89922100a..10599259901 100644 --- a/build/gulpfile.test.js +++ b/extensions/markdown-language-features/src/util/arrays.ts @@ -3,13 +3,16 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -'use strict'; +export function equals(one: ReadonlyArray, other: ReadonlyArray, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean { + if (one.length !== other.length) { + return false; + } -const gulp = require('gulp'); -const mocha = require('gulp-mocha'); + for (let i = 0, len = one.length; i < len; i++) { + if (!itemEquals(one[i], other[i])) { + return false; + } + } -gulp.task('test', function () { - return gulp.src('test/all.js') - .pipe(mocha({ ui: 'tdd', delay: true })) - .once('end', function () { process.exit(); }); -}); + return true; +} diff --git a/extensions/markdown-language-features/src/util/dispose.ts b/extensions/markdown-language-features/src/util/dispose.ts index 19b3b3f4f19..548094c28e5 100644 --- a/extensions/markdown-language-features/src/util/dispose.ts +++ b/extensions/markdown-language-features/src/util/dispose.ts @@ -14,3 +14,29 @@ export function disposeAll(disposables: vscode.Disposable[]) { } } +export abstract class Disposable { + private _isDisposed = false; + + protected _disposables: vscode.Disposable[] = []; + + public dispose(): any { + if (this._isDisposed) { + return; + } + this._isDisposed = true; + disposeAll(this._disposables); + } + + protected _register(value: T): T { + if (this._isDisposed) { + value.dispose(); + } else { + this._disposables.push(value); + } + return value; + } + + protected get isDisposed() { + return this._isDisposed; + } +} \ No newline at end of file diff --git a/extensions/markdown-language-features/yarn.lock b/extensions/markdown-language-features/yarn.lock index e63c5f4da91..e85ae950b3a 100644 --- a/extensions/markdown-language-features/yarn.lock +++ b/extensions/markdown-language-features/yarn.lock @@ -29,10 +29,10 @@ resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-0.0.2.tgz#5d9ad19e6e6508cdd2f2596df86fd0aade598660" integrity sha1-XZrRnm5lCM3S8llt+G/Qqt5ZhmA= -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== abbrev@1: version "1.1.1" @@ -6010,10 +6010,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.7.2.tgz#2d615a1ef4aee4f574425cdff7026edf81919836" - integrity sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw== +typescript@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.1.tgz#6de14e1db4b8a006ac535e482c8ba018c55f750b" + integrity sha512-cTmIDFW7O0IHbn1DPYjkiebHxwtCMU+eTy30ZtJNBPF9j2O1ITu5XH2YnBeVRKWHqF+3JQwWJv0Q0aUgX8W7IA== uc.micro@^1.0.1: version "1.0.3" diff --git a/extensions/npm/package.json b/extensions/npm/package.json index 6c8578ad784..43dc6a21557 100644 --- a/extensions/npm/package.json +++ b/extensions/npm/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@types/minimatch": "^3.0.3", - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" }, "main": "./out/main", "activationEvents": [ diff --git a/extensions/npm/yarn.lock b/extensions/npm/yarn.lock index 3851d9a4b67..ca339ed8150 100644 --- a/extensions/npm/yarn.lock +++ b/extensions/npm/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== agent-base@4, agent-base@^4.1.0: version "4.2.0" diff --git a/extensions/php-language-features/package.json b/extensions/php-language-features/package.json index fb6beb6deb5..28ccad47def 100644 --- a/extensions/php-language-features/package.json +++ b/extensions/php-language-features/package.json @@ -80,6 +80,6 @@ "vscode-nls": "^4.0.0" }, "devDependencies": { - "@types/node": "^8.10.25" + "@types/node": "^10.12.21" } } diff --git a/extensions/php-language-features/yarn.lock b/extensions/php-language-features/yarn.lock index 5e39a356be6..1bcd757b8a1 100644 --- a/extensions/php-language-features/yarn.lock +++ b/extensions/php-language-features/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== vscode-nls@^4.0.0: version "4.0.0" diff --git a/extensions/php/cgmanifest.json b/extensions/php/cgmanifest.json index 01cdb6b1761..669ade1d4cb 100644 --- a/extensions/php/cgmanifest.json +++ b/extensions/php/cgmanifest.json @@ -6,11 +6,11 @@ "git": { "name": "language-php", "repositoryUrl": "https://github.com/atom/language-php", - "commitHash": "b6c5e83016b52311cdc622c2579462861ee91587" + "commitHash": "b896ebfb6f669b8714f419527f047466420efe5c" } }, "license": "MIT", - "version": "0.44.0" + "version": "0.44.1" } ], "version": 1 diff --git a/extensions/scss/cgmanifest.json b/extensions/scss/cgmanifest.json index 0d3b37497f1..a67a4f54609 100644 --- a/extensions/scss/cgmanifest.json +++ b/extensions/scss/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "atom/language-sass", "repositoryUrl": "https://github.com/atom/language-sass", - "commitHash": "804a935ea1d50504e14a7f602e2bb133fee8450c" + "commitHash": "303bbf0c250fe380b9e57375598cfd916110758b" } }, "license": "MIT", diff --git a/extensions/sql/cgmanifest.json b/extensions/sql/cgmanifest.json index db3a5db2b06..4cdccf12d95 100644 --- a/extensions/sql/cgmanifest.json +++ b/extensions/sql/cgmanifest.json @@ -6,7 +6,7 @@ "git": { "name": "Microsoft/vscode-mssql", "repositoryUrl": "https://github.com/Microsoft/vscode-mssql", - "commitHash": "3aa44d04b04d219ad5fa8f411ca9dd32294a7a06" + "commitHash": "cd754662e5607c62ecdc51d2a2dc844546a0bbb6" } }, "license": "MIT", diff --git a/extensions/sql/syntaxes/sql.tmLanguage.json b/extensions/sql/syntaxes/sql.tmLanguage.json index 516b7ef6154..d7bc056c6eb 100644 --- a/extensions/sql/syntaxes/sql.tmLanguage.json +++ b/extensions/sql/syntaxes/sql.tmLanguage.json @@ -4,7 +4,7 @@ "If you want to provide a fix or improvement, please create a pull request against the original repository.", "Once accepted there, we are happy to receive an update request." ], - "version": "https://github.com/Microsoft/vscode-mssql/commit/3aa44d04b04d219ad5fa8f411ca9dd32294a7a06", + "version": "https://github.com/Microsoft/vscode-mssql/commit/cd754662e5607c62ecdc51d2a2dc844546a0bbb6", "name": "SQL", "scopeName": "source.sql", "patterns": [ @@ -17,7 +17,7 @@ "name": "text.bracketed" }, { - "match": "\\b(?i)(abort|abort_after_wait|absent|absolute|accent_sensitivity|acceptable_cursopt|acp|action|activation|address|admin|aes_128|aes_192|aes_256|affinity|after|aggregate|algorithm|all_constraints|all_errormsgs|all_indexes|all_levels|all_results|allow_connections|allow_dup_row|allow_encrypted_value_modifications|allow_page_locks|allow_row_locks|allow_snapshot_isolation|altercolumn|always|anonymous|ansi_defaults|ansi_null_default|ansi_null_dflt_off|ansi_null_dflt_on|ansi_nulls|ansi_padding|ansi_warnings|appdomain|append|application|apply|arithabort|arithignore|assembly|asymmetric|asynchronous_commit|at|atan2|atomic|attach|attach_force_rebuild_log|attach_rebuild_log|audit|auth_realm|authentication|auto|auto_cleanup|auto_close|auto_create_statistics|auto_shrink|auto_update_statistics|auto_update_statistics_async|automated_backup_preference |automatic|autopilot|availability|availability_mode|backup_priority|base64|basic|batches|batchsize|before|bigint|binary|binding|bit|block|blocksize|bmk|break|broker|broker_instance|bucket_count|buffer|buffercount|bulk_logged|by|call|caller|card|case|cast|catalog|catch|cert|certificate|change_retention|change_tracking|change_tracking_context|changes|char|character|character_set|check_expiration|check_policy|checkconstraints|checkindex|checkpoint|cleanup_policy|clear|clear_port|close|codepage|collection|column_encryption_key|column_master_key|columnstore|columnstore_archive|colv_80_to_100|colv_100_to_80|commit_differential_base|committed|compatibility_level|compress_all_row_groups|compression|compression_delay|concat_null_yields_null|concatenate|configuration|connect|continue|continue_after_error|contract|contract_name|control|conversation|conversation_group_id|conversation_handle|copy|copy_only|count_rows|counter|create(\\s+or\\s+alter)?|credential|cross|cryptographic|cryptographic_provider|cube|cursor_close_on_commit|cursor_default|data|data_compression|data_flush_interval_seconds|data_mirroring|data_purity|data_source|database|database_name|database_snapshot|datafiletype|date_correlation_optimization|date|datefirst|dateformat|date_format|datetime|datetime2|datetimeoffset|days|db_chaining|dbid|dbidexec|dbo_only|deadlock_priority|deallocate|dec|decimal|declare(\\s+cursor)?|decrypt|decrypt_a|decryption|default_database|default_language|default_logon_domain|default_schema|definition|delay|delayed_durability|delimitedtext|density_vector|dependent|des|description|desired_state|desx|differential|digest|disable|disable_broker|disable_def_cnst_chk|disabled|disk|distributed|distribution|drop|drop_existing|dts_buffers|dump|durability|dynamic|edition|elements|else|emergency|empty|enable|enable_broker|enabled|encoding|encrypted|encrypted_value|encryption|encryption_type|end|endpoint|endpoint_url|enhancedintegrity|entry|error_broker_conversations|errorfile|estimateonly|event|exec|executable|execute|exists|expand|expiredate|expiry_date|explicit|external_access|failover|failover_mode|failure_condition_level|fast|fast_forward|fastfirstrow|federated_service_account|fetch|field_terminator|fieldterminator|file|filelistonly|filegroup|filename|filestream|filestream_log|filestream_on|filetable|file_format|filter|fips_flagger|fire_triggers|first|firstrow|float|flush_interval_seconds|fmtonly|following|force|force_failover_allow_data_loss|force_service_allow_data_loss|forced|forceplan|formatfile|format_options|format_type|formsof|forward_only|free_cursors|free_exec_context|fullscan|fulltext|fulltextall|fulltextkey|function|generated|get|geography|geometry|global|go|goto|governor|guid|hadoop|hardening|hash|hashed|header_limit|headeronly|health_check_timeout|hidden|hierarchyid|histogram|histogram_steps|hits_cursors|hits_exec_context|hours|http|identity|identity_value|if|ifnull|ignore_constraints|ignore_dup_key|ignore_dup_row|ignore_triggers|image|immediate|implicit_transactions|include|include_null_values|inflectional|init|initiator|insensitive|insert|instead|int|integer|integrated|intermediate|interval_length_minutes|into|inuse_cursors|inuse_exec_context|io|is|isabout|iso_week|isolation|job_tracker_location|json|keep|keep_nulls|keep_replication|keepdefaults|keepfixed|keepidentity|keepnulls|kerberos|key|key_path|key_source|key_store_provider_name|keyset|kill|kilobytes_per_batch|labelonly|langid|language|last|lastrow|legacy_cardinality_estimation|length|level|lifetime|lineage_80_to_100|lineage_100_to_80|listener_ip|listener_port|load|loadhistory|lob_compaction|local|local_service_name|locate|location|lock_escalation|lock_timeout|lockres|login|login_type|loop|manual|mark_in_use_for_removal|masked|master|max_queue_readers|max_duration|max_outstanding_io_per_volume|maxdop|maxerrors|maxlength|maxtransfersize|max_plans_per_query|max_storage_size_mb|mediadescription|medianame|mediapassword|memogroup|memory_optimized|merge|message|message_forward_size|message_forwarding|microsecond|millisecond|minutes|mirror_address|misses_cursors|misses_exec_context|mixed|modify|money|move|multi_user|must_change|name|namespace|nanosecond|native|native_compilation|nchar|ncharacter|never|new_account|new_broker|newname|next|no|no_browsetable|no_checksum|no_compression|no_infomsgs|no_triggers|no_truncate|nocount|noexec|noexpand|noformat|noinit|nolock|nonatomic|nondurable|none|norecompute|norecovery|noreset|norewind|noskip|not|notification|nounload|now|nowait|ntext|ntlm|numeric|numeric_roundabort|nvarchar|object|objid|oem|offline|old_account|online|operation_mode|open|openjson|optimistic|option|orc|out|outer|output|over|override|owner|ownership|pad_index|page|page_checksum|page_verify|pagecount|paglock|param|parameter_sniffing|parameter_type_expansion|parameterization|parquet|parseonly|partial|partition|partner|password|path|pause|percentage|permission_set|persisted|period|physical_only|plan_forcing_mode|policy|pool|population|ports|preceding|precision|predicate|presume_abort|primary|primary_role|print|prior|priority |priority_level|private|proc(edure)?|procedure_name|profile|provider|query_capture_mode|query_governor_cost_limit|query_optimizer_hotfixes|query_store|queue|quoted_identifier|raiserror|range|raw|rcfile|rc2|rc4|rc4_128|rdbms|read_committed_snapshot|read|read_only|read_write|readcommitted|readcommittedlock|readonly|readpast|readuncommitted|readwrite|real|rebuild|receive|recmodel_70backcomp|recompile|reconfigure|recovery|recursive|recursive_triggers|redo_queue|reject_sample_value|reject_type|reject_value|relative|remote|remote_data_archive|remote_proc_transactions|remote_service_name|remove|removed_cursors|removed_exec_context|reorganize|repeat|repeatable|repeatableread|replica|replicated|replnick_100_to_80|replnickarray_80_to_100|replnickarray_100_to_80|required|required_cursopt|resample|reset|resource|resource_manager_location|restart|restore|restricted_user|resume|retaindays|retention|return|rewind|rewindonly|returns|robust|role|rollup|root|round_robin|route|row|rowdump|rowguidcol|rowlock|row_terminator|rows|rows_per_batch|rowsets_only|rowterminator|rowversion|rsa_1024|rsa_2048|rsa_3072|rsa_4096|rsa_512|safe|safety|sample|save|schemabinding|scoped|scroll|scroll_locks|sddl|secexpr|secondary|secondary_only|secondary_role|secret|security|securityaudit|selective|self|send|sent|sequence|serde_method|serializable|server|service|service_broker|service_name|service_objective|session_timeout|session|sessions|seterror|setopts|sets|shard_map_manager|shard_map_name|sharded|shared_memory|show_statistics|showplan_all|showplan_text|showplan_xml|showplan_xml_with_recompile|shrinkdb|shutdown|sid|signature|simple|single_blob|single_clob|single_nclob|single_user|singleton|site|size_based_cleanup_mode|skip|smalldatetime|smallint|smallmoney|snapshot|snapshot_import|snapshotrestorephase|soap|softnuma|sort_in_tempdb|sorted_data|sorted_data_reorg|spatial|sql|sql_bigint|sql_binary|sql_bit|sql_char|sql_date|sql_decimal|sql_double|sql_float|sql_guid|sql_handle|sql_longvarbinary|sql_longvarchar|sql_numeric|sql_real|sql_smallint|sql_time|sql_timestamp|sql_tinyint|sql_tsi_day|sql_tsi_frac_second|sql_tsi_hour|sql_tsi_minute|sql_tsi_month|sql_tsi_quarter|sql_tsi_second|sql_tsi_week|sql_tsi_year|sql_type_date|sql_type_time|sql_type_timestamp|sql_varbinary|sql_varchar|sql_variant|sql_wchar|sql_wlongvarchar|ssl|ssl_port|standard|standby|start|start_date|started|stat_header|state|statement|static|statistics|statistics_incremental|statistics_norecompute|statistics_only|statman|stats_stream|status|stop|stop_on_error|stopat|stopatmark|stopbeforemark|stoplist|stopped|string_delimiter|subject|supplemental_logging|supported|suspend|symmetric|synchronous_commit|synonym|sysname|system|system_time|system_versioning|table|tableresults|tablock|tablockx|take|tape|target|target_index|target_partition|tcp|temporal_history_retention|text|textimage_on|then|thesaurus|throw|time|timeout|timestamp|tinyint|to|top|torn_page_detection|track_columns_updated|tran|transaction|transfer|triple_des|triple_des_3key|truncate|trustworthy|try|tsql|type|type_desc|type_warning|tzoffset|uid|unbounded|uncommitted|uniqueidentifier|unlimited|unload|unlock|unsafe|updlock|url|use|useplan|useroptions|use_type_default|using|utcdatetime|valid_xml|validation|value|values|varbinary|varchar|verbose|verifyonly|version|view_metadata|virtual_device|visiblity|waitfor|webmethod|weekday|weight|well_formed_xml|when|while|widechar|widechar_ansi|widenative|windows|with|within|witness|without|without_array_wrapper|workload|wsdl|xact_abort|xlock|xml|xmlschema|xquery|xsinil|zone)\\b", + "match": "\\b(?i)(abort|abort_after_wait|absent|absolute|accent_sensitivity|acceptable_cursopt|acp|action|activation|address|admin|aes_128|aes_192|aes_256|affinity|after|aggregate|algorithm|all_constraints|all_errormsgs|all_indexes|all_levels|all_results|allow_connections|allow_dup_row|allow_encrypted_value_modifications|allow_page_locks|allow_row_locks|allow_snapshot_isolation|altercolumn|always|anonymous|ansi_defaults|ansi_null_default|ansi_null_dflt_off|ansi_null_dflt_on|ansi_nulls|ansi_padding|ansi_warnings|appdomain|append|application|apply|arithabort|arithignore|assembly|asymmetric|asynchronous_commit|at|atan2|atomic|attach|attach_force_rebuild_log|attach_rebuild_log|audit|auth_realm|authentication|auto|auto_cleanup|auto_close|auto_create_statistics|auto_shrink|auto_update_statistics|auto_update_statistics_async|automated_backup_preference |automatic|autopilot|availability|availability_mode|backup_priority|base64|basic|batches|batchsize|before|between|bigint|binary|binding|bit|block|blocksize|bmk|break|broker|broker_instance|bucket_count|buffer|buffercount|bulk_logged|by|call|caller|card|case|cast|catalog|catch|cert|certificate|change_retention|change_tracking|change_tracking_context|changes|char|character|character_set|check_expiration|check_policy|checkconstraints|checkindex|checkpoint|cleanup_policy|clear|clear_port|close|codepage|collection|column_encryption_key|column_master_key|columnstore|columnstore_archive|colv_80_to_100|colv_100_to_80|commit_differential_base|committed|compatibility_level|compress_all_row_groups|compression|compression_delay|concat_null_yields_null|concatenate|configuration|connect|continue|continue_after_error|contract|contract_name|control|conversation|conversation_group_id|conversation_handle|copy|copy_only|count_rows|counter|create(\\s+or\\s+alter)?|credential|cross|cryptographic|cryptographic_provider|cube|cursor_close_on_commit|cursor_default|data|data_compression|data_flush_interval_seconds|data_mirroring|data_purity|data_source|database|database_name|database_snapshot|datafiletype|date_correlation_optimization|date|datefirst|dateformat|date_format|datetime|datetime2|datetimeoffset|days|db_chaining|dbid|dbidexec|dbo_only|deadlock_priority|deallocate|dec|decimal|declare(\\s+cursor)?|decrypt|decrypt_a|decryption|default_database|default_language|default_logon_domain|default_schema|definition|delay|delayed_durability|delimitedtext|density_vector|dependent|des|description|desired_state|desx|differential|digest|disable|disable_broker|disable_def_cnst_chk|disabled|disk|distinct|distributed|distribution|drop|drop_existing|dts_buffers|dump|durability|dynamic|edition|elements|else|emergency|empty|enable|enable_broker|enabled|encoding|encrypted|encrypted_value|encryption|encryption_type|end|endpoint|endpoint_url|enhancedintegrity|entry|error_broker_conversations|errorfile|estimateonly|event|exec|executable|execute|exists|expand|expiredate|expiry_date|explicit|external_access|failover|failover_mode|failure_condition_level|fast|fast_forward|fastfirstrow|federated_service_account|fetch|field_terminator|fieldterminator|file|filelistonly|filegroup|filename|filestream|filestream_log|filestream_on|filetable|file_format|filter|fips_flagger|fire_triggers|first|firstrow|float|flush_interval_seconds|fmtonly|following|force|force_failover_allow_data_loss|force_service_allow_data_loss|forced|forceplan|formatfile|format_options|format_type|formsof|forward_only|free_cursors|free_exec_context|fullscan|fulltext|fulltextall|fulltextkey|function|generated|get|geography|geometry|global|go|goto|governor|guid|hadoop|hardening|hash|hashed|header_limit|headeronly|health_check_timeout|hidden|hierarchyid|histogram|histogram_steps|hits_cursors|hits_exec_context|hours|http|identity|identity_value|if|ifnull|ignore_constraints|ignore_dup_key|ignore_dup_row|ignore_triggers|image|immediate|implicit_transactions|include|include_null_values|inflectional|init|initiator|insensitive|insert|instead|int|integer|integrated|intermediate|interval_length_minutes|into|inuse_cursors|inuse_exec_context|io|is|isabout|iso_week|isolation|job_tracker_location|json|keep|keep_nulls|keep_replication|keepdefaults|keepfixed|keepidentity|keepnulls|kerberos|key|key_path|key_source|key_store_provider_name|keyset|kill|kilobytes_per_batch|labelonly|langid|language|last|lastrow|legacy_cardinality_estimation|length|level|lifetime|lineage_80_to_100|lineage_100_to_80|listener_ip|listener_port|load|loadhistory|lob_compaction|local|local_service_name|locate|location|lock_escalation|lock_timeout|lockres|login|login_type|loop|manual|mark_in_use_for_removal|masked|master|max_queue_readers|max_duration|max_outstanding_io_per_volume|maxdop|maxerrors|maxlength|maxtransfersize|max_plans_per_query|max_storage_size_mb|mediadescription|medianame|mediapassword|memogroup|memory_optimized|merge|message|message_forward_size|message_forwarding|microsecond|millisecond|minutes|mirror_address|misses_cursors|misses_exec_context|mixed|modify|money|move|multi_user|must_change|name|namespace|nanosecond|native|native_compilation|nchar|ncharacter|never|new_account|new_broker|newname|next|no|no_browsetable|no_checksum|no_compression|no_infomsgs|no_triggers|no_truncate|nocount|noexec|noexpand|noformat|noinit|nolock|nonatomic|nondurable|none|norecompute|norecovery|noreset|norewind|noskip|not|notification|nounload|now|nowait|ntext|ntlm|numeric|numeric_roundabort|nvarchar|object|objid|oem|offline|old_account|online|operation_mode|open|openjson|optimistic|option|orc|out|outer|output|over|override|owner|ownership|pad_index|page|page_checksum|page_verify|pagecount|paglock|param|parameter_sniffing|parameter_type_expansion|parameterization|parquet|parseonly|partial|partition|partner|password|path|pause|percentage|permission_set|persisted|period|physical_only|plan_forcing_mode|policy|pool|population|ports|preceding|precision|predicate|presume_abort|primary|primary_role|print|prior|priority |priority_level|private|proc(edure)?|procedure_name|profile|provider|query_capture_mode|query_governor_cost_limit|query_optimizer_hotfixes|query_store|queue|quoted_identifier|raiserror|range|raw|rcfile|rc2|rc4|rc4_128|rdbms|read_committed_snapshot|read|read_only|read_write|readcommitted|readcommittedlock|readonly|readpast|readuncommitted|readwrite|real|rebuild|receive|recmodel_70backcomp|recompile|reconfigure|recovery|recursive|recursive_triggers|redo_queue|reject_sample_value|reject_type|reject_value|relative|remote|remote_data_archive|remote_proc_transactions|remote_service_name|remove|removed_cursors|removed_exec_context|reorganize|repeat|repeatable|repeatableread|replica|replicated|replnick_100_to_80|replnickarray_80_to_100|replnickarray_100_to_80|required|required_cursopt|resample|reset|resource|resource_manager_location|restart|restore|restricted_user|resume|retaindays|retention|return|revert|rewind|rewindonly|returns|robust|role|rollup|root|round_robin|route|row|rowdump|rowguidcol|rowlock|row_terminator|rows|rows_per_batch|rowsets_only|rowterminator|rowversion|rsa_1024|rsa_2048|rsa_3072|rsa_4096|rsa_512|safe|safety|sample|save|schemabinding|scoped|scroll|scroll_locks|sddl|secexpr|secondary|secondary_only|secondary_role|secret|security|securityaudit|selective|self|send|sent|sequence|serde_method|serializable|server|service|service_broker|service_name|service_objective|session_timeout|session|sessions|seterror|setopts|sets|shard_map_manager|shard_map_name|sharded|shared_memory|show_statistics|showplan_all|showplan_text|showplan_xml|showplan_xml_with_recompile|shrinkdb|shutdown|sid|signature|simple|single_blob|single_clob|single_nclob|single_user|singleton|site|size_based_cleanup_mode|skip|smalldatetime|smallint|smallmoney|snapshot|snapshot_import|snapshotrestorephase|soap|softnuma|sort_in_tempdb|sorted_data|sorted_data_reorg|spatial|sql|sql_bigint|sql_binary|sql_bit|sql_char|sql_date|sql_decimal|sql_double|sql_float|sql_guid|sql_handle|sql_longvarbinary|sql_longvarchar|sql_numeric|sql_real|sql_smallint|sql_time|sql_timestamp|sql_tinyint|sql_tsi_day|sql_tsi_frac_second|sql_tsi_hour|sql_tsi_minute|sql_tsi_month|sql_tsi_quarter|sql_tsi_second|sql_tsi_week|sql_tsi_year|sql_type_date|sql_type_time|sql_type_timestamp|sql_varbinary|sql_varchar|sql_variant|sql_wchar|sql_wlongvarchar|ssl|ssl_port|standard|standby|start|start_date|started|stat_header|state|statement|static|statistics|statistics_incremental|statistics_norecompute|statistics_only|statman|stats_stream|status|stop|stop_on_error|stopat|stopatmark|stopbeforemark|stoplist|stopped|string_delimiter|subject|supplemental_logging|supported|suspend|symmetric|synchronous_commit|synonym|sysname|system|system_time|system_versioning|table|tableresults|tablock|tablockx|take|tape|target|target_index|target_partition|tcp|temporal_history_retention|text|textimage_on|then|thesaurus|throw|time|timeout|timestamp|tinyint|to|top|torn_page_detection|track_columns_updated|tran|transaction|transfer|triple_des|triple_des_3key|truncate|trustworthy|try|tsql|type|type_desc|type_warning|tzoffset|uid|unbounded|uncommitted|uniqueidentifier|unlimited|unload|unlock|unsafe|updlock|url|use|useplan|useroptions|use_type_default|using|utcdatetime|valid_xml|validation|value|values|varbinary|varchar|verbose|verifyonly|version|view_metadata|virtual_device|visiblity|waitfor|webmethod|weekday|weight|well_formed_xml|when|while|widechar|widechar_ansi|widenative|windows|with|within|witness|without|without_array_wrapper|workload|wsdl|xact_abort|xlock|xml|xmlschema|xquery|xsinil|zone)\\b", "name": "keyword.other.sql" }, { diff --git a/extensions/vscode-api-tests/package.json b/extensions/vscode-api-tests/package.json index 4ee121e1b1b..e1716b8555a 100644 --- a/extensions/vscode-api-tests/package.json +++ b/extensions/vscode-api-tests/package.json @@ -49,7 +49,7 @@ }, "devDependencies": { "@types/mocha": "2.2.43", - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "mocha-junit-reporter": "^1.17.0", "mocha-multi-reporters": "^1.1.7", "typescript": "^1.6.2", diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts index 707508b723c..a08d5d049d5 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/window.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind, Terminal } from 'vscode'; +import { workspace, window, commands, ViewColumn, TextEditorViewColumnChangeEvent, Uri, Selection, Position, CancellationTokenSource, TextEditorSelectionChangeKind, Terminal, TerminalDimensionsChangeEvent } from 'vscode'; import { join } from 'path'; import { closeAllEditors, pathEquals, createRandomFile } from '../utils'; @@ -695,6 +695,45 @@ suite('window namespace tests', () => { const terminal = window.createTerminal(); terminal.show(); }); + + test('onDidChangeTerminalDimensions should fire when new terminals are created', (done) => { + const reg1 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { + assert.equal(event.terminal, terminal1); + assert.equal(typeof event.dimensions.columns, 'number'); + assert.equal(typeof event.dimensions.rows, 'number'); + assert.ok(event.dimensions.columns > 0); + assert.ok(event.dimensions.rows > 0); + reg1.dispose(); + let terminal2: Terminal; + const reg2 = window.onDidOpenTerminal((newTerminal) => { + // THis is guarentees to fire before dimensions change event + if (newTerminal !== terminal1) { + terminal2 = newTerminal; + reg2.dispose(); + } + }); + let firstCalled = false; + let secondCalled = false; + const reg3 = window.onDidChangeTerminalDimensions((event: TerminalDimensionsChangeEvent) => { + if (event.terminal === terminal1) { + // The original terminal should fire dimension change after a split + firstCalled = true; + } else if (event.terminal !== terminal1) { + // The new split terminal should fire dimension change + secondCalled = true; + } + if (firstCalled && secondCalled) { + terminal1.dispose(); + terminal2.dispose(); + reg3.dispose(); + done(); + } + }); + commands.executeCommand('workbench.action.terminal.split'); + }); + const terminal1 = window.createTerminal({ name: 'test' }); + terminal1.show(); + }); }); }); diff --git a/extensions/vscode-api-tests/yarn.lock b/extensions/vscode-api-tests/yarn.lock index 74a177b2aea..c7841be1397 100644 --- a/extensions/vscode-api-tests/yarn.lock +++ b/extensions/vscode-api-tests/yarn.lock @@ -7,10 +7,10 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.43.tgz#03c54589c43ad048cbcbfd63999b55d0424eec27" integrity sha512-xNlAmH+lRJdUMXClMTI9Y0pRqIojdxfm7DHsIxoB2iTzu3fnPmSMEN8SsSx0cdwV36d02PWCWaDUoZPDSln+xw== -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== ajv@^5.1.0: version "5.3.0" diff --git a/extensions/vscode-colorize-tests/package.json b/extensions/vscode-colorize-tests/package.json index 9b43cfa2a6c..763513a590a 100644 --- a/extensions/vscode-colorize-tests/package.json +++ b/extensions/vscode-colorize-tests/package.json @@ -12,7 +12,7 @@ "postinstall": "node ./node_modules/vscode/bin/install" }, "devDependencies": { - "@types/node": "^8.10.25", + "@types/node": "^10.12.21", "mocha-junit-reporter": "^1.17.0", "mocha-multi-reporters": "^1.1.7", "vscode": "1.1.5" diff --git a/extensions/vscode-colorize-tests/yarn.lock b/extensions/vscode-colorize-tests/yarn.lock index b17b8b1954b..46684d06b5e 100644 --- a/extensions/vscode-colorize-tests/yarn.lock +++ b/extensions/vscode-colorize-tests/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@types/node@^8.10.25": - version "8.10.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.25.tgz#801fe4e39372cef18f268db880a5fbfcf71adc7e" - integrity sha512-WXvAXaknB0c2cJ7N44e1kUrVu5K90mSfPPaT5XxfuSMxEWva86EYIwxUZM3jNZ2P1CIC9e2z4WJqpAF69PQxeA== +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== ajv@^5.1.0: version "5.3.0" diff --git a/gulpfile.js b/gulpfile.js index 71e1618ae43..b41fa640399 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -12,23 +12,27 @@ const gulp = require('gulp'); const util = require('./build/lib/util'); const path = require('path'); const compilation = require('./build/lib/compilation'); +const { monacoTypecheckTask/* , monacoTypecheckWatchTask */ } = require('./build/gulpfile.editor'); +const { compileExtensionsTask, watchExtensionsTask } = require('./build/gulpfile.extensions'); // Fast compile for development time -gulp.task('compile-client', util.task.series(util.rimraf('out'), compilation.compileTask('src', 'out', false))); -gulp.task('watch-client', util.task.series(util.rimraf('out'), compilation.watchTask('out', false))); +const compileClientTask = util.task.series(util.rimraf('out'), compilation.compileTask('src', 'out', false)); +compileClientTask.displayName = 'compile-client'; +gulp.task(compileClientTask.displayName, compileClientTask); -// Full compile, including nls and inline sources in sourcemaps, for build -gulp.task('compile-client-build', util.task.series(util.rimraf('out-build'), compilation.compileTask('src', 'out-build', true))); - -// Default -gulp.task('default', ['compile']); +const watchClientTask = util.task.series(util.rimraf('out'), compilation.watchTask('out', false)); +watchClientTask.displayName = 'watch-client'; +gulp.task(watchClientTask.displayName, watchClientTask); // All -gulp.task('compile', ['monaco-typecheck', 'compile-client', 'compile-extensions']); -gulp.task('watch', [/* 'monaco-typecheck-watch', */ 'watch-client', 'watch-extensions']); +const compileTask = util.task.parallel(monacoTypecheckTask, compileClientTask, compileExtensionsTask); +compileTask.displayName = 'compile'; +gulp.task(compileTask.displayName, compileTask); -// All Build -gulp.task('compile-build', ['compile-client-build', 'compile-extensions-build']); +gulp.task('watch', util.task.parallel(/* monacoTypecheckWatchTask, */ watchClientTask, watchExtensionsTask)); + +// Default +gulp.task('default', compileTask); process.on('unhandledRejection', (reason, p) => { console.log('Unhandled Rejection at: Promise', p, 'reason:', reason); diff --git a/package.json b/package.json index 5f78d0e4027..ef3bb7814f7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "code-oss-dev", "version": "1.32.0", - "distro": "d274a23e463c080a0a3ba6278d43431d187e05f5", + "distro": "310c6547347fcd3b799dc67e048b7e010339211f", "author": { "name": "Microsoft Corporation" }, @@ -53,7 +53,7 @@ "vscode-ripgrep": "^1.2.5", "vscode-sqlite3": "4.0.7", "vscode-textmate": "^4.0.1", - "vscode-xterm": "3.12.0-beta1", + "vscode-xterm": "3.12.0-beta2", "winreg": "^1.2.4", "yauzl": "^2.9.1", "yazl": "^2.4.3" @@ -68,6 +68,7 @@ "@types/sinon": "^1.16.36", "@types/webpack": "^4.4.10", "@types/winreg": "^1.2.30", + "ansi-colors": "^3.2.3", "asar": "^0.14.0", "chromium-pickle-js": "^0.2.0", "clean-css": "3.4.6", @@ -80,27 +81,26 @@ "eslint": "^3.4.0", "event-stream": "3.3.4", "express": "^4.13.1", + "fancy-log": "^1.3.3", "glob": "^5.0.13", - "gulp": "^3.8.9", - "gulp-atom-electron": "^1.19.2", - "gulp-azure-storage": "^0.8.2", + "gulp": "^4.0.0", + "gulp-atom-electron": "^1.20.0", + "gulp-azure-storage": "^0.10.0", "gulp-buffer": "0.0.2", - "gulp-concat": "^2.6.0", - "gulp-cssnano": "^2.1.0", - "gulp-eslint": "^3.0.1", - "gulp-filter": "^3.0.0", - "gulp-flatmap": "^1.0.0", - "gulp-json-editor": "^2.2.1", - "gulp-mocha": "^2.1.3", + "gulp-concat": "^2.6.1", + "gulp-cssnano": "^2.1.3", + "gulp-eslint": "^5.0.0", + "gulp-filter": "^5.1.0", + "gulp-flatmap": "^1.0.2", + "gulp-json-editor": "^2.5.0", "gulp-plumber": "^1.2.0", "gulp-remote-src": "^0.4.4", "gulp-rename": "^1.2.0", "gulp-replace": "^0.5.4", - "gulp-shell": "^0.5.2", - "gulp-tsb": "2.0.5", - "gulp-tslint": "^8.1.2", + "gulp-shell": "^0.6.5", + "gulp-tsb": "2.0.6", + "gulp-tslint": "^8.1.3", "gulp-uglify": "^3.0.0", - "gulp-util": "^3.0.6", "gulp-vinyl-zip": "^2.1.2", "husky": "^0.13.1", "innosetup-compiler": "^5.5.60", @@ -119,7 +119,7 @@ "pump": "^1.0.1", "queue": "3.0.6", "rcedit": "^1.1.0", - "remap-istanbul": "^0.6.4", + "remap-istanbul": "^0.13.0", "rimraf": "^2.2.8", "sinon": "^1.17.2", "source-map": "^0.4.4", @@ -130,10 +130,10 @@ "typescript-tslint-plugin": "^0.0.7", "uglify-es": "^3.0.18", "underscore": "^1.8.2", - "vinyl": "^0.4.5", - "vinyl-fs": "^2.4.3", + "vinyl": "^2.0.0", + "vinyl-fs": "^3.0.0", "vsce": "1.48.0", - "vscode-nls-dev": "3.2.2", + "vscode-nls-dev": "3.2.4", "webpack": "^4.16.5", "webpack-cli": "^3.1.0", "webpack-stream": "^5.1.1" @@ -150,4 +150,4 @@ "windows-mutex": "0.2.1", "windows-process-tree": "0.2.3" } -} +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index 5d6dcfca955..064f5da1934 100644 --- a/src/main.js +++ b/src/main.js @@ -151,7 +151,7 @@ function onReady() { function configureCommandlineSwitches(cliArgs, nodeCachedDataDir) { // Force pre-Chrome-60 color profile handling (for https://github.com/Microsoft/vscode/issues/51791) - app.commandLine.appendSwitch('disable-features', 'ColorCorrectRendering'); + app.commandLine.appendSwitch('disable-color-correct-rendering'); // Support JS Flags const jsFlags = resolveJSFlags(cliArgs, nodeCachedDataDir.jsFlags()); @@ -305,7 +305,7 @@ function getNodeCachedDir() { * @returns {string} */ function stripComments(content) { - const regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; + const regexp = /("(?:[^\\"]*(?:\\.)?)*")|('(?:[^\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g; return content.replace(regexp, function (match, m1, m2, m3, m4) { // Only one of m1, m2, m3, m4 matches diff --git a/src/tsconfig.strictNullChecks.json b/src/tsconfig.strictNullChecks.json index ef2000cae7e..23725549fe4 100644 --- a/src/tsconfig.strictNullChecks.json +++ b/src/tsconfig.strictNullChecks.json @@ -6,9 +6,8 @@ }, "include": [ "./typings", - "./vs/base/browser/**/*.ts", - "./vs/base/common/**/*.ts", - "./vs/base/node/**/*.ts", + "./vs/base/**/*.ts", + "./vs/code/**/*.ts", "./vs/editor/browser/**/*.ts", "./vs/editor/common/**/*.ts", "./vs/editor/contrib/codeAction/**/*.ts", @@ -18,139 +17,21 @@ "./vs/editor/contrib/smartSelect/**/*.ts", "./vs/editor/contrib/snippet/**/*.ts", "./vs/editor/contrib/suggest/**/*.ts", - "./vs/editor/test/**/*.ts" + "./vs/editor/contrib/documentSymbols/**/*.ts", + "./vs/editor/test/**/*.ts", + "./vs/workbench/browser/parts/notifications/**/*", + "./vs/workbench/browser/parts/quickinput/**/*", + "./vs/workbench/electron-browser/actions/**/*", + "./vs/workbench/contrib/emmet/**/*", + "./vs/workbench/contrib/execution/**/*", + "./vs/workbench/contrib/snippets/**/*.ts", + "./vs/workbench/contrib/welcome/**/*.ts", + "./vs/workbench/services/commands/**/*", + "./vs/workbench/services/files/node/watcher/**/*", + "./vs/workbench/services/issue/**/*", + "./vs/workbench/services/themes/**/*.ts" ], "files": [ - "./vs/base/parts/contextmenu/common/contextmenu.ts", - "./vs/base/parts/contextmenu/electron-browser/contextmenu.ts", - "./vs/base/parts/contextmenu/electron-main/contextmenu.ts", - "./vs/base/parts/ipc/electron-browser/ipc.electron-browser.ts", - "./vs/base/parts/ipc/electron-main/ipc.electron-main.ts", - "./vs/base/parts/ipc/node/ipc.cp.ts", - "./vs/base/parts/ipc/node/ipc.electron.ts", - "./vs/base/parts/ipc/node/ipc.net.ts", - "./vs/base/parts/ipc/node/ipc.ts", - "./vs/base/parts/ipc/test/node/ipc.cp.test.ts", - "./vs/base/parts/ipc/test/node/ipc.net.test.ts", - "./vs/base/parts/ipc/test/node/ipc.test.ts", - "./vs/base/parts/ipc/test/node/testApp.ts", - "./vs/base/parts/ipc/test/node/testService.ts", - "./vs/base/parts/quickopen/common/quickOpen.ts", - "./vs/base/parts/quickopen/common/quickOpenScorer.ts", - "./vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts", - "./vs/base/parts/quickopen/browser/quickOpenWidget.ts", - "./vs/base/parts/tree/browser/tree.ts", - "./vs/base/parts/tree/browser/treeDefaults.ts", - "./vs/base/parts/tree/browser/treeDnd.ts", - "./vs/base/parts/tree/browser/treeImpl.ts", - "./vs/base/parts/tree/browser/treeModel.ts", - "./vs/base/parts/tree/browser/treeUtils.ts", - "./vs/base/parts/tree/browser/treeView.ts", - "./vs/base/parts/tree/browser/treeViewModel.ts", - "./vs/base/parts/tree/test/browser/treeModel.test.ts", - "./vs/base/parts/tree/test/browser/treeViewModel.test.ts", - "./vs/base/test/browser/browser.test.ts", - "./vs/base/test/browser/comparers.test.ts", - "./vs/base/test/browser/dom.test.ts", - "./vs/base/test/browser/highlightedLabel.test.ts", - "./vs/base/test/browser/htmlContent.test.ts", - "./vs/base/test/browser/progressBar.test.ts", - "./vs/base/test/browser/ui/contextview/contextview.test.ts", - "./vs/base/test/browser/ui/grid/grid.test.ts", - "./vs/base/test/browser/ui/grid/gridview.test.ts", - "./vs/base/test/browser/ui/grid/util.ts", - "./vs/base/test/browser/ui/list/listView.test.ts", - "./vs/base/test/browser/ui/list/rangeMap.test.ts", - "./vs/base/test/browser/ui/scrollbar/scrollableElement.test.ts", - "./vs/base/test/browser/ui/scrollbar/scrollbarState.test.ts", - "./vs/base/test/browser/ui/splitview/splitview.test.ts", - "./vs/base/test/browser/ui/tree/asyncDataTree.test.ts", - "./vs/base/test/browser/ui/tree/dataTree.test.ts", - "./vs/base/test/browser/ui/tree/indexTreeModel.test.ts", - "./vs/base/test/browser/ui/tree/objectTree.test.ts", - "./vs/base/test/browser/ui/tree/objectTreeModel.test.ts", - "./vs/base/test/common/arrays.test.ts", - "./vs/base/test/common/assert.test.ts", - "./vs/base/test/common/async.test.ts", - "./vs/base/test/common/cache.test.ts", - "./vs/base/test/common/cancellation.test.ts", - "./vs/base/test/common/charCode.test.ts", - "./vs/base/test/common/collections.test.ts", - "./vs/base/test/common/color.test.ts", - "./vs/base/test/common/decorators.test.ts", - "./vs/base/test/common/diff/diff.test.ts", - "./vs/base/test/common/errors.test.ts", - "./vs/base/test/common/event.test.ts", - "./vs/base/test/common/filters.perf.test.ts", - "./vs/base/test/common/filters.test.ts", - "./vs/base/test/common/hash.test.ts", - "./vs/base/test/common/history.test.ts", - "./vs/base/test/common/json.test.ts", - "./vs/base/test/common/jsonEdit.test.ts", - "./vs/base/test/common/jsonFormatter.test.ts", - "./vs/base/test/common/keyCodes.test.ts", - "./vs/base/test/common/labels.test.ts", - "./vs/base/test/common/lifecycle.test.ts", - "./vs/base/test/common/linkedList.test.ts", - "./vs/base/test/common/map.test.ts", - "./vs/base/test/common/marshalling.test.ts", - "./vs/base/test/common/mime.test.ts", - "./vs/base/test/common/objects.test.ts", - "./vs/base/test/common/octicon.test.ts", - "./vs/base/test/common/paging.test.ts", - "./vs/base/test/common/paths.test.ts", - "./vs/base/test/common/resources.test.ts", - "./vs/base/test/common/scrollable.test.ts", - "./vs/base/test/common/strings.test.ts", - "./vs/base/test/common/types.test.ts", - "./vs/base/test/common/uri.test.ts", - "./vs/base/test/common/utils.ts", - "./vs/base/test/common/uuid.test.ts", - "./vs/base/test/node/config.test.ts", - "./vs/base/test/node/console.test.ts", - "./vs/base/test/node/decoder.test.ts", - "./vs/base/test/node/encoding/encoding.test.ts", - "./vs/base/test/node/extfs/extfs.test.ts", - "./vs/base/test/node/flow.test.ts", - "./vs/base/test/node/glob.test.ts", - "./vs/base/test/node/id.test.ts", - "./vs/base/test/node/pfs.test.ts", - "./vs/base/test/node/port.test.ts", - "./vs/base/test/node/processes/fixtures/fork.ts", - "./vs/base/test/node/processes/fixtures/fork_large.ts", - "./vs/base/test/node/processes/processes.test.ts", - "./vs/base/test/node/storage/storage.test.ts", - "./vs/base/test/node/stream/stream.test.ts", - "./vs/base/test/node/uri.test.perf.ts", - "./vs/base/test/node/utils.ts", - "./vs/base/worker/defaultWorkerFactory.ts", - "./vs/base/worker/workerMain.ts", - "./vs/code/code.main.ts", - "./vs/code/electron-browser/issue/issueReporterMain.ts", - "./vs/code/electron-browser/issue/issueReporterModel.ts", - "./vs/code/electron-browser/issue/issueReporterPage.ts", - "./vs/code/electron-browser/issue/issueReporterUtil.ts", - "./vs/code/electron-browser/issue/test/testReporterModel.test.ts", - "./vs/code/electron-browser/processExplorer/processExplorerMain.ts", - "./vs/code/electron-browser/sharedProcess/contrib/contributions.ts", - "./vs/code/electron-browser/sharedProcess/contrib/languagePackCachedDataCleaner.ts", - "./vs/code/electron-browser/sharedProcess/contrib/logsDataCleaner.ts", - "./vs/code/electron-browser/sharedProcess/contrib/nodeCachedDataCleaner.ts", - "./vs/code/electron-browser/sharedProcess/contrib/storageDataCleaner.ts", - "./vs/code/electron-browser/sharedProcess/sharedProcessMain.ts", - "./vs/code/electron-main/auth.ts", - "./vs/code/electron-main/keyboard.ts", - "./vs/code/electron-main/logUploader.ts", - "./vs/code/electron-main/sharedProcess.ts", - "./vs/code/electron-main/theme.ts", - "./vs/code/node/cli.ts", - "./vs/code/node/cliProcessMain.ts", - "./vs/code/node/paths.ts", - "./vs/code/node/shellEnv.ts", - "./vs/code/node/wait.ts", - "./vs/code/node/windowsFinder.ts", - "./vs/code/test/node/argv.test.ts", - "./vs/code/test/node/windowsFinder.test.ts", "./vs/editor/contrib/bracketMatching/bracketMatching.ts", "./vs/editor/contrib/bracketMatching/test/bracketMatching.test.ts", "./vs/editor/contrib/caretOperations/caretOperations.ts", @@ -174,7 +55,6 @@ "./vs/editor/contrib/cursorUndo/cursorUndo.ts", "./vs/editor/contrib/dnd/dnd.ts", "./vs/editor/contrib/dnd/dragAndDropCommand.ts", - "./vs/editor/contrib/documentSymbols/outlineModel.ts", "./vs/editor/contrib/find/findController.ts", "./vs/editor/contrib/find/findDecorations.ts", "./vs/editor/contrib/find/findModel.ts", @@ -259,6 +139,11 @@ "./vs/editor/standalone/browser/colorizer.ts", "./vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.ts", "./vs/editor/standalone/browser/inspectTokens/inspectTokens.ts", + "./vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts", + "./vs/editor/standalone/browser/quickOpen/gotoLine.ts", + "./vs/editor/standalone/browser/quickOpen/quickCommand.ts", + "./vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts", + "./vs/editor/standalone/browser/quickOpen/quickOutline.ts", "./vs/editor/standalone/browser/simpleServices.ts", "./vs/editor/standalone/browser/standaloneCodeEditor.ts", "./vs/editor/standalone/browser/standaloneCodeServiceImpl.ts", @@ -513,9 +398,35 @@ "./vs/vscode.proposed.d.ts", "./vs/workbench/api/common/configurationExtensionPoint.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/mainThreadDiagnostics.ts", + "./vs/workbench/api/electron-browser/mainThreadErrors.ts", + "./vs/workbench/api/electron-browser/mainThreadFileSystem.ts", + "./vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts", + "./vs/workbench/api/electron-browser/mainThreadLanguages.ts", + "./vs/workbench/api/electron-browser/mainThreadLogService.ts", + "./vs/workbench/api/electron-browser/mainThreadProgress.ts", + "./vs/workbench/api/electron-browser/mainThreadStatusBar.ts", + "./vs/workbench/api/electron-browser/mainThreadStorage.ts", + "./vs/workbench/api/electron-browser/mainThreadTelemetry.ts", + "./vs/workbench/api/electron-browser/mainThreadUrls.ts", + "./vs/workbench/api/electron-browser/mainThreadWindow.ts", + "./vs/workbench/api/electron-browser/mainThreadWorkspace.ts", + "./vs/workbench/api/node/extHost.protocol.ts", + "./vs/workbench/api/node/extHostClipboard.ts", + "./vs/workbench/api/node/extHostDialogs.ts", "./vs/workbench/api/node/extHostExtensionActivator.ts", + "./vs/workbench/api/node/extHostHeapService.ts", + "./vs/workbench/api/node/extHostLogService.ts", + "./vs/workbench/api/node/extHostMessageService.ts", + "./vs/workbench/api/node/extHostOutputService.ts", "./vs/workbench/api/node/extHostSearch.fileIndex.ts", + "./vs/workbench/api/node/extHostStorage.ts", "./vs/workbench/api/node/extHostTypes.ts", + "./vs/workbench/api/node/extHostUrls.ts", + "./vs/workbench/api/node/extHostWindow.ts", "./vs/workbench/api/shared/editor.ts", "./vs/workbench/api/shared/tasks.ts", "./vs/workbench/browser/actions.ts", @@ -535,19 +446,12 @@ "./vs/workbench/browser/parts/editor/breadcrumbsModel.ts", "./vs/workbench/browser/parts/editor/editor.ts", "./vs/workbench/browser/parts/editor/editorControl.ts", + "./vs/workbench/browser/parts/editor/editorPicker.ts", "./vs/workbench/browser/parts/editor/editorWidgets.ts", "./vs/workbench/browser/parts/editor/rangeDecorations.ts", "./vs/workbench/browser/parts/editor/resourceViewer.ts", "./vs/workbench/browser/parts/editor/sideBySideEditor.ts", "./vs/workbench/browser/parts/editor/textEditor.ts", - "./vs/workbench/browser/parts/notifications/notificationsActions.ts", - "./vs/workbench/browser/parts/notifications/notificationsAlerts.ts", - "./vs/workbench/browser/parts/notifications/notificationsCenter.ts", - "./vs/workbench/browser/parts/notifications/notificationsCommands.ts", - "./vs/workbench/browser/parts/notifications/notificationsList.ts", - "./vs/workbench/browser/parts/notifications/notificationsStatus.ts", - "./vs/workbench/browser/parts/notifications/notificationsToasts.ts", - "./vs/workbench/browser/parts/notifications/notificationsViewer.ts", "./vs/workbench/browser/parts/quickinput/quickInputBox.ts", "./vs/workbench/browser/parts/quickinput/quickInputList.ts", "./vs/workbench/browser/parts/quickinput/quickInputUtils.ts", @@ -558,6 +462,7 @@ "./vs/workbench/browser/parts/views/panelViewlet.ts", "./vs/workbench/browser/parts/views/views.ts", "./vs/workbench/browser/parts/views/viewsViewlet.ts", + "./vs/workbench/browser/quickopen.ts", "./vs/workbench/browser/viewlet.ts", "./vs/workbench/browser/workbench.contribution.ts", "./vs/workbench/common/actions.ts", @@ -570,7 +475,6 @@ "./vs/workbench/common/editor/dataUriEditorInput.ts", "./vs/workbench/common/editor/diffEditorModel.ts", "./vs/workbench/common/editor/editorGroup.ts", - "./vs/workbench/common/extensionHostProtocol.ts", "./vs/workbench/common/memento.ts", "./vs/workbench/common/notifications.ts", "./vs/workbench/common/panel.ts", @@ -578,191 +482,163 @@ "./vs/workbench/common/theme.ts", "./vs/workbench/common/viewlet.ts", "./vs/workbench/common/views.ts", - "./vs/workbench/electron-browser/actions/developerActions", - "./vs/workbench/electron-browser/actions/developerActions.ts", - "./vs/workbench/electron-browser/actions/helpActions", - "./vs/workbench/electron-browser/actions/helpActions.ts", - "./vs/workbench/electron-browser/actions/windowActions", - "./vs/workbench/electron-browser/actions/windowActions.ts", "./vs/workbench/electron-browser/resources.ts", "./vs/workbench/electron-browser/window.ts", - "./vs/workbench/parts/backup/common/backupRestorer.ts", - "./vs/workbench/parts/cli/electron-browser/cli.contribution.ts", - "./vs/workbench/parts/codeEditor/browser/menuPreventer.ts", - "./vs/workbench/parts/codeEditor/browser/simpleEditorOptions.ts", - "./vs/workbench/parts/codeEditor/electron-browser/accessibility.ts", - "./vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.ts", - "./vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts", - "./vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts", - "./vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts", - "./vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions.ts", - "./vs/workbench/parts/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts", - "./vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts", - "./vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.ts", - "./vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts", - "./vs/workbench/parts/codeEditor/electron-browser/toggleMultiCursorModifier.ts", - "./vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts", - "./vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts", - "./vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts", - "./vs/workbench/parts/comments/common/commentModel.ts", - "./vs/workbench/parts/comments/electron-browser/commentGlyphWidget.ts", - "./vs/workbench/parts/comments/electron-browser/simpleCommentEditor.ts", - "./vs/workbench/parts/debug/browser/debugANSIHandling.ts", - "./vs/workbench/parts/debug/browser/linkDetector.ts", - "./vs/workbench/parts/debug/node/telemetryApp.ts", - "./vs/workbench/parts/emmet/browser/actions/showEmmetCommands.ts", - "./vs/workbench/parts/emmet/browser/emmet.browser.contribution.ts", - "./vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts", - "./vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts", - "./vs/workbench/parts/emmet/electron-browser/emmetActions.ts", - "./vs/workbench/parts/emmet/test/electron-browser/emmetAction.test.ts", - "./vs/workbench/parts/execution/common/execution.ts", - "./vs/workbench/parts/execution/electron-browser/execution.contribution.ts", - "./vs/workbench/parts/execution/electron-browser/terminal.ts", - "./vs/workbench/parts/execution/electron-browser/terminalService.ts", - "./vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts", - "./vs/workbench/parts/experiments/electron-browser/experimentalPrompt.ts", - "./vs/workbench/parts/experiments/electron-browser/experiments.contribution.ts", - "./vs/workbench/parts/experiments/node/experimentService.ts", - "./vs/workbench/parts/extensions/browser/extensionsViewer.ts", - "./vs/workbench/parts/extensions/common/extensionQuery.ts", - "./vs/workbench/parts/extensions/common/extensions.ts", - "./vs/workbench/parts/extensions/common/extensionsFileTemplate.ts", - "./vs/workbench/parts/extensions/common/extensionsInput.ts", - "./vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts", - "./vs/workbench/parts/extensions/electron-browser/extensionsActions.ts", - "./vs/workbench/parts/extensions/electron-browser/extensionsActivationProgress.ts", - "./vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts", - "./vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts", - "./vs/workbench/parts/extensions/test/common/extensionQuery.test.ts", - "./vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts", - "./vs/workbench/parts/feedback/electron-browser/feedback.ts", - "./vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts", - "./vs/workbench/parts/files/browser/files.ts", - "./vs/workbench/parts/files/common/explorerModel.ts", - "./vs/workbench/parts/files/common/files.ts", - "./vs/workbench/parts/files/electron-browser/explorerService.ts", - "./vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts", - "./vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts", - "./vs/workbench/parts/localizations/electron-browser/localizationsActions.ts", - "./vs/workbench/parts/logs/common/logConstants.ts", - "./vs/workbench/parts/logs/electron-browser/logs.contribution.ts", - "./vs/workbench/parts/logs/electron-browser/logsActions.ts", - "./vs/workbench/parts/markers/electron-browser/constants.ts", - "./vs/workbench/parts/markers/electron-browser/markers.ts", - "./vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts", - "./vs/workbench/parts/markers/electron-browser/markersFilterOptions.ts", - "./vs/workbench/parts/markers/electron-browser/markersModel.ts", - "./vs/workbench/parts/markers/electron-browser/markersPanelActions.ts", - "./vs/workbench/parts/markers/electron-browser/messages.ts", - "./vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts", - "./vs/workbench/parts/outline/electron-browser/outline.ts", - "./vs/workbench/parts/output/common/output.ts", - "./vs/workbench/parts/output/common/outputLinkComputer.ts", - "./vs/workbench/parts/output/common/outputLinkProvider.ts", - "./vs/workbench/parts/performance/electron-browser/startupTimings.ts", - "./vs/workbench/parts/preferences/browser/settingsWidgets.ts", - "./vs/workbench/parts/preferences/common/smartSnippetInserter.ts", - "./vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts", - "./vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts", - "./vs/workbench/parts/scm/common/scm.ts", - "./vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts", - "./vs/workbench/parts/scm/electron-browser/scmActivity.ts", - "./vs/workbench/parts/scm/electron-browser/scmMenus.ts", - "./vs/workbench/parts/scm/electron-browser/scmUtil.ts", - "./vs/workbench/parts/search/browser/patternInputWidget.ts", - "./vs/workbench/parts/search/browser/replaceContributions.ts", - "./vs/workbench/parts/search/browser/replaceService.ts", - "./vs/workbench/parts/search/common/constants.ts", - "./vs/workbench/parts/search/common/queryBuilder.ts", - "./vs/workbench/parts/search/common/replace.ts", - "./vs/workbench/parts/search/common/search.ts", - "./vs/workbench/parts/search/common/searchModel.ts", - "./vs/workbench/parts/search/test/browser/mockSearchTree.ts", - "./vs/workbench/parts/search/test/common/searchModel.test.ts", - "./vs/workbench/parts/search/test/common/searchResult.test.ts", - "./vs/workbench/parts/snippets/electron-browser/configureSnippets.ts", - "./vs/workbench/parts/snippets/electron-browser/insertSnippet.ts", - "./vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider.ts", - "./vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts", - "./vs/workbench/parts/snippets/electron-browser/snippetsFile.ts", - "./vs/workbench/parts/snippets/electron-browser/snippetsService.ts", - "./vs/workbench/parts/snippets/electron-browser/tabCompletion.ts", - "./vs/workbench/parts/snippets/test/electron-browser/snippetFile.test.ts", - "./vs/workbench/parts/snippets/test/electron-browser/snippetsRegistry.test.ts", - "./vs/workbench/parts/snippets/test/electron-browser/snippetsRewrite.test.ts", - "./vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts", - "./vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts", - "./vs/workbench/parts/stats/node/stats.contribution.ts", - "./vs/workbench/parts/stats/node/workspaceStats.ts", - "./vs/workbench/parts/stats/test/workspaceStats.test.ts", - "./vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts", - "./vs/workbench/parts/surveys/electron-browser/nps.contribution.ts", - "./vs/workbench/parts/tasks/common/problemCollectors.ts", - "./vs/workbench/parts/tasks/common/problemMatcher.ts", - "./vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts", - "./vs/workbench/parts/tasks/common/taskService.ts", - "./vs/workbench/parts/tasks/common/taskSystem.ts", - "./vs/workbench/parts/tasks/common/taskTemplates.ts", - "./vs/workbench/parts/tasks/common/tasks.ts", - "./vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts", - "./vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.ts", - "./vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts", - "./vs/workbench/parts/tasks/electron-browser/runAutomaticTasks.ts", - "./vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts", - "./vs/workbench/parts/tasks/node/processRunnerDetector.ts", - "./vs/workbench/parts/tasks/node/processTaskSystem.ts", - "./vs/workbench/parts/tasks/node/taskConfiguration.ts", - "./vs/workbench/parts/tasks/node/tasks.ts", - "./vs/workbench/parts/tasks/test/common/problemMatcher.test.ts", - "./vs/workbench/parts/tasks/test/electron-browser/configuration.test.ts", - "./vs/workbench/parts/terminal/browser/terminalFindWidget.ts", - "./vs/workbench/parts/terminal/browser/terminalTab.ts", - "./vs/workbench/parts/terminal/browser/terminalWidgetManager.ts", - "./vs/workbench/parts/terminal/common/terminal.ts", - "./vs/workbench/parts/terminal/common/terminalColorRegistry.ts", - "./vs/workbench/parts/terminal/common/terminalCommands.ts", - "./vs/workbench/parts/terminal/common/terminalMenu.ts", - "./vs/workbench/parts/terminal/common/terminalService.ts", - "./vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts", - "./vs/workbench/parts/terminal/electron-browser/terminalInstance.ts", - "./vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts", - "./vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts", - "./vs/workbench/parts/terminal/node/terminal.ts", - "./vs/workbench/parts/terminal/node/terminalCommandTracker.ts", - "./vs/workbench/parts/terminal/node/terminalEnvironment.ts", - "./vs/workbench/parts/terminal/node/terminalProcess.ts", - "./vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts", - "./vs/workbench/parts/terminal/node/windowsShellHelper.ts", - "./vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts", - "./vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts", - "./vs/workbench/parts/terminal/test/electron-browser/terminalLinkHandler.test.ts", - "./vs/workbench/parts/terminal/test/node/terminalCommandTracker.test.ts", - "./vs/workbench/parts/terminal/test/node/terminalEnvironment.test.ts", - "./vs/workbench/parts/themes/electron-browser/themes.contribution.ts", - "./vs/workbench/parts/url/electron-browser/url.contribution.ts", - "./vs/workbench/parts/webview/electron-browser/webviewProtocols.ts", - "./vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts", - "./vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts", - "./vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.ts", - "./vs/workbench/parts/welcome/gettingStarted/test/common/gettingStarted.test.ts", - "./vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts", - "./vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.ts", - "./vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts", - "./vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts", - "./vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.ts", - "./vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.ts", - "./vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts", - "./vs/workbench/parts/welcome/walkThrough/node/walkThroughContentProvider.ts", - "./vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts", - "./vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts", + "./vs/workbench/contrib/backup/common/backupRestorer.ts", + "./vs/workbench/contrib/cli/electron-browser/cli.contribution.ts", + "./vs/workbench/contrib/codeEditor/browser/menuPreventer.ts", + "./vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/accessibility.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/inspectKeybindings.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/largeFileOptimizations.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/textMate/inspectTMScopes.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/toggleMinimap.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/toggleMultiCursorModifier.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/toggleRenderControlCharacter.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/toggleRenderWhitespace.ts", + "./vs/workbench/contrib/codeEditor/electron-browser/toggleWordWrap.ts", + "./vs/workbench/contrib/comments/common/commentModel.ts", + "./vs/workbench/contrib/comments/electron-browser/commentGlyphWidget.ts", + "./vs/workbench/contrib/comments/electron-browser/commentService.ts", + "./vs/workbench/contrib/comments/electron-browser/simpleCommentEditor.ts", + "./vs/workbench/contrib/debug/browser/debugANSIHandling.ts", + "./vs/workbench/contrib/debug/browser/linkDetector.ts", + "./vs/workbench/contrib/debug/common/debugProtocol.d.ts", + "./vs/workbench/contrib/debug/node/telemetryApp.ts", + "./vs/workbench/contrib/debug/test/common/mockDebug.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/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/electron-browser/extensionTipsService.ts", + "./vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts", + "./vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts", + "./vs/workbench/contrib/extensions/electron-browser/extensionsUtils.ts", + "./vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts", + "./vs/workbench/contrib/extensions/test/common/extensionQuery.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/files/browser/files.ts", + "./vs/workbench/contrib/files/common/explorerModel.ts", + "./vs/workbench/contrib/files/common/files.ts", + "./vs/workbench/contrib/files/electron-browser/explorerService.ts", + "./vs/workbench/contrib/files/electron-browser/views/explorerDecorationsProvider.ts", + "./vs/workbench/contrib/localizations/electron-browser/localizations.contribution.ts", + "./vs/workbench/contrib/localizations/electron-browser/localizationsActions.ts", + "./vs/workbench/contrib/logs/common/logConstants.ts", + "./vs/workbench/contrib/logs/electron-browser/logs.contribution.ts", + "./vs/workbench/contrib/logs/electron-browser/logsActions.ts", + "./vs/workbench/contrib/markers/electron-browser/constants.ts", + "./vs/workbench/contrib/markers/electron-browser/markers.ts", + "./vs/workbench/contrib/markers/electron-browser/markersFileDecorations.ts", + "./vs/workbench/contrib/markers/electron-browser/markersFilterOptions.ts", + "./vs/workbench/contrib/markers/electron-browser/markersModel.ts", + "./vs/workbench/contrib/markers/electron-browser/markersPanelActions.ts", + "./vs/workbench/contrib/markers/electron-browser/messages.ts", + "./vs/workbench/contrib/markers/test/electron-browser/markersModel.test.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/performance/electron-browser/startupTimings.ts", + "./vs/workbench/contrib/preferences/browser/settingsWidgets.ts", + "./vs/workbench/contrib/preferences/common/smartSnippetInserter.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/common/scm.ts", + "./vs/workbench/contrib/scm/common/scmService.ts", + "./vs/workbench/contrib/scm/electron-browser/dirtydiffDecorator.ts", + "./vs/workbench/contrib/scm/electron-browser/scmActivity.ts", + "./vs/workbench/contrib/scm/electron-browser/scmMenus.ts", + "./vs/workbench/contrib/scm/electron-browser/scmUtil.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/searchModel.ts", + "./vs/workbench/contrib/search/test/browser/mockSearchTree.ts", + "./vs/workbench/contrib/search/test/browser/openFileHandler.test.ts", + "./vs/workbench/contrib/search/test/common/searchModel.test.ts", + "./vs/workbench/contrib/search/test/common/searchResult.test.ts", + "./vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts", + "./vs/workbench/contrib/stats/node/stats.contribution.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/tasks/browser/quickOpen.ts", + "./vs/workbench/contrib/tasks/browser/taskQuickOpen.ts", + "./vs/workbench/contrib/tasks/common/problemCollectors.ts", + "./vs/workbench/contrib/tasks/common/problemMatcher.ts", + "./vs/workbench/contrib/tasks/common/taskDefinitionRegistry.ts", + "./vs/workbench/contrib/tasks/common/taskService.ts", + "./vs/workbench/contrib/tasks/common/taskSystem.ts", + "./vs/workbench/contrib/tasks/common/taskTemplates.ts", + "./vs/workbench/contrib/tasks/common/tasks.ts", + "./vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts", + "./vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts", + "./vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts", + "./vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts", + "./vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts", + "./vs/workbench/contrib/tasks/node/processRunnerDetector.ts", + "./vs/workbench/contrib/tasks/node/processTaskSystem.ts", + "./vs/workbench/contrib/tasks/node/taskConfiguration.ts", + "./vs/workbench/contrib/tasks/node/tasks.ts", + "./vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts", + "./vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts", + "./vs/workbench/contrib/terminal/browser/terminalFindWidget.ts", + "./vs/workbench/contrib/terminal/browser/terminalQuickOpen.ts", + "./vs/workbench/contrib/terminal/browser/terminalTab.ts", + "./vs/workbench/contrib/terminal/browser/terminalWidgetManager.ts", + "./vs/workbench/contrib/terminal/common/terminal.ts", + "./vs/workbench/contrib/terminal/common/terminalColorRegistry.ts", + "./vs/workbench/contrib/terminal/common/terminalCommands.ts", + "./vs/workbench/contrib/terminal/common/terminalMenu.ts", + "./vs/workbench/contrib/terminal/common/terminalService.ts", + "./vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper.ts", + "./vs/workbench/contrib/terminal/electron-browser/terminalInstance.ts", + "./vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler.ts", + "./vs/workbench/contrib/terminal/electron-browser/terminalProcessManager.ts", + "./vs/workbench/contrib/terminal/node/terminal.ts", + "./vs/workbench/contrib/terminal/node/terminalCommandTracker.ts", + "./vs/workbench/contrib/terminal/node/terminalEnvironment.ts", + "./vs/workbench/contrib/terminal/node/terminalProcess.ts", + "./vs/workbench/contrib/terminal/node/terminalProcessExtHostProxy.ts", + "./vs/workbench/contrib/terminal/node/windowsShellHelper.ts", + "./vs/workbench/contrib/terminal/test/electron-browser/terminalColorRegistry.test.ts", + "./vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts", + "./vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts", + "./vs/workbench/contrib/terminal/test/node/terminalCommandTracker.test.ts", + "./vs/workbench/contrib/terminal/test/node/terminalEnvironment.test.ts", + "./vs/workbench/contrib/themes/electron-browser/themes.contribution.ts", + "./vs/workbench/contrib/url/electron-browser/url.contribution.ts", + "./vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts", "./vs/workbench/services/activity/common/activity.ts", "./vs/workbench/services/backup/common/backup.ts", "./vs/workbench/services/backup/node/backupFileService.ts", "./vs/workbench/services/bulkEdit/electron-browser/bulkEditService.ts", - "./vs/workbench/services/codeEditor/browser/codeEditorService.ts", - "./vs/workbench/services/commands/common/commandService.ts", - "./vs/workbench/services/commands/test/common/commandService.test.ts", "./vs/workbench/services/configuration/common/configuration.ts", "./vs/workbench/services/configuration/common/configurationModels.ts", "./vs/workbench/services/configuration/common/jsonEditing.ts", @@ -778,6 +654,9 @@ "./vs/workbench/services/decorations/test/browser/decorationsService.test.ts", "./vs/workbench/services/dialogs/electron-browser/dialogService.ts", "./vs/workbench/services/editor/common/editorService.ts", + "./vs/workbench/services/editor/common/editorGroupsService.ts", + "./vs/workbench/services/editor/browser/codeEditorService.ts", + "./vs/workbench/services/extensions/common/extensionHostProtocol.ts", "./vs/workbench/services/extensions/common/extensions.ts", "./vs/workbench/services/extensions/common/extensionsRegistry.ts", "./vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts", @@ -793,30 +672,12 @@ "./vs/workbench/services/extensions/test/node/rpcProtocol.test.ts", "./vs/workbench/services/files/electron-browser/encoding.ts", "./vs/workbench/services/files/electron-browser/streams.ts", - "./vs/workbench/services/files/node/watcher/common.ts", - "./vs/workbench/services/files/node/watcher/nsfw/nsfwWatcherService.ts", - "./vs/workbench/services/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts", - "./vs/workbench/services/files/node/watcher/nsfw/watcher.ts", - "./vs/workbench/services/files/node/watcher/nsfw/watcherApp.ts", - "./vs/workbench/services/files/node/watcher/nsfw/watcherIpc.ts", - "./vs/workbench/services/files/node/watcher/nsfw/watcherService.ts", - "./vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts", - "./vs/workbench/services/files/node/watcher/unix/test/chockidarWatcherService.test.ts", - "./vs/workbench/services/files/node/watcher/unix/watcher.ts", - "./vs/workbench/services/files/node/watcher/unix/watcherApp.ts", - "./vs/workbench/services/files/node/watcher/unix/watcherIpc.ts", - "./vs/workbench/services/files/node/watcher/unix/watcherService.ts", - "./vs/workbench/services/files/node/watcher/win32/csharpWatcherService.ts", - "./vs/workbench/services/files/node/watcher/win32/watcherService.ts", "./vs/workbench/services/files/test/electron-browser/utils.ts", "./vs/workbench/services/files/test/electron-browser/watcher.test.ts", - "./vs/workbench/services/group/common/editorGroupsService.ts", "./vs/workbench/services/hash/common/hashService.ts", "./vs/workbench/services/hash/node/hashService.ts", "./vs/workbench/services/history/common/history.ts", "./vs/workbench/services/history/electron-browser/history.ts", - "./vs/workbench/services/issue/common/issue.ts", - "./vs/workbench/services/issue/electron-browser/workbenchIssueService.ts", "./vs/workbench/services/jsonschemas/common/jsonValidationExtensionPoint.ts", "./vs/workbench/services/keybinding/common/keybindingIO.ts", "./vs/workbench/services/keybinding/common/keyboardMapper.ts", @@ -841,8 +702,6 @@ "./vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl.ts", "./vs/workbench/services/remote/node/remoteAgentEnvironmentChannel.ts", "./vs/workbench/services/remote/node/remoteAgentService.ts", - "./vs/workbench/services/scm/common/scm.ts", - "./vs/workbench/services/scm/common/scmService.ts", "./vs/workbench/services/search/common/searchHelpers.ts", "./vs/workbench/services/search/node/fileSearch.ts", "./vs/workbench/services/search/node/fileSearchManager.ts", @@ -869,16 +728,6 @@ "./vs/workbench/services/textMate/electron-browser/textMateService.ts", "./vs/workbench/services/textfile/common/textfiles.ts", "./vs/workbench/services/textfile/electron-browser/textResourcePropertiesService.ts", - "./vs/workbench/services/themes/common/colorExtensionPoint.ts", - "./vs/workbench/services/themes/common/colorThemeSchema.ts", - "./vs/workbench/services/themes/common/fileIconThemeSchema.ts", - "./vs/workbench/services/themes/common/workbenchThemeService.ts", - "./vs/workbench/services/themes/electron-browser/colorThemeData.ts", - "./vs/workbench/services/themes/electron-browser/colorThemeStore.ts", - "./vs/workbench/services/themes/electron-browser/fileIconThemeData.ts", - "./vs/workbench/services/themes/electron-browser/fileIconThemeStore.ts", - "./vs/workbench/services/themes/electron-browser/themeCompatibility.ts", - "./vs/workbench/services/themes/electron-browser/workbenchThemeService.ts", "./vs/workbench/services/timer/electron-browser/timerService.ts", "./vs/workbench/services/title/common/titleService.ts", "./vs/workbench/services/viewlet/browser/viewlet.ts", @@ -888,7 +737,10 @@ "./vs/workbench/test/common/editor/editorOptions.test.ts", "./vs/workbench/test/common/notifications.test.ts", "./vs/workbench/test/electron-browser/api/extHostTypes.test.ts", - "./vs/workbench/test/electron-browser/api/mock.ts" + "./vs/workbench/test/electron-browser/api/mainThreadCommands.test.ts", + "./vs/workbench/test/electron-browser/api/mainThreadDiagnostics.test.ts", + "./vs/workbench/test/electron-browser/api/mock.ts", + "./vs/workbench/test/electron-browser/api/testRPCProtocol.ts" ], "exclude": [ "./typings/require-monaco.d.ts" diff --git a/src/typings/electron.d.ts b/src/typings/electron.d.ts index 8f72a1bc565..50fb0d3e4f4 100644 --- a/src/typings/electron.d.ts +++ b/src/typings/electron.d.ts @@ -1,4 +1,4 @@ -// Type definitions for Electron 3.1.2 +// Type definitions for Electron 3.1.3 // Project: http://electronjs.org/ // Definitions by: The Electron Team // Definitions: https://github.com/electron/electron-typescript-definitions @@ -7869,6 +7869,11 @@ declare namespace Electron { * Should only be specified for checkbox or radio type menu items. */ checked?: boolean; + /** + * If false, the accelerator won't be registered with the system, but it will still + * be displayed. Defaults to true. + */ + registerAccelerator?: boolean; /** * Should be specified for submenu type menu items. If submenu is specified, the * type: 'submenu' can be omitted. If the value is not a then it will be diff --git a/src/typings/es6-promise.d.ts b/src/typings/es6-promise.d.ts index f674baa6a87..2d3271e2848 100644 --- a/src/typings/es6-promise.d.ts +++ b/src/typings/es6-promise.d.ts @@ -44,7 +44,12 @@ declare namespace Promise { * Make a new promise from the thenable. * A thenable is promise-like in as far as it has a "then" method. */ - function resolve(value?: T | Thenable): Promise; + function resolve(value: T | Thenable): Promise; + + /** + * + */ + function resolve(): Promise; /** * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error diff --git a/src/vs/base/browser/ui/findinput/findInput.ts b/src/vs/base/browser/ui/findinput/findInput.ts index 8688e319cb7..c0835afdba4 100644 --- a/src/vs/base/browser/ui/findinput/findInput.ts +++ b/src/vs/base/browser/ui/findinput/findInput.ts @@ -32,7 +32,7 @@ export interface IFindInputOptions extends IFindInputStyles { } export interface IFindInputStyles extends IInputBoxStyles { - inputActiveOptionBorder?: Color | null; + inputActiveOptionBorder?: Color; } const NLS_DEFAULT_LABEL = nls.localize('defaultLabel', "input"); @@ -48,20 +48,20 @@ export class FindInput extends Widget { private label: string; private fixFocusOnOptionClickEnabled = true; - private inputActiveOptionBorder?: Color | null; - private inputBackground?: Color | null; - private inputForeground?: Color | null; - private inputBorder?: Color | null; + private inputActiveOptionBorder?: Color; + private inputBackground?: Color; + private inputForeground?: Color; + private inputBorder?: Color; - private inputValidationInfoBorder?: Color | null; - private inputValidationInfoBackground?: Color | null; - private inputValidationInfoForeground?: Color | null; - private inputValidationWarningBorder?: Color | null; - private inputValidationWarningBackground?: Color | null; - private inputValidationWarningForeground?: Color | null; - private inputValidationErrorBorder?: Color | null; - private inputValidationErrorBackground?: Color | null; - private inputValidationErrorForeground?: Color | null; + private inputValidationInfoBorder?: Color; + private inputValidationInfoBackground?: Color; + private inputValidationInfoForeground?: Color; + private inputValidationWarningBorder?: Color; + private inputValidationWarningBackground?: Color; + private inputValidationWarningForeground?: Color; + private inputValidationErrorBorder?: Color; + private inputValidationErrorBackground?: Color; + private inputValidationErrorForeground?: Color; private regex: RegexCheckbox; private wholeWords: WholeWordsCheckbox; @@ -202,7 +202,7 @@ export class FindInput extends Widget { protected applyStyles(): void { if (this.domNode) { const checkBoxStyles: ICheckboxStyles = { - inputActiveOptionBorder: this.inputActiveOptionBorder || undefined, + inputActiveOptionBorder: this.inputActiveOptionBorder, }; this.regex.style(checkBoxStyles); this.wholeWords.style(checkBoxStyles); @@ -313,7 +313,7 @@ export class FindInput extends Widget { this.regex = this._register(new RegexCheckbox({ appendTitle: appendRegexLabel, isChecked: false, - inputActiveOptionBorder: this.inputActiveOptionBorder || undefined + inputActiveOptionBorder: this.inputActiveOptionBorder })); this._register(this.regex.onChange(viaKeyboard => { this._onDidOptionChange.fire(viaKeyboard); @@ -330,7 +330,7 @@ export class FindInput extends Widget { this.wholeWords = this._register(new WholeWordsCheckbox({ appendTitle: appendWholeWordsLabel, isChecked: false, - inputActiveOptionBorder: this.inputActiveOptionBorder || undefined + inputActiveOptionBorder: this.inputActiveOptionBorder })); this._register(this.wholeWords.onChange(viaKeyboard => { this._onDidOptionChange.fire(viaKeyboard); @@ -344,7 +344,7 @@ export class FindInput extends Widget { this.caseSensitive = this._register(new CaseSensitiveCheckbox({ appendTitle: appendCaseSensitiveLabel, isChecked: false, - inputActiveOptionBorder: this.inputActiveOptionBorder || undefined + inputActiveOptionBorder: this.inputActiveOptionBorder })); this._register(this.caseSensitive.onChange(viaKeyboard => { this._onDidOptionChange.fire(viaKeyboard); diff --git a/src/vs/base/browser/ui/inputbox/inputBox.ts b/src/vs/base/browser/ui/inputbox/inputBox.ts index 201cda1388d..01fe9dcaa36 100644 --- a/src/vs/base/browser/ui/inputbox/inputBox.ts +++ b/src/vs/base/browser/ui/inputbox/inputBox.ts @@ -32,18 +32,18 @@ export interface IInputOptions extends IInputBoxStyles { } export interface IInputBoxStyles { - readonly inputBackground?: Color | null; - readonly inputForeground?: Color | null; - readonly inputBorder?: Color | null; - readonly inputValidationInfoBorder?: Color | null; - readonly inputValidationInfoBackground?: Color | null; - readonly inputValidationInfoForeground?: Color | null; - readonly inputValidationWarningBorder?: Color | null; - readonly inputValidationWarningBackground?: Color | null; - readonly inputValidationWarningForeground?: Color | null; - readonly inputValidationErrorBorder?: Color | null; - readonly inputValidationErrorBackground?: Color | null; - readonly inputValidationErrorForeground?: Color | null; + readonly inputBackground?: Color; + readonly inputForeground?: Color; + readonly inputBorder?: Color; + readonly inputValidationInfoBorder?: Color; + readonly inputValidationInfoBackground?: Color; + readonly inputValidationInfoForeground?: Color; + readonly inputValidationWarningBorder?: Color; + readonly inputValidationWarningBackground?: Color; + readonly inputValidationWarningForeground?: Color; + readonly inputValidationErrorBorder?: Color; + readonly inputValidationErrorBackground?: Color; + readonly inputValidationErrorForeground?: Color; } export interface IInputValidator { @@ -96,19 +96,19 @@ export class InputBox extends Widget { private state: string | null = 'idle'; private cachedHeight: number | null; - private inputBackground?: Color | null; - private inputForeground?: Color | null; - private inputBorder?: Color | null; + private inputBackground?: Color; + private inputForeground?: Color; + private inputBorder?: Color; - private inputValidationInfoBorder?: Color | null; - private inputValidationInfoBackground?: Color | null; - private inputValidationInfoForeground?: Color | null; - private inputValidationWarningBorder?: Color | null; - private inputValidationWarningBackground?: Color | null; - private inputValidationWarningForeground?: Color | null; - private inputValidationErrorBorder?: Color | null; - private inputValidationErrorBackground?: Color | null; - private inputValidationErrorForeground?: Color | null; + private inputValidationInfoBorder?: Color; + private inputValidationInfoBackground?: Color; + private inputValidationInfoForeground?: Color; + private inputValidationWarningBorder?: Color; + private inputValidationWarningBackground?: Color; + private inputValidationWarningForeground?: Color; + private inputValidationErrorBorder?: Color; + private inputValidationErrorBackground?: Color; + private inputValidationErrorForeground?: Color; private _onDidChange = this._register(new Emitter()); public readonly onDidChange: Event = this._onDidChange.event; diff --git a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css index dd24df5df23..e33663d34b1 100644 --- a/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css +++ b/src/vs/base/browser/ui/keybindingLabel/keybindingLabel.css @@ -20,6 +20,15 @@ color: #555; font-size: 11px; padding: 3px 5px; + margin: 0 2px; +} + +.monaco-keybinding > .monaco-keybinding-key:first-child { + margin-left: 0; +} + +.monaco-keybinding > .monaco-keybinding-key:last-child { + margin-right: 0; } .hc-black .monaco-keybinding > .monaco-keybinding-key, @@ -36,5 +45,5 @@ } .monaco-keybinding > .monaco-keybinding-key-chord-separator { - width: 2px; + width: 6px; } \ No newline at end of file diff --git a/src/vs/base/browser/ui/list/list.css b/src/vs/base/browser/ui/list/list.css index 666bdaa9167..73756ce7811 100644 --- a/src/vs/base/browser/ui/list/list.css +++ b/src/vs/base/browser/ui/list/list.css @@ -60,7 +60,7 @@ } /* Dnd */ -.monaco-list-drag-image { +.monaco-drag-image { display: inline-block; padding: 1px 7px; border-radius: 10px; diff --git a/src/vs/base/browser/ui/list/listView.ts b/src/vs/base/browser/ui/list/listView.ts index 40c16806df2..7cf3f8ec9b3 100644 --- a/src/vs/base/browser/ui/list/listView.ts +++ b/src/vs/base/browser/ui/list/listView.ts @@ -552,9 +552,9 @@ export class ListView implements ISpliceable, IDisposable { const uri = this.dnd.getDragURI(item.element); item.dragStartDisposable.dispose(); + item.row.domNode!.draggable = !!uri; if (uri) { - item.row.domNode!.draggable = true; const onDragStart = domEvent(item.row.domNode!, 'dragstart'); item.dragStartDisposable = onDragStart(event => this.onDragStart(item.element, uri, event)); } @@ -729,7 +729,7 @@ export class ListView implements ISpliceable, IDisposable { label = String(elements.length); } - const dragImage = DOM.$('.monaco-list-drag-image'); + const dragImage = DOM.$('.monaco-drag-image'); dragImage.textContent = label; document.body.appendChild(dragImage); event.dataTransfer.setDragImage(dragImage, -10, -10); diff --git a/src/vs/base/browser/ui/list/listWidget.ts b/src/vs/base/browser/ui/list/listWidget.ts index 53869580549..1d2c65d40d2 100644 --- a/src/vs/base/browser/ui/list/listWidget.ts +++ b/src/vs/base/browser/ui/list/listWidget.ts @@ -502,36 +502,33 @@ const DefaultOpenController: IOpenController = { } }; -class MouseController implements IDisposable { +export class MouseController implements IDisposable { private multipleSelectionSupport: boolean; readonly multipleSelectionController: IMultipleSelectionController; private openController: IOpenController; private disposables: IDisposable[] = []; - constructor( - private list: List, - private view: ListView, - options: IListOptions = {} - ) { - this.multipleSelectionSupport = !(options.multipleSelectionSupport === false); + constructor(protected list: List) { + this.multipleSelectionSupport = !(list.options.multipleSelectionSupport === false); if (this.multipleSelectionSupport) { - this.multipleSelectionController = options.multipleSelectionController || DefaultMultipleSelectionContoller; + this.multipleSelectionController = list.options.multipleSelectionController || DefaultMultipleSelectionContoller; } - this.openController = options.openController || DefaultOpenController; + this.openController = list.options.openController || DefaultOpenController; - view.onMouseDown(this.onMouseDown, this, this.disposables); - view.onContextMenu(this.onContextMenu, this, this.disposables); - view.onMouseClick(this.onPointer, this, this.disposables); - view.onMouseDblClick(this.onDoubleClick, this, this.disposables); - view.onTouchStart(this.onMouseDown, this, this.disposables); - view.onTap(this.onPointer, this, this.disposables); - Gesture.addTarget(view.domNode); + list.onMouseDown(this.onMouseDown, this, this.disposables); + list.onContextMenu(this.onContextMenu, this, this.disposables); + list.onMouseClick(this.onPointer, this, this.disposables); + list.onMouseMiddleClick(this.onPointer, this, this.disposables); + list.onMouseDblClick(this.onDoubleClick, this, this.disposables); + list.onTouchStart(this.onMouseDown, this, this.disposables); + list.onTap(this.onPointer, this, this.disposables); + Gesture.addTarget(list.getHTMLElement()); } - private isSelectionSingleChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { + protected isSelectionSingleChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { if (this.multipleSelectionController) { return this.multipleSelectionController.isSelectionSingleChangeEvent(event); } @@ -539,7 +536,7 @@ class MouseController implements IDisposable { return platform.isMacintosh ? event.browserEvent.metaKey : event.browserEvent.ctrlKey; } - private isSelectionRangeChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { + protected isSelectionRangeChangeEvent(event: IListMouseEvent | IListTouchEvent): boolean { if (this.multipleSelectionController) { return this.multipleSelectionController.isSelectionRangeChangeEvent(event); } @@ -553,16 +550,20 @@ class MouseController implements IDisposable { private onMouseDown(e: IListMouseEvent | IListTouchEvent): void { if (document.activeElement !== e.browserEvent.target) { - this.view.domNode.focus(); + this.list.domFocus(); } } - private onContextMenu(e: IListMouseEvent | IListTouchEvent): void { + private onContextMenu(e: IListContextMenuEvent): void { const focus = typeof e.index === 'undefined' ? [] : [e.index]; this.list.setFocus(focus, e.browserEvent); } - private onPointer(e: IListMouseEvent): void { + protected onPointer(e: IListMouseEvent): void { + if (isInputElement(e.browserEvent.target as HTMLElement)) { + return; + } + let reference = this.list.getFocus()[0]; const selection = this.list.getSelection(); reference = reference === undefined ? selection[0] : reference; @@ -595,6 +596,10 @@ class MouseController implements IDisposable { } private onDoubleClick(e: IListMouseEvent): void { + if (isInputElement(e.browserEvent.target as HTMLElement)) { + return; + } + if (this.multipleSelectionSupport && this.isSelectionChangeEvent(e)) { return; } @@ -699,14 +704,14 @@ export class DefaultStyleController implements IStyleController { if (styles.listFocusAndSelectionBackground) { content.push(` - .monaco-list-drag-image, + .monaco-drag-image, .monaco-list${suffix}:focus .monaco-list-row.selected.focused { background-color: ${styles.listFocusAndSelectionBackground}; } `); } if (styles.listFocusAndSelectionForeground) { content.push(` - .monaco-list-drag-image, + .monaco-drag-image, .monaco-list${suffix}:focus .monaco-list-row.selected.focused { color: ${styles.listFocusAndSelectionForeground}; } `); } @@ -739,7 +744,7 @@ export class DefaultStyleController implements IStyleController { if (styles.listFocusOutline) { content.push(` - .monaco-list-drag-image, + .monaco-drag-image, .monaco-list${suffix}:focus .monaco-list-row.focused { outline: 1px solid ${styles.listFocusOutline}; outline-offset: -1px; } `); } @@ -1213,7 +1218,7 @@ export class List implements ISpliceable, IDisposable { } if (typeof _options.mouseSupport === 'boolean' ? _options.mouseSupport : true) { - this.mouseController = new MouseController(this, this.view, _options); + this.mouseController = this.createMouseController(_options); this.disposables.push(this.mouseController); } @@ -1227,6 +1232,10 @@ export class List implements ISpliceable, IDisposable { this.style(_options); } + protected createMouseController(options: IListOptions): MouseController { + return new MouseController(this); + } + updateOptions(optionsUpdate: IListOptionsUpdate = {}): void { this._options = { ...this._options, ...optionsUpdate }; this._onDidUpdateOptions.fire(this._options); diff --git a/src/vs/base/browser/ui/menu/menu.css b/src/vs/base/browser/ui/menu/menu.css index 14ced9b853a..f1cdb6f3e45 100644 --- a/src/vs/base/browser/ui/menu/menu.css +++ b/src/vs/base/browser/ui/menu/menu.css @@ -117,7 +117,6 @@ /* Context Menu */ .context-view.monaco-menu-container { - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; outline: 0; border: none; -webkit-animation: fadeIn 0.083s linear; @@ -182,7 +181,6 @@ } .menubar .menubar-menu-items-holder.monaco-menu-container { - font-family: -apple-system, BlinkMacSystemFont, "Segoe WPC", "Segoe UI", "Ubuntu", "Droid Sans", sans-serif; outline: 0; border: none; } diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 0378c58d62f..0369a9baa6e 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -75,8 +75,8 @@ export class MenuBar extends Disposable { private _focusState: MenubarState; private actionRunner: IActionRunner; - private _onVisibilityChange: Emitter; - private _onFocusStateChange: Emitter; + private readonly _onVisibilityChange: Emitter; + private readonly _onFocusStateChange: Emitter; private numMenusShown: number; private menuStyle: IMenuStyles; diff --git a/src/vs/base/browser/ui/splitview/panelview.ts b/src/vs/base/browser/ui/splitview/panelview.ts index 18fecbbaafa..bc375e34a37 100644 --- a/src/vs/base/browser/ui/splitview/panelview.ts +++ b/src/vs/base/browser/ui/splitview/panelview.ts @@ -268,7 +268,7 @@ class PanelDraggable extends Disposable { e.dataTransfer.effectAllowed = 'move'; - const dragImage = append(document.body, $('.monaco-panel-drag-image', {}, this.panel.draggableElement.textContent || '')); + const dragImage = append(document.body, $('.monaco-drag-image', {}, this.panel.draggableElement.textContent || '')); e.dataTransfer.setDragImage(dragImage, -10, -10); setTimeout(() => document.body.removeChild(dragImage), 0); diff --git a/src/vs/base/browser/ui/tree/abstractTree.ts b/src/vs/base/browser/ui/tree/abstractTree.ts index 134044cfde3..ca9bf9d311e 100644 --- a/src/vs/base/browser/ui/tree/abstractTree.ts +++ b/src/vs/base/browser/ui/tree/abstractTree.ts @@ -5,13 +5,13 @@ import 'vs/css!./media/tree'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; -import { IListOptions, List, IListStyles, mightProducePrintableCharacter } from 'vs/base/browser/ui/list/listWidget'; -import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; -import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass } from 'vs/base/browser/dom'; +import { IListOptions, List, IListStyles, mightProducePrintableCharacter, MouseController } from 'vs/base/browser/ui/list/listWidget'; +import { IListVirtualDelegate, IListRenderer, IListMouseEvent, IListEvent, IListContextMenuEvent, IListDragAndDrop, IListDragOverReaction, IKeyboardNavigationLabelProvider, IIdentityProvider } from 'vs/base/browser/ui/list/list'; +import { append, $, toggleClass, getDomNodePagePosition, removeClass, addClass, hasClass } from 'vs/base/browser/dom'; import { Event, Relay, Emitter, EventBufferer } from 'vs/base/common/event'; import { StandardKeyboardEvent, IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter, ITreeNavigator, ICollapseStateChangeEvent, ITreeDragAndDrop, TreeDragOverBubble, TreeVisibility, TreeFilterResult } from 'vs/base/browser/ui/tree/tree'; +import { ITreeModel, ITreeNode, ITreeRenderer, ITreeEvent, ITreeMouseEvent, ITreeContextMenuEvent, ITreeFilter, ITreeNavigator, ICollapseStateChangeEvent, ITreeDragAndDrop, TreeDragOverBubble, TreeVisibility, TreeFilterResult, ITreeModelSpliceEvent } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; import { IDragAndDropData, StaticDND, DragAndDropData } from 'vs/base/browser/dnd'; import { range } from 'vs/base/common/arrays'; @@ -241,7 +241,7 @@ class TreeRenderer implements IListRenderer): void { @@ -531,7 +531,10 @@ class TypeFilterController implements IDisposable { this._pattern = pattern; this.filter.pattern = pattern; this.tree.refilter(); - this.tree.focusNext(0, true); + + if (pattern) { + this.tree.focusNext(0, true, undefined, node => !FuzzyScore.isDefault(node.filterData as any as FuzzyScore)); + } const focus = this.tree.getFocus(); @@ -648,6 +651,18 @@ class TypeFilterController implements IDisposable { this.labelDomNode.textContent = this.pattern.length > 16 ? '…' + this.pattern.substr(this.pattern.length - 16) : this.pattern; } + shouldAllowFocus(node: ITreeNode): boolean { + if (!this.enabled || !this.pattern || this.filterOnType) { + return true; + } + + if (this.filter.totalCount > 0 && this.filter.matchCount <= 1) { + return true; + } + + return !FuzzyScore.isDefault(node.filterData as any as FuzzyScore); + } + dispose() { this.disable(); this.disposables = dispose(this.disposables); @@ -697,6 +712,12 @@ export interface IAbstractTreeOptions extends IAbstractTr readonly dnd?: ITreeDragAndDrop; readonly autoExpandSingleChildren?: boolean; readonly keyboardNavigationEventFilter?: IKeyboardNavigationEventFilter; + readonly expandOnlyOnTwistieClick?: boolean; +} + +function dfs(node: ITreeNode, fn: (node: ITreeNode) => void): void { + fn(node); + node.children.forEach(child => dfs(child, fn)); } /** @@ -714,16 +735,14 @@ class Trait { private _nodeSet: Set> | undefined; private get nodeSet(): Set> { if (!this._nodeSet) { - this._nodeSet = new Set(); - - for (const node of this.nodes) { - this._nodeSet.add(node); - } + this._nodeSet = this.createNodeSet(); } return this._nodeSet; } + constructor(private identityProvider?: IIdentityProvider) { } + set(nodes: ITreeNode[], browserEvent?: UIEvent): void { this.nodes = [...nodes]; this.elements = undefined; @@ -745,27 +764,93 @@ class Trait { return this.nodeSet.has(node); } - remove(nodes: ITreeNode[]): void { - if (nodes.length === 0) { + onDidModelSplice({ insertedNodes, deletedNodes }: ITreeModelSpliceEvent): void { + if (!this.identityProvider) { + const set = this.createNodeSet(); + const visit = node => set.delete(node); + deletedNodes.forEach(node => dfs(node, visit)); + this.set(values(set)); return; } - const set = this.nodeSet; - const visit = (node: ITreeNode) => { - set.delete(node); - node.children.forEach(visit); - }; + const identityProvider = this.identityProvider; + const nodesByIdentity = new Map>(); + this.nodes.forEach(node => nodesByIdentity.set(identityProvider.getId(node.element).toString(), node)); - nodes.forEach(visit); - this.set(values(set)); + const toDeleteByIdentity = new Map>(); + const toRemoveSetter = node => toDeleteByIdentity.set(identityProvider.getId(node.element).toString(), node); + const toRemoveDeleter = node => toDeleteByIdentity.delete(identityProvider.getId(node.element).toString()); + deletedNodes.forEach(node => dfs(node, toRemoveSetter)); + insertedNodes.forEach(node => dfs(node, toRemoveDeleter)); + + toDeleteByIdentity.forEach((_, id) => nodesByIdentity.delete(id)); + this.set(values(nodesByIdentity)); } + + private createNodeSet(): Set> { + const set = new Set>(); + + for (const node of this.nodes) { + set.add(node); + } + + return set; + } +} + +class TreeNodeListMouseController extends MouseController> { + + constructor(list: TreeNodeList, private tree: AbstractTree) { + super(list); + } + + protected onPointer(e: IListMouseEvent>): void { + if (isInputElement(e.browserEvent.target as HTMLElement)) { + return; + } + + const node = e.element; + + if (!node) { + return super.onPointer(e); + } + + if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) { + return super.onPointer(e); + } + + const onTwistie = hasClass(e.browserEvent.target as HTMLElement, 'monaco-tl-twistie'); + + if (!this.tree.openOnSingleClick && e.browserEvent.detail !== 2 && !onTwistie) { + return super.onPointer(e); + } + + if (this.tree.expandOnlyOnTwistieClick && !onTwistie) { + return super.onPointer(e); + } + + const model = ((this.tree as any).model as ITreeModel); // internal + const location = model.getNodeLocation(node); + const recursive = e.browserEvent.altKey; + model.setCollapsed(location, undefined, recursive); + + if (this.tree.expandOnlyOnTwistieClick && onTwistie) { + return; + } + + super.onPointer(e); + } +} + +interface ITreeNodeListOptions extends IListOptions> { + readonly tree: AbstractTree; } /** * We use this List subclass to restore selection and focus as nodes * get rendered in the list, possibly due to a node expand() call. */ -class TreeNodeList extends List> { +class TreeNodeList extends List> { constructor( container: HTMLElement, @@ -773,11 +858,15 @@ class TreeNodeList extends List> { renderers: IListRenderer[], private focusTrait: Trait, private selectionTrait: Trait, - options?: IListOptions> + options: ITreeNodeListOptions ) { super(container, virtualDelegate, renderers, options); } + protected createMouseController(options: ITreeNodeListOptions): MouseController> { + return new TreeNodeListMouseController(this, options.tree); + } + splice(start: number, deleteCount: number, elements: ITreeNode[] = []): void { super.splice(start, deleteCount, elements); @@ -826,20 +915,20 @@ class TreeNodeList extends List> { export abstract class AbstractTree implements IDisposable { - private view: TreeNodeList; + private view: TreeNodeList; private renderers: TreeRenderer[]; - private focusNavigationFilter: ((node: ITreeNode) => boolean) | undefined; protected model: ITreeModel; - private focus = new Trait(); - private selection = new Trait(); + private focus: Trait; + private selection: Trait; private eventBufferer = new EventBufferer(); private typeFilterController?: TypeFilterController; + private focusNavigationFilter: ((node: ITreeNode) => boolean) | undefined; protected disposables: IDisposable[] = []; get onDidScroll(): Event { return this.view.onDidScroll; } - readonly onDidChangeFocus: Event> = this.eventBufferer.wrapEvent(this.focus.onDidChange); - readonly onDidChangeSelection: Event> = this.eventBufferer.wrapEvent(this.selection.onDidChange); + get onDidChangeFocus(): Event> { return this.eventBufferer.wrapEvent(this.focus.onDidChange); } + get onDidChangeSelection(): Event> { return this.eventBufferer.wrapEvent(this.selection.onDidChange); } get onDidOpen(): Event> { return Event.map(this.view.onDidOpen, asTreeEvent); } get onMouseClick(): Event> { return Event.map(this.view.onMouseClick, asTreeMouseEvent); } @@ -860,7 +949,10 @@ export abstract class AbstractTree implements IDisposable readonly onWillRefilter: Event = this._onWillRefilter.event; get filterOnType(): boolean { return !!this._options.filterOnType; } + + // Options TODO@joao expose options only, not Optional<> get openOnSingleClick(): boolean { return typeof this._options.openOnSingleClick === 'undefined' ? true : this._options.openOnSingleClick; } + get expandOnlyOnTwistieClick(): boolean { return typeof this._options.expandOnlyOnTwistieClick === 'undefined' ? false : this._options.expandOnlyOnTwistieClick; } get onDidDispose(): Event { return this.view.onDidDispose; } @@ -884,44 +976,17 @@ export abstract class AbstractTree implements IDisposable this.disposables.push(filter); } - this.view = new TreeNodeList(container, treeDelegate, this.renderers, this.focus, this.selection, asListOptions(() => this.model, _options)); + this.focus = new Trait(_options.identityProvider); + this.selection = new Trait(_options.identityProvider); + this.view = new TreeNodeList(container, treeDelegate, this.renderers, this.focus, this.selection, { ...asListOptions(() => this.model, _options), tree: this }); this.model = this.createModel(this.view, _options); onDidChangeCollapseStateRelay.input = this.model.onDidChangeCollapseState; - if (this.options.identityProvider) { - const identityProvider = this.options.identityProvider; - - this.model.onDidSplice(e => { - if (e.deletedNodes.length === 0) { - return; - } - - this.eventBufferer.bufferEvents(() => { - const map = new Map>(); - - for (const node of e.deletedNodes) { - map.set(identityProvider.getId(node.element).toString(), node); - } - - for (const node of e.insertedNodes) { - map.delete(identityProvider.getId(node.element).toString()); - } - - if (map.size === 0) { - return; - } - - const deletedNodes = values(map); - - this.focus.remove(deletedNodes); - this.selection.remove(deletedNodes); - }); - }, null, this.disposables); - } - - this.view.onTap(this.reactOnMouseClick, this, this.disposables); - this.view.onMouseClick(this.reactOnMouseClick, this, this.disposables); + this.model.onDidSplice(e => { + this.focus.onDidModelSplice(e); + this.selection.onDidModelSplice(e); + }, null, this.disposables); if (_options.keyboardSupport !== false) { const onKeyDown = Event.chain(this.view.onKeyDown) @@ -935,17 +1000,7 @@ export abstract class AbstractTree implements IDisposable if (_options.keyboardNavigationLabelProvider) { this.typeFilterController = new TypeFilterController(this, this.model, this.view, filter!, _options.keyboardNavigationLabelProvider); - this.focusNavigationFilter = node => { - if (!this.typeFilterController!.enabled || !this.typeFilterController!.pattern || this.typeFilterController!.filterOnType) { - return true; - } - - if (filter!.totalCount > 0 && filter!.matchCount <= 1) { - return true; - } - - return !FuzzyScore.isDefault(node.filterData as any as FuzzyScore); - }; + this.focusNavigationFilter = node => this.typeFilterController!.shouldAllowFocus(node); this.disposables.push(this.typeFilterController!); } } @@ -1101,28 +1156,28 @@ export abstract class AbstractTree implements IDisposable this.view.setFocus(indexes, browserEvent, true); } - focusNext(n = 1, loop = false, browserEvent?: UIEvent): void { - this.view.focusNext(n, loop, browserEvent, this.focusNavigationFilter); + focusNext(n = 1, loop = false, browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusNext(n, loop, browserEvent, filter); } - focusPrevious(n = 1, loop = false, browserEvent?: UIEvent): void { - this.view.focusPrevious(n, loop, browserEvent, this.focusNavigationFilter); + focusPrevious(n = 1, loop = false, browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusPrevious(n, loop, browserEvent, filter); } - focusNextPage(browserEvent?: UIEvent): void { - this.view.focusNextPage(browserEvent, this.focusNavigationFilter); + focusNextPage(browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusNextPage(browserEvent, filter); } - focusPreviousPage(browserEvent?: UIEvent): void { - this.view.focusPreviousPage(browserEvent, this.focusNavigationFilter); + focusPreviousPage(browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusPreviousPage(browserEvent, filter); } - focusLast(browserEvent?: UIEvent): void { - this.view.focusLast(browserEvent, this.focusNavigationFilter); + focusLast(browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusLast(browserEvent, filter); } - focusFirst(browserEvent?: UIEvent): void { - this.view.focusFirst(browserEvent, this.focusNavigationFilter); + focusFirst(browserEvent?: UIEvent, filter = this.focusNavigationFilter): void { + this.view.focusFirst(browserEvent, filter); } getFocus(): T[] { @@ -1164,27 +1219,6 @@ export abstract class AbstractTree implements IDisposable return this.view.length; } - private reactOnMouseClick(e: IListMouseEvent>): void { - const node = e.element; - - if (!node) { - return; - } - - if (this.view.multipleSelectionController.isSelectionRangeChangeEvent(e) || this.view.multipleSelectionController.isSelectionSingleChangeEvent(e)) { - return; - } - - if (!this.openOnSingleClick && e.browserEvent.detail !== 2) { - return; - } - - const location = this.model.getNodeLocation(node); - const recursive = e.browserEvent.altKey; - - this.model.setCollapsed(location, undefined, recursive); - } - private onLeftArrow(e: StandardKeyboardEvent): void { e.preventDefault(); e.stopPropagation(); diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index 4cc1d74e6b7..d0379e7b612 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -17,7 +17,7 @@ export interface IDataTreeOptions extends IAbstractTreeOp export interface IDataTreeViewState { readonly focus: string[]; readonly selection: string[]; - readonly collapsed: string[]; + readonly expanded: string[]; } export class DataTree extends AbstractTree { @@ -61,19 +61,22 @@ export class DataTree extends AbstractTree { const id = this.identityProvider!.getId(element).toString(); + return viewState.expanded.indexOf(id) === -1; + }; + + const onDidCreateNode = (node: ITreeNode) => { + const id = this.identityProvider!.getId(node.element).toString(); if (viewState.focus.indexOf(id) > -1) { - focus.push(element); + focus.push(node.element); } if (viewState.selection.indexOf(id) > -1) { - selection.push(element); + selection.push(node.element); } - - return id in viewState.collapsed; }; - this._refresh(input, isCollapsed); + this._refresh(input, isCollapsed, onDidCreateNode); this.setFocus(focus); this.setSelection(selection); } @@ -94,18 +97,20 @@ export class DataTree extends AbstractTree boolean): void { - this.model.setChildren((element === this.input ? null : element) as T, this.createIterator(element, isCollapsed)); + private _refresh(element: TInput | T, isCollapsed?: (el: T) => boolean, onDidCreateNode?: (node: ITreeNode) => void): void { + this.model.setChildren((element === this.input ? null : element) as T, this.iterate(element, isCollapsed).elements, onDidCreateNode); } - private createIterator(element: TInput | T, isCollapsed?: (el: T) => boolean): Iterator> { - const children = Iterator.fromArray(this.dataSource.getChildren(element)); + private iterate(element: TInput | T, isCollapsed?: (el: T) => boolean): { elements: Iterator>, size: number } { + const children = this.dataSource.getChildren(element); + const elements = Iterator.map>(Iterator.fromArray(children), element => { + const { elements: children, size } = this.iterate(element, isCollapsed); + const collapsed = size === 0 ? undefined : (isCollapsed && isCollapsed(element)); - return Iterator.map>(children, element => ({ - element, - children: this.createIterator(element), - collapsed: isCollapsed && isCollapsed(element) - })); + return { element, children, collapsed }; + }); + + return { elements, size: children.length }; } protected createModel(view: ISpliceable>, options: IDataTreeOptions): ITreeModel { @@ -123,20 +128,20 @@ export class DataTree extends AbstractTree 0) { const node = queue.shift()!; - if (node !== root && node.collapsed) { - collapsed.push(getId(node.element!)); + if (node !== root && node.collapsible && !node.collapsed) { + expanded.push(getId(node.element!)); } queue.push(...node.children); } - return { focus, selection, collapsed }; + return { focus, selection, expanded }; } } \ No newline at end of file diff --git a/src/vs/base/common/arrays.ts b/src/vs/base/common/arrays.ts index ab01e07bded..ce2f41cf633 100644 --- a/src/vs/base/common/arrays.ts +++ b/src/vs/base/common/arrays.ts @@ -393,6 +393,7 @@ export function firstIndex(array: ReadonlyArray, fn: (item: T) => boolean) export function first(array: ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T): T; export function first(array: ReadonlyArray, fn: (item: T) => boolean): T | null; +export function first(array: ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T | null): T | null; export function first(array: ReadonlyArray, fn: (item: T) => boolean, notFoundValue: T | null = null): T | null { const index = firstIndex(array, fn); return index < 0 ? notFoundValue : array[index]; diff --git a/src/vs/base/node/stats.ts b/src/vs/base/node/stats.ts index ae76a9de218..aedbd13349e 100644 --- a/src/vs/base/node/stats.ts +++ b/src/vs/base/node/stats.ts @@ -17,6 +17,7 @@ export interface WorkspaceStats { configFiles: WorkspaceStatItem[]; fileCount: number; maxFilesReached: boolean; + launchConfigFiles: WorkspaceStatItem[]; } function asSortedItems(map: Map): WorkspaceStatItem[] { @@ -66,7 +67,7 @@ export function collectLaunchConfigs(folder: string): Promise { +export async function collectWorkspaceStats(folder: string, filter: string[]): Promise { const configFilePatterns = [ { 'tag': 'grunt.js', 'pattern': /^gruntfile\.js$/i }, { 'tag': 'gulp.js', 'pattern': /^gulpfile\.js$/i }, @@ -182,15 +183,17 @@ export function collectWorkspaceStats(folder: string, filter: string[]): Promise let token: { count: number, maxReached: boolean } = { count: 0, maxReached: false }; return new Promise((resolve, reject) => { - walk(folder, filter, token, (files) => { + walk(folder, filter, token, async (files) => { files.forEach(acceptFile); + let launchConfigs = await collectLaunchConfigs(folder); + resolve({ configFiles: asSortedItems(configFiles), fileTypes: asSortedItems(fileTypes), fileCount: token.count, - maxFilesReached: token.maxReached - + maxFilesReached: token.maxReached, + launchConfigFiles: launchConfigs }); }); }); diff --git a/src/vs/base/node/storage.ts b/src/vs/base/node/storage.ts index fa14cb70e4e..4ba88e5ffb1 100644 --- a/src/vs/base/node/storage.ts +++ b/src/vs/base/node/storage.ts @@ -83,7 +83,7 @@ export class Storage extends Disposable implements IStorage { private static readonly DEFAULT_FLUSH_DELAY = 100; - private _onDidChangeStorage: Emitter = this._register(new Emitter()); + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } private state = StorageState.None; diff --git a/src/vs/base/parts/ipc/node/ipc.ts b/src/vs/base/parts/ipc/node/ipc.ts index efda16899f0..e0e7b9ad3ac 100644 --- a/src/vs/base/parts/ipc/node/ipc.ts +++ b/src/vs/base/parts/ipc/node/ipc.ts @@ -690,7 +690,7 @@ export class IPCClient implements IChannelClient, IChannelSer export function getDelayedChannel(promise: Promise): T { return { call(command: string, arg?: any, cancellationToken?: CancellationToken): Promise { - return promise.then(c => c.call(command, arg, cancellationToken)); + return promise.then(c => c.call(command, arg, cancellationToken)); }, listen(event: string, arg?: any): Event { @@ -752,4 +752,4 @@ export class StaticRouter implements IClientRouter await Event.toPromise(hub.onDidChangeConnections); return await this.route(hub); } -} \ No newline at end of file +} diff --git a/src/vs/base/parts/ipc/test/node/ipc.test.ts b/src/vs/base/parts/ipc/test/node/ipc.test.ts index 625f1a65922..f8cd8a0ee83 100644 --- a/src/vs/base/parts/ipc/test/node/ipc.test.ts +++ b/src/vs/base/parts/ipc/test/node/ipc.test.ts @@ -71,7 +71,7 @@ class TestIPCClient extends IPCClient { class TestIPCServer extends IPCServer { - private onDidClientConnect: Emitter; + private readonly onDidClientConnect: Emitter; constructor() { const onDidClientConnect = new Emitter(); diff --git a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts index 4959a71f185..907b9e8e7e0 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenModel.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenModel.ts @@ -8,7 +8,7 @@ import * as types from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ITree, IActionProvider } from 'vs/base/parts/tree/browser/tree'; import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; -import { IQuickNavigateConfiguration, IModel, IDataSource, IFilter, IAccessiblityProvider, IRenderer, IRunner, Mode } from 'vs/base/parts/quickopen/common/quickOpen'; +import { IQuickNavigateConfiguration, IModel, IDataSource, IFilter, IAccessiblityProvider, IRenderer, IRunner, Mode, IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen'; import { Action, IAction, IActionRunner } from 'vs/base/common/actions'; import { compareAnything } from 'vs/base/common/comparers'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -35,15 +35,15 @@ let IDS = 0; export class QuickOpenItemAccessorClass implements IItemAccessor { - getItemLabel(entry: QuickOpenEntry): string { + getItemLabel(entry: QuickOpenEntry): string | null { return entry.getLabel(); } - getItemDescription(entry: QuickOpenEntry): string { + getItemDescription(entry: QuickOpenEntry): string | null { return entry.getDescription(); } - getItemPath(entry: QuickOpenEntry): string { + getItemPath(entry: QuickOpenEntry): string | undefined { const resource = entry.getResource(); return resource ? resource.fsPath : undefined; @@ -55,8 +55,8 @@ export const QuickOpenItemAccessor = new QuickOpenItemAccessorClass(); export class QuickOpenEntry { private id: string; private labelHighlights: IHighlight[]; - private descriptionHighlights: IHighlight[]; - private detailHighlights: IHighlight[]; + private descriptionHighlights?: IHighlight[]; + private detailHighlights?: IHighlight[]; private hidden: boolean; constructor(highlights: IHighlight[] = []) { @@ -75,14 +75,14 @@ export class QuickOpenEntry { /** * The label of the entry to identify it from others in the list */ - getLabel(): string { + getLabel(): string | null { return null; } /** * The options for the label to use for this entry */ - getLabelOptions(): IIconLabelValueOptions { + getLabelOptions(): IIconLabelValueOptions | null { return null; } @@ -97,42 +97,42 @@ export class QuickOpenEntry { /** * Detail information about the entry that is optional and can be shown below the label */ - getDetail(): string { + getDetail(): string | null { return null; } /** * The icon of the entry to identify it from others in the list */ - getIcon(): string { + getIcon(): string | null { return null; } /** * A secondary description that is optional and can be shown right to the label */ - getDescription(): string { + getDescription(): string | null { return null; } /** * A tooltip to show when hovering over the entry. */ - getTooltip(): string { + getTooltip(): string | null { return null; } /** * A tooltip to show when hovering over the description portion of the entry. */ - getDescriptionTooltip(): string { + getDescriptionTooltip(): string | null { return null; } /** * An optional keybinding to show for an entry. */ - getKeybinding(): ResolvedKeybinding { + getKeybinding(): ResolvedKeybinding | null { return null; } @@ -140,7 +140,7 @@ export class QuickOpenEntry { * A resource for this entry. Resource URIs can be used to compare different kinds of entries and group * them together. */ - getResource(): URI { + getResource(): URI | null { return null; } @@ -170,7 +170,7 @@ export class QuickOpenEntry { /** * Allows to return highlight ranges that should show up for the entry label and description. */ - getHighlights(): [IHighlight[] /* Label */, IHighlight[] /* Description */, IHighlight[] /* Detail */] { + getHighlights(): [IHighlight[] /* Label */, IHighlight[] | undefined /* Description */, IHighlight[] | undefined /* Detail */] { return [this.labelHighlights, this.descriptionHighlights, this.detailHighlights]; } @@ -180,7 +180,7 @@ export class QuickOpenEntry { * * The context parameter provides additional context information how the run was triggered. */ - run(mode: Mode, context: IContext): boolean { + run(mode: Mode, context: IEntryRunContext): boolean { return false; } @@ -195,9 +195,9 @@ export class QuickOpenEntry { } export class QuickOpenEntryGroup extends QuickOpenEntry { - private entry: QuickOpenEntry; - private groupLabel: string; - private withBorder: boolean; + private entry?: QuickOpenEntry; + private groupLabel?: string; + private withBorder?: boolean; constructor(entry?: QuickOpenEntry, groupLabel?: string, withBorder?: boolean) { super(); @@ -210,11 +210,11 @@ export class QuickOpenEntryGroup extends QuickOpenEntry { /** * The label of the group or null if none. */ - getGroupLabel(): string { + getGroupLabel(): string | undefined { return this.groupLabel; } - setGroupLabel(groupLabel: string): void { + setGroupLabel(groupLabel: string | undefined): void { this.groupLabel = groupLabel; } @@ -222,18 +222,18 @@ export class QuickOpenEntryGroup extends QuickOpenEntry { * Whether to show a border on top of the group entry or not. */ showBorder(): boolean { - return this.withBorder; + return !!this.withBorder; } setShowBorder(showBorder: boolean): void { this.withBorder = showBorder; } - getLabel(): string { + getLabel(): string | null { return this.entry ? this.entry.getLabel() : super.getLabel(); } - getLabelOptions(): IIconLabelValueOptions { + getLabelOptions(): IIconLabelValueOptions | null { return this.entry ? this.entry.getLabelOptions() : super.getLabelOptions(); } @@ -241,27 +241,27 @@ export class QuickOpenEntryGroup extends QuickOpenEntry { return this.entry ? this.entry.getAriaLabel() : super.getAriaLabel(); } - getDetail(): string { + getDetail(): string | null { return this.entry ? this.entry.getDetail() : super.getDetail(); } - getResource(): URI { + getResource(): URI | null { return this.entry ? this.entry.getResource() : super.getResource(); } - getIcon(): string { + getIcon(): string | null { return this.entry ? this.entry.getIcon() : super.getIcon(); } - getDescription(): string { + getDescription(): string | null { return this.entry ? this.entry.getDescription() : super.getDescription(); } - getEntry(): QuickOpenEntry { + getEntry(): QuickOpenEntry | undefined { return this.entry; } - getHighlights(): [IHighlight[], IHighlight[], IHighlight[]] { + getHighlights(): [IHighlight[], IHighlight[] | undefined, IHighlight[] | undefined] { return this.entry ? this.entry.getHighlights() : super.getHighlights(); } @@ -277,7 +277,7 @@ export class QuickOpenEntryGroup extends QuickOpenEntry { this.entry ? this.entry.setHidden(hidden) : super.setHidden(hidden); } - run(mode: Mode, context: IContext): boolean { + run(mode: Mode, context: IEntryRunContext): boolean { return this.entry ? this.entry.run(mode, context) : super.run(mode, context); } } @@ -288,7 +288,7 @@ class NoActionProvider implements IActionProvider { return false; } - getActions(tree: ITree, element: any): IAction[] { + getActions(tree: ITree, element: any): IAction[] | null { return null; } @@ -296,7 +296,7 @@ class NoActionProvider implements IActionProvider { return false; } - getSecondaryActions(tree: ITree, element: any): IAction[] { + getSecondaryActions(tree: ITree, element: any): IAction[] | null { return null; } @@ -316,7 +316,7 @@ export interface IQuickOpenEntryTemplateData { } export interface IQuickOpenEntryGroupTemplateData extends IQuickOpenEntryTemplateData { - group: HTMLDivElement; + group?: HTMLDivElement; } const templateEntry = 'quickOpenEntry'; @@ -325,9 +325,9 @@ const templateEntryGroup = 'quickOpenEntryGroup'; class Renderer implements IRenderer { private actionProvider: IActionProvider; - private actionRunner: IActionRunner; + private actionRunner?: IActionRunner; - constructor(actionProvider: IActionProvider = new NoActionProvider(), actionRunner: IActionRunner | null = null) { + constructor(actionProvider: IActionProvider = new NoActionProvider(), actionRunner?: IActionRunner) { this.actionProvider = actionProvider; this.actionRunner = actionRunner; } @@ -356,7 +356,7 @@ class Renderer implements IRenderer { // Entry const row1 = DOM.$('.quick-open-row'); const row2 = DOM.$('.quick-open-row'); - const entry = DOM.$('.quick-open-entry', null, row1, row2); + const entry = DOM.$('.quick-open-entry', undefined, row1, row2); entryContainer.appendChild(entry); // Icon @@ -379,7 +379,7 @@ class Renderer implements IRenderer { const detail = new HighlightedLabel(detailContainer, true); // Entry Group - let group: HTMLDivElement; + let group: HTMLDivElement | undefined; if (templateId === templateEntryGroup) { group = document.createElement('div'); DOM.addClass(group, 'results-group'); @@ -442,7 +442,9 @@ class Renderer implements IRenderer { // Border if (group.showBorder()) { DOM.addClass(groupData.container, 'results-group-separator'); - groupData.container.style.borderTopColor = styles.pickerGroupBorder.toString(); + if (styles.pickerGroupBorder) { + groupData.container.style.borderTopColor = styles.pickerGroupBorder.toString(); + } } else { DOM.removeClass(groupData.container, 'results-group-separator'); groupData.container.style.borderTopColor = null; @@ -450,8 +452,12 @@ class Renderer implements IRenderer { // Group Label const groupLabel = group.getGroupLabel() || ''; - groupData.group.textContent = groupLabel; - groupData.group.style.color = styles.pickerGroupForeground.toString(); + if (groupData.group) { + groupData.group.textContent = groupLabel; + if (styles.pickerGroupForeground) { + groupData.group.style.color = styles.pickerGroupForeground.toString(); + } + } } // Normal Entry @@ -465,31 +471,31 @@ class Renderer implements IRenderer { // Label const options: IIconLabelValueOptions = entry.getLabelOptions() || Object.create(null); options.matches = labelHighlights || []; - options.title = entry.getTooltip(); - options.descriptionTitle = entry.getDescriptionTooltip() || entry.getDescription(); // tooltip over description because it could overflow + options.title = entry.getTooltip() || undefined; + options.descriptionTitle = entry.getDescriptionTooltip() || entry.getDescription() || undefined; // tooltip over description because it could overflow options.descriptionMatches = descriptionHighlights || []; - data.label.setLabel(entry.getLabel(), entry.getDescription(), options); + data.label.setLabel(entry.getLabel() || undefined, entry.getDescription() || undefined, options); // Meta - data.detail.set(entry.getDetail(), detailHighlights); + data.detail.set(entry.getDetail() || undefined, detailHighlights); // Keybinding - data.keybinding.set(entry.getKeybinding()); + data.keybinding.set(entry.getKeybinding()!); } } disposeTemplate(templateId: string, templateData: IQuickOpenEntryGroupTemplateData): void { const data = templateData as IQuickOpenEntryGroupTemplateData; data.actionBar.dispose(); - data.actionBar = null; - data.container = null; - data.entry = null; - data.keybinding = null; - data.detail = null; - data.group = null; - data.icon = null; + data.actionBar = null!; + data.container = null!; + data.entry = null!; + data.keybinding = null!; + data.detail = null!; + data.group = null!; + data.icon = null!; data.label.dispose(); - data.label = null; + data.label = null!; } } @@ -562,7 +568,7 @@ export class QuickOpenModel implements return entry.getId(); } - getLabel(entry: QuickOpenEntry): string { + getLabel(entry: QuickOpenEntry): string | null { return entry.getLabel(); } @@ -579,7 +585,7 @@ export class QuickOpenModel implements return !entry.isHidden(); } - run(entry: QuickOpenEntry, mode: Mode, context: IContext): boolean { + run(entry: QuickOpenEntry, mode: Mode, context: IEntryRunContext): boolean { return entry.run(mode, context); } } @@ -603,8 +609,8 @@ export function compareEntries(elementA: QuickOpenEntry, elementB: QuickOpenEntr } // Fallback to the full path if labels are identical and we have associated resources - let nameA = elementA.getLabel(); - let nameB = elementB.getLabel(); + let nameA = elementA.getLabel()!; + let nameB = elementB.getLabel()!; if (nameA === nameB) { const resourceA = elementA.getResource(); const resourceB = elementB.getResource(); diff --git a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts index c121e1d3b58..ed4b43d2680 100644 --- a/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts +++ b/src/vs/base/parts/quickopen/browser/quickOpenWidget.ts @@ -36,7 +36,7 @@ export interface IQuickOpenCallbacks { export interface IQuickOpenOptions extends IQuickOpenStyles { minItemsToShow?: number; maxItemsToShow?: number; - inputPlaceHolder: string; + inputPlaceHolder?: string; inputAriaLabel?: string; actionProvider?: IActionProvider; keyboardSupport?: boolean; @@ -681,7 +681,7 @@ export class QuickOpenWidget extends Disposable implements IModelProvider { const prefix = autoFocus.autoFocusPrefixMatch; const lowerCasePrefix = prefix.toLowerCase(); for (const entry of entries) { - const label = input.dataSource.getLabel(entry); + const label = input.dataSource.getLabel(entry) || ''; if (!caseSensitiveMatch && label.indexOf(prefix) === 0) { caseSensitiveMatch = entry; diff --git a/src/vs/base/parts/quickopen/common/quickOpen.ts b/src/vs/base/parts/quickopen/common/quickOpen.ts index a7b46b23c46..dd39a215ef1 100644 --- a/src/vs/base/parts/quickopen/common/quickOpen.ts +++ b/src/vs/base/parts/quickopen/common/quickOpen.ts @@ -59,7 +59,7 @@ export interface IKeyMods { export interface IDataSource { getId(entry: T): string; - getLabel(entry: T): string; + getLabel(entry: T): string | null; } /** diff --git a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts index 9abbda5ac13..c1c1a82673e 100644 --- a/src/vs/base/parts/quickopen/common/quickOpenScorer.ts +++ b/src/vs/base/parts/quickopen/common/quickOpenScorer.ts @@ -285,17 +285,17 @@ export interface IItemAccessor { /** * Just the label of the item to score on. */ - getItemLabel(item: T): string; + getItemLabel(item: T): string | null; /** * The optional description of the item to score on. Can be null. */ - getItemDescription(item: T): string; + getItemDescription(item: T): string | null; /** * If the item is a file, the path of the file to score on. Can be null. */ - getItemPath(file: T): string; + getItemPath(file: T): string | undefined; } const PATH_IDENTITY_SCORE = 1 << 18; @@ -376,10 +376,10 @@ function createMatches(offsets: undefined | number[]): IMatch[] { return ret; } -function doScoreItem(label: string, description: string, path: string, query: IPreparedQuery, fuzzy: boolean): IItemScore { +function doScoreItem(label: string, description: string | null, path: string | undefined, query: IPreparedQuery, fuzzy: boolean): IItemScore { // 1.) treat identity matches on full path highest - if (path && isLinux ? query.original === path : equalsIgnoreCase(query.original, path)) { + if (path && (isLinux ? query.original === path : equalsIgnoreCase(query.original, path))) { return { score: PATH_IDENTITY_SCORE, labelMatch: [{ start: 0, end: label.length }], descriptionMatch: description ? [{ start: 0, end: description.length }] : undefined }; } @@ -469,8 +469,8 @@ export function compareItemsByScore(itemA: T, itemB: T, query: IPreparedQuery return scoreA === LABEL_PREFIX_SCORE ? -1 : 1; } - const labelA = accessor.getItemLabel(itemA); - const labelB = accessor.getItemLabel(itemB); + const labelA = accessor.getItemLabel(itemA) || ''; + const labelB = accessor.getItemLabel(itemB) || ''; // prefer shorter names when both match on label prefix if (labelA.length !== labelB.length) { @@ -484,8 +484,8 @@ export function compareItemsByScore(itemA: T, itemB: T, query: IPreparedQuery return scoreA === LABEL_CAMELCASE_SCORE ? -1 : 1; } - const labelA = accessor.getItemLabel(itemA); - const labelB = accessor.getItemLabel(itemB); + const labelA = accessor.getItemLabel(itemA) || ''; + const labelB = accessor.getItemLabel(itemB) || ''; // prefer more compact camel case matches over longer const comparedByMatchLength = compareByMatchLength(itemScoreA.labelMatch, itemScoreB.labelMatch); @@ -592,8 +592,8 @@ function compareByMatchLength(matchesA?: IMatch[], matchesB?: IMatch[]): number export function fallbackCompare(itemA: T, itemB: T, query: IPreparedQuery, accessor: IItemAccessor): number { // check for label + description length and prefer shorter - const labelA = accessor.getItemLabel(itemA); - const labelB = accessor.getItemLabel(itemB); + const labelA = accessor.getItemLabel(itemA) || ''; + const labelB = accessor.getItemLabel(itemB) || ''; const descriptionA = accessor.getItemDescription(itemA); const descriptionB = accessor.getItemDescription(itemB); diff --git a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts index dd317811cee..1ecc9e83e42 100644 --- a/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts +++ b/src/vs/base/parts/quickopen/test/common/quickOpenScorer.test.ts @@ -797,9 +797,9 @@ suite('Quick Open Scorer', () => { }); test('compareFilesByScore - avoid match scattering (bug #12095)', function () { - const resourceA = URI.file('src/vs/workbench/parts/files/common/explorerViewModel.ts'); - const resourceB = URI.file('src/vs/workbench/parts/files/browser/views/explorerView.ts'); - const resourceC = URI.file('src/vs/workbench/parts/files/browser/views/explorerViewer.ts'); + const resourceA = URI.file('src/vs/workbench/contrib/files/common/explorerViewModel.ts'); + const resourceB = URI.file('src/vs/workbench/contrib/files/browser/views/explorerView.ts'); + const resourceC = URI.file('src/vs/workbench/contrib/files/browser/views/explorerViewer.ts'); let query = 'filesexplorerview.ts'; diff --git a/src/vs/base/parts/tree/browser/tree.ts b/src/vs/base/parts/tree/browser/tree.ts index a74f5cad56e..9966687e74b 100644 --- a/src/vs/base/parts/tree/browser/tree.ts +++ b/src/vs/base/parts/tree/browser/tree.ts @@ -716,12 +716,12 @@ export interface IActionProvider { /** * Returns whether or not the element has actions. These show up in place right to the element in the tree. */ - hasActions(tree: ITree, element: any): boolean; + hasActions(tree: ITree | null, element: any): boolean; /** * Returns a promise of an array with the actions of the element that should show up in place right to the element in the tree. */ - getActions(tree: ITree, element: any): IAction[]; + getActions(tree: ITree | null, element: any): IAction[] | null; /** * Returns whether or not the element has secondary actions. These show up once the user has expanded the element's action bar. @@ -731,7 +731,7 @@ export interface IActionProvider { /** * Returns a promise of an array with the secondary actions of the element that should show up once the user has expanded the element's action bar. */ - getSecondaryActions(tree: ITree, element: any): IAction[]; + getSecondaryActions(tree: ITree, element: any): IAction[] | null; /** * Returns an action item to render an action. diff --git a/src/vs/base/test/node/storage/storage.test.ts b/src/vs/base/test/node/storage/storage.test.ts index 215c2bb530a..16f71f8d208 100644 --- a/src/vs/base/test/node/storage/storage.test.ts +++ b/src/vs/base/test/node/storage/storage.test.ts @@ -539,7 +539,9 @@ suite('SQLite Storage Library', () => { await del(storageDir, tmpdir()); }); - test('real world example', async () => { + test('real world example', async function () { + this.timeout(20000); + const storageDir = uniqueStorageDir(); await mkdirp(storageDir); @@ -553,7 +555,7 @@ suite('SQLite Storage Library', () => { items1.set('debug.actionswidgetposition', '0.6880952380952381'); const items2 = new Map(); - items2.set('workbench.editors.files.textfileeditor', '{"textEditorViewState":[["file:///Users/dummy/Documents/ticino-playground/play.htm",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":6,"column":16},"position":{"lineNumber":6,"column":16}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":0},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Documents/ticino-playground/nakefile.js",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":7,"column":81},"position":{"lineNumber":7,"column":81}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":20},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Desktop/vscode2/.gitattributes",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":9,"column":12},"position":{"lineNumber":9,"column":12}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":20},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Desktop/vscode2/src/vs/workbench/parts/search/browser/openAnythingHandler.ts",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":1,"column":1},"position":{"lineNumber":1,"column":1}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":0},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}]]}'); + items2.set('workbench.editors.files.textfileeditor', '{"textEditorViewState":[["file:///Users/dummy/Documents/ticino-playground/play.htm",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":6,"column":16},"position":{"lineNumber":6,"column":16}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":0},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Documents/ticino-playground/nakefile.js",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":7,"column":81},"position":{"lineNumber":7,"column":81}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":20},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Desktop/vscode2/.gitattributes",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":9,"column":12},"position":{"lineNumber":9,"column":12}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":20},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}],["file:///Users/dummy/Desktop/vscode2/src/vs/workbench/contrib/search/browser/openAnythingHandler.ts",{"0":{"cursorState":[{"inSelectionMode":false,"selectionStart":{"lineNumber":1,"column":1},"position":{"lineNumber":1,"column":1}}],"viewState":{"scrollLeft":0,"firstPosition":{"lineNumber":1,"column":1},"firstPositionDeltaTop":0},"contributionsState":{"editor.contrib.folding":{},"editor.contrib.wordHighlighter":false}}}]]}'); const items3 = new Map(); items3.set('nps/iscandidate', 'false'); @@ -628,7 +630,9 @@ suite('SQLite Storage Library', () => { await del(storageDir, tmpdir()); }); - test('very large item value', async () => { + test('very large item value', async function () { + this.timeout(20000); + const storageDir = uniqueStorageDir(); await mkdirp(storageDir); diff --git a/src/vs/code/electron-main/app.ts b/src/vs/code/electron-main/app.ts index ce0240ad7d2..f451547d241 100644 --- a/src/vs/code/electron-main/app.ts +++ b/src/vs/code/electron-main/app.ts @@ -6,7 +6,7 @@ import { app, ipcMain as ipc, systemPreferences, shell, Event, contentTracing, protocol, powerMonitor } from 'electron'; import { IProcessEnvironment, isWindows, isMacintosh } from 'vs/base/common/platform'; import { WindowsManager } from 'vs/code/electron-main/windows'; -import { IWindowsService, OpenContext, ActiveWindowManager } from 'vs/platform/windows/common/windows'; +import { IWindowsService, OpenContext, ActiveWindowManager, IURIToOpen } from 'vs/platform/windows/common/windows'; import { WindowsChannel } from 'vs/platform/windows/node/windowsIpc'; import { WindowsService } from 'vs/platform/windows/electron-main/windowsService'; import { ILifecycleService, LifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; @@ -16,7 +16,6 @@ import { UpdateChannel } from 'vs/platform/update/node/updateIpc'; import { Server as ElectronIPCServer } from 'vs/base/parts/ipc/electron-main/ipc.electron-main'; import { Server, connect, Client } from 'vs/base/parts/ipc/node/ipc.net'; import { SharedProcess } from 'vs/code/electron-main/sharedProcess'; -import { Mutex } from 'windows-mutex'; import { LaunchService, LaunchChannel, ILaunchService } from 'vs/platform/launch/electron-main/launchService'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; @@ -188,14 +187,14 @@ export class CodeApplication extends Disposable { }); }); - let macOpenFileURIs: URI[] = []; + let macOpenFileURIs: IURIToOpen[] = []; let runningTimeout: any = null; app.on('open-file', (event: Event, path: string) => { this.logService.trace('App#open-file: ', path); event.preventDefault(); // Keep in array because more might come! - macOpenFileURIs.push(URI.file(path)); + macOpenFileURIs.push({ uri: URI.file(path) }); // Clear previous handler if any if (runningTimeout !== null) { @@ -484,22 +483,22 @@ export class CodeApplication extends Disposable { // written from the main process once. const telemetryInstanceId = 'telemetry.instanceId'; - const instanceId = storageMainService.get(telemetryInstanceId, null); - if (instanceId === null) { + const instanceId = storageMainService.get(telemetryInstanceId, undefined); + if (instanceId === undefined) { storageMainService.store(telemetryInstanceId, generateUuid()); } const telemetryFirstSessionDate = 'telemetry.firstSessionDate'; - const firstSessionDate = storageMainService.get(telemetryFirstSessionDate, null); - if (firstSessionDate === null) { + const firstSessionDate = storageMainService.get(telemetryFirstSessionDate, undefined); + if (firstSessionDate === undefined) { storageMainService.store(telemetryFirstSessionDate, new Date().toUTCString()); } const telemetryCurrentSessionDate = 'telemetry.currentSessionDate'; const telemetryLastSessionDate = 'telemetry.lastSessionDate'; - const lastSessionDate = storageMainService.get(telemetryCurrentSessionDate, null); // previous session date was the "current" one at that time + const lastSessionDate = storageMainService.get(telemetryCurrentSessionDate, undefined); // previous session date was the "current" one at that time const currentSessionDate = new Date().toUTCString(); // current session date is "now" - storageMainService.store(telemetryLastSessionDate, lastSessionDate); + storageMainService.store(telemetryLastSessionDate, typeof lastSessionDate === 'undefined' ? null : lastSessionDate); storageMainService.store(telemetryCurrentSessionDate, currentSessionDate); }); } @@ -590,7 +589,7 @@ export class CodeApplication extends Disposable { // Watch Electron URLs and forward them to the UrlService const args = this.environmentService.args; const urls = args['open-url'] ? args._urls : []; - const urlListener = new ElectronURLListener(urls, urlService, this.windowsMainService); + const urlListener = new ElectronURLListener(urls || [], urlService, this.windowsMainService); this._register(urlListener); this.windowsMainService.ready(this.userEnv); @@ -607,7 +606,7 @@ export class CodeApplication extends Disposable { } if (macOpenFiles && macOpenFiles.length && !hasCliArgs && !hasFolderURIs && !hasFileURIs) { - return this.windowsMainService.open({ context: OpenContext.DOCK, cli: args, urisToOpen: macOpenFiles.map(file => URI.file(file)), initialStartup: true }); // mac: open-file event received on startup + return this.windowsMainService.open({ context: OpenContext.DOCK, cli: args, urisToOpen: macOpenFiles.map(file => ({ uri: URI.file(file) })), initialStartup: true }); // mac: open-file event received on startup } return this.windowsMainService.open({ context, cli: args, forceNewWindow: args['new-window'] || (!hasCliArgs && args['unity-launch']), diffMode: args.diff, initialStartup: true }); // default: read paths from cli @@ -617,13 +616,12 @@ export class CodeApplication extends Disposable { const windowsMainService = accessor.get(IWindowsMainService); const historyMainService = accessor.get(IHistoryMainService); - let windowsMutex: Mutex | null = null; if (isWindows) { // Setup Windows mutex try { const Mutex = (require.__$__nodeRequire('windows-mutex') as any).Mutex; - windowsMutex = new Mutex(product.win32MutexName); + const windowsMutex = new Mutex(product.win32MutexName); this._register(toDisposable(() => windowsMutex.release())); } catch (e) { if (!this.environmentService.isBuilt) { @@ -703,14 +701,17 @@ export class CodeApplication extends Disposable { const resolvedAuthorities = new Map(); ipc.on('vscode:remoteAuthorityResolved', (event: any, data: ResolvedAuthority) => { + this.logService.info('Receieved resolved authority', data.authority); resolvedAuthorities.set(data.authority, data); }); const resolveAuthority = (authority: string): ResolvedAuthority | null => { + this.logService.info('Resolving authority', authority); if (authority.indexOf('+') >= 0) { if (resolvedAuthorities.has(authority)) { - return resolvedAuthorities.get(authority); + return resolvedAuthorities.get(authority) || null; } + this.logService.info('Didnot find resolved authority for', authority); return null; } else { const [host, strPort] = authority.split(':'); @@ -721,24 +722,24 @@ export class CodeApplication extends Disposable { protocol.registerBufferProtocol(REMOTE_HOST_SCHEME, async (request, callback) => { if (request.method !== 'GET') { - return callback(null); + return callback(undefined); } const uri = URI.parse(request.url); - let activeConnection: ActiveConnection = null; + let activeConnection: ActiveConnection | undefined; if (connectionPool.has(uri.authority)) { activeConnection = connectionPool.get(uri.authority); } else { let resolvedAuthority = resolveAuthority(uri.authority); if (!resolvedAuthority) { - callback(null); + callback(undefined); return; } activeConnection = new ActiveConnection(uri.authority, resolvedAuthority.host, resolvedAuthority.port); connectionPool.set(uri.authority, activeConnection); } try { - const rawClient = await activeConnection.getClient(); + const rawClient = await activeConnection!.getClient(); if (connectionPool.has(uri.authority)) { // not disposed in the meantime const channel = rawClient.getChannel(REMOTE_FILE_SYSTEM_CHANNEL_NAME); @@ -746,11 +747,11 @@ export class CodeApplication extends Disposable { const fileContents = await channel.call('readFile', [uri]); callback(Buffer.from(fileContents)); } else { - callback(null); + callback(undefined); } } catch (err) { errors.onUnexpectedError(err); - callback(null); + callback(undefined); } }); } diff --git a/src/vs/code/electron-main/main.ts b/src/vs/code/electron-main/main.ts index 39f624e5de8..4874979725f 100644 --- a/src/vs/code/electron-main/main.ts +++ b/src/vs/code/electron-main/main.ts @@ -158,7 +158,7 @@ function setupIPC(accessor: ServicesAccessor): Promise { logService.trace('Sending env to running instance...'); return allowSetForegroundWindow(service) - .then(() => service.start(environmentService.args, process.env)) + .then(() => service.start(environmentService.args, process.env as platform.IProcessEnvironment)) .then(() => client.dispose()) .then(() => { @@ -316,14 +316,14 @@ function createServices(args: ParsedArgs, bufferLogService: BufferLogService): I function initServices(environmentService: IEnvironmentService, stateService: StateService): Promise { // Ensure paths for environment service exist - const environmentServiceInitialization = Promise.all([ + const environmentServiceInitialization = Promise.all([ environmentService.extensionsPath, environmentService.nodeCachedDataDir, environmentService.logsPath, environmentService.globalStorageHome, environmentService.workspaceStorageHome, environmentService.backupHome - ].map(path => path && mkdirp(path))); + ].map((path): undefined | Promise => path ? mkdirp(path) : undefined)); // State service const stateServiceInitialization = stateService.init(); diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index dbe19cc5743..03d22708966 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -73,7 +73,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { private whenReadyCallbacks: { (window: ICodeWindow): void }[]; private currentConfig: IWindowConfiguration; - private pendingLoadConfig: IWindowConfiguration; + private pendingLoadConfig?: IWindowConfiguration; private marketplaceHeadersPromise: Promise; @@ -205,7 +205,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { return !!this.config.extensionTestsPath; } - get extensionDevelopmentPath(): string { + get extensionDevelopmentPath(): string | undefined { return this.config.extensionDevelopmentPath; } @@ -253,19 +253,19 @@ export class CodeWindow extends Disposable implements ICodeWindow { return this._lastFocusTime; } - get backupPath(): string { + get backupPath(): string | undefined { return this.currentConfig ? this.currentConfig.backupPath : undefined; } - get openedWorkspace(): IWorkspaceIdentifier { + get openedWorkspace(): IWorkspaceIdentifier | undefined { return this.currentConfig ? this.currentConfig.workspace : undefined; } - get openedFolderUri(): URI { + get openedFolderUri(): URI | undefined { return this.currentConfig ? this.currentConfig.folderUri : undefined; } - get remoteAuthority(): string { + get remoteAuthority(): string | undefined { return this.currentConfig ? this.currentConfig.remoteAuthority : undefined; } @@ -310,7 +310,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { private registerListeners(): void { // Prevent loading of svgs - this._win.webContents.session.webRequest.onBeforeRequest(null, (details, callback) => { + this._win.webContents.session.webRequest.onBeforeRequest(null!, (details, callback) => { if (details.url.indexOf('.svg') > 0) { const uri = URI.parse(details.url); if (uri && !uri.scheme.match(/file/i) && (uri.path as any).endsWith('.svg')) { @@ -321,7 +321,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { return callback({}); }); - this._win.webContents.session.webRequest.onHeadersReceived(null, (details: any, callback: any) => { + this._win.webContents.session.webRequest.onHeadersReceived(null!, (details: any, callback: any) => { const contentType: string[] = (details.responseHeaders['content-type'] || details.responseHeaders['Content-Type']) as any; if (contentType && Array.isArray(contentType) && contentType.some(x => x.toLowerCase().indexOf('image/svg') >= 0)) { return callback({ cancel: true }); @@ -338,7 +338,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { if (this.pendingLoadConfig) { this.currentConfig = this.pendingLoadConfig; - this.pendingLoadConfig = null; + this.pendingLoadConfig = undefined; } // To prevent flashing, we set the window visible after the page has finished to load but before Code is loaded @@ -545,8 +545,8 @@ export class CodeWindow extends Disposable implements ICodeWindow { // in extension development mode. These options are all development related. if (this.isExtensionDevelopmentHost && cli) { configuration.verbose = cli.verbose; - configuration.debugPluginHost = cli.debugPluginHost; - configuration.debugBrkPluginHost = cli.debugBrkPluginHost; + configuration['inspect-extensions'] = cli['inspect-extensions']; + configuration['inspect-brk-extensions'] = cli['inspect-brk-extensions']; configuration.debugId = cli.debugId; configuration['extensions-dir'] = cli['extensions-dir']; } @@ -685,7 +685,7 @@ export class CodeWindow extends Disposable implements ICodeWindow { private restoreWindowState(state?: IWindowState): IWindowState { if (state) { try { - state = this.validateWindowState(state); + state = this.validateWindowState(state) || undefined; } catch (err) { this.logService.warn(`Unexpected error validating window state: ${err}\n${err.stack}`); // somehow display API can be picky about the state to validate } @@ -703,7 +703,11 @@ export class CodeWindow extends Disposable implements ICodeWindow { return null; } - if ([state.x, state.y, state.width, state.height].some(n => typeof n !== 'number')) { + if (typeof state.x !== 'number' + || typeof state.y !== 'number' + || typeof state.width !== 'number' + || typeof state.height !== 'number' + ) { return null; } @@ -1042,6 +1046,6 @@ export class CodeWindow extends Disposable implements ICodeWindow { clearTimeout(this.showTimeoutHandle); } - this._win = null; // Important to dereference the window object to allow for GC + this._win = null!; // Important to dereference the window object to allow for GC } } diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 9c2ff750b69..6a7ef247bb8 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { basename, normalize, join, dirname } from 'path'; +import { basename, normalize, join, dirname, extname } from 'path'; import * as fs from 'fs'; import { localize } from 'vs/nls'; import * as arrays from 'vs/base/common/arrays'; @@ -14,11 +14,11 @@ import { IStateService } from 'vs/platform/state/common/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; import { hasArgs, asArray } from 'vs/platform/environment/node/argv'; import { ipcMain as ipc, screen, BrowserWindow, dialog, systemPreferences } from 'electron'; -import { IPathWithLineAndColumn, parseLineAndColumnAware } from 'vs/code/node/paths'; +import { parseLineAndColumnAware } from 'vs/code/node/paths'; import { ILifecycleService, UnloadReason, IWindowUnloadEvent, LifecycleService } from 'vs/platform/lifecycle/electron-main/lifecycleMain'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; -import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, IPathsToWaitFor, IEnterWorkspaceResult, IMessageBoxResult, INewWindowOptions } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, IPathsToWaitFor, IEnterWorkspaceResult, IMessageBoxResult, INewWindowOptions, IURIToOpen, URIType, OpenDialogOptions } from 'vs/platform/windows/common/windows'; import { getLastActiveWindow, findBestWindowOrFolderForFile, findWindowOnWorkspace, findWindowOnExtensionDevelopmentPath, findWindowOnWorkspaceOrFolderUri } from 'vs/code/node/windowsFinder'; import { Event as CommonEvent, Emitter } from 'vs/base/common/event'; import product from 'vs/platform/node/product'; @@ -26,7 +26,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWindowsMainService, IOpenConfiguration, IWindowsCountChangedEvent, ICodeWindow, IWindowState as ISingleWindowState, WindowMode } from 'vs/platform/windows/electron-main/windows'; import { IHistoryMainService } from 'vs/platform/history/common/history'; import { IProcessEnvironment, isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; -import { IWorkspacesMainService, IWorkspaceIdentifier, WORKSPACE_FILTER, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesMainService, IWorkspaceIdentifier, WORKSPACE_FILTER, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { Schemas } from 'vs/base/common/network'; @@ -34,37 +34,34 @@ import { normalizeNFC } from 'vs/base/common/normalization'; import { URI } from 'vs/base/common/uri'; import { Queue, timeout } from 'vs/base/common/async'; import { exists } from 'vs/base/node/pfs'; -import { getComparisonKey, isEqual, normalizePath, basename as resourcesBasename } from 'vs/base/common/resources'; +import { getComparisonKey, isEqual, normalizePath, basename as resourcesBasename, fsPath } from 'vs/base/common/resources'; import { endsWith } from 'vs/base/common/strings'; import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; +import { restoreWindowsState, WindowsStateStorageData, getWindowsStateStoreData } from 'vs/code/electron-main/windowsStateStorage'; const enum WindowError { UNRESPONSIVE = 1, CRASHED = 2 } -interface INewWindowState extends ISingleWindowState { - hasDefaultState?: boolean; -} - -interface IWindowState { +export interface IWindowState { workspace?: IWorkspaceIdentifier; folderUri?: URI; - backupPath: string; + backupPath?: string; remoteAuthority?: string; uiState: ISingleWindowState; } -interface IBackwardCompatibleWindowState extends IWindowState { - folderPath?: string; -} - -interface IWindowsState { +export interface IWindowsState { lastActiveWindow?: IWindowState; lastPluginDevelopmentHostWindow?: IWindowState; openedWindows: IWindowState[]; } +interface INewWindowState extends ISingleWindowState { + hasDefaultState?: boolean; +} + type RestoreWindowsSetting = 'all' | 'folders' | 'one' | 'none'; interface IOpenBrowserWindowOptions { @@ -74,7 +71,7 @@ interface IOpenBrowserWindowOptions { workspace?: IWorkspaceIdentifier; folderUri?: URI; - remoteAuthority: string; + remoteAuthority?: string; initialStartup?: boolean; @@ -131,7 +128,7 @@ export class WindowsManager implements IWindowsMainService { private initialUserEnv: IProcessEnvironment; private windowsState: IWindowsState; - private lastClosedWindowState: IWindowState; + private lastClosedWindowState?: IWindowState; private dialogs: Dialogs; private workspacesManager: WorkspacesManager; @@ -161,7 +158,9 @@ export class WindowsManager implements IWindowsMainService { @IWorkspacesMainService private readonly workspacesMainService: IWorkspacesMainService, @IInstantiationService private readonly instantiationService: IInstantiationService ) { - this.windowsState = this.getWindowsState(); + const windowsStateStoreData = this.stateService.getItem(WindowsManager.windowsStateStorageKey); + + this.windowsState = restoreWindowsState(windowsStateStoreData); if (!Array.isArray(this.windowsState.openedWindows)) { this.windowsState.openedWindows = []; } @@ -170,30 +169,6 @@ export class WindowsManager implements IWindowsMainService { this.workspacesManager = new WorkspacesManager(workspacesMainService, backupMainService, environmentService, historyMainService, this); } - private getWindowsState(): IWindowsState { - const windowsState = this.stateService.getItem(WindowsManager.windowsStateStorageKey) || { openedWindows: [] }; - if (windowsState.lastActiveWindow) { - windowsState.lastActiveWindow = this.revive(windowsState.lastActiveWindow); - } - if (windowsState.lastPluginDevelopmentHostWindow) { - windowsState.lastPluginDevelopmentHostWindow = this.revive(windowsState.lastPluginDevelopmentHostWindow); - } - if (windowsState.openedWindows) { - windowsState.openedWindows = windowsState.openedWindows.map(windowState => this.revive(windowState)); - } - return windowsState; - } - - private revive(windowState: IWindowState): IWindowState { - if (windowState.folderUri) { - windowState.folderUri = URI.revive(windowState.folderUri); - } - if ((windowState).folderPath) { - windowState.folderUri = URI.file((windowState).folderPath); - } - return windowState; - } - ready(initialUserEnv: IProcessEnvironment): void { this.initialUserEnv = initialUserEnv; @@ -312,7 +287,7 @@ export class WindowsManager implements IWindowsMainService { } // Persist - this.stateService.setItem(WindowsManager.windowsStateStorageKey, currentWindowsState); + this.stateService.setItem(WindowsManager.windowsStateStorageKey, getWindowsStateStoreData(currentWindowsState)); } // See note on #onBeforeShutdown() for details how these events are flowing @@ -368,12 +343,12 @@ export class WindowsManager implements IWindowsMainService { // folders that should be added to the currently active window. let foldersToAdd: URI[] = []; if (openConfig.addMode) { - foldersToAdd = pathsToOpen.filter(path => !!path.folderUri).map(path => path.folderUri); + foldersToAdd = pathsToOpen.filter(path => !!path.folderUri).map(path => path.folderUri!); pathsToOpen = pathsToOpen.filter(path => !path.folderUri); } // collect all file inputs - let fileInputs: IFileInputs = undefined; + let fileInputs: IFileInputs | undefined; for (const path of pathsToOpen) { if (path.fileUri) { if (!fileInputs) { @@ -403,12 +378,12 @@ export class WindowsManager implements IWindowsMainService { // // These are windows to open to show workspaces // - const workspacesToOpen = arrays.distinct(pathsToOpen.filter(win => !!win.workspace).map(win => win.workspace), workspace => workspace.id); // prevent duplicates + const workspacesToOpen = arrays.distinct(arrays.coalesce(pathsToOpen.map(win => win.workspace)), workspace => workspace.id); // prevent duplicates // // These are windows to open to show either folders or files (including diffing files or creating them) // - const foldersToOpen = arrays.distinct(pathsToOpen.filter(win => win.folderUri && !win.fileUri).map(win => win.folderUri), folder => getComparisonKey(folder)); // prevent duplicates + const foldersToOpen = arrays.distinct(arrays.coalesce(pathsToOpen.filter(win => win.folderUri && !win.fileUri).map(win => win.folderUri)), folder => getComparisonKey(folder)); // prevent duplicates // // These are windows to restore because of hot-exit or from previous session (only performed once on startup!) @@ -423,8 +398,8 @@ export class WindowsManager implements IWindowsMainService { workspacesToRestore.push(...this.workspacesMainService.getUntitledWorkspacesSync()); // collect from previous window session emptyToRestore = this.backupMainService.getEmptyWindowBackupPaths(); - emptyToRestore.push(...pathsToOpen.filter(w => !w.workspace && !w.folderUri && w.backupPath).map(w => ({ backupFolder: basename(w.backupPath), remoteAuthority: w.remoteAuthority }))); // add empty windows with backupPath - emptyToRestore = arrays.distinct(emptyToRestore, info => info.backupFolder); // prevent duplicates + emptyToRestore.push(...pathsToOpen.filter(w => !w.workspace && !w.folderUri && w.backupPath).map(w => ({ backupFolder: basename(w.backupPath!), remoteAuthority: w.remoteAuthority }))); // add empty windows with backupPath + emptyToRestore = arrays.distinct(emptyToRestore, info => info.backupFolder!); // prevent duplicates } // @@ -444,9 +419,9 @@ export class WindowsManager implements IWindowsMainService { // 1.) focus last active window if we are not instructed to open any paths if (focusLastActive) { - const lastActiveWindw = usedWindows.filter(w => w.backupPath === this.windowsState.lastActiveWindow.backupPath); - if (lastActiveWindw.length) { - lastActiveWindw[0].focus(); + const lastActiveWindow = usedWindows.filter(w => w.backupPath === this.windowsState.lastActiveWindow!.backupPath); + if (lastActiveWindow.length) { + lastActiveWindow[0].focus(); focusLastOpened = false; focusLastWindow = false; } @@ -457,9 +432,9 @@ export class WindowsManager implements IWindowsMainService { for (let i = usedWindows.length - 1; i >= 0; i--) { const usedWindow = usedWindows[i]; if ( - (usedWindow.openedWorkspace && workspacesToRestore.some(workspace => workspace.id === usedWindow.openedWorkspace.id)) || // skip over restored workspace + (usedWindow.openedWorkspace && workspacesToRestore.some(workspace => workspace.id === usedWindow.openedWorkspace!.id)) || // skip over restored workspace (usedWindow.openedFolderUri && foldersToRestore.some(folder => isEqual(folder, usedWindow.openedFolderUri))) || // skip over restored folder - (usedWindow.backupPath && emptyToRestore.some(empty => empty.backupFolder === basename(usedWindow.backupPath))) // skip over restored empty window + (usedWindow.backupPath && emptyToRestore.some(empty => empty.backupFolder === basename(usedWindow.backupPath!))) // skip over restored empty window ) { continue; } @@ -483,8 +458,10 @@ export class WindowsManager implements IWindowsMainService { const recentlyOpenedFiles: URI[] = []; pathsToOpen.forEach(win => { - if (win.workspace || win.folderUri) { - recentlyOpenedWorkspaces.push(win.workspace || win.folderUri); + if (win.workspace) { + recentlyOpenedWorkspaces.push(win.workspace); + } else if (win.folderUri) { + recentlyOpenedWorkspaces.push(win.folderUri); } else if (win.fileUri) { recentlyOpenedFiles.push(win.fileUri); } @@ -499,7 +476,7 @@ export class WindowsManager implements IWindowsMainService { // used for the edit operation is closed or loaded to a different folder so that the waiting // process can continue. We do this by deleting the waitMarkerFilePath. if (openConfig.context === OpenContext.CLI && openConfig.cli.wait && openConfig.cli.waitMarkerFilePath && usedWindows.length === 1 && usedWindows[0]) { - this.waitForWindowCloseOrLoad(usedWindows[0].id).then(() => fs.unlink(openConfig.cli.waitMarkerFilePath, error => undefined)); + this.waitForWindowCloseOrLoad(usedWindows[0].id).then(() => fs.unlink(openConfig.cli.waitMarkerFilePath!, _error => undefined)); } return usedWindows; @@ -534,7 +511,7 @@ export class WindowsManager implements IWindowsMainService { // Handle folders to add by looking for the last active workspace (not on initial startup) if (!openConfig.initialStartup && foldersToAdd.length > 0) { const authority = getRemoteAuthority(foldersToAdd[0]); - const lastActiveWindow = this.getLastActiveWindowForAuthority(authority); + const lastActiveWindow = authority ? this.getLastActiveWindowForAuthority(authority) : undefined; if (lastActiveWindow) { usedWindows.push(this.doAddFoldersToExistingWindow(lastActiveWindow, foldersToAdd)); } @@ -547,15 +524,14 @@ export class WindowsManager implements IWindowsMainService { // Find suitable window or folder path to open files in const fileToCheck = fileInputs.filesToOpen[0] || fileInputs.filesToCreate[0] || fileInputs.filesToDiff[0]; // only look at the windows with correct authority - const windows = WindowsManager.WINDOWS.filter(w => w.remoteAuthority === fileInputs.remoteAuthority); + const windows = WindowsManager.WINDOWS.filter(w => w.remoteAuthority === fileInputs!.remoteAuthority); let bestWindowOrFolder = findBestWindowOrFolderForFile({ windows, newWindow: openFilesInNewWindow, - reuseWindow: openConfig.forceReuseWindow, context: openConfig.context, fileUri: fileToCheck && fileToCheck.fileUri, - workspaceResolver: workspace => this.workspacesMainService.resolveWorkspaceSync(workspace.configPath) + workspaceResolver: workspace => workspace.configPath.scheme === Schemas.file ? this.workspacesMainService.resolveWorkspaceSync(fsPath(workspace.configPath)) : null }); // We found a window to open the files in @@ -622,7 +598,7 @@ export class WindowsManager implements IWindowsMainService { // Open remaining ones allWorkspacesToOpen.forEach(workspaceToOpen => { - if (windowsOnWorkspace.some(win => win.openedWorkspace.id === workspaceToOpen.id)) { + if (windowsOnWorkspace.some(win => win.openedWorkspace!.id === workspaceToOpen.id)) { return; // ignore folders that are already open } @@ -764,7 +740,7 @@ export class WindowsManager implements IWindowsMainService { return window; } - private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IPathToOpen, forceNewWindow: boolean, fileInputs: IFileInputs, windowToUse?: ICodeWindow): ICodeWindow { + private doOpenFolderOrWorkspace(openConfig: IOpenConfiguration, folderOrWorkspace: IPathToOpen, forceNewWindow: boolean, fileInputs: IFileInputs | undefined, windowToUse?: ICodeWindow): ICodeWindow { if (!forceNewWindow && !windowToUse && typeof openConfig.contextWindowId === 'number') { windowToUse = this.getWindowById(openConfig.contextWindowId); // fix for https://github.com/Microsoft/vscode/issues/49587 } @@ -817,8 +793,8 @@ export class WindowsManager implements IWindowsMainService { // folders should be added to the existing window. if (!openConfig.addMode && isCommandLineOrAPICall) { const foldersToOpen = windowsToOpen.filter(path => !!path.folderUri); - if (foldersToOpen.length > 1 && foldersToOpen.every(f => f.folderUri.scheme === Schemas.file)) { - const workspace = this.workspacesMainService.createUntitledWorkspaceSync(foldersToOpen.map(folder => ({ uri: folder.folderUri }))); + if (foldersToOpen.length > 1 && foldersToOpen.every(f => f.folderUri!.scheme === Schemas.file)) { + const workspace = this.workspacesMainService.createUntitledWorkspaceSync(foldersToOpen.map(folder => ({ uri: folder.folderUri! }))); // Add workspace and remove folders thereby windowsToOpen.push({ workspace, remoteAuthority: foldersToOpen[0].remoteAuthority }); @@ -833,24 +809,24 @@ export class WindowsManager implements IWindowsMainService { const pathsToOpen: IPathToOpen[] = []; const cli = openConfig.cli; let parseOptions: IPathParseOptions = { gotoLineMode: cli && cli.goto, forceOpenWorkspaceAsFile: openConfig.forceOpenWorkspaceAsFile }; - for (const pathToOpen of openConfig.urisToOpen) { + for (const pathToOpen of openConfig.urisToOpen || []) { if (!pathToOpen) { continue; } - const path = this.parseUri(pathToOpen, openConfig.forceOpenWorkspaceAsFile, parseOptions); + const path = this.parseUri(pathToOpen.uri, pathToOpen.typeHint, parseOptions); if (path) { pathsToOpen.push(path); } else { // Warn about the invalid URI or path let message, detail; - if (pathToOpen.scheme === Schemas.file) { + if (pathToOpen.uri.scheme === Schemas.file) { message = localize('pathNotExistTitle', "Path does not exist"); - detail = localize('pathNotExistDetail', "The path '{0}' does not seem to exist anymore on disk.", pathToOpen.fsPath); + detail = localize('pathNotExistDetail', "The path '{0}' does not seem to exist anymore on disk.", pathToOpen.uri.fsPath); } else { message = localize('uriInvalidTitle', "URI can not be opened"); - detail = localize('uriInvalidDetail', "The URI '{0}' is not valid and can not be opened.", pathToOpen.toString()); + detail = localize('uriInvalidDetail', "The URI '{0}' is not valid and can not be opened.", pathToOpen.uri.toString()); } const options: Electron.MessageBoxOptions = { title: product.nameLong, @@ -874,7 +850,7 @@ export class WindowsManager implements IWindowsMainService { // folder uris const folderUris = asArray(cli['folder-uri']); for (let folderUri of folderUris) { - const path = this.parseUri(this.argToUri(folderUri), false, parseOptions); + const path = this.parseUri(this.argToUri(folderUri), 'folder', parseOptions); if (path) { pathsToOpen.push(path); } @@ -883,7 +859,7 @@ export class WindowsManager implements IWindowsMainService { // file uris const fileUris = asArray(cli['file-uri']); for (let fileUri of fileUris) { - const path = this.parseUri(this.argToUri(fileUri), true, parseOptions); + const path = this.parseUri(this.argToUri(fileUri), 'file'); if (path) { pathsToOpen.push(path); } @@ -932,12 +908,12 @@ export class WindowsManager implements IWindowsMainService { const windowsToOpen: IPathToOpen[] = []; for (const openedWindow of openedWindows) { if (openedWindow.workspace) { // Workspaces - const pathToOpen = this.parsePath(openedWindow.workspace.configPath, { remoteAuthority: openedWindow.remoteAuthority }); + const pathToOpen = this.parseUri(openedWindow.workspace.configPath, 'file', { remoteAuthority: openedWindow.remoteAuthority }); if (pathToOpen && pathToOpen.workspace) { windowsToOpen.push(pathToOpen); } } else if (openedWindow.folderUri) { // Folders - const pathToOpen = this.parseUri(openedWindow.folderUri, false, { remoteAuthority: openedWindow.remoteAuthority }); + const pathToOpen = this.parseUri(openedWindow.folderUri, 'folder', { remoteAuthority: openedWindow.remoteAuthority }); if (pathToOpen && pathToOpen.folderUri) { windowsToOpen.push(pathToOpen); } @@ -973,39 +949,54 @@ export class WindowsManager implements IWindowsMainService { return restoreWindows; } - private argToUri(arg: string): URI { + private argToUri(arg: string): URI | undefined { try { let uri = URI.parse(arg); if (!uri.scheme) { this.logService.error(`Invalid URI input string, scheme missing: ${arg}`); - return null; + return undefined; } return uri; } catch (e) { this.logService.error(`Invalid URI input string: ${arg}, ${e.message}`); } - return null; + return undefined; } - private parseUri(uri: URI, isFile: boolean, options?: IPathParseOptions): IPathToOpen { + private parseUri(uri: URI | undefined, typeHint?: URIType, options: IPathParseOptions = {}): IPathToOpen | undefined { if (!uri || !uri.scheme) { - return null; + return undefined; } if (uri.scheme === Schemas.file) { return this.parsePath(uri.fsPath, options); } // open remote if either specified in the cli or if it's a remotehost URI - const remoteAuthority = options && options.remoteAuthority || getRemoteAuthority(uri); + const remoteAuthority = options.remoteAuthority || getRemoteAuthority(uri); // normalize URI uri = normalizePath(uri); + + + // remove trailing slash const uriPath = uri.path; - if (uriPath.length > 2 && endsWith(uriPath, '/')) { - uri = uri.with({ path: uriPath.substr(0, uriPath.length - 1) }); + if (endsWith(uriPath, '/')) { + if (uriPath.length > 2) { + // only remove if the path has some content + uri = uri.with({ path: uriPath.substr(0, uriPath.length - 1) }); + } + if (!typeHint) { + typeHint = 'folder'; + } } - if (isFile) { - if (options && options.gotoLineMode) { + + // if there's no type hint + if (!typeHint && (extname(uri.path) === WORKSPACE_EXTENSION || options.gotoLineMode)) { + typeHint = 'file'; + } + + if (typeHint === 'file') { + if (options.gotoLineMode) { const parsedPath = parseLineAndColumnAware(uri.path); return { fileUri: uri.with({ path: parsedPath.path }), @@ -1014,6 +1005,12 @@ export class WindowsManager implements IWindowsMainService { remoteAuthority }; } + if (extname(uri.path) === WORKSPACE_EXTENSION && !options.forceOpenWorkspaceAsFile) { + return { + workspace: this.workspacesMainService.getWorkspaceIdentifier(uri), + remoteAuthority + }; + } return { fileUri: uri, remoteAuthority @@ -1025,21 +1022,23 @@ export class WindowsManager implements IWindowsMainService { }; } - private parsePath(anyPath: string, options?: IPathParseOptions): IPathToOpen { + private parsePath(anyPath: string, options: IPathParseOptions): IPathToOpen | undefined { if (!anyPath) { - return null; + return undefined; } - let parsedPath: IPathWithLineAndColumn; + let lineNumber, columnNumber: number | undefined; + + if (options.gotoLineMode) { + const parsedPath = parseLineAndColumnAware(anyPath); + lineNumber = parsedPath.line; + columnNumber = parsedPath.column; - const gotoLineMode = options && options.gotoLineMode; - if (options && options.gotoLineMode) { - parsedPath = parseLineAndColumnAware(anyPath); anyPath = parsedPath.path; } // open remote if either specified in the cli even if it is a local file. TODO: Future idea: resolve in remote host context. - const remoteAuthority = options && options.remoteAuthority; + const remoteAuthority = options.remoteAuthority; const candidate = normalize(anyPath); try { @@ -1048,7 +1047,7 @@ export class WindowsManager implements IWindowsMainService { if (candidateStat.isFile()) { // Workspace (unless disabled via flag) - if (!options || !options.forceOpenWorkspaceAsFile) { + if (!options.forceOpenWorkspaceAsFile) { const workspace = this.workspacesMainService.resolveWorkspaceSync(candidate); if (workspace) { return { workspace: { id: workspace.id, configPath: workspace.configPath }, remoteAuthority }; @@ -1058,8 +1057,8 @@ export class WindowsManager implements IWindowsMainService { // File return { fileUri: URI.file(candidate), - lineNumber: gotoLineMode ? parsedPath.line : undefined, - columnNumber: gotoLineMode ? parsedPath.column : undefined, + lineNumber, + columnNumber, remoteAuthority }; } @@ -1083,7 +1082,7 @@ export class WindowsManager implements IWindowsMainService { } } - return null; + return undefined; } private shouldOpenNewWindow(openConfig: IOpenConfiguration): { openFolderInNewWindow: boolean; openFilesInNewWindow: boolean; } { @@ -1099,9 +1098,9 @@ export class WindowsManager implements IWindowsMainService { } // let the user settings override how files are open in a new window or same window unless we are forced (not for extension development though) - let openFilesInNewWindow: boolean; + let openFilesInNewWindow: boolean = false; if (openConfig.forceNewWindow || openConfig.forceReuseWindow) { - openFilesInNewWindow = openConfig.forceNewWindow && !openConfig.forceReuseWindow; + openFilesInNewWindow = !!openConfig.forceNewWindow && !openConfig.forceReuseWindow; } else { // macOS: by default we open files in a new window if this is triggered via DOCK context @@ -1124,7 +1123,7 @@ export class WindowsManager implements IWindowsMainService { } } - return { openFolderInNewWindow, openFilesInNewWindow }; + return { openFolderInNewWindow: !!openFolderInNewWindow, openFilesInNewWindow }; } openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void { @@ -1132,7 +1131,7 @@ export class WindowsManager implements IWindowsMainService { // Reload an existing extension development host window on the same path // We currently do not allow more than one extension development window // on the same extension path. - const existingWindow = findWindowOnExtensionDevelopmentPath(WindowsManager.WINDOWS, openConfig.cli.extensionDevelopmentPath); + const existingWindow = openConfig.cli.extensionDevelopmentPath && findWindowOnExtensionDevelopmentPath(WindowsManager.WINDOWS, openConfig.cli.extensionDevelopmentPath); if (existingWindow) { this.reload(existingWindow, openConfig.cli); existingWindow.focus(); // make sure it gets focus and is restored @@ -1155,7 +1154,11 @@ export class WindowsManager implements IWindowsMainService { folderUris = [workspaceToOpen.toString()]; } } else { - cliArgs = [workspaceToOpen.configPath]; + if (workspaceToOpen.configPath.scheme === Schemas.file) { + cliArgs = [fsPath(workspaceToOpen.configPath)]; + } else { + fileUris = [workspaceToOpen.configPath.toString()]; + } } } } @@ -1209,10 +1212,10 @@ export class WindowsManager implements IWindowsMainService { // For all other cases we first call into registerEmptyWindowBackupSync() to set it before // loading the window. if (options.emptyWindowBackupInfo) { - configuration.backupPath = join(this.environmentService.backupHome, options.emptyWindowBackupInfo.backupFolder); + configuration.backupPath = join(this.environmentService.backupHome, options.emptyWindowBackupInfo.backupFolder!); } - let window: ICodeWindow; + let window: ICodeWindow | undefined; if (!options.forceNewWindow && !options.forceNewTabbedWindow) { window = options.windowToUse || this.getLastActiveWindow(); if (window) { @@ -1263,10 +1266,10 @@ export class WindowsManager implements IWindowsMainService { // Window Events window.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own - window.win.webContents.on('devtools-reload-page', () => this.reload(window)); - window.win.webContents.on('crashed', () => this.onWindowError(window, WindowError.CRASHED)); - window.win.on('unresponsive', () => this.onWindowError(window, WindowError.UNRESPONSIVE)); - window.win.on('closed', () => this.onWindowClosed(window)); + window.win.webContents.on('devtools-reload-page', () => this.reload(window!)); + window.win.webContents.on('crashed', () => this.onWindowError(window!, WindowError.CRASHED)); + window.win.on('unresponsive', () => this.onWindowError(window!, WindowError.UNRESPONSIVE)); + window.win.on('closed', () => this.onWindowClosed(window!)); // Lifecycle (this.lifecycleService as LifecycleService).registerWindow(window); @@ -1281,9 +1284,9 @@ export class WindowsManager implements IWindowsMainService { if (!configuration.extensionDevelopmentPath && currentWindowConfig && !!currentWindowConfig.extensionDevelopmentPath) { configuration.extensionDevelopmentPath = currentWindowConfig.extensionDevelopmentPath; configuration.verbose = currentWindowConfig.verbose; - configuration.debugBrkPluginHost = currentWindowConfig.debugBrkPluginHost; + configuration['inspect-brk-extensions'] = currentWindowConfig['inspect-brk-extensions']; configuration.debugId = currentWindowConfig.debugId; - configuration.debugPluginHost = currentWindowConfig.debugPluginHost; + configuration['inspect-extensions'] = currentWindowConfig['inspect-extensions']; configuration['extensions-dir'] = currentWindowConfig['extensions-dir']; } } @@ -1294,7 +1297,7 @@ export class WindowsManager implements IWindowsMainService { if (window.isReady) { this.lifecycleService.unload(window, UnloadReason.LOAD).then(veto => { if (!veto) { - this.doOpenInBrowserWindow(window, configuration, options); + this.doOpenInBrowserWindow(window!, configuration, options); } }); } else { @@ -1337,8 +1340,9 @@ export class WindowsManager implements IWindowsMainService { } // Known Workspace - load from stored settings - if (configuration.workspace) { - const stateForWorkspace = this.windowsState.openedWindows.filter(o => o.workspace && o.workspace.id === configuration.workspace.id).map(o => o.uiState); + const workspace = configuration.workspace; + if (workspace) { + const stateForWorkspace = this.windowsState.openedWindows.filter(o => o.workspace && o.workspace.id === workspace.id).map(o => o.uiState); if (stateForWorkspace.length) { return stateForWorkspace[0]; } @@ -1372,7 +1376,7 @@ export class WindowsManager implements IWindowsMainService { // // We want the new window to open on the same display that the last active one is in - let displayToUse: Electron.Display; + let displayToUse: Electron.Display | undefined; const displays = screen.getAllDisplays(); // Single Display @@ -1404,8 +1408,8 @@ export class WindowsManager implements IWindowsMainService { // Note: important to use Math.round() because Electron does not seem to be too happy about // display coordinates that are not absolute numbers. let state = defaultWindowState() as INewWindowState; - state.x = Math.round(displayToUse.bounds.x + (displayToUse.bounds.width / 2) - (state.width / 2)); - state.y = Math.round(displayToUse.bounds.y + (displayToUse.bounds.height / 2) - (state.height / 2)); + state.x = Math.round(displayToUse.bounds.x + (displayToUse.bounds.width / 2) - (state.width! / 2)); + state.y = Math.round(displayToUse.bounds.y + (displayToUse.bounds.height / 2) - (state.height! / 2)); // Check for newWindowDimensions setting and adjust accordingly const windowConfig = this.configurationService.getValue('window'); @@ -1443,6 +1447,9 @@ export class WindowsManager implements IWindowsMainService { return state; } + state.x = typeof state.x === 'number' ? state.x : 0; + state.y = typeof state.y === 'number' ? state.y : 0; + const existingWindowBounds = WindowsManager.WINDOWS.map(win => win.getBounds()); while (existingWindowBounds.some(b => b.x === state.x || b.y === state.y)) { state.x += 30; @@ -1470,8 +1477,8 @@ export class WindowsManager implements IWindowsMainService { }); } - enterWorkspace(win: ICodeWindow, path: URI): Promise { - return this.workspacesManager.enterWorkspace(win, path).then(result => this.doEnterWorkspace(win, result)); + enterWorkspace(win: ICodeWindow, path: URI): Promise { + return this.workspacesManager.enterWorkspace(win, path).then(result => result ? this.doEnterWorkspace(win, result) : undefined); } private doEnterWorkspace(win: ICodeWindow, result: IEnterWorkspaceResult): IEnterWorkspaceResult { @@ -1513,7 +1520,7 @@ export class WindowsManager implements IWindowsMainService { } // Handle untitled workspaces with prompt as needed - e.veto(this.workspacesManager.promptToSaveUntitledWorkspace(this.getWindowById(e.window.id), workspace).then(veto => { + e.veto(this.workspacesManager.promptToSaveUntitledWorkspace(this.getWindowById(e.window.id), workspace).then((veto): boolean | Promise => { if (veto) { return veto; } @@ -1538,11 +1545,11 @@ export class WindowsManager implements IWindowsMainService { return this.open({ context, cli, forceEmpty: true })[0]; } - getLastActiveWindow(): ICodeWindow { + getLastActiveWindow(): ICodeWindow | undefined { return getLastActiveWindow(WindowsManager.WINDOWS); } - getLastActiveWindowForAuthority(remoteAuthority: string): ICodeWindow { + getLastActiveWindowForAuthority(remoteAuthority: string): ICodeWindow | undefined { return getLastActiveWindow(WindowsManager.WINDOWS.filter(w => w.remoteAuthority === remoteAuthority)); } @@ -1566,7 +1573,7 @@ export class WindowsManager implements IWindowsMainService { closeListener.dispose(); loadListener.dispose(); - resolve(null); + resolve(); } } @@ -1593,22 +1600,22 @@ export class WindowsManager implements IWindowsMainService { }); } - getFocusedWindow(): ICodeWindow { + getFocusedWindow(): ICodeWindow | undefined { const win = BrowserWindow.getFocusedWindow(); if (win) { return this.getWindowById(win.id); } - return null; + return undefined; } - getWindowById(windowId: number): ICodeWindow { + getWindowById(windowId: number): ICodeWindow | undefined { const res = WindowsManager.WINDOWS.filter(w => w.id === windowId); if (res && res.length === 1) { return res[0]; } - return null; + return undefined; } getWindows(): ICodeWindow[] { @@ -1719,9 +1726,8 @@ export class WindowsManager implements IWindowsMainService { internalOptions.pickFolders = pickFolders; internalOptions.pickFiles = pickFiles; - if (!internalOptions.dialogOptions) { - internalOptions.dialogOptions = Object.create(null); - } + const dialogOptions: OpenDialogOptions = internalOptions.dialogOptions || Object.create(null); + internalOptions.dialogOptions = dialogOptions; if (!internalOptions.dialogOptions.title) { if (pickFolders && pickFiles) { @@ -1827,45 +1833,49 @@ class Dialogs { }); } - private getFileOrFolderUris(options: IInternalNativeOpenDialogOptions): Promise { + private getFileOrFolderUris(options: IInternalNativeOpenDialogOptions): Promise { // Ensure dialog options - if (!options.dialogOptions) { - options.dialogOptions = Object.create(null); - } + const dialogOptions = options.dialogOptions || Object.create(null); + options.dialogOptions = dialogOptions; // Ensure defaultPath - if (!options.dialogOptions.defaultPath) { - options.dialogOptions.defaultPath = this.stateService.getItem(Dialogs.workingDirPickerStorageKey); + if (!dialogOptions.defaultPath) { + dialogOptions.defaultPath = this.stateService.getItem(Dialogs.workingDirPickerStorageKey); } // Ensure properties if (typeof options.pickFiles === 'boolean' || typeof options.pickFolders === 'boolean') { - options.dialogOptions.properties = undefined; // let it override based on the booleans + dialogOptions.properties = undefined; // let it override based on the booleans if (options.pickFiles && options.pickFolders) { - options.dialogOptions.properties = ['multiSelections', 'openDirectory', 'openFile', 'createDirectory']; + dialogOptions.properties = ['multiSelections', 'openDirectory', 'openFile', 'createDirectory']; } } - if (!options.dialogOptions.properties) { - options.dialogOptions.properties = ['multiSelections', options.pickFolders ? 'openDirectory' : 'openFile', 'createDirectory']; + if (!dialogOptions.properties) { + dialogOptions.properties = ['multiSelections', options.pickFolders ? 'openDirectory' : 'openFile', 'createDirectory']; } if (isMacintosh) { - options.dialogOptions.properties.push('treatPackageAsDirectory'); // always drill into .app files + dialogOptions.properties.push('treatPackageAsDirectory'); // always drill into .app files } // Show Dialog - const focusedWindow = this.windowsMainService.getWindowById(options.windowId) || this.windowsMainService.getFocusedWindow(); + const focusedWindow = (typeof options.windowId === 'number' ? this.windowsMainService.getWindowById(options.windowId) : undefined) || this.windowsMainService.getFocusedWindow(); - return this.showOpenDialog(options.dialogOptions, focusedWindow).then(paths => { + return this.showOpenDialog(dialogOptions, focusedWindow).then(paths => { if (paths && paths.length > 0) { // Remember path in storage for next time this.stateService.setItem(Dialogs.workingDirPickerStorageKey, dirname(paths[0])); - return paths.map(path => URI.file(path)); + const result: IURIToOpen[] = []; + for (const path of paths) { + result.push({ uri: URI.file(path) }); + } + + return result; } return undefined; @@ -1889,7 +1899,7 @@ class Dialogs { showMessageBox(options: Electron.MessageBoxOptions, window?: ICodeWindow): Promise { return this.getDialogQueue(window).queue(() => { return new Promise(resolve => { - dialog.showMessageBox(window ? window.win : undefined, options, (response: number, checkboxChecked: boolean) => { + dialog.showMessageBox(window ? window.win : undefined!, options, (response: number, checkboxChecked: boolean) => { resolve({ button: response, checkboxChecked }); }); }); @@ -1908,7 +1918,7 @@ class Dialogs { return this.getDialogQueue(window).queue(() => { return new Promise(resolve => { - dialog.showSaveDialog(window ? window.win : undefined, options, path => { + dialog.showSaveDialog(window ? window.win : undefined!, options, path => { resolve(normalizePath(path)); }); }); @@ -1940,7 +1950,7 @@ class Dialogs { // Show dialog and wrap as promise validatePathPromise.then(() => { - dialog.showOpenDialog(window ? window.win : undefined, options, paths => { + dialog.showOpenDialog(window ? window.win : undefined!, options, paths => { resolve(normalizePaths(paths)); }); }); @@ -1952,13 +1962,12 @@ class Dialogs { class WorkspacesManager { constructor( - private workspacesMainService: IWorkspacesMainService, - private backupMainService: IBackupMainService, - private environmentService: IEnvironmentService, - private historyMainService: IHistoryMainService, - private windowsMainService: IWindowsMainService, - ) { - } + private readonly workspacesMainService: IWorkspacesMainService, + private readonly backupMainService: IBackupMainService, + private readonly environmentService: IEnvironmentService, + private readonly historyMainService: IHistoryMainService, + private readonly windowsMainService: IWindowsMainService, + ) { } enterWorkspace(window: ICodeWindow, path: URI): Promise { if (!window || !window.win || !window.isReady) { @@ -1980,7 +1989,7 @@ class WorkspacesManager { return Promise.resolve(true); } - if (window.openedWorkspace && isEqual(URI.file(window.openedWorkspace.configPath), path)) { + if (window.openedWorkspace && isEqual(window.openedWorkspace.configPath, path)) { return Promise.resolve(false); // window is already opened on a workspace with that path } @@ -2005,7 +2014,7 @@ class WorkspacesManager { window.focus(); // Register window for backups and migrate current backups over - let backupPath: string; + let backupPath: string | undefined; if (!window.config.extensionDevelopmentPath) { backupPath = this.backupMainService.registerWorkspaceBackupSync(workspace, window.config.backupPath); } @@ -2024,7 +2033,7 @@ class WorkspacesManager { } pickWorkspaceAndOpen(options: INativeOpenDialogOptions): void { - const window = this.windowsMainService.getWindowById(options.windowId) || this.windowsMainService.getFocusedWindow() || this.windowsMainService.getLastActiveWindow(); + const window = (typeof options.windowId === 'number' ? this.windowsMainService.getWindowById(options.windowId) : undefined) || this.windowsMainService.getFocusedWindow() || this.windowsMainService.getLastActiveWindow(); this.windowsMainService.pickFileAndOpen({ windowId: window ? window.id : undefined, @@ -2041,7 +2050,7 @@ class WorkspacesManager { }); } - promptToSaveUntitledWorkspace(window: ICodeWindow, workspace: IWorkspaceIdentifier): Promise { + promptToSaveUntitledWorkspace(window: ICodeWindow | undefined, workspace: IWorkspaceIdentifier): Promise { enum ConfirmResult { SAVE, DONT_SAVE, @@ -2110,13 +2119,13 @@ class WorkspacesManager { }); } - private getUntitledWorkspaceSaveDialogDefaultPath(workspace?: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier): string { + private getUntitledWorkspaceSaveDialogDefaultPath(workspace?: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier): string | undefined { if (workspace) { if (isSingleFolderWorkspaceIdentifier(workspace)) { return workspace.scheme === Schemas.file ? dirname(workspace.fsPath) : undefined; } - const resolvedWorkspace = this.workspacesMainService.resolveWorkspaceSync(workspace.configPath); + const resolvedWorkspace = workspace.configPath.scheme === Schemas.file && this.workspacesMainService.resolveWorkspaceSync(workspace.configPath.fsPath); if (resolvedWorkspace && resolvedWorkspace.folders.length > 0) { for (const folder of resolvedWorkspace.folders) { if (folder.uri.scheme === Schemas.file) { diff --git a/src/vs/code/electron-main/windowsStateStorage.ts b/src/vs/code/electron-main/windowsStateStorage.ts new file mode 100644 index 00000000000..16eac66cc20 --- /dev/null +++ b/src/vs/code/electron-main/windowsStateStorage.ts @@ -0,0 +1,86 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { URI, UriComponents } from 'vs/base/common/uri'; +import { IWindowState as IWindowUIState } from 'vs/platform/windows/electron-main/windows'; +import { IWindowState, IWindowsState } from 'vs/code/electron-main/windows'; + +export type WindowsStateStorageData = object; + +interface ISerializedWindowsState { + lastActiveWindow?: ISerializedWindowState; + lastPluginDevelopmentHostWindow?: ISerializedWindowState; + openedWindows: ISerializedWindowState[]; +} + +interface ISerializedWindowState { + workspaceIdentifier?: { id: string; configURIPath: string }; + folder?: string; + backupPath?: string; + remoteAuthority?: string; + uiState: IWindowUIState; + + // deprecated + folderUri?: UriComponents; + folderPath?: string; + workspace?: { id: string; configPath: string }; +} + +export function restoreWindowsState(data: WindowsStateStorageData | undefined): IWindowsState { + const result: IWindowsState = { openedWindows: [] }; + const windowsState = data as ISerializedWindowsState || { openedWindows: [] }; + + if (windowsState.lastActiveWindow) { + result.lastActiveWindow = restoreWindowState(windowsState.lastActiveWindow); + } + if (windowsState.lastPluginDevelopmentHostWindow) { + result.lastPluginDevelopmentHostWindow = restoreWindowState(windowsState.lastPluginDevelopmentHostWindow); + } + if (Array.isArray(windowsState.openedWindows)) { + result.openedWindows = windowsState.openedWindows.map(windowState => restoreWindowState(windowState)); + } + return result; +} + +function restoreWindowState(windowState: ISerializedWindowState): IWindowState { + const result: IWindowState = { uiState: windowState.uiState }; + if (windowState.backupPath) { + result.backupPath = windowState.backupPath; + } + if (windowState.remoteAuthority) { + result.remoteAuthority = windowState.remoteAuthority; + } + if (windowState.folder) { + result.folderUri = URI.parse(windowState.folder); + } else if (windowState.folderUri) { + result.folderUri = URI.revive(windowState.folderUri); + } else if (windowState.folderPath) { + result.folderUri = URI.file(windowState.folderPath); + } + if (windowState.workspaceIdentifier) { + result.workspace = { id: windowState.workspaceIdentifier.id, configPath: URI.parse(windowState.workspaceIdentifier.configURIPath) }; + } else if (windowState.workspace) { + result.workspace = { id: windowState.workspace.id, configPath: URI.file(windowState.workspace.configPath) }; + } + return result; +} + +export function getWindowsStateStoreData(windowsState: IWindowsState): WindowsStateStorageData { + return { + lastActiveWindow: windowsState.lastActiveWindow && serializeWindowState(windowsState.lastActiveWindow), + lastPluginDevelopmentHostWindow: windowsState.lastPluginDevelopmentHostWindow && serializeWindowState(windowsState.lastPluginDevelopmentHostWindow), + openedWindows: windowsState.openedWindows.map(ws => serializeWindowState(ws)) + }; +} + +function serializeWindowState(windowState: IWindowState): ISerializedWindowState { + return { + workspaceIdentifier: windowState.workspace && { id: windowState.workspace.id, configURIPath: windowState.workspace.configPath.toString() }, + folder: windowState.folderUri && windowState.folderUri.toString(), + backupPath: windowState.backupPath, + remoteAuthority: windowState.remoteAuthority, + uiState: windowState.uiState + }; +} \ No newline at end of file diff --git a/src/vs/code/node/shellEnv.ts b/src/vs/code/node/shellEnv.ts index 5ea15be5ecf..4f3f8022f46 100644 --- a/src/vs/code/node/shellEnv.ts +++ b/src/vs/code/node/shellEnv.ts @@ -9,7 +9,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { isWindows } from 'vs/base/common/platform'; function getUnixShellEnvironment(): Promise { - const promise = new Promise((resolve, reject) => { + const promise = new Promise((resolve, reject) => { const runAsNode = process.env['ELECTRON_RUN_AS_NODE']; const noAttach = process.env['ELECTRON_NO_ATTACH_CONSOLE']; const mark = generateUuid().replace(/-/g, '').substr(0, 12); @@ -66,7 +66,7 @@ function getUnixShellEnvironment(): Promise { }); // swallow errors - return promise.then(undefined, () => ({})); + return promise.catch(() => ({})); } diff --git a/src/vs/code/node/wait.ts b/src/vs/code/node/wait.ts index 3b1f1d0750e..6245e052a73 100644 --- a/src/vs/code/node/wait.ts +++ b/src/vs/code/node/wait.ts @@ -21,6 +21,6 @@ export function createWaitMarkerFile(verbose?: boolean): Promise { console.error(`Failed to create marker file for --wait: ${error}`); } - return Promise.resolve(); + return Promise.resolve(undefined); }); -} \ No newline at end of file +} diff --git a/src/vs/code/node/windowsFinder.ts b/src/vs/code/node/windowsFinder.ts index 607e68dd163..99c06e09b4e 100644 --- a/src/vs/code/node/windowsFinder.ts +++ b/src/vs/code/node/windowsFinder.ts @@ -21,7 +21,6 @@ export interface ISimpleWindow { export interface IBestWindowOrFolderOptions { windows: W[]; newWindow: boolean; - reuseWindow: boolean; context: OpenContext; fileUri?: URI; userHome?: string; @@ -29,24 +28,34 @@ export interface IBestWindowOrFolderOptions { workspaceResolver: (workspace: IWorkspaceIdentifier) => IResolvedWorkspace | null; } -export function findBestWindowOrFolderForFile({ windows, newWindow, reuseWindow, context, fileUri, workspaceResolver }: IBestWindowOrFolderOptions): W | null { +export function findBestWindowOrFolderForFile({ windows, newWindow, context, fileUri, workspaceResolver }: IBestWindowOrFolderOptions): W | undefined { if (!newWindow && fileUri && (context === OpenContext.DESKTOP || context === OpenContext.CLI || context === OpenContext.DOCK)) { const windowOnFilePath = findWindowOnFilePath(windows, fileUri, workspaceResolver); if (windowOnFilePath) { return windowOnFilePath; } } - return !newWindow ? getLastActiveWindow(windows) : null; + return !newWindow ? getLastActiveWindow(windows) : undefined; } function findWindowOnFilePath(windows: W[], fileUri: URI, workspaceResolver: (workspace: IWorkspaceIdentifier) => IResolvedWorkspace | null): W | null { // First check for windows with workspaces that have a parent folder of the provided path opened - const workspaceWindows = windows.filter(window => !!window.openedWorkspace); - for (const window of workspaceWindows) { - const resolvedWorkspace = workspaceResolver(window.openedWorkspace!); - if (resolvedWorkspace && resolvedWorkspace.folders.some(folder => isEqualOrParent(fileUri, folder.uri))) { - return window; + for (const window of windows) { + const workspace = window.openedWorkspace; + if (workspace) { + const resolvedWorkspace = workspaceResolver(workspace); + if (resolvedWorkspace) { + // workspace cpuld be resolved: It's in the local file system + if (resolvedWorkspace.folders.some(folder => isEqualOrParent(fileUri, folder.uri))) { + return window; + } + } else { + // use the config path instead + if (isEqualOrParent(fileUri, workspace.configPath)) { + return window; + } + } } } @@ -59,7 +68,7 @@ function findWindowOnFilePath(windows: W[], fileUri: UR return null; } -export function getLastActiveWindow(windows: W[]): W { +export function getLastActiveWindow(windows: W[]): W | undefined { const lastFocusedDate = Math.max.apply(Math, windows.map(window => window.lastFocusTime)); return windows.filter(window => window.lastFocusTime === lastFocusedDate)[0]; @@ -96,13 +105,13 @@ export function findWindowOnExtensionDevelopmentPath(wi return null; } -export function findWindowOnWorkspaceOrFolderUri(windows: W[], uri: URI): W | null { +export function findWindowOnWorkspaceOrFolderUri(windows: W[], uri: URI | undefined): W | null { if (!uri) { return null; } for (const window of windows) { // check for workspace config path - if (window.openedWorkspace && isEqual(URI.file(window.openedWorkspace.configPath), uri, !platform.isLinux /* ignorecase */)) { + if (window.openedWorkspace && isEqual(window.openedWorkspace.configPath, uri)) { return window; } diff --git a/src/vs/code/test/electron-main/windowsStateStorage.test.ts b/src/vs/code/test/electron-main/windowsStateStorage.test.ts new file mode 100644 index 00000000000..8a82e33e1e4 --- /dev/null +++ b/src/vs/code/test/electron-main/windowsStateStorage.test.ts @@ -0,0 +1,291 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as assert from 'assert'; +import * as os from 'os'; +import * as path from 'path'; + +import { restoreWindowsState, getWindowsStateStoreData } from 'vs/code/electron-main/windowsStateStorage'; +import { IWindowState as IWindowUIState, WindowMode } from 'vs/platform/windows/electron-main/windows'; +import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { URI } from 'vs/base/common/uri'; +import { IWindowsState, IWindowState } from 'vs/code/electron-main/windows'; + +function getUIState(): IWindowUIState { + return { + x: 0, + y: 10, + width: 100, + height: 200, + mode: 0 + }; +} + +function toWorkspace(uri: URI): IWorkspaceIdentifier { + return { + id: '1234', + configPath: uri + }; +} +function assertEqualURI(u1: URI | undefined, u2: URI | undefined, message?: string): void { + assert.equal(u1 && u1.toString(), u2 && u2.toString(), message); +} + +function assertEqualWorkspace(w1: IWorkspaceIdentifier | undefined, w2: IWorkspaceIdentifier | undefined, message?: string): void { + if (!w1 || !w2) { + assert.equal(w1, w2, message); + return; + } + assert.equal(w1.id, w2.id, message); + assertEqualURI(w1.configPath, w2.configPath, message); +} + +function assertEqualWindowState(expected: IWindowState | undefined, actual: IWindowState | undefined, message?: string) { + if (!expected || !actual) { + assert.deepEqual(expected, actual, message); + return; + } + assert.equal(expected.backupPath, actual.backupPath, message); + assertEqualURI(expected.folderUri, actual.folderUri, message); + assert.equal(expected.remoteAuthority, actual.remoteAuthority, message); + assertEqualWorkspace(expected.workspace, actual.workspace, message); + assert.deepEqual(expected.uiState, actual.uiState, message); +} + +function assertEqualWindowsState(expected: IWindowsState, actual: IWindowsState, message?: string) { + assertEqualWindowState(expected.lastPluginDevelopmentHostWindow, actual.lastPluginDevelopmentHostWindow, message); + assertEqualWindowState(expected.lastActiveWindow, actual.lastActiveWindow, message); + assert.equal(expected.openedWindows.length, actual.openedWindows.length, message); + for (let i = 0; i < expected.openedWindows.length; i++) { + assertEqualWindowState(expected.openedWindows[i], actual.openedWindows[i], message); + } +} + +function assertRestoring(state: IWindowsState, message?: string) { + const stored = getWindowsStateStoreData(state); + const restored = restoreWindowsState(stored); + assertEqualWindowsState(state, restored, message); +} + +const testBackupPath1 = path.join(os.tmpdir(), 'windowStateTest', 'backupFolder1'); +const testBackupPath2 = path.join(os.tmpdir(), 'windowStateTest', 'backupFolder2'); + +const testWSPath = URI.file(path.join(os.tmpdir(), 'windowStateTest', 'test.code-workspace')); +const testFolderURI = URI.file(path.join(os.tmpdir(), 'windowStateTest', 'testFolder')); + +const testRemoteFolderURI = URI.parse('foo://bar/c/d'); + +suite('Windows State Storing', () => { + test('storing and restoring', () => { + let windowState: IWindowsState; + windowState = { + openedWindows: [] + }; + assertRestoring(windowState, 'no windows'); + windowState = { + openedWindows: [{ backupPath: testBackupPath1, uiState: getUIState() }] + }; + assertRestoring(windowState, 'empty workspace'); + + windowState = { + openedWindows: [{ backupPath: testBackupPath1, uiState: getUIState(), workspace: toWorkspace(testWSPath) }] + }; + assertRestoring(windowState, 'workspace'); + + windowState = { + openedWindows: [{ backupPath: testBackupPath2, uiState: getUIState(), folderUri: testFolderURI }] + }; + assertRestoring(windowState, 'folder'); + + windowState = { + openedWindows: [{ backupPath: testBackupPath1, uiState: getUIState(), folderUri: testFolderURI }, { backupPath: testBackupPath1, uiState: getUIState(), folderUri: testRemoteFolderURI, remoteAuthority: 'bar' }] + }; + assertRestoring(windowState, 'multiple windows'); + + windowState = { + lastActiveWindow: { backupPath: testBackupPath2, uiState: getUIState(), folderUri: testFolderURI }, + openedWindows: [] + }; + assertRestoring(windowState, 'lastActiveWindow'); + + windowState = { + lastPluginDevelopmentHostWindow: { backupPath: testBackupPath2, uiState: getUIState(), folderUri: testFolderURI }, + openedWindows: [] + }; + assertRestoring(windowState, 'lastPluginDevelopmentHostWindow'); + }); + + test('open 1_31', () => { + const v1_31_workspace = `{ + "openedWindows": [], + "lastActiveWindow": { + "workspace": { + "id": "a41787288b5e9cc1a61ba2dd84cd0d80", + "configPath": "/home/user/workspaces/code-and-docs.code-workspace" + }, + "backupPath": "/home/user/.config/Code - Insiders/Backups/a41787288b5e9cc1a61ba2dd84cd0d80", + "uiState": { + "mode": 0, + "x": 0, + "y": 27, + "width": 2560, + "height": 1364 + } + } + }`; + + let windowsState = restoreWindowsState(JSON.parse(v1_31_workspace)); + let expected: IWindowsState = { + openedWindows: [], + lastActiveWindow: { + backupPath: '/home/user/.config/Code - Insiders/Backups/a41787288b5e9cc1a61ba2dd84cd0d80', + uiState: { mode: WindowMode.Maximized, x: 0, y: 27, width: 2560, height: 1364 }, + workspace: { id: 'a41787288b5e9cc1a61ba2dd84cd0d80', configPath: URI.file('/home/user/workspaces/code-and-docs.code-workspace') } + } + }; + + assertEqualWindowsState(expected, windowsState, 'v1_31_workspace'); + + const v1_31_folder = `{ + "openedWindows": [], + "lastPluginDevelopmentHostWindow": { + "folderUri": { + "$mid": 1, + "fsPath": "/home/user/workspaces/testing/customdata", + "external": "file:///home/user/workspaces/testing/customdata", + "path": "/home/user/workspaces/testing/customdata", + "scheme": "file" + }, + "uiState": { + "mode": 1, + "x": 593, + "y": 617, + "width": 1625, + "height": 595 + } + } + }`; + + windowsState = restoreWindowsState(JSON.parse(v1_31_folder)); + expected = { + openedWindows: [], + lastPluginDevelopmentHostWindow: { + uiState: { mode: WindowMode.Normal, x: 593, y: 617, width: 1625, height: 595 }, + folderUri: URI.parse('file:///home/user/workspaces/testing/customdata') + } + }; + assertEqualWindowsState(expected, windowsState, 'v1_31_folder'); + + const v1_31_empty_window = ` { + "openedWindows": [ + ], + "lastActiveWindow": { + "backupPath": "C:\\\\Users\\\\Mike\\\\AppData\\\\Roaming\\\\Code\\\\Backups\\\\1549538599815", + "uiState": { + "mode": 0, + "x": -8, + "y": -8, + "width": 2576, + "height": 1344 + } + } + }`; + + windowsState = restoreWindowsState(JSON.parse(v1_31_empty_window)); + expected = { + openedWindows: [], + lastActiveWindow: { + backupPath: 'C:\\Users\\Mike\\AppData\\Roaming\\Code\\Backups\\1549538599815', + uiState: { mode: WindowMode.Maximized, x: -8, y: -8, width: 2576, height: 1344 } + } + }; + assertEqualWindowsState(expected, windowsState, 'v1_31_empty_window'); + + }); + + test('open 1_32', () => { + const v1_32_workspace = `{ + "openedWindows": [], + "lastActiveWindow": { + "workspaceIdentifier": { + "id": "53b714b46ef1a2d4346568b4f591028c", + "configURIPath": "file:///home/user/workspaces/testing/custom.code-workspace" + }, + "backupPath": "/home/user/.config/code-oss-dev/Backups/53b714b46ef1a2d4346568b4f591028c", + "uiState": { + "mode": 0, + "x": 0, + "y": 27, + "width": 2560, + "height": 1364 + } + } + }`; + + let windowsState = restoreWindowsState(JSON.parse(v1_32_workspace)); + let expected: IWindowsState = { + openedWindows: [], + lastActiveWindow: { + backupPath: '/home/user/.config/code-oss-dev/Backups/53b714b46ef1a2d4346568b4f591028c', + uiState: { mode: WindowMode.Maximized, x: 0, y: 27, width: 2560, height: 1364 }, + workspace: { id: '53b714b46ef1a2d4346568b4f591028c', configPath: URI.parse('file:///home/user/workspaces/testing/custom.code-workspace') } + } + }; + + assertEqualWindowsState(expected, windowsState, 'v1_32_workspace'); + + const v1_32_folder = `{ + "openedWindows": [], + "lastActiveWindow": { + "folder": "file:///home/user/workspaces/testing/folding", + "backupPath": "/home/user/.config/code-oss-dev/Backups/1daac1621c6c06f9e916ac8062e5a1b5", + "uiState": { + "mode": 1, + "x": 625, + "y": 263, + "width": 1718, + "height": 953 + } + } + }`; + + windowsState = restoreWindowsState(JSON.parse(v1_32_folder)); + expected = { + openedWindows: [], + lastActiveWindow: { + backupPath: '/home/user/.config/code-oss-dev/Backups/1daac1621c6c06f9e916ac8062e5a1b5', + uiState: { mode: WindowMode.Normal, x: 625, y: 263, width: 1718, height: 953 }, + folderUri: URI.parse('file:///home/user/workspaces/testing/folding') + } + }; + assertEqualWindowsState(expected, windowsState, 'v1_32_folder'); + + const v1_32_empty_window = ` { + "openedWindows": [ + ], + "lastActiveWindow": { + "backupPath": "/home/user/.config/code-oss-dev/Backups/1549539668998", + "uiState": { + "mode": 1, + "x": 768, + "y": 336, + "width": 1024, + "height": 768 + } + } + }`; + + windowsState = restoreWindowsState(JSON.parse(v1_32_empty_window)); + expected = { + openedWindows: [], + lastActiveWindow: { + backupPath: '/home/user/.config/code-oss-dev/Backups/1549539668998', + uiState: { mode: WindowMode.Normal, x: 768, y: 336, width: 1024, height: 768 } + } + }; + assertEqualWindowsState(expected, windowsState, 'v1_32_empty_window'); + + }); + +}); \ No newline at end of file diff --git a/src/vs/code/test/node/windowsFinder.test.ts b/src/vs/code/test/node/windowsFinder.test.ts index 270a7dc04c9..79d476c53d0 100644 --- a/src/vs/code/test/node/windowsFinder.test.ts +++ b/src/vs/code/test/node/windowsFinder.test.ts @@ -15,14 +15,13 @@ const fixturesFolder = getPathFromAmdModule(require, './fixtures'); const testWorkspace: IWorkspaceIdentifier = { id: Date.now().toString(), - configPath: path.join(fixturesFolder, 'workspaces.json') + configPath: URI.file(path.join(fixturesFolder, 'workspaces.json')) }; function options(custom?: Partial>): IBestWindowOrFolderOptions { return { windows: [], newWindow: false, - reuseWindow: false, context: OpenContext.CLI, codeSettingsFolder: '_vscode', workspaceResolver: workspace => { return workspace === testWorkspace ? { id: testWorkspace.id, configPath: workspace.configPath, folders: toWorkspaceFolders([{ path: path.join(fixturesFolder, 'vscode_workspace_1_folder') }, { path: path.join(fixturesFolder, 'vscode_workspace_2_folder') }]) } : null!; }, @@ -52,7 +51,6 @@ suite('WindowsFinder', () => { })), null); assert.equal(findBestWindowOrFolderForFile(options({ fileUri: URI.file(path.join(fixturesFolder, 'vscode_folder', 'file.txt')), - reuseWindow: true })), null); assert.equal(findBestWindowOrFolderForFile(options({ fileUri: URI.file(path.join(fixturesFolder, 'vscode_folder', 'file.txt')), @@ -85,7 +83,6 @@ suite('WindowsFinder', () => { assert.equal(findBestWindowOrFolderForFile(options({ windows: [lastActiveWindow, noVscodeFolderWindow], fileUri: URI.file(path.join(fixturesFolder, 'vscode_folder', 'file.txt')), - reuseWindow: true })), lastActiveWindow); assert.equal(findBestWindowOrFolderForFile(options({ windows, diff --git a/src/vs/editor/browser/editorExtensions.ts b/src/vs/editor/browser/editorExtensions.ts index 15365b311a9..b7061803c01 100644 --- a/src/vs/editor/browser/editorExtensions.ts +++ b/src/vs/editor/browser/editorExtensions.ts @@ -184,9 +184,9 @@ export interface IActionOptions extends ICommandOptions { } export abstract class EditorAction extends EditorCommand { - public label: string; - public alias: string; - private menuOpts: IEditorCommandMenuOptions | undefined; + public readonly label: string; + public readonly alias: string; + private readonly menuOpts: IEditorCommandMenuOptions | undefined; constructor(opts: IActionOptions) { super(opts); diff --git a/src/vs/editor/browser/view/viewController.ts b/src/vs/editor/browser/view/viewController.ts index 0279da56704..0e9eec2e01c 100644 --- a/src/vs/editor/browser/view/viewController.ts +++ b/src/vs/editor/browser/view/viewController.ts @@ -132,7 +132,7 @@ export class ViewController { public dispatchMouse(data: IMouseDispatchData): void { if (data.middleButton) { if (data.inSelectionMode) { - this.columnSelect(data.position, data.mouseColumn); + this._columnSelect(data.position, data.mouseColumn); } else { this.moveTo(data.position); } @@ -140,60 +140,60 @@ export class ViewController { // If the dragging started on the gutter, then have operations work on the entire line if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { - this.lastCursorLineSelect(data.position); + this._lastCursorLineSelect(data.position); } else { - this.createCursor(data.position, true); + this._createCursor(data.position, true); } } else { if (data.inSelectionMode) { - this.lineSelectDrag(data.position); + this._lineSelectDrag(data.position); } else { - this.lineSelect(data.position); + this._lineSelect(data.position); } } } else if (data.mouseDownCount >= 4) { - this.selectAll(); + this._selectAll(); } else if (data.mouseDownCount === 3) { if (this._hasMulticursorModifier(data)) { if (data.inSelectionMode) { - this.lastCursorLineSelectDrag(data.position); + this._lastCursorLineSelectDrag(data.position); } else { - this.lastCursorLineSelect(data.position); + this._lastCursorLineSelect(data.position); } } else { if (data.inSelectionMode) { - this.lineSelectDrag(data.position); + this._lineSelectDrag(data.position); } else { - this.lineSelect(data.position); + this._lineSelect(data.position); } } } else if (data.mouseDownCount === 2) { if (this._hasMulticursorModifier(data)) { - this.lastCursorWordSelect(data.position); + this._lastCursorWordSelect(data.position); } else { if (data.inSelectionMode) { - this.wordSelectDrag(data.position); + this._wordSelectDrag(data.position); } else { - this.wordSelect(data.position); + this._wordSelect(data.position); } } } else { if (this._hasMulticursorModifier(data)) { if (!this._hasNonMulticursorModifier(data)) { if (data.shiftKey) { - this.columnSelect(data.position, data.mouseColumn); + this._columnSelect(data.position, data.mouseColumn); } else { // Do multi-cursor operations only when purely alt is pressed if (data.inSelectionMode) { - this.lastCursorMoveToSelect(data.position); + this._lastCursorMoveToSelect(data.position); } else { - this.createCursor(data.position, false); + this._createCursor(data.position, false); } } } } else { if (data.inSelectionMode) { - this.moveToSelect(data.position); + this._moveToSelect(data.position); } else { this.moveTo(data.position); } @@ -204,7 +204,7 @@ export class ViewController { private _usualArgs(viewPosition: Position) { viewPosition = this._validateViewColumn(viewPosition); return { - position: this.convertViewToModelPosition(viewPosition), + position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition }; } @@ -213,67 +213,67 @@ export class ViewController { this._execMouseCommand(CoreNavigationCommands.MoveTo, this._usualArgs(viewPosition)); } - private moveToSelect(viewPosition: Position): void { + private _moveToSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.MoveToSelect, this._usualArgs(viewPosition)); } - private columnSelect(viewPosition: Position, mouseColumn: number): void { + private _columnSelect(viewPosition: Position, mouseColumn: number): void { viewPosition = this._validateViewColumn(viewPosition); this._execMouseCommand(CoreNavigationCommands.ColumnSelect, { - position: this.convertViewToModelPosition(viewPosition), + position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition, mouseColumn: mouseColumn }); } - private createCursor(viewPosition: Position, wholeLine: boolean): void { + private _createCursor(viewPosition: Position, wholeLine: boolean): void { viewPosition = this._validateViewColumn(viewPosition); this._execMouseCommand(CoreNavigationCommands.CreateCursor, { - position: this.convertViewToModelPosition(viewPosition), + position: this._convertViewToModelPosition(viewPosition), viewPosition: viewPosition, wholeLine: wholeLine }); } - private lastCursorMoveToSelect(viewPosition: Position): void { + private _lastCursorMoveToSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LastCursorMoveToSelect, this._usualArgs(viewPosition)); } - private wordSelect(viewPosition: Position): void { + private _wordSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.WordSelect, this._usualArgs(viewPosition)); } - private wordSelectDrag(viewPosition: Position): void { + private _wordSelectDrag(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.WordSelectDrag, this._usualArgs(viewPosition)); } - private lastCursorWordSelect(viewPosition: Position): void { + private _lastCursorWordSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LastCursorWordSelect, this._usualArgs(viewPosition)); } - private lineSelect(viewPosition: Position): void { + private _lineSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LineSelect, this._usualArgs(viewPosition)); } - private lineSelectDrag(viewPosition: Position): void { + private _lineSelectDrag(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LineSelectDrag, this._usualArgs(viewPosition)); } - private lastCursorLineSelect(viewPosition: Position): void { + private _lastCursorLineSelect(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelect, this._usualArgs(viewPosition)); } - private lastCursorLineSelectDrag(viewPosition: Position): void { + private _lastCursorLineSelectDrag(viewPosition: Position): void { this._execMouseCommand(CoreNavigationCommands.LastCursorLineSelectDrag, this._usualArgs(viewPosition)); } - private selectAll(): void { + private _selectAll(): void { this._execMouseCommand(CoreNavigationCommands.SelectAll, {}); } // ---------------------- - private convertViewToModelPosition(viewPosition: Position): Position { + private _convertViewToModelPosition(viewPosition: Position): Position { return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(viewPosition); } diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 1468afc9581..4bad77f0289 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -864,8 +864,8 @@ export const symbolKindToCssClass = (function () { _fromMapping[SymbolKind.Operator] = 'operator'; _fromMapping[SymbolKind.TypeParameter] = 'type-parameter'; - return function toCssClassName(kind: SymbolKind): string { - return `symbol-icon ${_fromMapping[kind] || 'property'}`; + return function toCssClassName(kind: SymbolKind, inline?: boolean): string { + return `symbol-icon ${inline ? 'inline' : 'block'} ${_fromMapping[kind] || 'property'}`; }; })(); diff --git a/src/vs/editor/contrib/documentSymbols/media/outlineTree.css b/src/vs/editor/contrib/documentSymbols/media/outlineTree.css index a208aacb5dd..ebc2389a0e2 100644 --- a/src/vs/editor/contrib/documentSymbols/media/outlineTree.css +++ b/src/vs/editor/contrib/documentSymbols/media/outlineTree.css @@ -3,49 +3,28 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-tree.focused .selected .outline-element-label, .monaco-tree.focused .selected .outline-element-decoration { +.monaco-list .monaco-list-row.focused.selected .outline-element .monaco-highlighted-label, +.monaco-list .monaco-list-row.focused.selected .outline-element-decoration { /* make sure selection color wins when a label is being selected */ color: inherit !important; } -.monaco-tree .outline-element { +.monaco-list .outline-element { display: flex; flex: 1; flex-flow: row nowrap; align-items: center; } -.monaco-tree .outline-element .outline-element-icon { - padding-right: 3px; -} - -.monaco-tree .outline-element .outline-element-label { - text-overflow: ellipsis; - overflow: hidden; +.monaco-list .outline-element .monaco-highlighted-label { color: var(--outline-element-color); } -.monaco-tree .outline-element .outline-element-label .monaco-highlighted-label .highlight { - font-weight: bold; -} - -.monaco-tree .outline-element .outline-element-detail { - visibility: hidden; - flex: 1; - flex-basis: 10%; - opacity: 0.8; - overflow: hidden; - text-overflow: ellipsis; - font-size: 90%; - padding-left: 4px; - padding-top: 3px; -} - .monaco-tree .monaco-tree-row.focused .outline-element .outline-element-detail { visibility: inherit; } -.monaco-tree .outline-element .outline-element-decoration { +.monaco-list .outline-element .outline-element-decoration { opacity: 0.75; font-size: 90%; font-weight: 600; @@ -55,7 +34,7 @@ color: var(--outline-element-color); } -.monaco-tree .outline-element .outline-element-decoration.bubble { +.monaco-list .outline-element .outline-element-decoration.bubble { font-family: octicons; font-size: 14px; opacity: 0.4; diff --git a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css index 76d67d5efcc..2a6a31185fa 100644 --- a/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css +++ b/src/vs/editor/contrib/documentSymbols/media/symbol-icons.css @@ -3,7 +3,13 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -.monaco-workbench .symbol-icon { +.monaco-workbench .symbol-icon.inline { + background-position: left center; + padding-left: 20px; + background-size: 16px 16px; +} + +.monaco-workbench .symbol-icon.block { display: inline-block; height: 14px; width: 16px; diff --git a/src/vs/workbench/parts/outline/electron-browser/outline.ts b/src/vs/editor/contrib/documentSymbols/outline.ts similarity index 100% rename from src/vs/workbench/parts/outline/electron-browser/outline.ts rename to src/vs/editor/contrib/documentSymbols/outline.ts diff --git a/src/vs/editor/contrib/documentSymbols/outlineModel.ts b/src/vs/editor/contrib/documentSymbols/outlineModel.ts index cf559331c52..179b23f3a11 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineModel.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineModel.ts @@ -7,7 +7,6 @@ import { binarySearch, coalesceInPlace } from 'vs/base/common/arrays'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { first, forEach, size } from 'vs/base/common/collections'; import { onUnexpectedExternalError } from 'vs/base/common/errors'; -import { fuzzyScore, FuzzyScore } from 'vs/base/common/filters'; import { LRUCache } from 'vs/base/common/map'; import { commonPrefixLength } from 'vs/base/common/strings'; import { IPosition } from 'vs/editor/common/core/position'; @@ -90,7 +89,6 @@ export abstract class TreeElement { export class OutlineElement extends TreeElement { children: { [id: string]: OutlineElement; } = Object.create(null); - score: FuzzyScore | undefined = FuzzyScore.Default; marker: { count: number, topSev: MarkerSeverity } | undefined; constructor( @@ -127,33 +125,6 @@ export class OutlineGroup extends TreeElement { return res; } - updateMatches(pattern: string, topMatch: OutlineElement | undefined): OutlineElement | undefined { - for (const key in this.children) { - topMatch = this._updateMatches(pattern, this.children[key], topMatch); - } - return topMatch; - } - - private _updateMatches(pattern: string, item: OutlineElement, topMatch: OutlineElement | undefined): OutlineElement | undefined { - - item.score = pattern - ? fuzzyScore(pattern, pattern.toLowerCase(), 0, item.symbol.name, item.symbol.name.toLowerCase(), 0, true) - : FuzzyScore.Default; - - if (item.score && (!topMatch || !topMatch.score || item.score[0] > topMatch.score[0])) { - topMatch = item; - } - for (const key in item.children) { - let child = item.children[key]; - topMatch = this._updateMatches(pattern, child, topMatch); - if (!item.score && child.score) { - // don't filter parents with unfiltered children - item.score = FuzzyScore.Default; - } - } - return topMatch; - } - getItemEnclosingPosition(position: IPosition): OutlineElement | undefined { return position ? this._getItemEnclosingPosition(position, this.children) : undefined; } @@ -268,7 +239,7 @@ export class OutlineModel extends TreeElement { if (data!.model) { // resolved -> return data - return Promise.resolve(data.model); + return Promise.resolve(data.model!); } // increase usage counter @@ -395,20 +366,6 @@ export class OutlineModel extends TreeElement { return true; } - private _matches: [string, OutlineElement | undefined]; - - updateMatches(pattern: string): OutlineElement | undefined { - if (this._matches && this._matches[0] === pattern) { - return this._matches[1]; - } - let topMatch: OutlineElement | undefined; - for (const key in this._groups) { - topMatch = this._groups[key].updateMatches(pattern, topMatch); - } - this._matches = [pattern, topMatch]; - return topMatch; - } - getItemEnclosingPosition(position: IPosition, context?: OutlineElement): OutlineElement | undefined { let preferredGroup: OutlineGroup | undefined; diff --git a/src/vs/editor/contrib/documentSymbols/outlineTree.ts b/src/vs/editor/contrib/documentSymbols/outlineTree.ts index 4c529be6e97..a15286a4a94 100644 --- a/src/vs/editor/contrib/documentSymbols/outlineTree.ts +++ b/src/vs/editor/contrib/documentSymbols/outlineTree.ts @@ -4,178 +4,140 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; +import { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; +import { IDataSource, ITreeNode, ITreeRenderer, ITreeSorter } from 'vs/base/browser/ui/tree/tree'; import { values } from 'vs/base/common/collections'; -import { createMatches } from 'vs/base/common/filters'; -import { IDataSource, IFilter, IRenderer, ISorter, ITree } from 'vs/base/parts/tree/browser/tree'; +import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import 'vs/css!./media/outlineTree'; import 'vs/css!./media/symbol-icons'; import { Range } from 'vs/editor/common/core/range'; import { SymbolKind, symbolKindToCssClass } from 'vs/editor/common/modes'; import { OutlineElement, OutlineGroup, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; import { localize } from 'vs/nls'; +import { IKeybindingService, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding'; +import { IconLabel } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { WorkbenchTreeController } from 'vs/platform/list/browser/listService'; +import { OutlineConfigKeys } from 'vs/editor/contrib/documentSymbols/outline'; import { MarkerSeverity } from 'vs/platform/markers/common/markers'; -import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { listErrorForeground, listWarningForeground } from 'vs/platform/theme/common/colorRegistry'; -export const enum OutlineItemCompareType { - ByPosition, - ByName, - ByKind -} +export type OutlineItem = OutlineGroup | OutlineElement; -export class OutlineItemComparator implements ISorter { +export class OutlineNavigationLabelProvider implements IKeyboardNavigationLabelProvider { - constructor( - public type: OutlineItemCompareType = OutlineItemCompareType.ByPosition - ) { } + constructor(@IKeybindingService private readonly _keybindingService: IKeybindingService) { } - compare(tree: ITree, a: OutlineGroup | OutlineElement, b: OutlineGroup | OutlineElement): number { - - if (a instanceof OutlineGroup && b instanceof OutlineGroup) { - return a.providerIndex - b.providerIndex; + getKeyboardNavigationLabel(element: OutlineItem): { toString(): string; } { + if (element instanceof OutlineGroup) { + return element.provider.displayName || element.id; + } else { + return element.symbol.name; } + } - if (a instanceof OutlineElement && b instanceof OutlineElement) { - switch (this.type) { - case OutlineItemCompareType.ByKind: - return a.symbol.kind - b.symbol.kind; - case OutlineItemCompareType.ByName: - return a.symbol.name.localeCompare(b.symbol.name); - case OutlineItemCompareType.ByPosition: - default: - return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); - } - } - - return 0; + mightProducePrintableCharacter(event: IKeyboardEvent): boolean { + return this._keybindingService.mightProducePrintableCharacter(event); } } -export class OutlineItemFilter implements IFilter { - enabled: boolean = true; - - isVisible(tree: ITree, element: OutlineElement | any): boolean { - if (!this.enabled) { - return true; - } - return !(element instanceof OutlineElement) || Boolean(element.score); +export class OutlineIdentityProvider implements IIdentityProvider { + getId(element: TreeElement): { toString(): string; } { + return element.id; } } -export class OutlineDataSource implements IDataSource { +export class OutlineGroupTemplate { + static id = 'OutlineGroupTemplate'; - // this is a workaround for the tree showing twisties for items - // with only filtered children - filterOnScore: boolean = true; - - getId(tree: ITree, element: TreeElement): string { - return element ? element.id : 'empty'; - } - - hasChildren(tree: ITree, element: OutlineModel | OutlineGroup | OutlineElement): boolean { - if (!element) { - return false; - } - if (element instanceof OutlineModel) { - return true; - } - if (element instanceof OutlineElement && (this.filterOnScore && !element.score)) { - return false; - } - for (const id in element.children) { - if (!this.filterOnScore || element.children[id].score) { - return true; - } - } - return false; - } - - getChildren(tree: ITree, element: TreeElement): Promise { - let res = values(element.children); - // console.log(element.id + ' with children ' + res.length); - return Promise.resolve(res); - } - - getParent(tree: ITree, element: TreeElement | any): Promise { - return Promise.resolve(element && element.parent); - } - - shouldAutoexpand(tree: ITree, element: TreeElement): boolean { - return element && (element instanceof OutlineModel || element.parent instanceof OutlineModel || element instanceof OutlineGroup || element.parent instanceof OutlineGroup); - } -} - -export interface OutlineTemplate { labelContainer: HTMLElement; label: HighlightedLabel; - icon?: HTMLElement; - detail?: HTMLElement; - decoration?: HTMLElement; } -export class OutlineRenderer implements IRenderer { +export class OutlineElementTemplate { + static id = 'OutlineElementTemplate'; + container: HTMLElement; + iconLabel: IconLabel; + decoration: HTMLElement; +} - renderProblemColors = true; - renderProblemBadges = true; +export class OutlineVirtualDelegate implements IListVirtualDelegate { - constructor( - @IThemeService readonly _themeService: IThemeService, - @IConfigurationService readonly _configurationService: IConfigurationService - ) { - // - } - - getHeight(tree: ITree, element: any): number { + getHeight(_element: OutlineItem): number { return 22; } - getTemplateId(tree: ITree, element: OutlineGroup | OutlineElement): string { - return element instanceof OutlineGroup ? 'outline-group' : 'outline-element'; - } - - renderTemplate(tree: ITree, templateId: string, container: HTMLElement): OutlineTemplate { - if (templateId === 'outline-element') { - const icon = dom.$('.outline-element-icon symbol-icon'); - const labelContainer = dom.$('.outline-element-label'); - const detail = dom.$('.outline-element-detail'); - const decoration = dom.$('.outline-element-decoration'); - dom.addClass(container, 'outline-element'); - dom.append(container, icon, labelContainer, detail, decoration); - return { icon, labelContainer, label: new HighlightedLabel(labelContainer, true), detail, decoration }; - } - if (templateId === 'outline-group') { - const labelContainer = dom.$('.outline-element-label'); - dom.addClass(container, 'outline-element'); - dom.append(container, labelContainer); - return { labelContainer, label: new HighlightedLabel(labelContainer, true) }; - } - - throw new Error(templateId); - } - - renderElement(tree: ITree, element: OutlineGroup | OutlineElement, templateId: string, template: OutlineTemplate): void { - if (element instanceof OutlineElement) { - template.icon.className = `outline-element-icon ${symbolKindToCssClass(element.symbol.kind)}`; - template.label.set(element.symbol.name, element.score ? createMatches(element.score) : undefined, localize('title.template', "{0} ({1})", element.symbol.name, OutlineRenderer._symbolKindNames[element.symbol.kind])); - template.detail.innerText = element.symbol.detail || ''; - this._renderMarkerInfo(element, template); - - } + getTemplateId(element: OutlineItem): string { if (element instanceof OutlineGroup) { - template.label.set(element.provider.displayName || localize('provider', "Outline Provider")); + return OutlineGroupTemplate.id; + } else { + return OutlineElementTemplate.id; } } +} - private _renderMarkerInfo(element: OutlineElement, template: OutlineTemplate): void { +export class OutlineGroupRenderer implements ITreeRenderer { + + readonly templateId: string = OutlineGroupTemplate.id; + + renderTemplate(container: HTMLElement): OutlineGroupTemplate { + const labelContainer = dom.$('.outline-element-label'); + dom.addClass(container, 'outline-element'); + dom.append(container, labelContainer); + return { labelContainer, label: new HighlightedLabel(labelContainer, true) }; + } + + renderElement(node: ITreeNode, index: number, template: OutlineGroupTemplate): void { + template.label.set( + node.element.provider.displayName || localize('provider', "Outline Provider"), + createMatches(node.filterData) + ); + } + + disposeTemplate(_template: OutlineGroupTemplate): void { + // nothing + } +} + +export class OutlineElementRenderer implements ITreeRenderer { + + readonly templateId: string = OutlineElementTemplate.id; + + constructor( + @IConfigurationService private readonly _configurationService: IConfigurationService, + @IThemeService private readonly _themeService: IThemeService, + ) { } + + renderTemplate(container: HTMLElement): OutlineElementTemplate { + dom.addClass(container, 'outline-element'); + const iconLabel = new IconLabel(container, { supportHighlights: true }); + const decoration = dom.$('.outline-element-decoration'); + container.appendChild(decoration); + return { container, iconLabel, decoration }; + } + + renderElement(node: ITreeNode, index: number, template: OutlineElementTemplate): void { + const { element } = node; + const options = { + matches: createMatches(node.filterData), + extraClasses: [], + title: localize('title.template', "{0} ({1})", element.symbol.name, OutlineElementRenderer._symbolKindNames[element.symbol.kind]) + }; + if (this._configurationService.getValue(OutlineConfigKeys.icons)) { + // add styles for the icons + options.extraClasses.push(`outline-element-icon ${symbolKindToCssClass(element.symbol.kind, true)}`); + } + template.iconLabel.setLabel(element.symbol.name, element.symbol.detail, options); + this._renderMarkerInfo(element, template); + } + + private _renderMarkerInfo(element: OutlineElement, template: OutlineElementTemplate): void { if (!element.marker) { dom.hide(template.decoration); - template.labelContainer.style.removeProperty('--outline-element-color'); + template.container.style.removeProperty('--outline-element-color'); return; } @@ -184,14 +146,14 @@ export class OutlineRenderer implements IRenderer { const cssColor = color ? color.toString() : 'inherit'; // color of the label - if (this.renderProblemColors) { - template.labelContainer.style.setProperty('--outline-element-color', cssColor); + if (this._configurationService.getValue(OutlineConfigKeys.problemsColors)) { + template.container.style.setProperty('--outline-element-color', cssColor); } else { - template.labelContainer.style.removeProperty('--outline-element-color'); + template.container.style.removeProperty('--outline-element-color'); } // badge with color/rollup - if (!this.renderProblemBadges) { + if (!this._configurationService.getValue(OutlineConfigKeys.problemsBadges)) { dom.hide(template.decoration); } else if (count > 0) { @@ -239,77 +201,46 @@ export class OutlineRenderer implements IRenderer { [SymbolKind.Variable]: localize('Variable', "variable"), }; - disposeTemplate(tree: ITree, templateId: string, template: OutlineTemplate): void { - // noop + disposeTemplate(_template: OutlineElementTemplate): void { + _template.iconLabel.dispose(); } } -export class OutlineTreeState { +export const enum OutlineSortOrder { + ByPosition, + ByName, + ByKind +} - readonly selected: string; - readonly focused: string; - readonly expanded: string[]; +export class OutlineItemComparator implements ITreeSorter { - static capture(tree: ITree): OutlineTreeState { - // selection - let selected: string; - let element = tree.getSelection()[0]; - if (element instanceof TreeElement) { - selected = element.id; - } + constructor( + public type: OutlineSortOrder = OutlineSortOrder.ByPosition + ) { } - // focus - let focused: string; - element = tree.getFocus(true); - if (element instanceof TreeElement) { - focused = element.id; - } + compare(a: OutlineItem, b: OutlineItem): number { + if (a instanceof OutlineGroup && b instanceof OutlineGroup) { + return a.providerIndex - b.providerIndex; - // expansion - let expanded = new Array(); - let nav = tree.getNavigator(); - while (nav.next()) { - let element = nav.current(); - if (element instanceof TreeElement) { - if (tree.isExpanded(element)) { - expanded.push(element.id); - } + } else if (a instanceof OutlineElement && b instanceof OutlineElement) { + if (this.type === OutlineSortOrder.ByKind) { + return a.symbol.kind - b.symbol.kind || a.symbol.name.localeCompare(b.symbol.name); + } else if (this.type === OutlineSortOrder.ByName) { + return a.symbol.name.localeCompare(b.symbol.name) || Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range); + } else if (this.type === OutlineSortOrder.ByPosition) { + return Range.compareRangesUsingStarts(a.symbol.range, b.symbol.range) || a.symbol.name.localeCompare(b.symbol.name); } } - return { selected, focused, expanded }; - } - - static async restore(tree: ITree, state: OutlineTreeState, eventPayload: any): Promise { - let model = tree.getInput(); - if (!state || !(model instanceof OutlineModel)) { - return Promise.resolve(undefined); - } - - // expansion - let items: TreeElement[] = []; - for (const id of state.expanded) { - let item = model.getItemById(id); - if (item) { - items.push(item); - } - } - await tree.collapseAll(undefined); - await tree.expandAll(items); - - // selection & focus - let selected = model.getItemById(state.selected); - let focused = model.getItemById(state.focused); - tree.setSelection([selected], eventPayload); - tree.setFocus(focused, eventPayload); + return 0; } } -export class OutlineController extends WorkbenchTreeController { - protected shouldToggleExpansion(element: any, event: IMouseEvent, origin: string): boolean { - if (element instanceof OutlineElement) { - return this.isClickOnTwistie(event); - } else { - return super.shouldToggleExpansion(element, event, origin); +export class OutlineDataSource implements IDataSource { + + getChildren(element: undefined | OutlineModel | OutlineGroup | OutlineElement): OutlineItem[] { + if (!element) { + return []; } + return values(element.children); } } diff --git a/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts b/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts index 057bdfbea2c..b15a1451072 100644 --- a/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts +++ b/src/vs/editor/contrib/documentSymbols/test/outlineModel.test.ts @@ -101,9 +101,9 @@ suite('OutlineModel', function () { group.updateMarker(data); assert.equal(data.length, 0); // all 'stolen' - assert.equal(e0.marker.count, 1); + assert.equal(e0.marker!.count, 1); assert.equal(e1.marker, undefined); - assert.equal(e2.marker.count, 2); + assert.equal(e2.marker!.count, 2); group.updateMarker([]); assert.equal(e0.marker, undefined); @@ -127,8 +127,8 @@ suite('OutlineModel', function () { ]; group.updateMarker(data); - assert.equal(p.marker.count, 0); - assert.equal(c1.marker.count, 1); + assert.equal(p.marker!.count, 0); + assert.equal(c1.marker!.count, 1); assert.equal(c2.marker, undefined); data = [ @@ -137,18 +137,18 @@ suite('OutlineModel', function () { fakeMarker(new Range(7, 6, 7, 8)), ]; group.updateMarker(data); - assert.equal(p.marker.count, 0); - assert.equal(c1.marker.count, 2); - assert.equal(c2.marker.count, 1); + assert.equal(p.marker!.count, 0); + assert.equal(c1.marker!.count, 2); + assert.equal(c2.marker!.count, 1); data = [ fakeMarker(new Range(1, 4, 1, 11)), fakeMarker(new Range(7, 6, 7, 8)), ]; group.updateMarker(data); - assert.equal(p.marker.count, 1); + assert.equal(p.marker!.count, 1); assert.equal(c1.marker, undefined); - assert.equal(c2.marker.count, 1); + assert.equal(c2.marker!.count, 1); }); test('OutlineElement - updateMarker/multiple groups', function () { @@ -178,9 +178,9 @@ suite('OutlineModel', function () { model.updateMarker(data); - assert.equal(model.children['g1'].children['c1'].marker.count, 2); - assert.equal(model.children['g2'].children['c2'].children['c2.1'].marker.count, 1); - assert.equal(model.children['g2'].children['c2'].children['c2.2'].marker.count, 1); + assert.equal(model.children['g1']!.children['c1'].marker!.count, 2); + assert.equal(model.children['g2']!.children['c2'].children['c2.1'].marker!.count, 1); + assert.equal(model.children['g2']!.children['c2'].children['c2.2'].marker!.count, 1); }); }); diff --git a/src/vs/editor/contrib/find/findOptionsWidget.ts b/src/vs/editor/contrib/find/findOptionsWidget.ts index 0637b0a9789..768bb6adaeb 100644 --- a/src/vs/editor/contrib/find/findOptionsWidget.ts +++ b/src/vs/editor/contrib/find/findOptionsWidget.ts @@ -46,7 +46,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { this._domNode.setAttribute('role', 'presentation'); this._domNode.setAttribute('aria-hidden', 'true'); - const inputActiveOptionBorderColor = themeService.getTheme().getColor(inputActiveOptionBorder) || undefined; + const inputActiveOptionBorderColor = themeService.getTheme().getColor(inputActiveOptionBorder); this.caseSensitive = this._register(new CaseSensitiveCheckbox({ appendTitle: this._keybindingLabelFor(FIND_IDS.ToggleCaseSensitiveCommand), @@ -179,7 +179,7 @@ export class FindOptionsWidget extends Widget implements IOverlayWidget { } private _applyTheme(theme: ITheme) { - let inputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder) || undefined }; + let inputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder) }; this.caseSensitive.style(inputStyles); this.wholeWords.style(inputStyles); this.regex.style(inputStyles); diff --git a/src/vs/editor/contrib/find/findWidget.ts b/src/vs/editor/contrib/find/findWidget.ts index bda8474369d..aab295b7f39 100644 --- a/src/vs/editor/contrib/find/findWidget.ts +++ b/src/vs/editor/contrib/find/findWidget.ts @@ -542,7 +542,7 @@ export class FindWidget extends Widget implements IOverlayWidget, IHorizontalSas inputValidationWarningBorder: theme.getColor(inputValidationWarningBorder), inputValidationErrorBackground: theme.getColor(inputValidationErrorBackground), inputValidationErrorForeground: theme.getColor(inputValidationErrorForeground), - inputValidationErrorBorder: theme.getColor(inputValidationErrorBorder) + inputValidationErrorBorder: theme.getColor(inputValidationErrorBorder), }; this._findInput.style(inputStyles); this._replaceInputBox.style(inputStyles); @@ -1130,7 +1130,7 @@ export class SimpleButton extends Widget { // theming registerThemingParticipant((theme, collector) => { - const addBackgroundColorRule = (selector: string, color: Color | null): void => { + const addBackgroundColorRule = (selector: string, color: Color | undefined): void => { if (color) { collector.addRule(`.monaco-editor ${selector} { background-color: ${color}; }`); } diff --git a/src/vs/editor/contrib/find/simpleFindWidget.ts b/src/vs/editor/contrib/find/simpleFindWidget.ts index 9b96fbdcd81..2c014684065 100644 --- a/src/vs/editor/contrib/find/simpleFindWidget.ts +++ b/src/vs/editor/contrib/find/simpleFindWidget.ts @@ -6,7 +6,7 @@ import 'vs/css!./simpleFindWidget'; import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; -import { FindInput } from 'vs/base/browser/ui/findinput/findInput'; +import { FindInput, IFindInputStyles } from 'vs/base/browser/ui/findinput/findInput'; import { Widget } from 'vs/base/browser/ui/widget'; import { Delayer } from 'vs/base/common/async'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; @@ -159,7 +159,7 @@ export abstract class SimpleFindWidget extends Widget { } public updateTheme(theme: ITheme): void { - const inputStyles = { + const inputStyles: IFindInputStyles = { inputActiveOptionBorder: theme.getColor(inputActiveOptionBorder), inputBackground: theme.getColor(inputBackground), inputForeground: theme.getColor(inputForeground), diff --git a/src/vs/editor/contrib/find/test/findModel.test.ts b/src/vs/editor/contrib/find/test/findModel.test.ts index fb34b82efa0..9ac679cb054 100644 --- a/src/vs/editor/contrib/find/test/findModel.test.ts +++ b/src/vs/editor/contrib/find/test/findModel.test.ts @@ -1507,7 +1507,7 @@ suite('FindModel', () => { ] ); - editor.getModel().setValue('hello\nhi'); + editor!.getModel()!.setValue('hello\nhi'); assertFindState( editor, [1, 1, 1, 1], @@ -1538,7 +1538,7 @@ suite('FindModel', () => { findModel.selectAllMatches(); - assert.deepEqual(editor.getSelections().map(s => s.toString()), [ + assert.deepEqual(editor!.getSelections()!.map(s => s.toString()), [ new Selection(6, 14, 6, 19), new Selection(6, 27, 6, 32), new Selection(7, 14, 7, 19), @@ -1582,14 +1582,14 @@ suite('FindModel', () => { findModel.selectAllMatches(); - assert.deepEqual(editor.getSelections().map(s => s.toString()), [ + assert.deepEqual(editor!.getSelections()!.map(s => s.toString()), [ new Selection(7, 14, 7, 19), new Selection(6, 14, 6, 19), new Selection(6, 27, 6, 32), new Selection(8, 14, 8, 19) ].map(s => s.toString())); - assert.deepEqual(editor.getSelection().toString(), new Selection(7, 14, 7, 19).toString()); + assert.deepEqual(editor!.getSelection()!.toString(), new Selection(7, 14, 7, 19).toString()); assertFindState( editor, @@ -1984,7 +1984,7 @@ suite('FindModel', () => { for (let i = 0; i < 1100; i++) { initialText += 'line' + i + '\n'; } - editor.getModel().setValue(initialText); + editor!.getModel()!.setValue(initialText); let findState = new FindReplaceState(); findState.change({ searchString: '^', replaceString: 'a ', isRegex: true }, false); let findModel = new FindModelBoundToEditorModel(editor, findState); @@ -1996,7 +1996,7 @@ suite('FindModel', () => { expectedText += 'a line' + i + '\n'; } expectedText += 'a '; - assert.equal(editor.getModel().getValue(), expectedText); + assert.equal(editor!.getModel()!.getValue(), expectedText); findModel.dispose(); findState.dispose(); diff --git a/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts b/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts index 52648d04694..4f99a51c6a6 100644 --- a/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts +++ b/src/vs/editor/contrib/goToDefinition/goToDefinitionCommands.ts @@ -51,6 +51,9 @@ export class DefinitionAction extends EditorAction { } public run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { + if (!editor.hasModel()) { + return Promise.resolve(undefined); + } const notificationService = accessor.get(INotificationService); const editorService = accessor.get(ICodeEditorService); const progressService = accessor.get(IProgressService); @@ -112,14 +115,14 @@ export class DefinitionAction extends EditorAction { return getDefinitionsAtPosition(model, position, token); } - protected _getNoResultFoundMessage(info?: IWordAtPosition): string { + protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { return info && info.word ? nls.localize('noResultWord', "No definition found for '{0}'", info.word) : nls.localize('generic.noResults', "No definition found"); } protected _getMetaTitle(model: ReferencesModel): string { - return model.references.length > 1 && nls.localize('meta.title', " – {0} definitions", model.references.length); + return model.references.length > 1 ? nls.localize('meta.title', " – {0} definitions", model.references.length) : ''; } private async _onResult(editorService: ICodeEditorService, editor: ICodeEditor, model: ReferencesModel): Promise { @@ -129,21 +132,23 @@ export class DefinitionAction extends EditorAction { if (this._configuration.openInPeek) { this._openInPeek(editorService, editor, model); - } else { + } else if (editor.hasModel()) { const next = model.nearestReference(editor.getModel().uri, editor.getPosition()); - const targetEditor = await this._openReference(editor, editorService, next, this._configuration.openToSide); - if (targetEditor && model.references.length > 1) { - this._openInPeek(editorService, targetEditor, model); - } else { - model.dispose(); + if (next) { + const targetEditor = await this._openReference(editor, editorService, next, this._configuration.openToSide); + if (targetEditor && model.references.length > 1) { + this._openInPeek(editorService, targetEditor, model); + } else { + model.dispose(); + } } } } - private _openReference(editor: ICodeEditor, editorService: ICodeEditorService, reference: Location | LocationLink, sideBySide: boolean): Promise { + private _openReference(editor: ICodeEditor, editorService: ICodeEditorService, reference: Location | LocationLink, sideBySide: boolean): Promise { // range is the target-selection-range when we have one // and the the fallback is the 'full' range - let range: IRange = undefined; + let range: IRange | undefined = undefined; if (isLocationLink(reference)) { range = reference.targetSelectionRange; } @@ -265,14 +270,14 @@ export class DeclarationAction extends DefinitionAction { return getDeclarationsAtPosition(model, position, token); } - protected _getNoResultFoundMessage(info?: IWordAtPosition): string { + protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { return info && info.word ? nls.localize('decl.noResultWord', "No declaration found for '{0}'", info.word) : nls.localize('decl.generic.noResults', "No declaration found"); } protected _getMetaTitle(model: ReferencesModel): string { - return model.references.length > 1 && nls.localize('decl.meta.title', " – {0} declarations", model.references.length); + return model.references.length > 1 ? nls.localize('decl.meta.title', " – {0} declarations", model.references.length) : ''; } } @@ -295,14 +300,14 @@ export class GoToDeclarationAction extends DeclarationAction { }); } - protected _getNoResultFoundMessage(info?: IWordAtPosition): string { + protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { return info && info.word ? nls.localize('decl.noResultWord', "No declaration found for '{0}'", info.word) : nls.localize('decl.generic.noResults', "No declaration found"); } protected _getMetaTitle(model: ReferencesModel): string { - return model.references.length > 1 && nls.localize('decl.meta.title', " – {0} declarations", model.references.length); + return model.references.length > 1 ? nls.localize('decl.meta.title', " – {0} declarations", model.references.length) : ''; } } @@ -329,14 +334,14 @@ export class ImplementationAction extends DefinitionAction { return getImplementationsAtPosition(model, position, token); } - protected _getNoResultFoundMessage(info?: IWordAtPosition): string { + protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { return info && info.word ? nls.localize('goToImplementation.noResultWord', "No implementation found for '{0}'", info.word) : nls.localize('goToImplementation.generic.noResults', "No implementation found"); } protected _getMetaTitle(model: ReferencesModel): string { - return model.references.length > 1 && nls.localize('meta.implementations.title', " – {0} implementations", model.references.length); + return model.references.length > 1 ? nls.localize('meta.implementations.title', " – {0} implementations", model.references.length) : ''; } } @@ -387,14 +392,14 @@ export class TypeDefinitionAction extends DefinitionAction { return getTypeDefinitionsAtPosition(model, position, token); } - protected _getNoResultFoundMessage(info?: IWordAtPosition): string { + protected _getNoResultFoundMessage(info: IWordAtPosition | null): string { return info && info.word ? nls.localize('goToTypeDefinition.noResultWord', "No type definition found for '{0}'", info.word) : nls.localize('goToTypeDefinition.generic.noResults', "No type definition found"); } protected _getMetaTitle(model: ReferencesModel): string { - return model.references.length > 1 && nls.localize('meta.typeDefinitions.title', " – {0} type definitions", model.references.length); + return model.references.length > 1 ? nls.localize('meta.typeDefinitions.title', " – {0} type definitions", model.references.length) : ''; } } diff --git a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts index 55e2e6e0047..abb0f9c3575 100644 --- a/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts +++ b/src/vs/editor/contrib/goToDefinition/goToDefinitionMouse.ts @@ -34,8 +34,8 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC private editor: ICodeEditor; private toUnhook: IDisposable[]; private decorations: string[]; - private currentWordUnderMouse: IWordAtPosition; - private previousPromise: CancelablePromise; + private currentWordUnderMouse: IWordAtPosition | null; + private previousPromise: CancelablePromise | null; constructor( editor: ICodeEditor, @@ -51,7 +51,7 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC this.toUnhook.push(linkGesture); this.toUnhook.push(linkGesture.onMouseMoveOrRelevantKeyDown(([mouseEvent, keyboardEvent]) => { - this.startFindDefinition(mouseEvent, keyboardEvent); + this.startFindDefinition(mouseEvent, keyboardEvent || undefined); })); this.toUnhook.push(linkGesture.onExecute((mouseEvent: ClickLinkMouseEvent) => { @@ -79,20 +79,20 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC return; } - if (!this.isEnabled(mouseEvent, withKey)) { + if (!this.editor.hasModel() || !this.isEnabled(mouseEvent, withKey)) { this.currentWordUnderMouse = null; this.removeDecorations(); return; } // Find word at mouse position - let position = mouseEvent.target.position; - let word = position ? this.editor.getModel().getWordAtPosition(position) : null; + const word = mouseEvent.target.position ? this.editor.getModel().getWordAtPosition(mouseEvent.target.position) : null; if (!word) { this.currentWordUnderMouse = null; this.removeDecorations(); return; } + const position = mouseEvent.target.position!; // Return early if word at position is still the same if (this.currentWordUnderMouse && this.currentWordUnderMouse.startColumn === word.startColumn && this.currentWordUnderMouse.endColumn === word.endColumn && this.currentWordUnderMouse.word === word.word) { @@ -158,9 +158,10 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC wordRange = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn); } + const modeId = this.modeService.getModeIdByFilepathOrFirstLine(textEditorModel.uri.fsPath); this.addDecoration( wordRange, - new MarkdownString().appendCodeblock(this.modeService.getModeIdByFilepathOrFirstLine(textEditorModel.uri.fsPath), previewValue) + new MarkdownString().appendCodeblock(modeId ? modeId : '', previewValue) ); ref.dispose(); }); @@ -274,10 +275,10 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC } private isEnabled(mouseEvent: ClickLinkMouseEvent, withKey?: ClickLinkKeyboardEvent): boolean { - return this.editor.getModel() && + return this.editor.hasModel() && mouseEvent.isNoneOrSingleMouseDown && (mouseEvent.target.type === MouseTargetType.CONTENT_TEXT) && - (mouseEvent.hasTriggerModifier || (withKey && withKey.keyCodeIsTriggerKey)) && + (mouseEvent.hasTriggerModifier || (withKey ? withKey.keyCodeIsTriggerKey : false)) && DefinitionProviderRegistry.has(this.editor.getModel()); } @@ -287,11 +288,11 @@ class GotoDefinitionWithMouseEditorContribution implements editorCommon.IEditorC return Promise.resolve(null); } - return getDefinitionsAtPosition(model, target.position, token); + return getDefinitionsAtPosition(model, target.position!, token); } private gotoDefinition(target: IMouseTarget, sideBySide: boolean): Promise { - this.editor.setPosition(target.position); + this.editor.setPosition(target.position!); const action = new DefinitionAction(new DefinitionActionConfig(sideBySide, false, true, false), { alias: undefined, label: undefined, id: undefined, precondition: undefined }); return this.editor.invokeWithinContext(accessor => action.run(accessor, this.editor)); } diff --git a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts index 9b9c0bbe4b1..22e8918aa23 100644 --- a/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/gotoErrorWidget.ts @@ -165,7 +165,7 @@ export class MarkerNavigationWidget extends ZoneWidget { private _message: MessageWidget; private _callOnDispose: IDisposable[] = []; private _severity: MarkerSeverity; - private _backgroundColor: Color | null; + private _backgroundColor?: Color; private _onDidSelectRelatedInformation = new Emitter(); readonly onDidSelectRelatedInformation: Event = this._onDidSelectRelatedInformation.event; diff --git a/src/vs/editor/contrib/referenceSearch/peekViewWidget.ts b/src/vs/editor/contrib/referenceSearch/peekViewWidget.ts index 39429bdf72e..f0481b7ee29 100644 --- a/src/vs/editor/contrib/referenceSearch/peekViewWidget.ts +++ b/src/vs/editor/contrib/referenceSearch/peekViewWidget.ts @@ -34,9 +34,9 @@ export function getOuterEditor(accessor: ServicesAccessor): ICodeEditor | null { } export interface IPeekViewStyles extends IStyles { - headerBackgroundColor?: Color | null; - primaryHeadingColor?: Color | null; - secondaryHeadingColor?: Color | null; + headerBackgroundColor?: Color; + primaryHeadingColor?: Color; + secondaryHeadingColor?: Color; } export type IPeekViewOptions = IOptions & IPeekViewStyles; diff --git a/src/vs/editor/contrib/suggest/suggest.ts b/src/vs/editor/contrib/suggest/suggest.ts index 3d7e3b008cd..b068415b791 100644 --- a/src/vs/editor/contrib/suggest/suggest.ts +++ b/src/vs/editor/contrib/suggest/suggest.ts @@ -170,7 +170,7 @@ export function provideSuggestionItems( return hasResult || token.isCancellationRequested; }).then(() => { if (token.isCancellationRequested) { - return Promise.reject(canceled()); + return Promise.reject(canceled()); } return allSuggestions.sort(getSuggestionComparator(snippetConfig)); }); diff --git a/src/vs/editor/contrib/suggest/suggestController.ts b/src/vs/editor/contrib/suggest/suggestController.ts index 05e535ac302..30d7559131e 100644 --- a/src/vs/editor/contrib/suggest/suggestController.ts +++ b/src/vs/editor/contrib/suggest/suggestController.ts @@ -181,7 +181,7 @@ export class SuggestController implements IEditorContribution { this._widget.getValue().hideWidget(); } })); - this._toDispose.push(this._editor.onDidBlurEditorText(() => { + this._toDispose.push(this._editor.onDidBlurEditorWidget(() => { if (!this._sticky) { this._model.cancel(); } diff --git a/src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts b/src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts index 75de1e65c8d..0a77b555d7d 100644 --- a/src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts +++ b/src/vs/editor/standalone/browser/quickOpen/editorQuickOpen.ts @@ -31,9 +31,9 @@ export class QuickOpenController implements editorCommon.IEditorContribution, ID } private editor: ICodeEditor; - private widget: QuickOpenEditorWidget; - private rangeHighlightDecorationId: string; - private lastKnownEditorSelection: Selection; + private widget: QuickOpenEditorWidget | null; + private rangeHighlightDecorationId: string | null; + private lastKnownEditorSelection: Selection | null; constructor(editor: ICodeEditor, @IThemeService private readonly themeService: IThemeService) { this.editor = editor; @@ -83,7 +83,7 @@ export class QuickOpenController implements editorCommon.IEditorContribution, ID () => onClose(false), () => onClose(true), (value: string) => { - this.widget.setInput(opts.getModel(value), opts.getAutoFocus(value)); + this.widget!.setInput(opts.getModel(value), opts.getAutoFocus(value)); }, { inputAriaLabel: opts.inputAriaLabel diff --git a/src/vs/editor/standalone/browser/quickOpen/gotoLine.ts b/src/vs/editor/standalone/browser/quickOpen/gotoLine.ts index 7c55710e9a2..47cc1ea540d 100644 --- a/src/vs/editor/standalone/browser/quickOpen/gotoLine.ts +++ b/src/vs/editor/standalone/browser/quickOpen/gotoLine.ts @@ -6,8 +6,8 @@ import 'vs/css!./gotoLine'; import * as nls from 'vs/nls'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IContext, QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { IAutoFocus, Mode } from 'vs/base/parts/quickopen/common/quickOpen'; +import { QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; +import { IAutoFocus, Mode, IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen'; import { ICodeEditor, IDiffEditor, isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions'; import { Position } from 'vs/editor/common/core/position'; @@ -49,14 +49,15 @@ export class GotoLineEntry extends QuickOpenEntry { position = new Position(numbers[0], numbers[1]); } - let model: ITextModel; + let model: ITextModel | null; if (isCodeEditor(this.editor)) { model = this.editor.getModel(); } else { - model = (this.editor).getModel().modified; + const diffModel = (this.editor).getModel(); + model = diffModel ? diffModel.modified : null; } - const isValid = model.validatePosition(position).equals(position); + const isValid = model ? model.validatePosition(position).equals(position) : false; let label: string; if (isValid) { @@ -65,10 +66,10 @@ export class GotoLineEntry extends QuickOpenEntry { } else { label = nls.localize('gotoLineLabelValidLine', "Go to line {0}", position.lineNumber, position.column); } - } else if (position.lineNumber < 1 || position.lineNumber > model.getLineCount()) { - label = nls.localize('gotoLineLabelEmptyWithLineLimit', "Type a line number between 1 and {0} to navigate to", model.getLineCount()); + } else if (position.lineNumber < 1 || position.lineNumber > (model ? model.getLineCount() : 0)) { + label = nls.localize('gotoLineLabelEmptyWithLineLimit', "Type a line number between 1 and {0} to navigate to", model ? model.getLineCount() : 0); } else { - label = nls.localize('gotoLineLabelEmptyWithLineAndColumnLimit', "Type a character between 1 and {0} to navigate to", model.getLineMaxColumn(position.lineNumber)); + label = nls.localize('gotoLineLabelEmptyWithLineAndColumnLimit', "Type a character between 1 and {0} to navigate to", model ? model.getLineMaxColumn(position.lineNumber) : 0); } return { @@ -83,12 +84,12 @@ export class GotoLineEntry extends QuickOpenEntry { } getAriaLabel(): string { - const currentLine = this.editor.getPosition().lineNumber; - + const position = this.editor.getPosition(); + const currentLine = position ? position.lineNumber : 0; return nls.localize('gotoLineAriaLabel', "Current Line: {0}. Go to line {0}.", currentLine, this.parseResult.label); } - run(mode: Mode, context: IContext): boolean { + run(mode: Mode, _context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { return this.runOpen(); } diff --git a/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts b/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts index 892d458a277..fdbf17a7685 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickCommand.ts @@ -8,8 +8,8 @@ import * as browser from 'vs/base/browser/browser'; import { onUnexpectedError } from 'vs/base/common/errors'; import { matchesFuzzy } from 'vs/base/common/filters'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; -import { IContext, IHighlight, QuickOpenEntryGroup, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { IAutoFocus, Mode } from 'vs/base/parts/quickopen/common/quickOpen'; +import { IHighlight, QuickOpenEntryGroup, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; +import { IAutoFocus, Mode, IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions'; import { IEditor, IEditorAction } from 'vs/editor/common/editorCommon'; @@ -50,7 +50,7 @@ export class EditorActionCommandEntry extends QuickOpenEntryGroup { return this.key; } - public run(mode: Mode, context: IContext): boolean { + public run(mode: Mode, context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { // Use a timeout to give the quick open widget a chance to close itself first @@ -112,8 +112,8 @@ export class QuickCommandAction extends BaseEditorQuickOpenAction { } private _sort(elementA: QuickOpenEntryGroup, elementB: QuickOpenEntryGroup): number { - let elementAName = elementA.getLabel().toLowerCase(); - let elementBName = elementB.getLabel().toLowerCase(); + let elementAName = (elementA.getLabel() || '').toLowerCase(); + let elementBName = (elementB.getLabel() || '').toLowerCase(); return elementAName.localeCompare(elementBName); } @@ -129,7 +129,7 @@ export class QuickCommandAction extends BaseEditorQuickOpenAction { if (action.label) { let highlights = matchesFuzzy(searchValue, action.label); if (highlights) { - entries.push(new EditorActionCommandEntry(keybinding ? keybinding.getLabel() : '', keybinding ? keybinding.getAriaLabel() : '', highlights, action, editor)); + entries.push(new EditorActionCommandEntry(keybinding ? keybinding.getLabel() || '' : '', keybinding ? keybinding.getAriaLabel() || '' : '', highlights, action, editor)); } } } diff --git a/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts b/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts index 34df6555f29..859e8cca21b 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickOpenEditorWidget.ts @@ -45,7 +45,7 @@ export class QuickOpenEditorWidget implements IOverlayWidget { onCancel: onCancel, onType: onType }, { - inputPlaceHolder: null, + inputPlaceHolder: undefined, inputAriaLabel: configuration.inputAriaLabel, keyboardSupport: true } @@ -98,7 +98,7 @@ export class QuickOpenEditorWidget implements IOverlayWidget { this.codeEditor.layoutOverlayWidget(this); } - public getPosition(): IOverlayWidgetPosition { + public getPosition(): IOverlayWidgetPosition | null { if (this.visible) { return { preference: OverlayWidgetPositionPreference.TOP_CENTER diff --git a/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts b/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts index 7a75c155e2d..7a303f61636 100644 --- a/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts +++ b/src/vs/editor/standalone/browser/quickOpen/quickOutline.ts @@ -9,8 +9,8 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { matchesFuzzy } from 'vs/base/common/filters'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import * as strings from 'vs/base/common/strings'; -import { IContext, IHighlight, QuickOpenEntryGroup, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { IAutoFocus, Mode } from 'vs/base/parts/quickopen/common/quickOpen'; +import { IHighlight, QuickOpenEntryGroup, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; +import { IAutoFocus, Mode, IEntryRunContext } from 'vs/base/parts/quickopen/common/quickOpen'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ServicesAccessor, registerEditorAction } from 'vs/editor/browser/editorExtensions'; import { IRange, Range } from 'vs/editor/common/core/range'; @@ -26,12 +26,12 @@ let SCOPE_PREFIX = ':'; export class SymbolEntry extends QuickOpenEntryGroup { private name: string; private type: string; - private description: string; + private description: string | null; private range: Range; private editor: ICodeEditor; private decorator: IDecorator; - constructor(name: string, type: string, description: string, range: Range, highlights: IHighlight[], editor: ICodeEditor, decorator: IDecorator) { + constructor(name: string, type: string, description: string | null, range: Range, highlights: IHighlight[], editor: ICodeEditor, decorator: IDecorator) { super(); this.name = name; @@ -55,7 +55,7 @@ export class SymbolEntry extends QuickOpenEntryGroup { return this.type; } - public getDescription(): string { + public getDescription(): string | null { return this.description; } @@ -67,7 +67,7 @@ export class SymbolEntry extends QuickOpenEntryGroup { return this.range; } - public run(mode: Mode, context: IContext): boolean { + public run(mode: Mode, context: IEntryRunContext): boolean { if (mode === Mode.OPEN) { return this.runOpen(context); } @@ -75,7 +75,7 @@ export class SymbolEntry extends QuickOpenEntryGroup { return this.runPreview(); } - private runOpen(context: IContext): boolean { + private runOpen(_context: IEntryRunContext): boolean { // Apply selection and focus let range = this.toSelection(); @@ -128,12 +128,15 @@ export class QuickOutlineAction extends BaseEditorQuickOpenAction { }); } - public run(accessor: ServicesAccessor, editor: ICodeEditor): Promise { + public run(accessor: ServicesAccessor, editor: ICodeEditor) { + if (!editor.hasModel()) { + return undefined; + } - let model = editor.getModel(); + const model = editor.getModel(); if (!DocumentSymbolProviderRegistry.has(model)) { - return null; + return undefined; } // Resolve outline @@ -166,7 +169,7 @@ export class QuickOutlineAction extends BaseEditorQuickOpenAction { }); } - private symbolEntry(name: string, type: string, description: string, range: IRange, highlights: IHighlight[], editor: ICodeEditor, decorator: IDecorator): SymbolEntry { + private symbolEntry(name: string, type: string, description: string | null, range: IRange, highlights: IHighlight[], editor: ICodeEditor, decorator: IDecorator): SymbolEntry { return new SymbolEntry(name, type, description, Range.lift(range), highlights, editor, decorator); } @@ -222,7 +225,7 @@ export class QuickOutlineAction extends BaseEditorQuickOpenAction { // Update previous result with count if (currentResult) { - currentResult.setGroupLabel(this.typeToLabel(currentType, typeCounter)); + currentResult.setGroupLabel(this.typeToLabel(currentType || '', typeCounter)); } currentType = result.getType(); @@ -240,7 +243,7 @@ export class QuickOutlineAction extends BaseEditorQuickOpenAction { // Update previous result with count if (currentResult) { - currentResult.setGroupLabel(this.typeToLabel(currentType, typeCounter)); + currentResult.setGroupLabel(this.typeToLabel(currentType || '', typeCounter)); } } diff --git a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts index d46974b5dd3..7efa2c38ba7 100644 --- a/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts +++ b/src/vs/editor/standalone/browser/standaloneThemeServiceImpl.ts @@ -28,7 +28,7 @@ class StandaloneTheme implements IStandaloneTheme { private themeData: IStandaloneThemeData; private colors: { [colorId: string]: Color } | null; - private defaultColors: { [colorId: string]: Color | null; }; + private defaultColors: { [colorId: string]: Color | undefined; }; private _tokenTheme: TokenTheme | null; constructor(name: string, standaloneThemeData: IStandaloneThemeData) { @@ -77,7 +77,7 @@ class StandaloneTheme implements IStandaloneTheme { return this.colors; } - public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | null { + public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | undefined { const color = this.getColors()[colorId]; if (color) { return color; @@ -85,10 +85,10 @@ class StandaloneTheme implements IStandaloneTheme { if (useDefault !== false) { return this.getDefault(colorId); } - return null; + return undefined; } - private getDefault(colorId: ColorIdentifier): Color | null { + private getDefault(colorId: ColorIdentifier): Color | undefined { let color = this.defaultColors[colorId]; if (color) { return color; diff --git a/src/vs/platform/backup/common/backup.ts b/src/vs/platform/backup/common/backup.ts index e1e5392e73a..98e7998cd27 100644 --- a/src/vs/platform/backup/common/backup.ts +++ b/src/vs/platform/backup/common/backup.ts @@ -7,20 +7,23 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; +export interface ISerializedWorkspace { id: string; configURIPath: string; } + export interface IBackupWorkspacesFormat { - rootWorkspaces: IWorkspaceIdentifier[]; + rootURIWorkspaces: ISerializedWorkspace[]; folderURIWorkspaces: string[]; emptyWorkspaceInfos: IEmptyWindowBackupInfo[]; // deprecated folderWorkspaces?: string[]; // use folderURIWorkspaces instead emptyWorkspaces?: string[]; + rootWorkspaces?: { id: string, configPath: string }[]; // use rootURIWorkspaces instead } export const IBackupMainService = createDecorator('backupMainService'); export interface IEmptyWindowBackupInfo { - backupFolder: string; + backupFolder?: string; remoteAuthority?: string; } diff --git a/src/vs/platform/backup/electron-main/backupMainService.ts b/src/vs/platform/backup/electron-main/backupMainService.ts index 98a462fde33..af82955b242 100644 --- a/src/vs/platform/backup/electron-main/backupMainService.ts +++ b/src/vs/platform/backup/electron-main/backupMainService.ts @@ -60,7 +60,17 @@ export class BackupMainService implements IBackupMainService { } // read workspace backups - this.rootWorkspaces = await this.validateWorkspaces(backups.rootWorkspaces); + let rootWorkspaces: IWorkspaceIdentifier[] = []; + try { + if (Array.isArray(backups.rootURIWorkspaces)) { + rootWorkspaces = backups.rootURIWorkspaces.map(f => ({ id: f.id, configPath: URI.parse(f.configURIPath) })); + } else if (Array.isArray(backups.rootWorkspaces)) { + rootWorkspaces = backups.rootWorkspaces.map(f => ({ id: f.id, configPath: URI.file(f.configPath) })); + } + } catch (e) { + // ignore URI parsing exceptions + } + this.rootWorkspaces = await this.validateWorkspaces(rootWorkspaces); // read folder backups let workspaceFolders: URI[] = []; @@ -211,7 +221,7 @@ export class BackupMainService implements IBackupMainService { backupFolder = this.getRandomEmptyWindowId(); } - if (!this.emptyWorkspaces.some(w => isEqual(w.backupFolder, backupFolder, !platform.isLinux))) { + if (!this.emptyWorkspaces.some(w => !!w.backupFolder && isEqual(w.backupFolder, backupFolder!, !platform.isLinux))) { this.emptyWorkspaces.push({ backupFolder, remoteAuthority }); this.saveSync(); } @@ -220,7 +230,7 @@ export class BackupMainService implements IBackupMainService { } unregisterEmptyWindowBackupSync(backupFolder: string): void { - let index = arrays.firstIndex(this.emptyWorkspaces, w => isEqual(w.backupFolder, backupFolder, !platform.isLinux)); + let index = arrays.firstIndex(this.emptyWorkspaces, w => !!w.backupFolder && isEqual(w.backupFolder, backupFolder, !platform.isLinux)); if (index !== -1) { this.emptyWorkspaces.splice(index, 1); this.saveSync(); @@ -242,6 +252,7 @@ export class BackupMainService implements IBackupMainService { // Validate Workspaces for (let workspace of rootWorkspaces) { if (!isWorkspaceIdentifier(workspace)) { + console.log('not a workspace identifer'); return []; // wrong format, skip all entries } @@ -253,13 +264,15 @@ export class BackupMainService implements IBackupMainService { // If the workspace has no backups, ignore it if (hasBackups) { - if (await exists(workspace.configPath)) { + if (workspace.configPath.scheme !== Schemas.file || await exists(workspace.configPath.fsPath)) { result.push(workspace); } else { + console.log('target workspace missing'); // If the workspace has backups, but the target workspace is missing, convert backups to empty ones await this.convertToEmptyWindowBackup(backupPath); } } else { + console.log('no backups'); await this.deleteStaleBackup(backupPath); } } @@ -344,7 +357,7 @@ export class BackupMainService implements IBackupMainService { // New empty window backup let newBackupFolder = this.getRandomEmptyWindowId(); - while (this.emptyWorkspaces.some(w => isEqual(w.backupFolder, newBackupFolder, platform.isLinux))) { + while (this.emptyWorkspaces.some(w => !!w.backupFolder && isEqual(w.backupFolder, newBackupFolder, platform.isLinux))) { newBackupFolder = this.getRandomEmptyWindowId(); } @@ -365,7 +378,7 @@ export class BackupMainService implements IBackupMainService { // New empty window backup let newBackupFolder = this.getRandomEmptyWindowId(); - while (this.emptyWorkspaces.some(w => isEqual(w.backupFolder, newBackupFolder, platform.isLinux))) { + while (this.emptyWorkspaces.some(w => !!w.backupFolder && isEqual(w.backupFolder, newBackupFolder, platform.isLinux))) { newBackupFolder = this.getRandomEmptyWindowId(); } @@ -421,7 +434,7 @@ export class BackupMainService implements IBackupMainService { private serializeBackups(): IBackupWorkspacesFormat { return { - rootWorkspaces: this.rootWorkspaces, + rootURIWorkspaces: this.rootWorkspaces.map(f => ({ id: f.id, configURIPath: f.configPath.toString() })), folderURIWorkspaces: this.folderWorkspaces.map(f => f.toString()), emptyWorkspaceInfos: this.emptyWorkspaces, emptyWorkspaces: this.emptyWorkspaces.map(info => info.backupFolder) diff --git a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts index 35808ca924e..077133574f3 100644 --- a/src/vs/platform/backup/test/electron-main/backupMainService.test.ts +++ b/src/vs/platform/backup/test/electron-main/backupMainService.test.ts @@ -9,11 +9,11 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import * as pfs from 'vs/base/node/pfs'; -import { URI as Uri } from 'vs/base/common/uri'; +import { URI as Uri, URI } from 'vs/base/common/uri'; import { EnvironmentService } from 'vs/platform/environment/node/environmentService'; import { parseArgs } from 'vs/platform/environment/node/argv'; import { BackupMainService } from 'vs/platform/backup/electron-main/backupMainService'; -import { IBackupWorkspacesFormat } from 'vs/platform/backup/common/backup'; +import { IBackupWorkspacesFormat, ISerializedWorkspace } from 'vs/platform/backup/common/backup'; import { HotExitConfiguration } from 'vs/platform/files/common/files'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ConsoleLogMainService } from 'vs/platform/log/common/log'; @@ -60,7 +60,14 @@ suite('BackupMainService', () => { function toWorkspace(path: string): IWorkspaceIdentifier { return { id: createHash('md5').update(sanitizePath(path)).digest('hex'), - configPath: path + configPath: URI.file(path) + }; + } + + function toSerializedWorkspace(ws: IWorkspaceIdentifier): ISerializedWorkspace { + return { + id: ws.id, + configURIPath: ws.configPath.toString() }; } @@ -73,8 +80,8 @@ suite('BackupMainService', () => { } async function ensureWorkspaceExists(workspace: IWorkspaceIdentifier): Promise { - if (!fs.existsSync(workspace.configPath)) { - await pfs.writeFile(workspace.configPath, 'Hello'); + if (!fs.existsSync(workspace.configPath.fsPath)) { + await pfs.writeFile(workspace.configPath.fsPath, 'Hello'); } const backupFolder = service.toBackupPath(workspace.id); await createBackupFolder(backupFolder); @@ -248,15 +255,11 @@ suite('BackupMainService', () => { assert.equal(1, fs.readdirSync(path.join(backupHome, emptyBackups[0].backupFolder)).length); }); - suite('migrate folderPath to folderURI', () => { + suite('migrate path to URI', () => { - test('migration makes sure to preserve existing backups', async () => { - if (platform.isLinux) { - return; // TODO:Martin #54483 fix tests - } - - let path1 = path.join(parentDir, 'folder1').toLowerCase(); - let path2 = path.join(parentDir, 'folder2').toUpperCase(); + test('migration folder path to URI makes sure to preserve existing backups', async () => { + let path1 = path.join(parentDir, 'folder1'); + let path2 = path.join(parentDir, 'FOLDER2'); let uri1 = Uri.file(path1); let uri2 = Uri.file(path2); @@ -290,8 +293,30 @@ suite('BackupMainService', () => { const newBackupFolder2 = service.toBackupPath(uri2); assert.ok(fs.existsSync(path.join(newBackupFolder2, Schemas.file, 'unsaved2.txt'))); }); + + test('migrate storage file', async () => { + let folderPath = path.join(parentDir, 'f1'); + ensureFolderExists(URI.file(folderPath)); + const backupFolderPath = service.toLegacyBackupPath(folderPath); + await createBackupFolder(backupFolderPath); + + let workspacePath = path.join(parentDir, 'f2.code-workspace'); + const workspace = toWorkspace(workspacePath); + await ensureWorkspaceExists(workspace); + + const workspacesJson = { rootWorkspaces: [{ id: workspace.id, configPath: workspacePath }], folderWorkspaces: [folderPath], emptyWorkspaces: [] }; + await pfs.writeFile(backupWorkspacesPath, JSON.stringify(workspacesJson)); + await service.initialize(); + const content = await pfs.readFile(backupWorkspacesPath, 'utf-8'); + const json = (JSON.parse(content)); + assert.deepEqual(json.folderURIWorkspaces, [URI.file(folderPath).toString()]); + assert.deepEqual(json.rootURIWorkspaces, [{ id: workspace.id, configURIPath: URI.file(workspacePath).toString() }]); + + assertEqualUris(service.getWorkspaceBackups().map(w => w.configPath), [workspace.configPath]); + }); }); + suite('loadSync', () => { test('getFolderBackupPaths() should return [] when workspaces.json doesn\'t exist', () => { assertEqualUris(service.getFolderBackupPaths(), []); @@ -387,10 +412,32 @@ suite('BackupMainService', () => { assert.deepEqual(service.getWorkspaceBackups(), []); }); + test('getWorkspaceBackups() should return [] when rootURIWorkspaces in workspaces.json is not a object array', async () => { + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":{}}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":{"foo": ["bar"]}}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":{"foo": []}}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":{"foo": "bar"}}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":"foo"}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + fs.writeFileSync(backupWorkspacesPath, '{"rootURIWorkspaces":1}'); + await service.initialize(); + assert.deepEqual(service.getWorkspaceBackups(), []); + }); + test('getWorkspaceBackups() should return [] when files.hotExit = "onExitAndWindowClose"', async () => { - service.registerWorkspaceBackupSync(toWorkspace(fooFile.fsPath.toUpperCase())); + const upperFooPath = fooFile.fsPath.toUpperCase(); + service.registerWorkspaceBackupSync(toWorkspace(upperFooPath)); assert.equal(service.getWorkspaceBackups().length, 1); - assert.deepEqual(service.getWorkspaceBackups().map(r => r.configPath), [fooFile.fsPath.toUpperCase()]); + assertEqualUris(service.getWorkspaceBackups().map(r => r.configPath), [URI.file(upperFooPath)]); configService.setUserConfiguration('files.hotExit', HotExitConfiguration.ON_EXIT_AND_WINDOW_CLOSE); await service.initialize(); assert.deepEqual(service.getWorkspaceBackups(), []); @@ -447,7 +494,7 @@ suite('BackupMainService', () => { await ensureFolderExists(existingTestFolder1); const workspacesJson: IBackupWorkspacesFormat = { - rootWorkspaces: [], + rootURIWorkspaces: [], folderURIWorkspaces: [existingTestFolder1.toString(), existingTestFolder1.toString()], emptyWorkspaceInfos: [] }; @@ -464,7 +511,7 @@ suite('BackupMainService', () => { await ensureFolderExists(existingTestFolder1); const workspacesJson: IBackupWorkspacesFormat = { - rootWorkspaces: [], + rootURIWorkspaces: [], folderURIWorkspaces: [existingTestFolder1.toString(), existingTestFolder1.toString().toLowerCase()], emptyWorkspaceInfos: [] }; @@ -476,18 +523,17 @@ suite('BackupMainService', () => { }); test('should ignore duplicates on Windows and Mac (root workspace)', async () => { - if (platform.isLinux) { - return; // TODO:Martin #54483 fix tests - } const workspacePath = path.join(parentDir, 'Foo.code-workspace'); + const workspacePath1 = path.join(parentDir, 'FOO.code-workspace'); + const workspacePath2 = path.join(parentDir, 'foo.code-workspace'); const workspace1 = await ensureWorkspaceExists(toWorkspace(workspacePath)); - const workspace2 = await ensureWorkspaceExists(toWorkspace(workspacePath.toUpperCase())); - const workspace3 = await ensureWorkspaceExists(toWorkspace(workspacePath.toLowerCase())); + const workspace2 = await ensureWorkspaceExists(toWorkspace(workspacePath1)); + const workspace3 = await ensureWorkspaceExists(toWorkspace(workspacePath2)); const workspacesJson: IBackupWorkspacesFormat = { - rootWorkspaces: [workspace1, workspace2, workspace3], + rootURIWorkspaces: [workspace1, workspace2, workspace3].map(toSerializedWorkspace), folderURIWorkspaces: [], emptyWorkspaceInfos: [] }; @@ -496,11 +542,11 @@ suite('BackupMainService', () => { const buffer = await pfs.readFile(backupWorkspacesPath, 'utf-8'); const json = JSON.parse(buffer); - assert.equal(json.rootWorkspaces.length, platform.isLinux ? 3 : 1); + assert.equal(json.rootURIWorkspaces.length, platform.isLinux ? 3 : 1); if (platform.isLinux) { - assert.deepEqual(json.rootWorkspaces.map(r => r.configPath), [workspacePath, workspacePath.toUpperCase(), workspacePath.toLowerCase()]); + assert.deepEqual(json.rootURIWorkspaces.map(r => r.configURIPath), [URI.file(workspacePath).toString(), URI.file(workspacePath1).toString(), URI.file(workspacePath2).toString()]); } else { - assert.deepEqual(json.rootWorkspaces.map(r => r.configPath), [workspacePath], 'should return the first duplicated entry'); + assert.deepEqual(json.rootURIWorkspaces.map(r => r.configURIPath), [URI.file(workspacePath).toString()], 'should return the first duplicated entry'); } }); }); @@ -521,16 +567,16 @@ suite('BackupMainService', () => { const ws2 = toWorkspace(barFile.fsPath); service.registerWorkspaceBackupSync(ws2); - assert.deepEqual(service.getWorkspaceBackups().map(b => b.configPath), [fooFile.fsPath, barFile.fsPath]); + assertEqualUris(service.getWorkspaceBackups().map(b => b.configPath), [fooFile, barFile]); assert.equal(ws1.id, service.getWorkspaceBackups()[0].id); assert.equal(ws2.id, service.getWorkspaceBackups()[1].id); const buffer = await pfs.readFile(backupWorkspacesPath, 'utf-8'); const json = JSON.parse(buffer); - assert.deepEqual(json.rootWorkspaces.map(b => b.configPath), [fooFile.fsPath, barFile.fsPath]); - assert.equal(ws1.id, json.rootWorkspaces[0].id); - assert.equal(ws2.id, json.rootWorkspaces[1].id); + assert.deepEqual(json.rootURIWorkspaces.map(b => b.configURIPath), [fooFile.toString(), barFile.toString()]); + assert.equal(ws1.id, json.rootURIWorkspaces[0].id); + assert.equal(ws2.id, json.rootURIWorkspaces[1].id); }); }); @@ -544,11 +590,12 @@ suite('BackupMainService', () => { }); test('should always store the workspace path in workspaces.json using the case given, regardless of whether the file system is case-sensitive (root workspace)', () => { - service.registerWorkspaceBackupSync(toWorkspace(fooFile.fsPath.toUpperCase())); - assert.deepEqual(service.getWorkspaceBackups().map(b => b.configPath), [fooFile.fsPath.toUpperCase()]); + const upperFooPath = fooFile.fsPath.toUpperCase(); + service.registerWorkspaceBackupSync(toWorkspace(upperFooPath)); + assertEqualUris(service.getWorkspaceBackups().map(b => b.configPath), [URI.file(upperFooPath)]); return pfs.readFile(backupWorkspacesPath, 'utf-8').then(buffer => { const json = JSON.parse(buffer); - assert.deepEqual(json.rootWorkspaces.map(b => b.configPath), [fooFile.fsPath.toUpperCase()]); + assert.deepEqual(json.rootURIWorkspaces.map(b => b.configURIPath), [URI.file(upperFooPath).toString()]); }); }); @@ -576,11 +623,11 @@ suite('BackupMainService', () => { service.unregisterWorkspaceBackupSync(ws1); return pfs.readFile(backupWorkspacesPath, 'utf-8').then(buffer => { const json = JSON.parse(buffer); - assert.deepEqual(json.rootWorkspaces.map(r => r.configPath), [barFile.fsPath]); + assert.deepEqual(json.rootURIWorkspaces.map(r => r.configURIPath), [barFile.toString()]); service.unregisterWorkspaceBackupSync(ws2); return pfs.readFile(backupWorkspacesPath, 'utf-8').then(content => { const json2 = JSON.parse(content); - assert.deepEqual(json2.rootWorkspaces, []); + assert.deepEqual(json2.rootURIWorkspaces, []); }); }); }); @@ -604,7 +651,7 @@ suite('BackupMainService', () => { await ensureFolderExists(existingTestFolder1); // make sure backup folder exists, so the folder is not removed on loadSync - const workspacesJson: IBackupWorkspacesFormat = { rootWorkspaces: [], folderURIWorkspaces: [existingTestFolder1.toString()], emptyWorkspaceInfos: [] }; + const workspacesJson: IBackupWorkspacesFormat = { rootURIWorkspaces: [], folderURIWorkspaces: [existingTestFolder1.toString()], emptyWorkspaceInfos: [] }; await pfs.writeFile(backupWorkspacesPath, JSON.stringify(workspacesJson)); await service.initialize(); service.unregisterFolderBackupSync(barFile); diff --git a/src/vs/platform/commands/common/commands.ts b/src/vs/platform/commands/common/commands.ts index 5a5bf2ca121..16c3a764a02 100644 --- a/src/vs/platform/commands/common/commands.ts +++ b/src/vs/platform/commands/common/commands.ts @@ -132,7 +132,7 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR export const NullCommandService: ICommandService = { _serviceBrand: undefined, onWillExecuteCommand: () => ({ dispose: () => { } }), - executeCommand() { - return Promise.resolve(undefined); + executeCommand() { + return Promise.resolve(undefined); } }; diff --git a/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts b/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts index 94cba280d74..1eb77972c18 100644 --- a/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts +++ b/src/vs/platform/diagnostics/electron-main/diagnosticsService.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { WorkspaceStats, collectWorkspaceStats, collectLaunchConfigs, WorkspaceStatItem } from 'vs/base/node/stats'; +import { WorkspaceStats, collectWorkspaceStats } from 'vs/base/node/stats'; import { IMainProcessInfo } from 'vs/platform/launch/electron-main/launchService'; import { ProcessItem, listProcesses } from 'vs/base/node/ps'; import product from 'vs/platform/node/product'; @@ -109,11 +109,6 @@ export class DiagnosticsService implements IDiagnosticsService { } workspaceInfoMessages.push(`| Folder (${basename(folder)}): ${countMessage}`); workspaceInfoMessages.push(this.formatWorkspaceStats(stats)); - - const launchConfigs = await collectLaunchConfigs(folder); - if (launchConfigs.length > 0) { - workspaceInfoMessages.push(this.formatLaunchConfigs(launchConfigs)); - } })); } else { workspaceInfoMessages.push(`| Folder (${folderUri.toString()}): RPerformance stats not available.`); @@ -196,11 +191,6 @@ export class DiagnosticsService implements IDiagnosticsService { console.log(`| Folder (${basename(folder)}): ${countMessage}`); console.log(this.formatWorkspaceStats(stats)); - await collectLaunchConfigs(folder).then(launchConfigs => { - if (launchConfigs.length > 0) { - console.log(this.formatLaunchConfigs(launchConfigs)); - } - }); }).catch(error => { console.log(`| Error: Unable to collect workspace stats for folder ${folder} (${error.toString()})`); })); @@ -257,17 +247,14 @@ export class DiagnosticsService implements IDiagnosticsService { output.push(line); } - return output.join('\n'); - } - - private formatLaunchConfigs(configs: WorkspaceStatItem[]): string { - const output: string[] = []; - let line = '| Launch Configs:'; - configs.forEach(each => { - const item = each.count > 1 ? ` ${each.name}(${each.count})` : ` ${each.name}`; - line += item; - }); - output.push(line); + if (workspaceStats.launchConfigFiles.length > 0) { + let line = '| Launch Configs:'; + workspaceStats.launchConfigFiles.forEach(each => { + const item = each.count > 1 ? ` ${each.name}(${each.count})` : ` ${each.name}`; + line += item; + }); + output.push(line); + } return output.join('\n'); } diff --git a/src/vs/platform/driver/electron-main/driver.ts b/src/vs/platform/driver/electron-main/driver.ts index cc6eecc1819..deab8063bb3 100644 --- a/src/vs/platform/driver/electron-main/driver.ts +++ b/src/vs/platform/driver/electron-main/driver.ts @@ -57,9 +57,11 @@ export class Driver implements IDriver, IWindowDriverRegistry { await this.whenUnfrozen(windowId); const window = this.windowsService.getWindowById(windowId); + if (!window) { + throw new Error('Invalid window'); + } const webContents = window.win.webContents; const image = await new Promise(c => webContents.capturePage(c)); - return image.toPNG().toString('base64'); } @@ -67,6 +69,9 @@ export class Driver implements IDriver, IWindowDriverRegistry { await this.whenUnfrozen(windowId); const window = this.windowsService.getWindowById(windowId); + if (!window) { + throw new Error('Invalid window'); + } this.reloadingWindowIds.add(windowId); this.windowsService.reload(window); } @@ -97,6 +102,9 @@ export class Driver implements IDriver, IWindowDriverRegistry { } const window = this.windowsService.getWindowById(windowId); + if (!window) { + throw new Error('Invalid window'); + } const webContents = window.win.webContents; const noModifiedKeybinding = new SimpleKeybinding(false, false, false, false, keybinding.keyCode); const resolvedKeybinding = new USLayoutResolvedKeybinding(noModifiedKeybinding, OS); diff --git a/src/vs/platform/environment/common/environment.ts b/src/vs/platform/environment/common/environment.ts index 23e84ca2f83..93f117ad29e 100644 --- a/src/vs/platform/environment/common/environment.ts +++ b/src/vs/platform/environment/common/environment.ts @@ -39,11 +39,11 @@ export interface ParsedArgs { 'builtin-extensions-dir'?: string; extensionDevelopmentPath?: string; extensionTestsPath?: string; - debugPluginHost?: string; - debugBrkPluginHost?: string; + 'inspect-extensions'?: string; + 'inspect-brk-extensions'?: string; debugId?: string; - debugSearch?: string; - debugBrkSearch?: string; + 'inspect-search'?: string; + 'inspect-brk-search'?: string; 'disable-extensions'?: boolean; 'disable-extension'?: string | string[]; 'list-extensions'?: boolean; diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index d7e62cbfd82..054a7fe2c61 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -22,6 +22,7 @@ export interface Option { id: string; type: 'boolean' | 'string'; alias?: string; + deprecates?: string; // old deprecated id args?: string | string[]; description?: string; cat?: keyof HelpCategories; @@ -41,7 +42,7 @@ export const options: Option[] = [ { id: 'folder-uri', type: 'string', cat: 'o', args: 'uri', description: localize('folderUri', "Opens a window with given folder uri(s)") }, { id: 'file-uri', type: 'string', cat: 'o', args: 'uri', description: localize('fileUri', "Opens a window with given file uri(s)") }, - { id: 'extensions-dir', type: 'string', cat: 'e', args: 'dir', description: localize('extensionHomePath', "Set the root path for extensions.") }, + { id: 'extensions-dir', type: 'string', deprecates: 'extensionHomePath', cat: 'e', args: 'dir', description: localize('extensionHomePath', "Set the root path for extensions.") }, { id: 'list-extensions', type: 'boolean', cat: 'e', description: localize('listExtensions', "List the installed extensions.") }, { id: 'show-versions', type: 'boolean', cat: 'e', description: localize('showVersions', "Show versions of installed extensions, when using --list-extension.") }, { id: 'install-extension', type: 'string', cat: 'e', args: 'extension-id', description: localize('installExtension', "Installs or updates the extension. Use `--force` argument to avoid prompts.") }, @@ -53,11 +54,11 @@ export const options: Option[] = [ { id: 'status', type: 'boolean', alias: 's', cat: 't', description: localize('status', "Print process usage and diagnostics information.") }, { id: 'prof-modules', type: 'boolean', alias: 'p', cat: 't', description: localize('prof-modules', "Capture performance markers while loading JS modules and print them with 'F1 > Developer: Startup Performance") }, { id: 'prof-startup', type: 'boolean', cat: 't', description: localize('prof-startup', "Run CPU profiler during startup") }, - { id: 'disable-extensions', type: 'boolean', cat: 't', description: localize('disableExtensions', "Disable all installed extensions.") }, + { id: 'disable-extensions', type: 'boolean', deprecates: 'disableExtensions', cat: 't', description: localize('disableExtensions', "Disable all installed extensions.") }, { id: 'disable-extension', type: 'string', cat: 't', args: 'extension-id', description: localize('disableExtension', "Disable an extension.") }, - { id: 'inspect-extensions', type: 'string', args: 'port', cat: 't', description: localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.") }, - { id: 'inspect-brk-search', type: 'string', args: 'port', cat: 't', description: localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.") }, + { id: 'inspect-extensions', type: 'string', deprecates: 'debugPluginHost', args: 'port', cat: 't', description: localize('inspect-extensions', "Allow debugging and profiling of extensions. Check the developer tools for the connection URI.") }, + { id: 'inspect-brk-extensions', type: 'string', deprecates: 'debugBrkPluginHost', args: 'port', cat: 't', description: localize('inspect-brk-extensions', "Allow debugging and profiling of extensions with the extension host being paused after start. Check the developer tools for the connection URI.") }, { id: 'disable-gpu', type: 'boolean', cat: 't', description: localize('disableGPU', "Disable GPU hardware acceleration.") }, { id: 'upload-logs', type: 'string', cat: 't', description: localize('uploadLogs', "Uploads logs from current session to a secure endpoint.") }, { id: 'max-memory', type: 'boolean', cat: 't', description: localize('maxMemory', "Max memory size for a window (in Mbytes).") }, @@ -66,8 +67,8 @@ export const options: Option[] = [ { id: 'extensionDevelopmentPath', type: 'string' }, { id: 'extensionTestsPath', type: 'string' }, { id: 'debugId', type: 'string' }, - { id: 'inspect-search', type: 'string' }, - { id: 'inspect-brk-extensions', type: 'string' }, + { id: 'inspect-search', type: 'string', deprecates: 'debugSearch' }, + { id: 'inspect-brk-search', type: 'string', deprecates: 'debugBrkSearch' }, { id: 'export-default-configuration', type: 'string' }, { id: 'install-source', type: 'string' }, { id: 'driver', type: 'string' }, @@ -90,10 +91,7 @@ export const options: Option[] = [ { id: 'force', type: 'boolean' }, { id: 'trace-category-filter', type: 'string' }, { id: 'trace-options', type: 'string' }, - { id: 'prof-code-loading', type: 'boolean' }, - - { id: 'debugPluginHost', type: 'string', alias: 'inspect-extensions' }, - { id: 'debugBrkPluginHost', type: 'string', alias: 'inspect-brk-extensions' } + { id: 'prof-code-loading', type: 'boolean' } ]; export function parseArgs(args: string[], isOptionSupported = (_: Option) => true): ParsedArgs { @@ -101,13 +99,22 @@ export function parseArgs(args: string[], isOptionSupported = (_: Option) => tru const string: string[] = []; const boolean: string[] = []; for (let o of options) { - if (o.alias && isOptionSupported(o)) { - alias[o.id] = o.alias; + if (isOptionSupported(o)) { + if (o.alias) { + alias[o.id] = o.alias; + } } + if (o.type === 'string') { string.push(o.id); + if (o.deprecates) { + string.push(o.deprecates); + } } else if (o.type === 'boolean') { boolean.push(o.id); + if (o.deprecates) { + boolean.push(o.deprecates); + } } } // remote aliases to avoid confusion @@ -116,6 +123,10 @@ export function parseArgs(args: string[], isOptionSupported = (_: Option) => tru if (o.alias) { delete parsedArgs[o.alias]; } + if (o.deprecates && parsedArgs.hasOwnProperty(o.deprecates) && !parsedArgs[o.id]) { + parsedArgs[o.id] = parsedArgs[o.deprecates]; + delete parsedArgs[o.deprecates]; + } } return parsedArgs; } diff --git a/src/vs/platform/environment/node/environmentService.ts b/src/vs/platform/environment/node/environmentService.ts index 5ecf265cdbd..8c33dbaec1e 100644 --- a/src/vs/platform/environment/node/environmentService.ts +++ b/src/vs/platform/environment/node/environmentService.ts @@ -250,11 +250,11 @@ export class EnvironmentService implements IEnvironmentService { } export function parseExtensionHostPort(args: ParsedArgs, isBuild: boolean): IExtensionHostDebugParams { - return parseDebugPort(args.debugPluginHost, args.debugBrkPluginHost, 5870, isBuild, args.debugId); + return parseDebugPort(args['inspect-extensions'], args['inspect-brk-extensions'], 5870, isBuild, args.debugId); } export function parseSearchPort(args: ParsedArgs, isBuild: boolean): IDebugParams { - return parseDebugPort(args.debugSearch, args.debugBrkSearch, 5876, isBuild); + return parseDebugPort(args['inspect-search'], args['inspect-brk-search'], 5876, isBuild); } export function parseDebugPort(debugArg: string | undefined, debugBrkArg: string | undefined, defaultBuildPort: number, isBuild: boolean, debugId?: string): IExtensionHostDebugParams { diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index b29c8629002..fc1faf3fff7 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -19,6 +19,12 @@ suite('EnvironmentService', () => { assert.deepEqual(parse(['--debugBrkPluginHost']), { port: null, break: false, debugId: undefined }); assert.deepEqual(parse(['--debugBrkPluginHost=5678']), { port: 5678, break: true, debugId: undefined }); assert.deepEqual(parse(['--debugPluginHost=1234', '--debugBrkPluginHost=5678', '--debugId=7']), { port: 5678, break: true, debugId: '7' }); + + assert.deepEqual(parse(['--inspect-extensions']), { port: null, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-extensions=1234']), { port: 1234, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-brk-extensions']), { port: null, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-brk-extensions=5678']), { port: 5678, break: true, debugId: undefined }); + assert.deepEqual(parse(['--inspect-extensions=1234', '--inspect-brk-extensions=5678', '--debugId=7']), { port: 5678, break: true, debugId: '7' }); }); test('parseExtensionHostPort when unbuilt', () => { @@ -30,6 +36,12 @@ suite('EnvironmentService', () => { assert.deepEqual(parse(['--debugBrkPluginHost']), { port: 5870, break: false, debugId: undefined }); assert.deepEqual(parse(['--debugBrkPluginHost=5678']), { port: 5678, break: true, debugId: undefined }); assert.deepEqual(parse(['--debugPluginHost=1234', '--debugBrkPluginHost=5678', '--debugId=7']), { port: 5678, break: true, debugId: '7' }); + + assert.deepEqual(parse(['--inspect-extensions']), { port: 5870, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-extensions=1234']), { port: 1234, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-brk-extensions']), { port: 5870, break: false, debugId: undefined }); + assert.deepEqual(parse(['--inspect-brk-extensions=5678']), { port: 5678, break: true, debugId: undefined }); + assert.deepEqual(parse(['--inspect-extensions=1234', '--inspect-brk-extensions=5678', '--debugId=7']), { port: 5678, break: true, debugId: '7' }); }); test('userDataPath', () => { diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index a72c577218f..d4f636b463f 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -774,7 +774,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { const headers = { 'Accept-Encoding': 'gzip' }; return this.getAsset(manifest, { headers }) .then(context => asJson(context)) - .then(manifest => manifest ? manifest.engines.vscode : Promise.reject('Error while reading manifest')); + .then(manifest => manifest ? manifest.engines.vscode : Promise.reject('Error while reading manifest')); } private getLastValidExtensionVersionReccursively(extension: IRawGalleryExtension, versions: IRawGalleryExtensionVersion[]): Promise { @@ -839,7 +839,7 @@ export function resolveMarketplaceHeaders(environmentService: IEnvironmentServic const marketplaceMachineIdFile = path.join(environmentService.userDataPath, 'machineid'); return readFile(marketplaceMachineIdFile, 'utf8') - .then(contents => isUUID(contents) ? contents : Promise.resolve(null), () => Promise.resolve(null) /* error reading ID file */) + .then(contents => isUUID(contents) ? contents : null, () => null /* error reading ID file */) .then(uuid => { if (!uuid) { uuid = generateUuid(); diff --git a/src/vs/platform/extensionManagement/node/extensionManagementService.ts b/src/vs/platform/extensionManagement/node/extensionManagementService.ts index eec60635669..ab6982abed3 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementService.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementService.ts @@ -24,7 +24,7 @@ import { import { areSameExtensions, getGalleryExtensionId, groupByExtension, getMaliciousExtensionsSet, getGalleryExtensionTelemetryData, getLocalExtensionTelemetryData } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { localizeManifest } from '../common/extensionNls'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { Limiter, always, createCancelablePromise, CancelablePromise, Queue } from 'vs/base/common/async'; +import { Limiter, createCancelablePromise, CancelablePromise, Queue } from 'vs/base/common/async'; import { Event, Emitter } from 'vs/base/common/event'; import * as semver from 'semver'; import { URI } from 'vs/base/common/uri'; @@ -306,7 +306,7 @@ export class ExtensionManagementService extends Disposable implements IExtension this.downloadInstallableExtension(extension, operation) .then(installableExtension => this.installExtension(installableExtension, ExtensionType.User, cancellationToken) - .then(local => always(pfs.rimraf(installableExtension.zipPath), () => null).then(() => local))) + .then(local => pfs.rimraf(installableExtension.zipPath).finally(() => null).then(() => local))) .then(local => this.installDependenciesAndPackExtensions(local, existingExtension) .then(() => local, error => this.uninstall(local, true).then(() => Promise.reject(error), () => Promise.reject(error)))) .then( @@ -464,7 +464,7 @@ export class ExtensionManagementService extends Disposable implements IExtension () => this.logService.info('Renamed to', renamePath), e => { this.logService.info('Rename failed. Deleting from extracted location', extractPath); - return always(pfs.rimraf(extractPath), () => null).then(() => Promise.reject(e)); + return pfs.rimraf(extractPath).finally(() => null).then(() => Promise.reject(e)); })); } @@ -475,7 +475,7 @@ export class ExtensionManagementService extends Disposable implements IExtension () => extract(zipPath, extractPath, { sourcePath: 'extension', overwrite: true }, this.logService, token) .then( () => this.logService.info(`Extracted extension to ${extractPath}:`, identifier.id), - e => always(pfs.rimraf(extractPath), () => null) + e => pfs.rimraf(extractPath).finally(() => null) .then(() => Promise.reject(new ExtensionManagementError(e.message, e instanceof ExtractError && e.type ? e.type : INSTALL_ERROR_EXTRACTING)))), e => Promise.reject(new ExtensionManagementError(this.joinErrors(e).message, INSTALL_ERROR_DELETING))); } diff --git a/src/vs/platform/history/electron-main/historyMainService.ts b/src/vs/platform/history/electron-main/historyMainService.ts index 1b0d20dc036..4e854d1a1e5 100644 --- a/src/vs/platform/history/electron-main/historyMainService.ts +++ b/src/vs/platform/history/electron-main/historyMainService.ts @@ -16,21 +16,12 @@ import { IWorkspaceIdentifier, IWorkspacesMainService, ISingleFolderWorkspaceIde import { IHistoryMainService, IRecentlyOpened } from 'vs/platform/history/common/history'; import { isEqual } from 'vs/base/common/paths'; import { RunOnceScheduler } from 'vs/base/common/async'; -import { getComparisonKey, isEqual as areResourcesEqual, dirname } from 'vs/base/common/resources'; -import { URI, UriComponents } from 'vs/base/common/uri'; +import { getComparisonKey, isEqual as areResourcesEqual, dirname, fsPath } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; import { Schemas } from 'vs/base/common/network'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { getSimpleWorkspaceLabel } from 'vs/platform/label/common/label'; - -interface ISerializedRecentlyOpened { - workspaces2: Array; // IWorkspaceIdentifier or URI.toString() - files2: string[]; // files as URI.toString() -} - -interface ILegacySerializedRecentlyOpened { - workspaces: Array; // legacy (UriComponents was also supported for a few insider builds) - files: string[]; // files as paths -} +import { toStoreData, restoreRecentlyOpened, RecentlyOpenedStorageData } from 'vs/platform/history/electron-main/historyStorage'; export class HistoryMainService implements IHistoryMainService { @@ -112,7 +103,7 @@ export class HistoryMainService implements IHistoryMainService { // Remove workspace let index = arrays.firstIndex(mru.workspaces, workspace => { if (isWorkspaceIdentifier(pathToRemove)) { - return isWorkspaceIdentifier(workspace) && isEqual(pathToRemove.configPath, workspace.configPath, !isLinux /* ignorecase */); + return isWorkspaceIdentifier(workspace) && areResourcesEqual(pathToRemove.configPath, workspace.configPath, !isLinux /* ignorecase */); } if (isSingleFolderWorkspaceIdentifier(pathToRemove)) { return isSingleFolderWorkspaceIdentifier(workspace) && areResourcesEqual(pathToRemove, workspace); @@ -122,7 +113,7 @@ export class HistoryMainService implements IHistoryMainService { return workspace.scheme === Schemas.file && isEqual(pathToRemove, workspace.fsPath, !isLinux /* ignorecase */); } if (isWorkspaceIdentifier(workspace)) { - return isEqual(pathToRemove, workspace.configPath, !isLinux /* ignorecase */); + return workspace.configPath.scheme === Schemas.file && isEqual(pathToRemove, workspace.configPath.fsPath, !isLinux /* ignorecase */); } } return false; @@ -178,12 +169,14 @@ export class HistoryMainService implements IHistoryMainService { const workspace = mru.workspaces[i]; if (isSingleFolderWorkspaceIdentifier(workspace)) { if (workspace.scheme === Schemas.file) { - app.addRecentDocument(workspace.fsPath); + app.addRecentDocument(fsPath(workspace)); entries++; } } else { - app.addRecentDocument(workspace.configPath); - entries++; + if (workspace.configPath.scheme === Schemas.file) { + app.addRecentDocument(fsPath(workspace.configPath)); + entries++; + } } } @@ -192,7 +185,7 @@ export class HistoryMainService implements IHistoryMainService { for (let i = 0; i < mru.files.length && entries < HistoryMainService.MAX_MACOS_DOCK_RECENT_FILES; i++) { const file = mru.files[i]; if (file.scheme === Schemas.file) { - app.addRecentDocument(file.fsPath); + app.addRecentDocument(fsPath(file)); entries++; } } @@ -207,18 +200,9 @@ export class HistoryMainService implements IHistoryMainService { } getRecentlyOpened(currentWorkspace?: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier, currentFiles?: IPath[]): IRecentlyOpened { - let workspaces: Array; - let files: URI[]; // Get from storage - const storedRecents = this.getRecentlyOpenedFromStorage(); - if (storedRecents) { - workspaces = storedRecents.workspaces || []; - files = storedRecents.files || []; - } else { - workspaces = []; - files = []; - } + let { workspaces, files } = this.getRecentlyOpenedFromStorage(); // Add current workspace to beginning if set if (currentWorkspace) { @@ -249,65 +233,12 @@ export class HistoryMainService implements IHistoryMainService { } private getRecentlyOpenedFromStorage(): IRecentlyOpened { - const storedRecents = this.stateService.getItem(HistoryMainService.recentlyOpenedStorageKey); - const result: IRecentlyOpened = { workspaces: [], files: [] }; - if (storedRecents) { - if (Array.isArray(storedRecents.workspaces2)) { - for (const workspace of storedRecents.workspaces2) { - if (isWorkspaceIdentifier(workspace)) { - result.workspaces.push(workspace); - } else if (typeof workspace === 'string') { - result.workspaces.push(URI.parse(workspace)); - } - } - } else if (Array.isArray(storedRecents.workspaces)) { - // TODO@martin legacy support can be removed at some point (6 month?) - // format of 1.25 and before - for (const workspace of storedRecents.workspaces) { - if (typeof workspace === 'string') { - result.workspaces.push(URI.file(workspace)); - } else if (isWorkspaceIdentifier(workspace)) { - result.workspaces.push(workspace); - } else if (workspace && typeof workspace.path === 'string' && typeof workspace.scheme === 'string') { - // added by 1.26-insiders - result.workspaces.push(URI.revive(workspace)); - } - } - } - - if (Array.isArray(storedRecents.files2)) { - for (const file of storedRecents.files2) { - if (typeof file === 'string') { - result.files.push(URI.parse(file)); - } - } - } else if (Array.isArray(storedRecents.files)) { - for (const file of storedRecents.files) { - if (typeof file === 'string') { - result.files.push(URI.file(file)); - } - } - } - } - - return result; + const storedRecents = this.stateService.getItem(HistoryMainService.recentlyOpenedStorageKey); + return restoreRecentlyOpened(storedRecents); } private saveRecentlyOpened(recent: IRecentlyOpened): void { - const serialized: ISerializedRecentlyOpened = { workspaces2: [], files2: [] }; - - for (const workspace of recent.workspaces) { - if (isSingleFolderWorkspaceIdentifier(workspace)) { - serialized.workspaces2.push(workspace.toString()); - } else { - serialized.workspaces2.push(workspace); - } - } - - for (const file of recent.files) { - serialized.files2.push(file.toString()); - } - + const serialized = toStoreData(recent); this.stateService.setItem(HistoryMainService.recentlyOpenedStorageKey, serialized); } @@ -345,14 +276,9 @@ export class HistoryMainService implements IHistoryMainService { for (let item of app.getJumpListSettings().removedItems) { const args = item.args; if (args) { - const match = /^--folder-uri\s+"([^"]+)"$/.exec(args); + const match = /^--(folder|file)-uri\s+"([^"]+)"$/.exec(args); if (match) { - if (args[0] === '-') { - toRemove.push(URI.parse(match[1])); - } else { - let configPath = match[1]; - toRemove.push({ id: this.workspacesMainService.getWorkspaceId(configPath), configPath }); - } + toRemove.push(URI.parse(match[2])); } } } @@ -372,7 +298,7 @@ export class HistoryMainService implements IHistoryMainService { args = `--folder-uri "${workspace.toString()}"`; } else { description = nls.localize('codeWorkspace', "Code Workspace"); - args = `"${workspace.configPath}"`; + args = `--file-uri "${workspace.configPath.toString()}"`; } return { type: 'task', diff --git a/src/vs/platform/history/electron-main/historyStorage.ts b/src/vs/platform/history/electron-main/historyStorage.ts new file mode 100644 index 00000000000..5f4649dfcd0 --- /dev/null +++ b/src/vs/platform/history/electron-main/historyStorage.ts @@ -0,0 +1,94 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { UriComponents, URI } from 'vs/base/common/uri'; +import { IRecentlyOpened } from 'vs/platform/history/common/history'; +import { isSingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; + +interface ISerializedRecentlyOpened { + workspaces3: Array; // workspace or URI.toString() + files2: string[]; // files as URI.toString() +} + +interface ILegacySerializedRecentlyOpened { + workspaces2: Array; // legacy, configPath as file path + workspaces: Array; // legacy (UriComponents was also supported for a few insider builds) + files: string[]; // files as paths +} + +interface ISerializedWorkspace { id: string; configURIPath: string; } +interface ILegacySerializedWorkspace { id: string; configPath: string; } + +export type RecentlyOpenedStorageData = object; + +export function restoreRecentlyOpened(data: RecentlyOpenedStorageData | undefined): IRecentlyOpened { + const result: IRecentlyOpened = { workspaces: [], files: [] }; + if (data) { + const storedRecents = data as ISerializedRecentlyOpened & ILegacySerializedRecentlyOpened; + if (Array.isArray(storedRecents.workspaces3)) { + for (const workspace of storedRecents.workspaces3) { + if (typeof workspace === 'object' && typeof workspace.id === 'string' && typeof workspace.configURIPath === 'string') { + result.workspaces.push({ id: workspace.id, configPath: URI.parse(workspace.configURIPath) }); + } else if (typeof workspace === 'string') { + result.workspaces.push(URI.parse(workspace)); + } + } + } else if (Array.isArray(storedRecents.workspaces2)) { + for (const workspace of storedRecents.workspaces2) { + if (typeof workspace === 'object' && typeof workspace.id === 'string' && typeof workspace.configPath === 'string') { + result.workspaces.push({ id: workspace.id, configPath: URI.file(workspace.configPath) }); + } else if (typeof workspace === 'string') { + result.workspaces.push(URI.parse(workspace)); + } + } + } else if (Array.isArray(storedRecents.workspaces)) { + // TODO@martin legacy support can be removed at some point (6 month?) + // format of 1.25 and before + for (const workspace of storedRecents.workspaces) { + if (typeof workspace === 'string') { + result.workspaces.push(URI.file(workspace)); + } else if (typeof workspace === 'object' && typeof workspace['id'] === 'string' && typeof workspace['configPath'] === 'string') { + result.workspaces.push({ id: workspace['id'], configPath: URI.file(workspace['configPath']) }); + } else if (workspace && typeof workspace['path'] === 'string' && typeof workspace['scheme'] === 'string') { + // added by 1.26-insiders + result.workspaces.push(URI.revive(workspace)); + } + } + } + + if (Array.isArray(storedRecents.files2)) { + for (const file of storedRecents.files2) { + if (typeof file === 'string') { + result.files.push(URI.parse(file)); + } + } + } else if (Array.isArray(storedRecents.files)) { + for (const file of storedRecents.files) { + if (typeof file === 'string') { + result.files.push(URI.file(file)); + } + } + } + } + + return result; +} + +export function toStoreData(recent: IRecentlyOpened): RecentlyOpenedStorageData { + const serialized: ISerializedRecentlyOpened = { workspaces3: [], files2: [] }; + + for (const workspace of recent.workspaces) { + if (isSingleFolderWorkspaceIdentifier(workspace)) { + serialized.workspaces3.push(workspace.toString()); + } else { + serialized.workspaces3.push({ id: workspace.id, configURIPath: workspace.configPath.toString() }); + } + } + + for (const file of recent.files) { + serialized.files2.push(file.toString()); + } + + return serialized; +} diff --git a/src/vs/platform/history/test/electron-main/historyStorage.test.ts b/src/vs/platform/history/test/electron-main/historyStorage.test.ts new file mode 100644 index 00000000000..79e354a9471 --- /dev/null +++ b/src/vs/platform/history/test/electron-main/historyStorage.test.ts @@ -0,0 +1,180 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import * as assert from 'assert'; +import * as os from 'os'; +import * as path from 'path'; + +import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { URI } from 'vs/base/common/uri'; +import { IRecentlyOpened } from 'vs/platform/history/common/history'; +import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/electron-main/historyStorage'; + +function toWorkspace(uri: URI): IWorkspaceIdentifier { + return { + id: '1234', + configPath: uri + }; +} +function assertEqualURI(u1: URI | undefined, u2: URI | undefined, message?: string): void { + assert.equal(u1 && u1.toString(), u2 && u2.toString(), message); +} + +function assertEqualWorkspace(w1: IWorkspaceIdentifier | undefined, w2: IWorkspaceIdentifier | undefined, message?: string): void { + if (!w1 || !w2) { + assert.equal(w1, w2, message); + return; + } + assert.equal(w1.id, w2.id, message); + assertEqualURI(w1.configPath, w2.configPath, message); +} + +function assertEqualRecentlyOpened(expected: IRecentlyOpened, actual: IRecentlyOpened, message?: string) { + assert.equal(expected.files.length, actual.files.length, message); + for (let i = 0; i < expected.files.length; i++) { + assertEqualURI(expected.files[i], actual.files[i], message); + } + assert.equal(expected.workspaces.length, actual.workspaces.length, message); + for (let i = 0; i < expected.workspaces.length; i++) { + if (expected.workspaces[i] instanceof URI) { + assertEqualURI(expected.workspaces[i], actual.workspaces[i], message); + } else { + assertEqualWorkspace(expected.workspaces[i], actual.workspaces[i], message); + } + } +} + +function assertRestoring(state: IRecentlyOpened, message?: string) { + const stored = toStoreData(state); + const restored = restoreRecentlyOpened(stored); + assertEqualRecentlyOpened(state, restored, message); +} + +const testWSPath = URI.file(path.join(os.tmpdir(), 'windowStateTest', 'test.code-workspace')); +const testFileURI = URI.file(path.join(os.tmpdir(), 'windowStateTest', 'testFile.txt')); +const testFolderURI = URI.file(path.join(os.tmpdir(), 'windowStateTest', 'testFolder')); + +const testRemoteFolderURI = URI.parse('foo://bar/c/e'); +const testRemoteFileURI = URI.parse('foo://bar/c/d.txt'); +const testRemoteWSURI = URI.parse('foo://bar/c/test.code-workspace'); + +suite('History Storage', () => { + test('storing and restoring', () => { + let ro: IRecentlyOpened; + ro = { + files: [], + workspaces: [] + }; + assertRestoring(ro, 'empty'); + ro = { + files: [testFileURI], + workspaces: [] + }; + assertRestoring(ro, 'file'); + ro = { + files: [], + workspaces: [testFolderURI] + }; + assertRestoring(ro, 'folder'); + ro = { + files: [], + workspaces: [toWorkspace(testWSPath), testFolderURI] + }; + assertRestoring(ro, 'workspaces and folders'); + + ro = { + files: [testRemoteFileURI], + workspaces: [toWorkspace(testRemoteWSURI), testRemoteFolderURI] + }; + assertRestoring(ro, 'remote workspaces and folders'); + }); + + test('open 1_25', () => { + const v1_25_win = `{ + "workspaces": [ + { + "id": "2fa677dbdf5f771e775af84dea9feaea", + "configPath": "C:\\\\workspaces\\\\testing\\\\test.code-workspace" + }, + "C:\\\\workspaces\\\\testing\\\\test-ext", + { + "id": "d87a0241f8abc86b95c4e5481ebcbf56", + "configPath": "C:\\\\workspaces\\\\test.code-workspace" + } + ], + "files": [ + "C:\\\\workspaces\\\\test.code-workspace", + "C:\\\\workspaces\\\\testing\\\\test-ext\\\\.gitignore" + ] + }`; + + let actual = restoreRecentlyOpened(JSON.parse(v1_25_win)); + let expected: IRecentlyOpened = { + files: [URI.file('C:\\workspaces\\test.code-workspace'), URI.file('C:\\workspaces\\testing\\test-ext\\.gitignore')], + workspaces: [ + { id: '2fa677dbdf5f771e775af84dea9feaea', configPath: URI.file('C:\\workspaces\\testing\\test.code-workspace') }, + URI.file('C:\\workspaces\\testing\\test-ext'), + { id: 'd87a0241f8abc86b95c4e5481ebcbf56', configPath: URI.file('C:\\workspaces\\test.code-workspace') } + ] + }; + + assertEqualRecentlyOpened(expected, actual, 'v1_31_win'); + }); + + test('open 1_31', () => { + const v1_31_win = `{ + "workspaces2": [ + "file:///c%3A/workspaces/testing/test-ext", + "file:///c%3A/WINDOWS/system32", + { + "id": "d87a0241f8abc86b95c4e5481ebcbf56", + "configPath": "c:\\\\workspaces\\\\test.code-workspace" + } + ], + "files2": [ + "file:///c%3A/workspaces/vscode/.yarnrc" + ] + }`; + + let actual = restoreRecentlyOpened(JSON.parse(v1_31_win)); + let expected: IRecentlyOpened = { + files: [URI.parse('file:///c%3A/workspaces/vscode/.yarnrc')], + workspaces: [ + URI.parse('file:///c%3A/workspaces/testing/test-ext'), + URI.parse('file:///c%3A/WINDOWS/system32'), + { id: 'd87a0241f8abc86b95c4e5481ebcbf56', configPath: URI.file('c:\\workspaces\\test.code-workspace') } + ] + }; + + assertEqualRecentlyOpened(expected, actual, 'v1_31_win'); + }); + + test('open 1_32', () => { + const v1_32 = `{ + "workspaces3": [ + { + "id": "53b714b46ef1a2d4346568b4f591028c", + "configURIPath": "file:///home/user/workspaces/testing/custom.code-workspace" + }, + "file:///home/user/workspaces/testing/folding" + ], + "files2": [ + "file:///home/user/.config/code-oss-dev/storage.json" + ] + }`; + + let windowsState = restoreRecentlyOpened(JSON.parse(v1_32)); + let expected: IRecentlyOpened = { + files: [URI.parse('file:///home/user/.config/code-oss-dev/storage.json')], + workspaces: [ + { id: '53b714b46ef1a2d4346568b4f591028c', configPath: URI.parse('file:///home/user/workspaces/testing/custom.code-workspace') }, + URI.parse('file:///home/user/workspaces/testing/folding') + ] + }; + + assertEqualRecentlyOpened(expected, windowsState, 'v1_32'); + + }); + +}); \ No newline at end of file diff --git a/src/vs/platform/keybinding/common/keybindingResolver.ts b/src/vs/platform/keybinding/common/keybindingResolver.ts index 4e2ee339287..0d631c3a4de 100644 --- a/src/vs/platform/keybinding/common/keybindingResolver.ts +++ b/src/vs/platform/keybinding/common/keybindingResolver.ts @@ -311,7 +311,7 @@ export class KeybindingResolver { if (seenMap.has(id)) { return; } - seenMap.set(id); + seenMap.set(id, true); if (id[0] === '_' || id.indexOf('vscode.') === 0) { // private command return; } diff --git a/src/vs/platform/label/common/label.ts b/src/vs/platform/label/common/label.ts index 6f018648f98..4bd34446d4f 100644 --- a/src/vs/platform/label/common/label.ts +++ b/src/vs/platform/label/common/label.ts @@ -8,12 +8,9 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; import { IWorkspace } from 'vs/platform/workspace/common/workspace'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { basename as resourceBasename } from 'vs/base/common/resources'; -import { isLinux } from 'vs/base/common/platform'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { localize } from 'vs/nls'; -import { isParent } from 'vs/platform/files/common/files'; -import { basename } from 'vs/base/common/paths'; +import { isEqualOrParent, basename } from 'vs/base/common/resources'; export interface ILabelService { _serviceBrand: any; @@ -48,10 +45,10 @@ const LABEL_SERVICE_ID = 'label'; export function getSimpleWorkspaceLabel(workspace: IWorkspaceIdentifier | URI, workspaceHome: string): string { if (isSingleFolderWorkspaceIdentifier(workspace)) { - return resourceBasename(workspace); + return basename(workspace); } // Workspace: Untitled - if (isParent(workspace.configPath, workspaceHome, !isLinux /* ignore case */)) { + if (isEqualOrParent(workspace.configPath, URI.file(workspaceHome))) { return localize('untitledWorkspace', "Untitled (Workspace)"); } diff --git a/src/vs/platform/launch/electron-main/launchService.ts b/src/vs/platform/launch/electron-main/launchService.ts index ba14b195335..aa77f122c84 100644 --- a/src/vs/platform/launch/electron-main/launchService.ts +++ b/src/vs/platform/launch/electron-main/launchService.ts @@ -19,6 +19,7 @@ import { BrowserWindow } from 'electron'; import { Event } from 'vs/base/common/event'; import { hasArgs } from 'vs/platform/environment/node/argv'; import { coalesce } from 'vs/base/common/arrays'; +import { Schemas } from 'vs/base/common/network'; export const ID = 'launchService'; export const ILaunchService = createDecorator(ID); @@ -270,12 +271,16 @@ export class LaunchService implements ILaunchService { if (window.openedFolderUri) { folderURIs.push(window.openedFolderUri); } else if (window.openedWorkspace) { - const resolvedWorkspace = this.workspacesMainService.resolveWorkspaceSync(window.openedWorkspace.configPath); + // workspace folders can only be shown for local workspaces + const workspaceConfigPath = window.openedWorkspace.configPath; + const resolvedWorkspace = workspaceConfigPath.scheme === Schemas.file && this.workspacesMainService.resolveWorkspaceSync(workspaceConfigPath.fsPath); if (resolvedWorkspace) { const rootFolders = resolvedWorkspace.folders; rootFolders.forEach(root => { folderURIs.push(root.uri); }); + } else { + //TODO: can we add the workspace file here? } } diff --git a/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts b/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts index 28697f4c745..587c31f584e 100644 --- a/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts +++ b/src/vs/platform/lifecycle/electron-main/lifecycleMain.ts @@ -233,7 +233,7 @@ export class LifecycleService extends Disposable implements ILifecycleService { } }); - this.pendingWillShutdownPromise = Promise.all(joiners).then(undefined, err => this.logService.error(err)); + this.pendingWillShutdownPromise = Promise.all(joiners).then(() => undefined, err => this.logService.error(err)); return this.pendingWillShutdownPromise; } diff --git a/src/vs/platform/list/browser/listService.ts b/src/vs/platform/list/browser/listService.ts index 0966123e57d..389b713aebf 100644 --- a/src/vs/platform/list/browser/listService.ts +++ b/src/vs/platform/list/browser/listService.ts @@ -3,32 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { addClass, addStandardDisposableListener, createStyleSheet, getTotalHeight, removeClass } from 'vs/base/browser/dom'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { IInputOptions, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; +import { createStyleSheet } from 'vs/base/browser/dom'; import { IListMouseEvent, IListTouchEvent, IListRenderer, IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer, PagedList } from 'vs/base/browser/ui/list/listPaging'; import { DefaultStyleController, IListOptions, IMultipleSelectionController, IOpenController, isSelectionRangeChangeEvent, isSelectionSingleChangeEvent, List } from 'vs/base/browser/ui/list/listWidget'; -import { canceled, onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { FuzzyScore } from 'vs/base/common/filters'; -import { KeyCode } from 'vs/base/common/keyCodes'; import { combinedDisposable, Disposable, dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { ScrollbarVisibility } from 'vs/base/common/scrollable'; import { isUndefinedOrNull } from 'vs/base/common/types'; -import { IFilter, ITree, ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; +import { ITree, ITreeConfiguration, ITreeOptions } from 'vs/base/parts/tree/browser/tree'; import { ClickBehavior, DefaultController, DefaultTreestyler, IControllerOptions, OpenMode } from 'vs/base/parts/tree/browser/treeDefaults'; import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Extensions as ConfigurationExtensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; import { ContextKeyExpr, IContextKey, IContextKeyService, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { Registry } from 'vs/platform/registry/common/platform'; -import { attachInputBoxStyler, attachListStyler, computeStyles, defaultListStyles } from 'vs/platform/theme/common/styler'; +import { attachListStyler, computeStyles, defaultListStyles } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { InputFocusedContextKey } from 'vs/platform/workbench/common/contextkeys'; import { ObjectTree, IObjectTreeOptions } from 'vs/base/browser/ui/tree/objectTree'; @@ -181,12 +175,13 @@ class WorkbenchOpenController extends Disposable implements IOpenController { shouldOpen(event: UIEvent): boolean { if (event instanceof MouseEvent) { + const isLeftButton = event.button === 0; const isDoubleClick = event.detail === 2; - if (!this.openOnSingleClick && !isDoubleClick) { + if (isLeftButton && !this.openOnSingleClick && !isDoubleClick) { return false; } - if (event.button === 0 /* left mouse button */ || event.button === 1 /* middle mouse button */) { + if (isLeftButton /* left mouse button */ || event.button === 1 /* middle mouse button */) { return this.existingOpenController ? this.existingOpenController.shouldOpen(event) : true; } @@ -232,27 +227,6 @@ function getSharedListStyleSheet(): HTMLStyleElement { return sharedListStyleSheet; } -let sharedTreeStyleSheet: HTMLStyleElement; -function getSharedTreeStyleSheet(): HTMLStyleElement { - if (!sharedTreeStyleSheet) { - sharedTreeStyleSheet = createStyleSheet(); - } - - return sharedTreeStyleSheet; -} - -function handleTreeController(configuration: ITreeConfiguration, instantiationService: IInstantiationService): ITreeConfiguration { - if (!configuration.controller) { - configuration.controller = instantiationService.createInstance(WorkbenchTreeController, {}); - } - - if (!configuration.styler) { - configuration.styler = new DefaultTreestyler(getSharedTreeStyleSheet()); - } - - return configuration; -} - export class WorkbenchList extends List { readonly contextKeyService: IContextKeyService; @@ -408,6 +382,36 @@ export class WorkbenchPagedList extends PagedList { } } +/** + * @deprecated + */ +let sharedTreeStyleSheet: HTMLStyleElement; +function getSharedTreeStyleSheet(): HTMLStyleElement { + if (!sharedTreeStyleSheet) { + sharedTreeStyleSheet = createStyleSheet(); + } + + return sharedTreeStyleSheet; +} + +/** + * @deprecated + */ +function handleTreeController(configuration: ITreeConfiguration, instantiationService: IInstantiationService): ITreeConfiguration { + if (!configuration.controller) { + configuration.controller = instantiationService.createInstance(WorkbenchTreeController, {}); + } + + if (!configuration.styler) { + configuration.styler = new DefaultTreestyler(getSharedTreeStyleSheet()); + } + + return configuration; +} + +/** + * @deprecated + */ export class WorkbenchTree extends Tree { readonly contextKeyService: IContextKeyService; @@ -502,6 +506,9 @@ export class WorkbenchTree extends Tree { } } +/** + * @deprecated + */ function massageControllerOptions(options: IControllerOptions): IControllerOptions { if (typeof options.keyboardSupport !== 'boolean') { options.keyboardSupport = false; @@ -514,6 +521,9 @@ function massageControllerOptions(options: IControllerOptions): IControllerOptio return options; } +/** + * @deprecated + */ export class WorkbenchTreeController extends DefaultController { protected disposables: IDisposable[] = []; @@ -559,6 +569,9 @@ export interface IResourceResultsNavigationOptions { openOnFocus: boolean; } +/** + * @deprecated + */ export class TreeResourceNavigator extends Disposable { private readonly _openResource = new Emitter(); @@ -704,241 +717,6 @@ export class TreeResourceNavigator2 extends Disposable { } } -export interface IHighlighter { - getHighlights(tree: ITree, element: any, pattern: string): FuzzyScore; - getHighlightsStorageKey?(element: any): any; -} - -export interface IHighlightingTreeConfiguration extends ITreeConfiguration { - highlighter: IHighlighter; -} - -export interface IHighlightingTreeOptions extends ITreeOptions { - filterOnType?: boolean; -} - -export class HighlightingTreeController extends WorkbenchTreeController { - - constructor( - options: IControllerOptions, - private readonly onType: () => any, - @IConfigurationService configurationService: IConfigurationService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, - ) { - super(options, configurationService); - } - - onKeyDown(tree: ITree, event: IKeyboardEvent) { - let handled = super.onKeyDown(tree, event); - if (handled) { - return true; - } - if (this.upKeyBindingDispatcher.has(event.keyCode)) { - return false; - } - if (this._keybindingService.mightProducePrintableCharacter(event)) { - this.onType(); - return true; - } - return false; - } -} - -class HightlightsFilter implements IFilter { - - static add(config: ITreeConfiguration, options: IHighlightingTreeOptions): ITreeConfiguration { - const myFilter = new HightlightsFilter(); - myFilter.enabled = !!options.filterOnType; - if (!config.filter) { - config.filter = myFilter; - } else { - let otherFilter = config.filter; - config.filter = { - isVisible(tree: ITree, element: any): boolean { - return myFilter.isVisible(tree, element) && otherFilter.isVisible(tree, element); - } - }; - } - return config; - } - - enabled: boolean = true; - - isVisible(tree: ITree, element: any): boolean { - if (!this.enabled) { - return true; - } - let tree2 = (tree as HighlightingWorkbenchTree); - if (!tree2.isHighlighterScoring()) { - return true; - } - if (tree2.getHighlighterScore(element)) { - return true; - } - return false; - } -} - -export class HighlightingWorkbenchTree extends WorkbenchTree { - - protected readonly domNode: HTMLElement; - protected readonly inputContainer: HTMLElement; - protected readonly input: InputBox; - - protected readonly highlighter: IHighlighter; - protected readonly highlights: Map; - - private readonly _onDidStartFilter: Emitter; - readonly onDidStartFiltering: Event; - - constructor( - parent: HTMLElement, - treeConfiguration: IHighlightingTreeConfiguration, - treeOptions: IHighlightingTreeOptions, - listOptions: IInputOptions, - @IContextKeyService contextKeyService: IContextKeyService, - @IContextViewService contextViewService: IContextViewService, - @IListService listService: IListService, - @IThemeService themeService: IThemeService, - @IInstantiationService instantiationService: IInstantiationService, - @IConfigurationService configurationService: IConfigurationService - ) { - // build html skeleton - const container = document.createElement('div'); - container.className = 'highlighting-tree'; - const inputContainer = document.createElement('div'); - inputContainer.className = 'input'; - const treeContainer = document.createElement('div'); - treeContainer.className = 'tree'; - container.appendChild(inputContainer); - container.appendChild(treeContainer); - parent.appendChild(container); - - // create tree - treeConfiguration.controller = treeConfiguration.controller || instantiationService.createInstance(HighlightingTreeController, {}, () => this.onTypeInTree()); - super(treeContainer, HightlightsFilter.add(treeConfiguration, treeOptions), treeOptions, contextKeyService, listService, themeService, instantiationService, configurationService); - this.highlighter = treeConfiguration.highlighter; - this.highlights = new Map(); - - this.domNode = container; - addClass(this.domNode, 'inactive'); - - // create input - this.inputContainer = inputContainer; - this.input = new InputBox(inputContainer, contextViewService, listOptions); - this.input.setEnabled(false); - this.input.onDidChange(this.updateHighlights, this, this.disposables); - this.disposables.push(attachInputBoxStyler(this.input, themeService)); - this.disposables.push(this.input); - this.disposables.push(addStandardDisposableListener(this.input.inputElement, 'keydown', event => { - //todo@joh make this command/context-key based - switch (event.keyCode) { - case KeyCode.UpArrow: - case KeyCode.DownArrow: - case KeyCode.Tab: - this.domFocus(); - event.preventDefault(); - break; - case KeyCode.Enter: - this.setSelection(this.getSelection()); - event.preventDefault(); - break; - case KeyCode.Escape: - this.input.value = ''; - this.domFocus(); - event.preventDefault(); - break; - } - })); - - this._onDidStartFilter = new Emitter(); - this.onDidStartFiltering = this._onDidStartFilter.event; - this.disposables.push(this._onDidStartFilter); - } - - setInput(element: any): Promise { - this.input.setEnabled(false); - return super.setInput(element).then(value => { - if (!this.input.inputElement) { - // has been disposed in the meantime -> cancel - return Promise.reject(canceled()); - } - this.input.setEnabled(true); - return value; - }); - } - - layout(height?: number, width?: number): void { - this.input.layout(); - super.layout(typeof height !== 'number' || isNaN(height) ? height : height - getTotalHeight(this.inputContainer), width); - } - - private onTypeInTree(): void { - removeClass(this.domNode, 'inactive'); - this.input.focus(); - this.layout(); - this._onDidStartFilter.fire(this); - } - - private lastSelection: any[]; - - private updateHighlights(pattern: string): void { - - // remember old selection - let defaultSelection: any[] = []; - if (!this.lastSelection && pattern) { - this.lastSelection = this.getSelection(); - } else if (this.lastSelection && !pattern) { - defaultSelection = this.lastSelection; - this.lastSelection = []; - } - - let topElement: any; - if (pattern) { - let nav = this.getNavigator(undefined, false); - let topScore: FuzzyScore | undefined; - while (nav.next()) { - let element = nav.current(); - let score = this.highlighter.getHighlights(this, element, pattern); - this.highlights.set(this._getHighlightsStorageKey(element), score); - element.foo = 1; - if (!topScore || score && topScore[0] < score[0]) { - topScore = score; - topElement = element; - } - } - } else { - // no pattern, clear highlights - this.highlights.clear(); - } - - this.refresh().then(() => { - if (topElement) { - this.reveal(topElement, 0.5).then(_ => { - this.setSelection([topElement], this); - this.setFocus(topElement, this); - }); - } else { - this.setSelection(defaultSelection, this); - } - }, onUnexpectedError); - } - - isHighlighterScoring(): boolean { - return this.highlights.size > 0; - } - - getHighlighterScore(element: any): FuzzyScore | undefined { - return this.highlights.get(this._getHighlightsStorageKey(element)); - } - - private _getHighlightsStorageKey(element: any): any { - return typeof this.highlighter.getHighlightsStorageKey === 'function' - ? this.highlighter.getHighlightsStorageKey(element) - : element; - } -} - function createKeyboardNavigationEventFilter(container: HTMLElement, keybindingService: IKeybindingService): IKeyboardNavigationEventFilter { let inChord = false; diff --git a/src/vs/platform/menubar/electron-main/menubar.ts b/src/vs/platform/menubar/electron-main/menubar.ts index 7070576c1c1..75c14409faa 100644 --- a/src/vs/platform/menubar/electron-main/menubar.ts +++ b/src/vs/platform/menubar/electron-main/menubar.ts @@ -359,7 +359,7 @@ export class Menubar { if ( this.windowsMainService.getWindowCount() === 0 || // allow to quit when no more windows are open !!this.windowsMainService.getFocusedWindow() || // allow to quit when window has focus (fix for https://github.com/Microsoft/vscode/issues/39191) - this.windowsMainService.getLastActiveWindow().isMinimized() // allow to quit when window has no focus but is minimized (https://github.com/Microsoft/vscode/issues/63000) + this.windowsMainService.getLastActiveWindow()!.isMinimized() // allow to quit when window has no focus but is minimized (https://github.com/Microsoft/vscode/issues/63000) ) { this.windowsMainService.quit(); } @@ -424,7 +424,7 @@ export class Menubar { this.setMenu(submenu, item.submenu.items); menu.append(submenuItem); } else if (isMenubarMenuItemUriAction(item)) { - menu.append(this.createOpenRecentMenuItem(item.uri, item.label, item.id, item.id === 'openRecentFile')); + menu.append(this.createOpenRecentMenuItem(item.uri, item.label, item.id)); } else if (isMenubarMenuItemAction(item)) { if (item.id === 'workbench.action.showAboutDialog') { this.insertCheckForUpdatesItems(menu); @@ -462,8 +462,9 @@ export class Menubar { } } - private createOpenRecentMenuItem(uri: URI, label: string, commandId: string, isFile: boolean): Electron.MenuItem { + private createOpenRecentMenuItem(uri: URI, label: string, commandId: string): Electron.MenuItem { const revivedUri = URI.revive(uri); + const typeHint = commandId === 'openRecentFile' || commandId === 'openRecentWorkspace' ? 'file' : 'folder'; return new MenuItem(this.likeAction(commandId, { label, @@ -472,9 +473,9 @@ export class Menubar { const success = this.windowsMainService.open({ context: OpenContext.MENU, cli: this.environmentService.args, - urisToOpen: [revivedUri], + urisToOpen: [{ uri: revivedUri, typeHint }], forceNewWindow: openInNewWindow, - forceOpenWorkspaceAsFile: isFile + forceOpenWorkspaceAsFile: commandId === 'openRecentFile' }).length > 0; if (!success) { @@ -702,7 +703,7 @@ export class Menubar { let activeWindow = this.windowsMainService.getFocusedWindow(); if (!activeWindow) { const lastActiveWindow = this.windowsMainService.getLastActiveWindow(); - if (lastActiveWindow.isMinimized()) { + if (lastActiveWindow && lastActiveWindow.isMinimized()) { activeWindow = lastActiveWindow; } } diff --git a/src/vs/platform/node/zip.ts b/src/vs/platform/node/zip.ts index be8629a236a..5696d1dec62 100644 --- a/src/vs/platform/node/zip.ts +++ b/src/vs/platform/node/zip.ts @@ -87,7 +87,7 @@ function extractEntry(stream: Readable, fileName: string, mode: number, targetPa } }); - return Promise.resolve(mkdirp(targetDirName, undefined, token)).then(() => new Promise((c, e) => { + return Promise.resolve(mkdirp(targetDirName, undefined, token)).then(() => new Promise((c, e) => { if (token.isCancellationRequested) { return; } diff --git a/src/vs/platform/quickinput/common/quickInput.ts b/src/vs/platform/quickinput/common/quickInput.ts index 7dde852bb12..4f6d33febf1 100644 --- a/src/vs/platform/quickinput/common/quickInput.ts +++ b/src/vs/platform/quickinput/common/quickInput.ts @@ -150,7 +150,7 @@ export interface IQuickPick extends IQuickInput { readonly onDidChangeValue: Event; - readonly onDidAccept: Event; + readonly onDidAccept: Event; buttons: ReadonlyArray; @@ -183,7 +183,7 @@ export interface IInputBox extends IQuickInput { value: string; - valueSelection: Readonly<[number, number]>; + valueSelection: Readonly<[number, number]> | undefined; placeholder: string | undefined; @@ -191,7 +191,7 @@ export interface IInputBox extends IQuickInput { readonly onDidChangeValue: Event; - readonly onDidAccept: Event; + readonly onDidAccept: Event; buttons: ReadonlyArray; @@ -203,7 +203,9 @@ export interface IInputBox extends IQuickInput { } export interface IQuickInputButton { + /** iconPath or iconClass required */ iconPath?: { dark: URI; light?: URI; }; + /** iconPath or iconClass required */ iconClass?: string; tooltip?: string; } diff --git a/src/vs/platform/search/common/search.ts b/src/vs/platform/search/common/search.ts index 877b69da34a..5fc96984e21 100644 --- a/src/vs/platform/search/common/search.ts +++ b/src/vs/platform/search/common/search.ts @@ -27,7 +27,6 @@ export interface ISearchService { _serviceBrand: any; textSearch(query: ITextQuery, token?: CancellationToken, onProgress?: (result: ISearchProgressItem) => void): Promise; fileSearch(query: IFileQuery, token?: CancellationToken): Promise; - extendQuery(query: ITextQuery | IFileQuery): void; clearCache(cacheKey: string): Promise; registerSearchResultProvider(scheme: string, type: SearchProviderType, provider: ISearchResultProvider): IDisposable; } @@ -328,6 +327,7 @@ export interface ISearchConfigurationProperties { showLineNumbers: boolean; usePCRE2: boolean; actionsPosition: 'auto' | 'right'; + maintainFileSearchCache: boolean; collapseResults: 'auto' | 'alwaysCollapse' | 'alwaysExpand'; } diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index 02513305828..13089daf59f 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -108,7 +108,7 @@ export interface IWorkspaceStorageChangeEvent { export class InMemoryStorageService extends Disposable implements IStorageService { _serviceBrand = undefined; - private _onDidChangeStorage: Emitter = this._register(new Emitter()); + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } readonly onWillSaveState = Event.None; diff --git a/src/vs/platform/storage/node/storageIpc.ts b/src/vs/platform/storage/node/storageIpc.ts index 40749376be2..c48b421bb81 100644 --- a/src/vs/platform/storage/node/storageIpc.ts +++ b/src/vs/platform/storage/node/storageIpc.ts @@ -27,7 +27,7 @@ export class GlobalStorageDatabaseChannel extends Disposable implements IServerC private static STORAGE_CHANGE_DEBOUNCE_TIME = 100; - private _onDidChangeItems: Emitter = this._register(new Emitter()); + private readonly _onDidChangeItems: Emitter = this._register(new Emitter()); get onDidChangeItems(): Event { return this._onDidChangeItems.event; } constructor(private storageMainService: StorageMainService) { @@ -104,7 +104,7 @@ export class GlobalStorageDatabaseChannelClient extends Disposable implements IS _serviceBrand: any; - private _onDidChangeItemsExternal: Emitter = this._register(new Emitter()); + private readonly _onDidChangeItemsExternal: Emitter = this._register(new Emitter()); get onDidChangeItemsExternal(): Event { return this._onDidChangeItemsExternal.event; } private onDidChangeItemsOnMainListener: IDisposable; diff --git a/src/vs/platform/storage/node/storageMainService.ts b/src/vs/platform/storage/node/storageMainService.ts index 72ae2f3222b..d6227c98e36 100644 --- a/src/vs/platform/storage/node/storageMainService.ts +++ b/src/vs/platform/storage/node/storageMainService.ts @@ -78,10 +78,10 @@ export class StorageMainService extends Disposable implements IStorageMainServic private static STORAGE_NAME = 'state.vscdb'; - private _onDidChangeStorage: Emitter = this._register(new Emitter()); + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } - private _onWillSaveState: Emitter = this._register(new Emitter()); + private readonly _onWillSaveState: Emitter = this._register(new Emitter()); get onWillSaveState(): Event { return this._onWillSaveState.event; } get items(): Map { return this.storage.items; } @@ -236,7 +236,7 @@ export class StorageMainService extends Disposable implements IStorageMainServic return import('vscode-sqlite3').then(sqlite3 => { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { const handleSuffixKey = (row, key: string, suffix: string) => { if (endsWith(key, suffix.toLowerCase())) { const value: string = row.value.toString('utf16le'); @@ -366,4 +366,4 @@ export class StorageMainService extends Disposable implements IStorageMainServic checkIntegrity(full: boolean): Promise { return this.storage.checkIntegrity(full); } -} \ No newline at end of file +} diff --git a/src/vs/platform/storage/node/storageService.ts b/src/vs/platform/storage/node/storageService.ts index 536a6fcb0a3..79d189e43a6 100644 --- a/src/vs/platform/storage/node/storageService.ts +++ b/src/vs/platform/storage/node/storageService.ts @@ -24,10 +24,10 @@ export class StorageService extends Disposable implements IStorageService { private static WORKSPACE_STORAGE_NAME = 'state.vscdb'; private static WORKSPACE_META_NAME = 'workspace.json'; - private _onDidChangeStorage: Emitter = this._register(new Emitter()); + private readonly _onDidChangeStorage: Emitter = this._register(new Emitter()); get onDidChangeStorage(): Event { return this._onDidChangeStorage.event; } - private _onWillSaveState: Emitter = this._register(new Emitter()); + private readonly _onWillSaveState: Emitter = this._register(new Emitter()); get onWillSaveState(): Event { return this._onWillSaveState.event; } private globalStorage: IStorage; diff --git a/src/vs/platform/telemetry/common/telemetryService.ts b/src/vs/platform/telemetry/common/telemetryService.ts index 7f300844819..87e94be9834 100644 --- a/src/vs/platform/telemetry/common/telemetryService.ts +++ b/src/vs/platform/telemetry/common/telemetryService.ts @@ -60,6 +60,17 @@ export class TelemetryService implements ITelemetryService { } */ this.publicLog('optInStatus', { optIn: this._userOptIn }); + + this._commonProperties.then(values => { + const isHashedId = /^[a-f0-9]+$/i.test(values['common.machineId']); + + /* __GDPR__ + "machineIdFallback" : { + "usingFallbackGuid" : { "classification": "SystemMetaData", "purpose": "BusinessInsight", "isMeasurement": true } + } + */ + this.publicLog('machineIdFallback', { usingFallbackGuid: !isHashedId }); + }); } } diff --git a/src/vs/platform/theme/common/colorRegistry.ts b/src/vs/platform/theme/common/colorRegistry.ts index 8c94876cb23..9c26136e804 100644 --- a/src/vs/platform/theme/common/colorRegistry.ts +++ b/src/vs/platform/theme/common/colorRegistry.ts @@ -27,7 +27,7 @@ export interface ColorContribution { export interface ColorFunction { - (theme: ITheme): Color | null; + (theme: ITheme): Color | undefined; } export interface ColorDefaults { @@ -71,7 +71,7 @@ export interface IColorRegistry { /** * Gets the default color of the given id */ - resolveDefaultColor(id: ColorIdentifier, theme: ITheme): Color | null; + resolveDefaultColor(id: ColorIdentifier, theme: ITheme): Color | undefined; /** * JSON schema for an object to assign color values to one of the color contributions. @@ -131,13 +131,13 @@ class ColorRegistry implements IColorRegistry { return Object.keys(this.colorsById).map(id => this.colorsById[id]); } - public resolveDefaultColor(id: ColorIdentifier, theme: ITheme): Color | null { - let colorDesc = this.colorsById[id]; + public resolveDefaultColor(id: ColorIdentifier, theme: ITheme): Color | undefined { + const colorDesc = this.colorsById[id]; if (colorDesc && colorDesc.defaults) { - let colorValue = colorDesc.defaults[theme.type]; + const colorValue = colorDesc.defaults[theme.type]; return resolveColorValue(colorValue, theme); } - return null; + return undefined; } public getColorSchema(): IJSONSchema { @@ -257,7 +257,7 @@ export const scrollbarSliderActiveBackground = registerColor('scrollbarSlider.ac export const progressBarBackground = registerColor('progressBar.background', { dark: Color.fromHex('#0E70C0'), light: Color.fromHex('#0E70C0'), hc: contrastBorder }, nls.localize('progressBarBackground', "Background color of the progress bar that can show for long running operations.")); export const menuBorder = registerColor('menu.border', { dark: null, light: null, hc: contrastBorder }, nls.localize('menuBorder', "Border color of menus.")); -export const menuForeground = registerColor('menu.foreground', { dark: selectForeground, light: selectForeground, hc: selectForeground }, nls.localize('menuForeground', "Foreground color of menu items.")); +export const menuForeground = registerColor('menu.foreground', { dark: selectForeground, light: foreground, hc: selectForeground }, nls.localize('menuForeground', "Foreground color of menu items.")); export const menuBackground = registerColor('menu.background', { dark: selectBackground, light: selectBackground, hc: selectBackground }, nls.localize('menuBackground', "Background color of menu items.")); export const menuSelectionForeground = registerColor('menu.selectionForeground', { dark: listActiveSelectionForeground, light: listActiveSelectionForeground, hc: listActiveSelectionForeground }, nls.localize('menuSelectionForeground', "Foreground color of the selected menu item in menus.")); export const menuSelectionBackground = registerColor('menu.selectionBackground', { dark: listActiveSelectionBackground, light: listActiveSelectionBackground, hc: listActiveSelectionBackground }, nls.localize('menuSelectionBackground', "Background color of the selected menu item in menus.")); @@ -385,7 +385,7 @@ export function darken(colorValue: ColorValue, factor: number): ColorFunction { if (color) { return color.darken(factor); } - return null; + return undefined; }; } @@ -395,7 +395,7 @@ export function lighten(colorValue: ColorValue, factor: number): ColorFunction { if (color) { return color.lighten(factor); } - return null; + return undefined; }; } @@ -405,7 +405,7 @@ export function transparent(colorValue: ColorValue, factor: number): ColorFuncti if (color) { return color.transparent(factor); } - return null; + return undefined; }; } @@ -417,7 +417,7 @@ export function oneOf(...colorValues: ColorValue[]): ColorFunction { return color; } } - return null; + return undefined; }; } @@ -434,7 +434,7 @@ function lessProminent(colorValue: ColorValue, backgroundColorValue: ColorValue, } return from.transparent(factor * transparency); } - return null; + return undefined; }; } @@ -443,9 +443,9 @@ function lessProminent(colorValue: ColorValue, backgroundColorValue: ColorValue, /** * @param colorValue Resolve a color value in the context of a theme */ -function resolveColorValue(colorValue: ColorValue | null, theme: ITheme): Color | null { +function resolveColorValue(colorValue: ColorValue | null, theme: ITheme): Color | undefined { if (colorValue === null) { - return null; + return undefined; } else if (typeof colorValue === 'string') { if (colorValue[0] === '#') { return Color.fromHex(colorValue); @@ -456,7 +456,7 @@ function resolveColorValue(colorValue: ColorValue | null, theme: ITheme): Color } else if (typeof colorValue === 'function') { return colorValue(theme); } - return null; + return undefined; } export const workbenchColorsSchemaId = 'vscode://schemas/workbench-colors'; diff --git a/src/vs/platform/theme/common/styler.ts b/src/vs/platform/theme/common/styler.ts index d7725d4d1ca..f8377047e8e 100644 --- a/src/vs/platform/theme/common/styler.ts +++ b/src/vs/platform/theme/common/styler.ts @@ -9,7 +9,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Color } from 'vs/base/common/color'; import { mixin } from 'vs/base/common/objects'; -export type styleFn = (colors: { [name: string]: Color | null }) => void; +export type styleFn = (colors: { [name: string]: Color | undefined }) => void; export interface IStyleOverrides { [color: string]: ColorIdentifier | undefined; @@ -24,7 +24,7 @@ export interface IColorMapping { } export interface IComputedStyles { - [color: string]: Color | null; + [color: string]: Color | undefined; } export function computeStyles(theme: ITheme, styleMap: IColorMapping): IComputedStyles { @@ -327,10 +327,5 @@ export const defaultMenuStyles = { }; export function attachMenuStyler(widget: IThemable, themeService, style?: IMenuStyleOverrides): IDisposable { - const styles = { ...defaultMenuStyles, ...style }; - const fallback: IMenuStyleOverrides = { - foregroundColor: !!styles.foregroundColor && !!themeService && !!themeService.getTheme().getColor(styles.foregroundColor) ? styles.foregroundColor : foreground - }; - - return attachStyler(themeService, { ...styles, ...fallback }, widget); + return attachStyler(themeService, { ...defaultMenuStyles, ...style }, widget); } diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 21ea865016c..9b6ea499582 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -52,7 +52,7 @@ export interface ITheme { * @param color the id of the color * @param useDefault specifies if the default color should be used. If not set, the default is used. */ - getColor(color: ColorIdentifier, useDefault?: boolean): Color | null; + getColor(color: ColorIdentifier, useDefault?: boolean): Color | undefined; /** * Returns whether the theme defines a value for the color. If not, that means the diff --git a/src/vs/platform/theme/test/common/testThemeService.ts b/src/vs/platform/theme/test/common/testThemeService.ts index 08207173349..e29bfc636f5 100644 --- a/src/vs/platform/theme/test/common/testThemeService.ts +++ b/src/vs/platform/theme/test/common/testThemeService.ts @@ -12,12 +12,12 @@ export class TestTheme implements ITheme { constructor(private colors: { [id: string]: string; } = {}, public type = DARK) { } - getColor(color: string, useDefault?: boolean): Color | null { + getColor(color: string, useDefault?: boolean): Color | undefined { let value = this.colors[color]; if (value) { return Color.fromHex(value); } - return null; + return undefined; } defines(color: string): boolean { diff --git a/src/vs/platform/theme/test/electron-browser/colorRegistry.releaseTest.ts b/src/vs/platform/theme/test/electron-browser/colorRegistry.releaseTest.ts index 30e0d0ca05e..1e92b4d8608 100644 --- a/src/vs/platform/theme/test/electron-browser/colorRegistry.releaseTest.ts +++ b/src/vs/platform/theme/test/electron-browser/colorRegistry.releaseTest.ts @@ -6,12 +6,12 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IColorRegistry, Extensions, ColorContribution } from 'vs/platform/theme/common/colorRegistry'; import { editorMarkerNavigationError } from 'vs/editor/contrib/gotoError/gotoErrorWidget'; -import { overviewRulerModifiedForeground } from 'vs/workbench/parts/scm/electron-browser/dirtydiffDecorator'; -import { STATUS_BAR_DEBUGGING_BACKGROUND } from 'vs/workbench/parts/debug/browser/statusbarColorProvider'; -import { debugExceptionWidgetBackground } from 'vs/workbench/parts/debug/browser/exceptionWidget'; -import { debugToolBarBackground } from 'vs/workbench/parts/debug/browser/debugToolbar'; -import { buttonBackground } from 'vs/workbench/parts/welcome/page/electron-browser/welcomePage'; -import { embeddedEditorBackground } from 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart'; +import { overviewRulerModifiedForeground } from 'vs/workbench/contrib/scm/electron-browser/dirtydiffDecorator'; +import { STATUS_BAR_DEBUGGING_BACKGROUND } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; +import { debugExceptionWidgetBackground } from 'vs/workbench/contrib/debug/browser/exceptionWidget'; +import { debugToolBarBackground } from 'vs/workbench/contrib/debug/browser/debugToolbar'; +import { buttonBackground } from 'vs/workbench/contrib/welcome/page/electron-browser/welcomePage'; +import { embeddedEditorBackground } from 'vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart'; import { request, asText } from 'vs/base/node/request'; import * as pfs from 'vs/base/node/pfs'; import * as path from 'path'; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 56eaeef6f49..f86580a7d73 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -31,7 +31,7 @@ export interface INativeOpenDialogOptions { export interface IEnterWorkspaceResult { workspace: IWorkspaceIdentifier; - backupPath: string; + backupPath?: string; } export interface CrashReporterStartOptions { @@ -149,7 +149,7 @@ export interface IWindowsService { toggleSharedProcess(): Promise; // Global methods - openWindow(windowId: number, paths: URI[], options?: IOpenSettings): Promise; + openWindow(windowId: number, uris: IURIToOpen[], options?: IOpenSettings): Promise; openNewWindow(options?: INewWindowOptions): Promise; showWindow(windowId: number): Promise; getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>; @@ -185,6 +185,13 @@ export interface IOpenSettings { args?: ParsedArgs; } +export type URIType = 'file' | 'folder'; + +export interface IURIToOpen { + uri: URI; + typeHint?: URIType; +} + export interface IWindowService { _serviceBrand: any; @@ -211,7 +218,7 @@ export interface IWindowService { getRecentlyOpened(): Promise; focusWindow(): Promise; closeWindow(): Promise; - openWindow(paths: URI[], options?: IOpenSettings): Promise; + openWindow(uris: IURIToOpen[], options?: IOpenSettings): Promise; isFocused(): Promise; setDocumentEdited(flag: boolean): Promise; isMaximized(): Promise; @@ -373,7 +380,7 @@ export interface IWindowConfiguration extends ParsedArgs { isInitialStartup?: boolean; userEnv: IProcessEnvironment; - nodeCachedDataDir: string; + nodeCachedDataDir?: string; backupPath?: string; diff --git a/src/vs/platform/windows/electron-browser/windowService.ts b/src/vs/platform/windows/electron-browser/windowService.ts index 9c9cc78d419..179df0df102 100644 --- a/src/vs/platform/windows/electron-browser/windowService.ts +++ b/src/vs/platform/windows/electron-browser/windowService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, IDevToolsOptions, IOpenSettings } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, IDevToolsOptions, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -92,8 +92,8 @@ export class WindowService extends Disposable implements IWindowService { return this.windowsService.enterWorkspace(this.windowId, path); } - openWindow(paths: URI[], options?: IOpenSettings): Promise { - return this.windowsService.openWindow(this.windowId, paths, options); + openWindow(uris: IURIToOpen[], options?: IOpenSettings): Promise { + return this.windowsService.openWindow(this.windowId, uris, options); } closeWindow(): Promise { diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index e067b62e96d..757c9496fb6 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OpenContext, IWindowConfiguration, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, INewWindowOptions } from 'vs/platform/windows/common/windows'; +import { OpenContext, IWindowConfiguration, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, INewWindowOptions, IURIToOpen } from 'vs/platform/windows/common/windows'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -33,11 +33,11 @@ export interface ICodeWindow { readonly win: Electron.BrowserWindow; readonly config: IWindowConfiguration; - readonly openedFolderUri: URI; - readonly openedWorkspace: IWorkspaceIdentifier; - readonly backupPath: string; + readonly openedFolderUri?: URI; + readonly openedWorkspace?: IWorkspaceIdentifier; + readonly backupPath?: string; - readonly remoteAuthority: string; + readonly remoteAuthority?: string; readonly isExtensionDevelopmentHost: boolean; readonly isExtensionTestHost: boolean; @@ -94,7 +94,7 @@ export interface IWindowsMainService { // methods ready(initialUserEnv: IProcessEnvironment): void; reload(win: ICodeWindow, cli?: ParsedArgs): void; - enterWorkspace(win: ICodeWindow, path: URI): Promise; + enterWorkspace(win: ICodeWindow, path: URI): Promise; closeWorkspace(win: ICodeWindow): void; open(openConfig: IOpenConfiguration): ICodeWindow[]; openExtensionDevelopmentHostWindow(openConfig: IOpenConfiguration): void; @@ -106,14 +106,14 @@ export interface IWindowsMainService { showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): Promise; showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): Promise; focusLastActive(cli: ParsedArgs, context: OpenContext): ICodeWindow; - getLastActiveWindow(): ICodeWindow; + getLastActiveWindow(): ICodeWindow | undefined; waitForWindowCloseOrLoad(windowId: number): Promise; openNewWindow(context: OpenContext, options?: INewWindowOptions): ICodeWindow[]; openNewTabbedWindow(context: OpenContext): ICodeWindow[]; sendToFocused(channel: string, ...args: any[]): void; sendToAll(channel: string, payload: any, windowIdsToIgnore?: number[]): void; - getFocusedWindow(): ICodeWindow; - getWindowById(windowId: number): ICodeWindow; + getFocusedWindow(): ICodeWindow | undefined; + getWindowById(windowId: number): ICodeWindow | undefined; getWindows(): ICodeWindow[]; getWindowCount(): number; quit(): void; @@ -124,7 +124,7 @@ export interface IOpenConfiguration { readonly contextWindowId?: number; readonly cli: ParsedArgs; readonly userEnv?: IProcessEnvironment; - readonly urisToOpen?: URI[]; + readonly urisToOpen?: IURIToOpen[]; readonly preferNewWindow?: boolean; readonly forceNewWindow?: boolean; readonly forceNewTabbedWindow?: boolean; diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 940cbe2d1cd..b0f30135244 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -9,7 +9,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import product from 'vs/platform/node/product'; -import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IDevToolsOptions, INewWindowOptions, IOpenSettings } from 'vs/platform/windows/common/windows'; +import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IDevToolsOptions, INewWindowOptions, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { shell, crashReporter, app, Menu, clipboard } from 'electron'; import { Event } from 'vs/base/common/event'; @@ -37,7 +37,7 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable readonly onWindowMaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-maximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); readonly onWindowUnmaximize: Event = Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-unmaximize', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)); readonly onWindowFocus: Event = Event.any( - Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w.id), + Event.map(Event.filter(Event.map(this.windowsMainService.onWindowsCountChanged, () => this.windowsMainService.getLastActiveWindow()), w => !!w), w => w!.id), Event.filter(Event.fromNodeEventEmitter(app, 'browser-window-focus', (_, w: Electron.BrowserWindow) => w.id), id => !!this.windowsMainService.getWindowById(id)) ); @@ -274,16 +274,16 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable }); } - async openWindow(windowId: number, paths: URI[], options?: IOpenSettings): Promise { + async openWindow(windowId: number, urisToOpen: IURIToOpen[], options?: IOpenSettings): Promise { this.logService.trace('windowsService#openWindow'); - if (!paths || !paths.length) { + if (!urisToOpen || !urisToOpen.length) { return undefined; } this.windowsMainService.open({ context: OpenContext.API, contextWindowId: windowId, - urisToOpen: paths, + urisToOpen: urisToOpen, cli: options && options.args ? { ...this.environmentService.args, ...options.args } : this.environmentService.args, forceNewWindow: options && options.forceNewWindow, forceReuseWindow: options && options.forceReuseWindow, @@ -419,14 +419,14 @@ export class WindowsService implements IWindowsService, IURLHandler, IDisposable // Catch file URLs if (uri.authority === Schemas.file && !!uri.path) { - this.openFileForURI(URI.file(uri.fsPath)); + this.openFileForURI({ uri }); return true; } return false; } - private openFileForURI(uri: URI): void { + private openFileForURI(uri: IURIToOpen): void { const cli = assign(Object.create(null), this.environmentService.args, { goto: true }); const urisToOpen = [uri]; diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index dc10702ca5b..12b741138c0 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -5,8 +5,8 @@ import { Event } from 'vs/base/common/event'; import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IDevToolsOptions, INewWindowOptions } from 'vs/platform/windows/common/windows'; -import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IDevToolsOptions, INewWindowOptions, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; @@ -63,7 +63,7 @@ export class WindowsChannel implements IServerChannel { case 'removeFromRecentlyOpened': { let paths: Array = arg; if (Array.isArray(paths)) { - paths = paths.map(path => isWorkspaceIdentifier(path) || typeof path === 'string' ? path : URI.revive(path)); + paths = paths.map(path => isChanneledWorkspaceIdentifier(path) ? reviveWorkspaceIdentifier(path) : typeof path === 'string' ? path : URI.revive(path)); } return this.service.removeFromRecentlyOpened(paths); } @@ -85,7 +85,7 @@ export class WindowsChannel implements IServerChannel { case 'minimizeWindow': return this.service.minimizeWindow(arg); case 'onWindowTitleDoubleClick': return this.service.onWindowTitleDoubleClick(arg); case 'setDocumentEdited': return this.service.setDocumentEdited(arg[0], arg[1]); - case 'openWindow': return this.service.openWindow(arg[0], arg[1] ? (arg[1]).map(r => URI.revive(r)) : arg[1], arg[2]); + case 'openWindow': return this.service.openWindow(arg[0], arg[1] ? (arg[1]).map(r => ({ uri: URI.revive(r.uri), typeHint: r.typeHint })) : arg[1], arg[2]); case 'openNewWindow': return this.service.openNewWindow(arg); case 'showWindow': return this.service.showWindow(arg); case 'getWindows': return this.service.getWindows(); @@ -165,7 +165,9 @@ export class WindowsChannelClient implements IWindowsService { } enterWorkspace(windowId: number, path: URI): Promise { - return this.channel.call('enterWorkspace', [windowId, path]); + return this.channel.call('enterWorkspace', [windowId, path]).then((result: IEnterWorkspaceResult) => { + return { backupPath: result.backupPath, workspace: reviveWorkspaceIdentifier(result.workspace) }; + }); } toggleFullScreen(windowId: number): Promise { @@ -191,7 +193,7 @@ export class WindowsChannelClient implements IWindowsService { getRecentlyOpened(windowId: number): Promise { return this.channel.call('getRecentlyOpened', windowId) .then((recentlyOpened: IRecentlyOpened) => { - recentlyOpened.workspaces = recentlyOpened.workspaces.map(workspace => isWorkspaceIdentifier(workspace) ? workspace : URI.revive(workspace)); + recentlyOpened.workspaces = recentlyOpened.workspaces.map(workspace => isChanneledWorkspaceIdentifier(workspace) ? reviveWorkspaceIdentifier(workspace) : URI.revive(workspace)); recentlyOpened.files = recentlyOpened.files.map(URI.revive); return recentlyOpened; }); @@ -273,8 +275,8 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('toggleSharedProcess'); } - openWindow(windowId: number, paths: URI[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean, args?: ParsedArgs }): Promise { - return this.channel.call('openWindow', [windowId, paths, options]); + openWindow(windowId: number, uris: IURIToOpen[], options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean, args?: ParsedArgs }): Promise { + return this.channel.call('openWindow', [windowId, uris, options]); } openNewWindow(options?: INewWindowOptions): Promise { @@ -286,7 +288,17 @@ export class WindowsChannelClient implements IWindowsService { } getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { - return this.channel.call<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>('getWindows').then(result => { result.forEach(win => win.folderUri = win.folderUri ? URI.revive(win.folderUri) : win.folderUri); return result; }); + return this.channel.call<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>('getWindows').then(result => { + for (const win of result) { + if (win.folderUri) { + win.folderUri = URI.revive(win.folderUri); + } + if (win.workspace) { + win.workspace = reviveWorkspaceIdentifier(win.workspace); + } + } + return result; + }); } getWindowCount(): Promise { @@ -325,3 +337,7 @@ export class WindowsChannelClient implements IWindowsService { return Promise.resolve(this.channel.call('resolveProxy', [windowId, url])); } } + +function isChanneledWorkspaceIdentifier(obj: any): obj is IWorkspaceIdentifier { + return obj && obj['configPath']; +} \ No newline at end of file diff --git a/src/vs/platform/workspace/common/workspace.ts b/src/vs/platform/workspace/common/workspace.ts index 9521062c3ac..e2488422d95 100644 --- a/src/vs/platform/workspace/common/workspace.ts +++ b/src/vs/platform/workspace/common/workspace.ts @@ -183,12 +183,12 @@ export class Workspace implements IWorkspace { this._configuration = configuration; } - getFolder(resource: URI): IWorkspaceFolder | null | undefined { + getFolder(resource: URI): IWorkspaceFolder | null { if (!resource) { return null; } - return this._foldersMap.findSubstr(resource.toString()); + return this._foldersMap.findSubstr(resource.toString()) || null; } private updateFoldersMap(): void { diff --git a/src/vs/platform/workspaces/common/workspaces.ts b/src/vs/platform/workspaces/common/workspaces.ts index ec81bacefb9..b4559e3f6e8 100644 --- a/src/vs/platform/workspaces/common/workspaces.ts +++ b/src/vs/platform/workspaces/common/workspaces.ts @@ -7,7 +7,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { localize } from 'vs/nls'; import { Event } from 'vs/base/common/event'; import { IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace'; -import { URI } from 'vs/base/common/uri'; +import { URI, UriComponents } from 'vs/base/common/uri'; export const IWorkspacesMainService = createDecorator('workspacesMainService'); export const IWorkspacesService = createDecorator('workspacesService'); @@ -23,7 +23,11 @@ export type ISingleFolderWorkspaceIdentifier = URI; export interface IWorkspaceIdentifier { id: string; - configPath: string; + configPath: URI; +} + +export function reviveWorkspaceIdentifier(workspace: { id: string, configPath: UriComponents; }): IWorkspaceIdentifier { + return { id: workspace.id, configPath: URI.revive(workspace.configPath) }; } export function isStoredWorkspaceFolder(thing: any): thing is IStoredWorkspaceFolder { @@ -91,8 +95,6 @@ export interface IWorkspacesMainService extends IWorkspacesService { getUntitledWorkspacesSync(): IWorkspaceIdentifier[]; - getWorkspaceId(workspacePath: string): string; - getWorkspaceIdentifier(workspacePath: URI): IWorkspaceIdentifier; } @@ -109,13 +111,13 @@ export function isSingleFolderWorkspaceIdentifier(obj: any): obj is ISingleFolde export function isWorkspaceIdentifier(obj: any): obj is IWorkspaceIdentifier { const workspaceIdentifier = obj as IWorkspaceIdentifier; - return workspaceIdentifier && typeof workspaceIdentifier.id === 'string' && typeof workspaceIdentifier.configPath === 'string'; + return workspaceIdentifier && typeof workspaceIdentifier.id === 'string' && workspaceIdentifier.configPath instanceof URI; } export function toWorkspaceIdentifier(workspace: IWorkspace): IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | undefined { if (workspace.configuration) { return { - configPath: workspace.configuration.fsPath, + configPath: workspace.configuration, id: workspace.id }; } diff --git a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts index 015156751a9..a9a6242f1d3 100644 --- a/src/vs/platform/workspaces/electron-main/workspacesMainService.ts +++ b/src/vs/platform/workspaces/electron-main/workspacesMainService.ts @@ -14,7 +14,6 @@ import { delSync, readdirSync, writeFileAndFlushSync } from 'vs/base/node/extfs' import { Event, Emitter } from 'vs/base/common/event'; import { ILogService } from 'vs/platform/log/common/log'; import { isEqual } from 'vs/base/common/paths'; -import { coalesce } from 'vs/base/common/arrays'; import { createHash } from 'crypto'; import * as json from 'vs/base/common/json'; import { massageFolderPathForWorkspace, rewriteWorkspaceFileForNewLocation } from 'vs/platform/workspaces/node/workspaces'; @@ -107,7 +106,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain const { workspace, configParent, storedWorkspace } = this.newUntitledWorkspace(folders); return mkdirp(configParent).then(() => { - return writeFile(workspace.configPath, JSON.stringify(storedWorkspace, null, '\t')).then(() => workspace); + return writeFile(workspace.configPath.fsPath, JSON.stringify(storedWorkspace, null, '\t')).then(() => workspace); }); } @@ -120,7 +119,7 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain mkdirSync(configParent); - writeFileAndFlushSync(workspace.configPath, JSON.stringify(storedWorkspace, null, '\t')); + writeFileAndFlushSync(workspace.configPath.fsPath, JSON.stringify(storedWorkspace, null, '\t')); return workspace; } @@ -154,16 +153,14 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain }; return { - workspace: { - id: this.getWorkspaceId(untitledWorkspaceConfigPath), - configPath: untitledWorkspaceConfigPath - }, + workspace: this.getWorkspaceIdentifier(URI.file(untitledWorkspaceConfigPath)), configParent: untitledWorkspaceConfigFolder, storedWorkspace }; } - getWorkspaceId(workspaceConfigPath: string): string { + getWorkspaceId(configPath: URI): string { + let workspaceConfigPath = configPath.scheme === Schemas.file ? fsPath(configPath) : configPath.toString(); if (!isLinux) { workspaceConfigPath = workspaceConfigPath.toLowerCase(); // sanitize for platform file system } @@ -171,36 +168,34 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain return createHash('md5').update(workspaceConfigPath).digest('hex'); } - getWorkspaceIdentifier(workspacePath: URI): IWorkspaceIdentifier { - if (workspacePath.scheme === Schemas.file) { - const configPath = fsPath(workspacePath); - return { - configPath, - id: this.getWorkspaceId(configPath) - }; - } - throw new Error('Not yet supported'); - /*return { - configPath: workspacePath - id: this.getWorkspaceId(workspacePath.toString()); - };*/ + getWorkspaceIdentifier(configPath: URI): IWorkspaceIdentifier { + return { + configPath, + id: this.getWorkspaceId(configPath) + }; } isUntitledWorkspace(workspace: IWorkspaceIdentifier): boolean { - return this.isInsideWorkspacesHome(workspace.configPath); + return workspace.configPath.scheme === Schemas.file && this.isInsideWorkspacesHome(fsPath(workspace.configPath)); } saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPath: string): Promise { + if (workspace.configPath.scheme !== Schemas.file) { + throw new Error('Only local workspaces can be saved with this API. Use WorkspaceEditingService.saveWorkspaceAs on the renderer instead.'); + } + + const configPath = fsPath(workspace.configPath); + // Return early if target is same as source - if (isEqual(workspace.configPath, targetConfigPath, !isLinux)) { + if (isEqual(configPath, targetConfigPath, !isLinux)) { return Promise.resolve(workspace); } // Read the contents of the workspace file and resolve it - return readFile(workspace.configPath).then(raw => { + return readFile(configPath).then(raw => { const targetConfigPathURI = URI.file(targetConfigPath); - const newRawWorkspaceContents = rewriteWorkspaceFileForNewLocation(raw.toString(), URI.file(workspace.configPath), targetConfigPathURI); + const newRawWorkspaceContents = rewriteWorkspaceFileForNewLocation(raw.toString(), workspace.configPath, targetConfigPathURI); return writeFile(targetConfigPath, newRawWorkspaceContents).then(() => { return this.getWorkspaceIdentifier(targetConfigPathURI); @@ -214,20 +209,20 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain } // Delete from disk - this.doDeleteUntitledWorkspaceSync(workspace.configPath); + this.doDeleteUntitledWorkspaceSync(workspace); // Event this._onUntitledWorkspaceDeleted.fire(workspace); } - private doDeleteUntitledWorkspaceSync(configPath: string): void { + private doDeleteUntitledWorkspaceSync(workspace: IWorkspaceIdentifier): void { + const configPath = fsPath(workspace.configPath); try { - // Delete Workspace delSync(dirname(configPath)); // Mark Workspace Storage to be deleted - const workspaceStoragePath = join(this.environmentService.workspaceStorageHome, this.getWorkspaceId(configPath)); + const workspaceStoragePath = join(this.environmentService.workspaceStorageHome, workspace.id); if (existsSync(workspaceStoragePath)) { writeFileSync(join(workspaceStoragePath, 'obsolete'), ''); } @@ -237,26 +232,22 @@ export class WorkspacesMainService extends Disposable implements IWorkspacesMain } getUntitledWorkspacesSync(): IWorkspaceIdentifier[] { - let untitledWorkspacePaths: string[] = []; + let untitledWorkspaces: IWorkspaceIdentifier[] = []; try { - untitledWorkspacePaths = readdirSync(this.workspacesHome).map(folder => join(this.workspacesHome, folder, UNTITLED_WORKSPACE_NAME)); + const untitledWorkspacePaths = readdirSync(this.workspacesHome).map(folder => join(this.workspacesHome, folder, UNTITLED_WORKSPACE_NAME)); + for (const untitledWorkspacePath of untitledWorkspacePaths) { + const workspace = this.getWorkspaceIdentifier(URI.file(untitledWorkspacePath)); + if (!this.resolveWorkspaceSync(untitledWorkspacePath)) { + this.doDeleteUntitledWorkspaceSync(workspace); + } else { + untitledWorkspaces.push(workspace); + } + } } catch (error) { if (error && error.code !== 'ENOENT') { this.logService.warn(`Unable to read folders in ${this.workspacesHome} (${error}).`); } } - - const untitledWorkspaces: IWorkspaceIdentifier[] = coalesce(untitledWorkspacePaths.map(untitledWorkspacePath => { - const workspace = this.resolveWorkspaceSync(untitledWorkspacePath); - if (!workspace) { - this.doDeleteUntitledWorkspaceSync(untitledWorkspacePath); - - return null; // invalid workspace - } - - return { id: workspace.id, configPath: untitledWorkspacePath }; - })); - return untitledWorkspaces; } } diff --git a/src/vs/platform/workspaces/node/workspacesIpc.ts b/src/vs/platform/workspaces/node/workspacesIpc.ts index 6b44c1dedea..11ae4da17ec 100644 --- a/src/vs/platform/workspaces/node/workspacesIpc.ts +++ b/src/vs/platform/workspaces/node/workspacesIpc.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IChannel, IServerChannel } from 'vs/base/parts/ipc/node/ipc'; -import { IWorkspacesService, IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesMainService } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService, IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesMainService, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; @@ -45,6 +45,6 @@ export class WorkspacesChannelClient implements IWorkspacesService { constructor(private channel: IChannel) { } createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[]): Promise { - return this.channel.call('createUntitledWorkspace', folders); + return this.channel.call('createUntitledWorkspace', folders).then(reviveWorkspaceIdentifier); } } diff --git a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts index 914930bb9ff..d902534458c 100644 --- a/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts +++ b/src/vs/platform/workspaces/test/electron-main/workspacesMainService.test.ts @@ -74,13 +74,17 @@ suite('WorkspacesMainService', () => { assert.equal(p1, p2); } + function assertEqualURI(u1: URI, u2: URI): void { + assert.equal(u1.toString(), u2.toString()); + } + test('createWorkspace (folders)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); // assertPathEquals((ws.folders[0]).path, process.cwd()); assertPathEquals((ws.folders[1]).path, os.tmpdir()); @@ -93,10 +97,10 @@ suite('WorkspacesMainService', () => { test('createWorkspace (folders with name)', () => { return createWorkspace([process.cwd(), os.tmpdir()], ['currentworkingdirectory', 'tempdir']).then(workspace => { assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); // assertPathEquals((ws.folders[0]).path, process.cwd()); assertPathEquals((ws.folders[1]).path, os.tmpdir()); @@ -109,10 +113,10 @@ suite('WorkspacesMainService', () => { test('createUntitledWorkspace (folders as other resource URIs)', () => { return service.createUntitledWorkspace([{ uri: URI.from({ scheme: 'myScheme', path: process.cwd() }) }, { uri: URI.from({ scheme: 'myScheme', path: os.tmpdir() }) }]).then(workspace => { assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); assert.equal((ws.folders[0]).uri, URI.from({ scheme: 'myScheme', path: process.cwd() }).toString(true)); assert.equal((ws.folders[1]).uri, URI.from({ scheme: 'myScheme', path: os.tmpdir() }).toString(true)); @@ -125,10 +129,10 @@ suite('WorkspacesMainService', () => { test('createWorkspaceSync (folders)', () => { const workspace = createWorkspaceSync([process.cwd(), os.tmpdir()]); assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); assertPathEquals((ws.folders[0]).path, process.cwd()); assertPathEquals((ws.folders[1]).path, os.tmpdir()); @@ -140,10 +144,10 @@ suite('WorkspacesMainService', () => { test('createWorkspaceSync (folders with names)', () => { const workspace = createWorkspaceSync([process.cwd(), os.tmpdir()], ['currentworkingdirectory', 'tempdir']); assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); assertPathEquals((ws.folders[0]).path, process.cwd()); assertPathEquals((ws.folders[1]).path, os.tmpdir()); @@ -155,10 +159,10 @@ suite('WorkspacesMainService', () => { test('createUntitledWorkspaceSync (folders as other resource URIs)', () => { const workspace = service.createUntitledWorkspaceSync([{ uri: URI.from({ scheme: 'myScheme', path: process.cwd() }) }, { uri: URI.from({ scheme: 'myScheme', path: os.tmpdir() }) }]); assert.ok(workspace); - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); assert.ok(service.isUntitledWorkspace(workspace)); - const ws = JSON.parse(fs.readFileSync(workspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(workspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 2); assert.equal((ws.folders[0]).uri, URI.from({ scheme: 'myScheme', path: process.cwd() }).toString(true)); assert.equal((ws.folders[1]).uri, URI.from({ scheme: 'myScheme', path: os.tmpdir() }).toString(true)); @@ -169,57 +173,57 @@ suite('WorkspacesMainService', () => { test('resolveWorkspaceSync', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - assert.ok(service.resolveWorkspaceSync(workspace.configPath)); + assert.ok(service.resolveWorkspaceSync(workspace.configPath.fsPath)); // make it a valid workspace path - const newPath = path.join(path.dirname(workspace.configPath), `workspace.${WORKSPACE_EXTENSION}`); - fs.renameSync(workspace.configPath, newPath); - workspace.configPath = newPath; + const newPath = path.join(path.dirname(workspace.configPath.fsPath), `workspace.${WORKSPACE_EXTENSION}`); + fs.renameSync(workspace.configPath.fsPath, newPath); + workspace.configPath = URI.file(newPath); - const resolved = service.resolveWorkspaceSync(workspace.configPath); + const resolved = service.resolveWorkspaceSync(workspace.configPath.fsPath); assert.equal(2, resolved!.folders.length); - assert.equal(resolved!.configPath, workspace.configPath); + assertEqualURI(resolved!.configPath, workspace.configPath); assert.ok(resolved!.id); - fs.writeFileSync(workspace.configPath, JSON.stringify({ something: 'something' })); // invalid workspace - const resolvedInvalid = service.resolveWorkspaceSync(workspace.configPath); + fs.writeFileSync(workspace.configPath.fsPath, JSON.stringify({ something: 'something' })); // invalid workspace + const resolvedInvalid = service.resolveWorkspaceSync(workspace.configPath.fsPath); assert.ok(!resolvedInvalid); }); }); test('resolveWorkspaceSync (support relative paths)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - fs.writeFileSync(workspace.configPath, JSON.stringify({ folders: [{ path: './ticino-playground/lib' }] })); + fs.writeFileSync(workspace.configPath.fsPath, JSON.stringify({ folders: [{ path: './ticino-playground/lib' }] })); - const resolved = service.resolveWorkspaceSync(workspace.configPath); - assert.equal(resolved!.folders[0].uri.fsPath, URI.file(path.join(path.dirname(workspace.configPath), 'ticino-playground', 'lib')).fsPath); + const resolved = service.resolveWorkspaceSync(workspace.configPath.fsPath); + assertEqualURI(resolved!.folders[0].uri, URI.file(path.join(path.dirname(workspace.configPath.fsPath), 'ticino-playground', 'lib'))); }); }); test('resolveWorkspaceSync (support relative paths #2)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - fs.writeFileSync(workspace.configPath, JSON.stringify({ folders: [{ path: './ticino-playground/lib/../other' }] })); + fs.writeFileSync(workspace.configPath.fsPath, JSON.stringify({ folders: [{ path: './ticino-playground/lib/../other' }] })); - const resolved = service.resolveWorkspaceSync(workspace.configPath); - assert.equal(resolved!.folders[0].uri.fsPath, URI.file(path.join(path.dirname(workspace.configPath), 'ticino-playground', 'other')).fsPath); + const resolved = service.resolveWorkspaceSync(workspace.configPath.fsPath); + assertEqualURI(resolved!.folders[0].uri, URI.file(path.join(path.dirname(workspace.configPath.fsPath), 'ticino-playground', 'other'))); }); }); test('resolveWorkspaceSync (support relative paths #3)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - fs.writeFileSync(workspace.configPath, JSON.stringify({ folders: [{ path: 'ticino-playground/lib' }] })); + fs.writeFileSync(workspace.configPath.fsPath, JSON.stringify({ folders: [{ path: 'ticino-playground/lib' }] })); - const resolved = service.resolveWorkspaceSync(workspace.configPath); - assert.equal(resolved!.folders[0].uri.fsPath, URI.file(path.join(path.dirname(workspace.configPath), 'ticino-playground', 'lib')).fsPath); + const resolved = service.resolveWorkspaceSync(workspace.configPath.fsPath); + assertEqualURI(resolved!.folders[0].uri, URI.file(path.join(path.dirname(workspace.configPath.fsPath), 'ticino-playground', 'lib'))); }); }); test('resolveWorkspaceSync (support invalid JSON via fault tolerant parsing)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - fs.writeFileSync(workspace.configPath, '{ "folders": [ { "path": "./ticino-playground/lib" } , ] }'); // trailing comma + fs.writeFileSync(workspace.configPath.fsPath, '{ "folders": [ { "path": "./ticino-playground/lib" } , ] }'); // trailing comma - const resolved = service.resolveWorkspaceSync(workspace.configPath); - assert.equal(resolved!.folders[0].uri.fsPath, URI.file(path.join(path.dirname(workspace.configPath), 'ticino-playground', 'lib')).fsPath); + const resolved = service.resolveWorkspaceSync(workspace.configPath.fsPath); + assertEqualURI(resolved!.folders[0].uri, URI.file(path.join(path.dirname(workspace.configPath.fsPath), 'ticino-playground', 'lib'))); }); }); @@ -230,9 +234,9 @@ suite('WorkspacesMainService', () => { return service.saveWorkspaceAs(workspace, workspaceConfigPath).then(savedWorkspace => { assert.ok(savedWorkspace.id); assert.notEqual(savedWorkspace.id, workspace.id); - assert.equal(savedWorkspace.configPath, workspaceConfigPath); + assertPathEquals(savedWorkspace.configPath.fsPath, workspaceConfigPath); - const ws = JSON.parse(fs.readFileSync(savedWorkspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(savedWorkspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 3); assertPathEquals((ws.folders[0]).path, process.cwd()); // absolute assertPathEquals((ws.folders[1]).path, '.'); // relative @@ -252,9 +256,9 @@ suite('WorkspacesMainService', () => { return service.saveWorkspaceAs(savedWorkspace, newWorkspaceConfigPath).then(newSavedWorkspace => { assert.ok(newSavedWorkspace.id); assert.notEqual(newSavedWorkspace.id, workspace.id); - assertPathEquals(newSavedWorkspace.configPath, newWorkspaceConfigPath); + assertPathEquals(newSavedWorkspace.configPath.fsPath, newWorkspaceConfigPath); - const ws = JSON.parse(fs.readFileSync(newSavedWorkspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(newSavedWorkspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.equal(ws.folders.length, 3); assertPathEquals((ws.folders[0]).path, process.cwd()); // absolute path because outside of tmpdir assertPathEquals((ws.folders[1]).path, '.'); // relative path because inside of tmpdir @@ -273,15 +277,15 @@ suite('WorkspacesMainService', () => { const newWorkspaceConfigPath = path.join(os.tmpdir(), `mySavedWorkspace.${Date.now()}.${WORKSPACE_EXTENSION}`); return service.saveWorkspaceAs(workspace, workspaceConfigPath).then(savedWorkspace => { - const contents = fs.readFileSync(savedWorkspace.configPath).toString(); - fs.writeFileSync(savedWorkspace.configPath, `// this is a comment\n${contents}`); + const contents = fs.readFileSync(savedWorkspace.configPath.fsPath).toString(); + fs.writeFileSync(savedWorkspace.configPath.fsPath, `// this is a comment\n${contents}`); return service.saveWorkspaceAs(savedWorkspace, newWorkspaceConfigPath).then(newSavedWorkspace => { assert.ok(newSavedWorkspace.id); assert.notEqual(newSavedWorkspace.id, workspace.id); - assertPathEquals(newSavedWorkspace.configPath, newWorkspaceConfigPath); + assertPathEquals(newSavedWorkspace.configPath.fsPath, newWorkspaceConfigPath); - const savedContents = fs.readFileSync(newSavedWorkspace.configPath).toString(); + const savedContents = fs.readFileSync(newSavedWorkspace.configPath.fsPath).toString(); assert.equal(0, savedContents.indexOf('// this is a comment')); extfs.delSync(workspaceConfigPath); @@ -297,15 +301,15 @@ suite('WorkspacesMainService', () => { const newWorkspaceConfigPath = path.join(os.tmpdir(), `mySavedWorkspace.${Date.now()}.${WORKSPACE_EXTENSION}`); return service.saveWorkspaceAs(workspace, workspaceConfigPath).then(savedWorkspace => { - const contents = fs.readFileSync(savedWorkspace.configPath).toString(); - fs.writeFileSync(savedWorkspace.configPath, contents.replace(/[\\]/g, '/')); // convert backslash to slash + const contents = fs.readFileSync(savedWorkspace.configPath.fsPath).toString(); + fs.writeFileSync(savedWorkspace.configPath.fsPath, contents.replace(/[\\]/g, '/')); // convert backslash to slash return service.saveWorkspaceAs(savedWorkspace, newWorkspaceConfigPath).then(newSavedWorkspace => { assert.ok(newSavedWorkspace.id); assert.notEqual(newSavedWorkspace.id, workspace.id); - assertPathEquals(newSavedWorkspace.configPath, newWorkspaceConfigPath); + assertPathEquals(newSavedWorkspace.configPath.fsPath, newWorkspaceConfigPath); - const ws = JSON.parse(fs.readFileSync(newSavedWorkspace.configPath).toString()) as IStoredWorkspace; + const ws = JSON.parse(fs.readFileSync(newSavedWorkspace.configPath.fsPath).toString()) as IStoredWorkspace; assert.ok(ws.folders.every(f => (f).path.indexOf('\\') < 0)); extfs.delSync(workspaceConfigPath); @@ -317,11 +321,11 @@ suite('WorkspacesMainService', () => { test('deleteUntitledWorkspaceSync (untitled)', () => { return createWorkspace([process.cwd(), os.tmpdir()]).then(workspace => { - assert.ok(fs.existsSync(workspace.configPath)); + assert.ok(fs.existsSync(workspace.configPath.fsPath)); service.deleteUntitledWorkspaceSync(workspace); - assert.ok(!fs.existsSync(workspace.configPath)); + assert.ok(!fs.existsSync(workspace.configPath.fsPath)); }); }); @@ -330,11 +334,11 @@ suite('WorkspacesMainService', () => { const workspaceConfigPath = path.join(os.tmpdir(), `myworkspace.${Date.now()}.${WORKSPACE_EXTENSION}`); return service.saveWorkspaceAs(workspace, workspaceConfigPath).then(savedWorkspace => { - assert.ok(fs.existsSync(savedWorkspace.configPath)); + assert.ok(fs.existsSync(savedWorkspace.configPath.fsPath)); service.deleteUntitledWorkspaceSync(savedWorkspace); - assert.ok(fs.existsSync(savedWorkspace.configPath)); + assert.ok(fs.existsSync(savedWorkspace.configPath.fsPath)); }); }); }); @@ -344,7 +348,7 @@ suite('WorkspacesMainService', () => { assert.equal(0, untitled.length); return createWorkspace([process.cwd(), os.tmpdir()]).then(untitledOne => { - assert.ok(fs.existsSync(untitledOne.configPath)); + assert.ok(fs.existsSync(untitledOne.configPath.fsPath)); untitled = service.getUntitledWorkspacesSync(); @@ -352,12 +356,12 @@ suite('WorkspacesMainService', () => { assert.equal(untitledOne.id, untitled[0].id); return createWorkspace([os.tmpdir(), process.cwd()]).then(untitledTwo => { - assert.ok(fs.existsSync(untitledTwo.configPath)); + assert.ok(fs.existsSync(untitledTwo.configPath.fsPath)); untitled = service.getUntitledWorkspacesSync(); if (untitled.length === 1) { - assert.fail('Unexpected workspaces count, contents:\n' + fs.readFileSync(untitledTwo.configPath, 'utf8')); + assert.fail('Unexpected workspaces count, contents:\n' + fs.readFileSync(untitledTwo.configPath.fsPath, 'utf8')); } assert.equal(2, untitled.length); diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index e68bdf1b04f..7fa1945c4b2 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -3184,6 +3184,14 @@ declare module 'vscode' { * typing a trigger character, a cursor move, or document content changes. */ readonly isRetrigger: boolean; + + /** + * The currently active [`SignatureHelp`](#SignatureHelp). + * + * The `activeSignatureHelp` has its [`SignatureHelp.activeSignature`] field updated based on + * the user arrowing through available signatures. + */ + readonly activeSignatureHelp?: SignatureHelp; } /** diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 7cbfa9882e4..f9d2f3c2c27 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -888,13 +888,41 @@ declare module 'vscode' { //#region Terminal + /** + * An [event](#Event) which fires when a [Terminal](#Terminal)'s dimensions change. + */ + export interface TerminalDimensionsChangeEvent { + /** + * The [terminal](#Terminal) for which the dimensions have changed. + */ + readonly terminal: Terminal; + /** + * The new value for the [terminal's dimensions](#Terminal.dimensions). + */ + readonly dimensions: TerminalDimensions; + } + + namespace window { + /** + * An event which fires when the [dimensions](#Terminal.dimensions) of the terminal change. + */ + export const onDidChangeTerminalDimensions: Event; + } + export interface Terminal { + /** + * The current dimensions of the terminal. This will be `undefined` immediately after the + * terminal is created as the dimensions are not known until shortly after the terminal is + * created. + */ + readonly dimensions: TerminalDimensions | undefined; + /** * Fires when the terminal's pty slave pseudo-device is written to. In other words, this * provides access to the raw data stream from the process running within the terminal, * including VT sequences. */ - onDidWriteData: Event; + readonly onDidWriteData: Event; } /** @@ -1098,18 +1126,6 @@ declare module 'vscode' { } //#endregion - //#region SignatureHelpContext active parameters - mjbvz - export interface SignatureHelpContext { - /** - * The currently active [`SignatureHelp`](#SignatureHelp). - * - * The `activeSignatureHelp` has its [`SignatureHelp.activeSignature`] field updated based on - * the user arrowing through available signatures. - */ - readonly activeSignatureHelp?: SignatureHelp; - } - //#endregion - /** * Interface used to render ANSI output (typically to a [terminal](TerminalRenderer). */ diff --git a/src/vs/workbench/api/browser/viewsExtensionPoint.ts b/src/vs/workbench/api/browser/viewsExtensionPoint.ts index fbffb5d002f..15e27de0202 100644 --- a/src/vs/workbench/api/browser/viewsExtensionPoint.ts +++ b/src/vs/workbench/api/browser/viewsExtensionPoint.ts @@ -16,9 +16,9 @@ import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWo import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { VIEWLET_ID as EXPLORER } from 'vs/workbench/parts/files/common/files'; -import { VIEWLET_ID as SCM } from 'vs/workbench/parts/scm/common/scm'; -import { VIEWLET_ID as DEBUG } from 'vs/workbench/parts/debug/common/debug'; +import { VIEWLET_ID as EXPLORER } from 'vs/workbench/contrib/files/common/files'; +import { VIEWLET_ID as SCM } from 'vs/workbench/contrib/scm/common/scm'; +import { VIEWLET_ID as DEBUG } from 'vs/workbench/contrib/debug/common/debug'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ShowViewletAction } from 'vs/workbench/browser/viewlet'; @@ -33,7 +33,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { createCSSRule } from 'vs/base/browser/dom'; @@ -358,11 +358,11 @@ class ViewsExtensionHandler implements IWorkbenchContribution { return; } - let container = this.getViewContainer(entry.key); - if (!container) { + const viewContainer = this.getViewContainer(entry.key); + if (!viewContainer) { collector.warn(localize('ViewContainerDoesnotExist', "View container '{0}' does not exist and all views registered to it will be added to 'Explorer'.", entry.key)); - container = this.getDefaultViewContainer(); } + const container = viewContainer || this.getDefaultViewContainer(); const registeredViews = ViewsRegistry.getViews(container); const viewIds: string[] = []; const viewDescriptors = coalesce(entry.value.map((item, index) => { @@ -398,7 +398,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { } private getDefaultViewContainer(): ViewContainer { - return this.viewContainersRegistry.get(EXPLORER); + return this.viewContainersRegistry.get(EXPLORER)!; } private removeViews(extensions: IExtensionPointUser[]): void { @@ -435,7 +435,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution { return true; } - private getViewContainer(value: string): ViewContainer { + private getViewContainer(value: string): ViewContainer | undefined { switch (value) { case 'explorer': return this.viewContainersRegistry.get(EXPLORER); case 'debug': return this.viewContainersRegistry.get(DEBUG); diff --git a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts index e0e07ea27ce..3e466d8b5b3 100644 --- a/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts +++ b/src/vs/workbench/api/electron-browser/extensionHost.contribution.ts @@ -11,7 +11,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // --- other interested parties import { JSONValidationExtensionPoint } from 'vs/workbench/services/jsonschemas/common/jsonValidationExtensionPoint'; import { ColorExtensionPoint } from 'vs/workbench/services/themes/common/colorExtensionPoint'; -import { LanguageConfigurationFileHandler } from 'vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint'; +import { LanguageConfigurationFileHandler } from 'vs/workbench/contrib/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint'; // --- mainThread participants import 'vs/workbench/api/node/apiCommands'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts b/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts index 6497256226e..80c0f71bf9e 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadClipboard.ts @@ -20,6 +20,6 @@ export class MainThreadCommands implements MainThreadClipboardShape { $writeText(value: string): Promise { clipboard.writeText(value); - return undefined; + return Promise.resolve(); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts index ebfc4171ae3..061034039c1 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadCommands.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadCommands.ts @@ -64,13 +64,14 @@ export class MainThreadCommands implements MainThreadCommandsShape { } $unregisterCommand(id: string): void { - if (this._disposables.has(id)) { - this._disposables.get(id).dispose(); + const command = this._disposables.get(id); + if (command) { + command.dispose(); this._disposables.delete(id); } } - $executeCommand(id: string, args: any[]): Promise { + $executeCommand(id: string, args: any[]): Promise { for (let i = 0; i < args.length; i++) { args[i] = revive(args[i], 0); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadComments.ts b/src/vs/workbench/api/electron-browser/mainThreadComments.ts index 2eec4b8c85f..b8b975d7188 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadComments.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadComments.ts @@ -11,14 +11,14 @@ 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 { ICommentService } from 'vs/workbench/parts/comments/electron-browser/commentService'; -import { COMMENTS_PANEL_ID, CommentsPanel, COMMENTS_PANEL_TITLE } from 'vs/workbench/parts/comments/electron-browser/commentsPanel'; +import { ICommentService } from 'vs/workbench/contrib/comments/electron-browser/commentService'; +import { COMMENTS_PANEL_ID, CommentsPanel, COMMENTS_PANEL_TITLE } from 'vs/workbench/contrib/comments/electron-browser/commentsPanel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { URI } from 'vs/base/common/uri'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { generateUuid } from 'vs/base/common/uuid'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ICommentsConfiguration } from 'vs/workbench/parts/comments/electron-browser/comments.contribution'; +import { ICommentsConfiguration } from 'vs/workbench/contrib/comments/electron-browser/comments.contribution'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor } from 'vs/workbench/browser/panel'; @@ -27,10 +27,10 @@ export class MainThreadDocumentCommentProvider implements modes.DocumentCommentP private _proxy: ExtHostCommentsShape; private _handle: number; private _features: CommentProviderFeatures; - get startDraftLabel(): string { return this._features.startDraftLabel; } - get deleteDraftLabel(): string { return this._features.deleteDraftLabel; } - get finishDraftLabel(): string { return this._features.finishDraftLabel; } - get reactionGroup(): modes.CommentReaction[] { return this._features.reactionGroup; } + get startDraftLabel(): string | undefined { return this._features.startDraftLabel; } + get deleteDraftLabel(): string | undefined { return this._features.deleteDraftLabel; } + get finishDraftLabel(): string | undefined { return this._features.finishDraftLabel; } + get reactionGroup(): modes.CommentReaction[] | undefined { return this._features.reactionGroup; } constructor(proxy: ExtHostCommentsShape, handle: number, features: CommentProviderFeatures) { this._proxy = proxy; diff --git a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts index 0d91a9b058a..81929b60a66 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadConfiguration.ts @@ -56,12 +56,12 @@ export class MainThreadConfiguration implements MainThreadConfigurationShape { return this.writeConfiguration(target, key, undefined, resource); } - private writeConfiguration(target: ConfigurationTarget, key: string, value: any, resource: URI): Promise { + private writeConfiguration(target: ConfigurationTarget, key: string, value: any, resource: URI | null): Promise { target = target !== null && target !== undefined ? target : this.deriveConfigurationTarget(key, resource); return this.configurationService.updateValue(key, value, { resource }, target, true); } - private deriveConfigurationTarget(key: string, resource: URI): ConfigurationTarget { + private deriveConfigurationTarget(key: string, resource: URI | null): ConfigurationTarget { if (resource && this._workspaceContextService.getWorkbenchState() === WorkbenchState.WORKSPACE) { const configurationProperties = Registry.as(ConfigurationExtensions.Configuration).getConfigurationProperties(); if (configurationProperties[key] && configurationProperties[key].scope === ConfigurationScope.RESOURCE) { diff --git a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts index 2eac8972c17..287c7320573 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDebugService.ts @@ -5,16 +5,16 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { URI as uri } from 'vs/base/common/uri'; -import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, ITerminalSettings, IDebugAdapter, IDebugAdapterDescriptorFactory, IDebugSession, IDebugAdapterFactory, IDebugAdapterTrackerFactory } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IConfig, IDebugConfigurationProvider, IBreakpoint, IFunctionBreakpoint, IBreakpointData, ITerminalSettings, IDebugAdapter, IDebugAdapterDescriptorFactory, IDebugSession, IDebugAdapterFactory, IDebugAdapterTrackerFactory } from 'vs/workbench/contrib/debug/common/debug'; 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'; import severity from 'vs/base/common/severity'; -import { AbstractDebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; +import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/parts/debug/common/debugUtils'; +import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/contrib/debug/common/debugUtils'; @extHostNamedCustomer(MainContext.MainThreadDebugService) export class MainThreadDebugService implements MainThreadDebugServiceShape, IDebugAdapterFactory { diff --git a/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts b/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts index ff13bad10d1..c04448ef31e 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDiagnostics.ts @@ -22,7 +22,7 @@ export class MainThreadDiagnostics implements MainThreadDiagnosticsShape { } dispose(): void { - this._activeOwners.forEach(owner => this._markerService.changeAll(owner, undefined)); + this._activeOwners.forEach(owner => this._markerService.changeAll(owner, [])); } $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]): void { @@ -43,7 +43,7 @@ export class MainThreadDiagnostics implements MainThreadDiagnosticsShape { } $clear(owner: string): void { - this._markerService.changeAll(owner, undefined); + this._markerService.changeAll(owner, []); this._activeOwners.delete(owner); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts b/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts index 8ff02a01d93..a4d35e062f7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDialogs.ts @@ -41,7 +41,7 @@ export class MainThreadDialogs implements MainThreadDiaglogsShape { }; if (options.filters) { result.filters = []; - forEach(options.filters, entry => result.filters.push({ name: entry.key, extensions: entry.value })); + forEach(options.filters, entry => result.filters!.push({ name: entry.key, extensions: entry.value })); } return result; } @@ -53,7 +53,7 @@ export class MainThreadDialogs implements MainThreadDiaglogsShape { }; if (options.filters) { result.filters = []; - forEach(options.filters, entry => result.filters.push({ name: entry.key, extensions: entry.value })); + forEach(options.filters, entry => result.filters!.push({ name: entry.key, extensions: entry.value })); } return result; } diff --git a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts index cbbe4d79dcb..1a51bf7f504 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadDocumentsAndEditors.ts @@ -25,7 +25,7 @@ import { EditorViewColumn, editorGroupToViewColumn } from 'vs/workbench/api/shar 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'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { ITextFileService } 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/mainThreadEditors.ts b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts index 5455438d38a..d35dda26fd8 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadEditors.ts @@ -23,7 +23,7 @@ import { MainThreadTextEditor } from 'vs/workbench/api/electron-browser/mainThre 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 { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IURLService } from 'vs/platform/url/common/url'; import product from 'vs/platform/node/product'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts index caea6c69d7f..df3fac179a9 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystem.ts @@ -44,7 +44,11 @@ export class MainThreadFileSystem implements MainThreadFileSystemShape { } $onFileSystemChange(handle: number, changes: IFileChangeDto[]): void { - this._fileProvider.get(handle).$onFileSystemChange(changes); + const fileProvider = this._fileProvider.get(handle); + if (!fileProvider) { + throw new Error('Unknown file provider'); + } + fileProvider.$onFileSystemChange(changes); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts b/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts index 2a492bf0f7a..1e9d568863e 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadFileSystemEventService.ts @@ -52,7 +52,7 @@ export class MainThreadFileSystemEventService { // file operation events - (changes the editor makes) fileService.onAfterOperation(e => { if (e.operation === FileOperation.MOVE) { - proxy.$onFileRename(e.resource, e.target.resource); + proxy.$onFileRename(e.resource, e.target!.resource); } }, undefined, this._listener); diff --git a/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts index 6c52cbc9378..d7af8caf14a 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadHeapService.ts @@ -9,8 +9,7 @@ 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 { isThenable } from 'vs/base/common/async'; -import { isNullOrUndefined } from 'util'; +import { GCSignal } from 'gc-signals'; export const IHeapService = createDecorator('heapService'); @@ -20,10 +19,9 @@ export interface IHeapService { readonly onGarbageCollection: Event; /** - * Track gc-collection for all new objects that - * have the $ident-value set. + * Track gc-collection for the given object */ - trackRecursive(obj: T | Promise): Promise; + trackObject(obj: ObjectIdentifier): void; } export class HeapService implements IHeapService { @@ -35,7 +33,10 @@ export class HeapService implements IHeapService { private _activeSignals = new WeakMap(); private _activeIds = new Set(); + private _consumeHandle: any; + private _ctor: { new(id: number): GCSignal }; + private _ctorInit: Promise; constructor() { // @@ -45,73 +46,41 @@ export class HeapService implements IHeapService { clearInterval(this._consumeHandle); } - trackRecursive(obj: T | Promise): Promise { - if (isThenable(obj)) { - return obj.then(result => this.trackRecursive(result)); + trackObject(obj: ObjectIdentifier | undefined | null): void { + if (!obj || typeof obj.$ident !== 'number') { + return; + } + + if (this._ctor) { + // track and leave + this._activeIds.add(obj.$ident); + this._activeSignals.set(obj, new this._ctor(obj.$ident)); + } else { - return this._doTrackRecursive(obj); - } - } + // make sure to load gc-signals, then track and leave + if (!this._ctorInit) { + this._ctorInit = import('gc-signals').then(({ GCSignal, consumeSignals }) => { + this._ctor = GCSignal; + this._consumeHandle = setInterval(() => { + const ids = consumeSignals(); - private _doTrackRecursive(obj: any): Promise { - - if (isNullOrUndefined(obj)) { - return Promise.resolve(obj); - } - - return import('gc-signals').then(({ GCSignal, consumeSignals }) => { - - if (this._consumeHandle === undefined) { - // ensure that there is one consumer of signals - this._consumeHandle = setInterval(() => { - const ids = consumeSignals(); - - if (ids.length > 0) { - // local book-keeping - for (const id of ids) { - this._activeIds.delete(id); + if (ids.length > 0) { + // local book-keeping + for (const id of ids) { + this._activeIds.delete(id); + } + // fire event + this._onGarbageCollection.fire(ids); } - - // fire event - this._onGarbageCollection.fire(ids); - } - - }, 15 * 1000); + }, 15 * 1000); + }); } - const stack = [obj]; - while (stack.length > 0) { - - // remove first element - let obj = stack.shift(); - - if (!obj || typeof obj !== 'object') { - continue; - } - - for (let key in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, key)) { - continue; - } - - const value = obj[key]; - // recurse -> object/array - if (typeof value === 'object') { - stack.push(value); - - } else if (key === ObjectIdentifier.name) { - // track new $ident-objects - - if (typeof value === 'number' && !this._activeIds.has(value)) { - this._activeIds.add(value); - this._activeSignals.set(obj, new GCSignal(value)); - } - } - } - } - - return obj; - }); + this._ctorInit.then(() => { + this._activeIds.add(obj.$ident); + this._activeSignals.set(obj, new this._ctor(obj.$ident)); + }); + } } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts index bdd181a2cac..f3307626193 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadLanguageFeatures.ts @@ -7,7 +7,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { Emitter } from 'vs/base/common/event'; import { ITextModel, ISingleEditOperation } from 'vs/editor/common/model'; import * as modes from 'vs/editor/common/modes'; -import * as search from 'vs/workbench/parts/search/common/search'; +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'; @@ -123,10 +123,16 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha const provider = { provideCodeLenses: (model: ITextModel, token: CancellationToken): modes.ICodeLensSymbol[] | Promise => { - return this._heapService.trackRecursive(this._proxy.$provideCodeLenses(handle, model.uri, token)); + return this._proxy.$provideCodeLenses(handle, model.uri, token).then(dto => { + if (dto) { dto.forEach(obj => this._heapService.trackObject(obj)); } + return dto; + }); }, resolveCodeLens: (model: ITextModel, codeLens: modes.ICodeLensSymbol, token: CancellationToken): modes.ICodeLensSymbol | Promise => { - return this._heapService.trackRecursive(this._proxy.$resolveCodeLens(handle, model.uri, codeLens, token)); + return this._proxy.$resolveCodeLens(handle, model.uri, codeLens, token).then(obj => { + this._heapService.trackObject(obj); + return obj; + }); } }; @@ -215,7 +221,10 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerQuickFixSupport(handle: number, selector: ISerializedDocumentFilter[], providedCodeActionKinds?: string[]): void { this._registrations[handle] = modes.CodeActionProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { provideCodeActions: (model: ITextModel, rangeOrSelection: EditorRange | Selection, context: modes.CodeActionContext, token: CancellationToken): Promise => { - return this._heapService.trackRecursive(this._proxy.$provideCodeActions(handle, model.uri, rangeOrSelection, context, token)).then(MainThreadLanguageFeatures._reviveCodeActionDto); + return this._proxy.$provideCodeActions(handle, model.uri, rangeOrSelection, context, token).then(dto => { + if (dto) { dto.forEach(obj => this._heapService.trackObject(obj.command)); } + return MainThreadLanguageFeatures._reviveCodeActionDto(dto); + }); }, providedCodeActionKinds }); @@ -328,10 +337,16 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha $registerDocumentLinkProvider(handle: number, selector: ISerializedDocumentFilter[]): void { this._registrations[handle] = modes.LinkProviderRegistry.register(typeConverters.LanguageSelector.from(selector), { provideLinks: (model, token) => { - return this._heapService.trackRecursive(this._proxy.$provideDocumentLinks(handle, model.uri, token)); + return this._proxy.$provideDocumentLinks(handle, model.uri, token).then(dto => { + if (dto) { dto.forEach(obj => this._heapService.trackObject(obj)); } + return dto; + }); }, resolveLink: (link, token) => { - return this._proxy.$resolveDocumentLink(handle, link, token); + return this._proxy.$resolveDocumentLink(handle, link, token).then(obj => { + this._heapService.trackObject(obj); + return obj; + }); } }); } diff --git a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts index 7427501f88c..6318bbd9559 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadOutputService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Registry } from 'vs/platform/registry/common/platform'; -import { IOutputService, IOutputChannel, OUTPUT_PANEL_ID, Extensions, IOutputChannelRegistry } from 'vs/workbench/parts/output/common/output'; +import { IOutputService, IOutputChannel, OUTPUT_PANEL_ID, Extensions, IOutputChannelRegistry } from 'vs/workbench/contrib/output/common/output'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { MainThreadOutputServiceShape, MainContext, IExtHostContext, ExtHostOutputServiceShape, ExtHostContext } from '../node/extHost.protocol'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts index 83ef37518c2..5521d8f3854 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadProgress.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadProgress.ts @@ -34,14 +34,16 @@ export class MainThreadProgress implements MainThreadProgressShape { } $progressReport(handle: number, message: IProgressStep): void { - if (this._progress.has(handle)) { - this._progress.get(handle).progress.report(message); + const entry = this._progress.get(handle); + if (entry) { + entry.progress.report(message); } } $progressEnd(handle: number): void { - if (this._progress.has(handle)) { - this._progress.get(handle).resolve(); + const entry = this._progress.get(handle); + if (entry) { + entry.resolve(); this._progress.delete(handle); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts index 18790abe8c9..33588a6084d 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSCM.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSCM.ts @@ -7,7 +7,7 @@ import { URI, UriComponents } from 'vs/base/common/uri'; 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/services/scm/common/scm'; +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 { Command } from 'vs/editor/common/modes'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadStorage.ts b/src/vs/workbench/api/electron-browser/mainThreadStorage.ts index ac9c82bb075..96f63fbecba 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadStorage.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadStorage.ts @@ -39,7 +39,7 @@ export class MainThreadStorage implements MainThreadStorageShape { this._storageListener.dispose(); } - $getValue(shared: boolean, key: string): Promise { + $getValue(shared: boolean, key: string): Promise { if (shared) { this._sharedStorageKeysToWatch.set(key, true); } @@ -50,7 +50,7 @@ export class MainThreadStorage implements MainThreadStorageShape { } } - private _getValue(shared: boolean, key: string): T { + private _getValue(shared: boolean, key: string): T | undefined { let jsonValue = this._storageService.get(key, shared ? StorageScope.GLOBAL : StorageScope.WORKSPACE); if (!jsonValue) { return undefined; @@ -66,6 +66,6 @@ export class MainThreadStorage implements MainThreadStorageShape { } catch (err) { return Promise.reject(err); } - return undefined; + return Promise.resolve(undefined); } } diff --git a/src/vs/workbench/api/electron-browser/mainThreadTask.ts b/src/vs/workbench/api/electron-browser/mainThreadTask.ts index ffb6dbaf806..02d543ac34b 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTask.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTask.ts @@ -18,13 +18,13 @@ import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspac import { ContributedTask, KeyedTaskIdentifier, TaskExecution, Task, TaskEvent, TaskEventKind, PresentationOptions, CommandOptions, CommandConfiguration, RuntimeType, CustomTask, TaskScope, TaskSource, TaskSourceKind, ExtensionTaskSource, RunOptions, TaskSet -} from 'vs/workbench/parts/tasks/common/tasks'; +} from 'vs/workbench/contrib/tasks/common/tasks'; -import { ResolveSet, ResolvedVariables } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { ITaskService, TaskFilter, ITaskProvider } from 'vs/workbench/parts/tasks/common/taskService'; +import { ResolveSet, ResolvedVariables } from 'vs/workbench/contrib/tasks/common/taskSystem'; +import { ITaskService, TaskFilter, ITaskProvider } from 'vs/workbench/contrib/tasks/common/taskService'; -import { TaskDefinition } from 'vs/workbench/parts/tasks/node/tasks'; +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'; @@ -580,7 +580,7 @@ export class MainThreadTask implements MainThreadTaskShape { forEach(values.variables, (entry) => { partiallyResolvedVars.push(entry.value); }); - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this._configurationResolverService.resolveWithInteraction(workspaceFolder, partiallyResolvedVars, 'tasks').then(resolvedVars => { let result = { process: undefined as string, diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 035b0904b16..2c6526b83f4 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, ITerminalDimensions, EXT_HOST_CREATION_DELAY } from 'vs/workbench/parts/terminal/common/terminal'; +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'; @@ -28,7 +28,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // Delay this message so the TerminalInstance constructor has a chance to finish and // return the ID normally to the extension host. The ID that is passed here will be used // to register non-extension API terminals in the extension host. - setTimeout(() => this._onTerminalOpened(instance), EXT_HOST_CREATION_DELAY); + setTimeout(() => { + this._onTerminalOpened(instance); + this._onInstanceDimensionsChanged(instance); + }, EXT_HOST_CREATION_DELAY); })); this._toDispose.push(terminalService.onInstanceDisposed(instance => this._onTerminalDisposed(instance))); this._toDispose.push(terminalService.onInstanceProcessIdReady(instance => this._onTerminalProcessIdReady(instance))); @@ -205,11 +208,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } private _onInstanceDimensionsChanged(instance: ITerminalInstance): void { - // Only send the dimensions if the terminal is a renderer only as there is no API to access - // dimensions on a plain Terminal. - if (instance.shellLaunchConfig.isRendererOnly) { - this._proxy.$acceptTerminalRendererDimensions(instance.id, instance.cols, instance.rows); - } + this._proxy.$acceptTerminalDimensions(instance.id, instance.cols, instance.rows); } private _onTerminalRequestExtHostProcess(request: ITerminalProcessExtHostRequest): void { diff --git a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts index ee93e07d8d0..cc68e778185 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWebview.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWebview.ts @@ -10,12 +10,12 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ExtHostContext, ExtHostWebviewsShape, IExtHostContext, MainContext, MainThreadWebviewsShape, WebviewPanelHandle, WebviewPanelShowOptions } from 'vs/workbench/api/node/extHost.protocol'; import { editorGroupToViewColumn, EditorViewColumn, viewColumnToEditorGroup } from 'vs/workbench/api/shared/editor'; -import { WebviewEditor } from 'vs/workbench/parts/webview/electron-browser/webviewEditor'; -import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; -import { ICreateWebViewShowOptions, IWebviewEditorService, WebviewInputOptions, WebviewReviver } from 'vs/workbench/parts/webview/electron-browser/webviewEditorService'; +import { WebviewEditor } from 'vs/workbench/contrib/webview/electron-browser/webviewEditor'; +import { WebviewEditorInput } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorInput'; +import { ICreateWebViewShowOptions, IWebviewEditorService, WebviewInputOptions, WebviewReviver } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import * as vscode from 'vscode'; import { extHostNamedCustomer } from './extHostCustomers'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index 6a435ed4660..f7eab4f2cf2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -3,27 +3,26 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import { isPromiseCanceledError } from 'vs/base/common/errors'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { URI, UriComponents } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; -import { IFolderQuery, IPatternInfo, ISearchConfiguration, ISearchProgressItem, ISearchService, QueryType, IFileQuery, IFileMatch } from 'vs/platform/search/common/search'; +import { IFileMatch, IPatternInfo, ISearchProgressItem, ISearchService } from 'vs/platform/search/common/search'; import { IStatusbarService } from 'vs/platform/statusbar/common/statusbar'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { extHostNamedCustomer } from 'vs/workbench/api/electron-browser/extHostCustomers'; -import { QueryBuilder, ITextQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; +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 } from '../node/extHost.protocol'; -import { CancellationTokenSource, CancellationToken } from 'vs/base/common/cancellation'; import { TextSearchComplete } from 'vscode'; -import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; +import { ExtHostContext, ExtHostWorkspaceShape, IExtHostContext, MainContext, MainThreadWorkspaceShape } from '../node/extHost.protocol'; @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { @@ -31,13 +30,13 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { private readonly _toDispose: IDisposable[] = []; private readonly _activeCancelTokens: { [id: number]: CancellationTokenSource } = Object.create(null); private readonly _proxy: ExtHostWorkspaceShape; + private readonly _queryBuilder = this._instantiationService.createInstance(QueryBuilder); constructor( extHostContext: IExtHostContext, @ISearchService private readonly _searchService: ISearchService, @IWorkspaceContextService private readonly _contextService: IWorkspaceContextService, @ITextFileService private readonly _textFileService: ITextFileService, - @IConfigurationService private readonly _configurationService: IConfigurationService, @IWorkspaceEditingService private readonly _workspaceEditingService: IWorkspaceEditingService, @IStatusbarService private readonly _statusbarService: IStatusbarService, @IWindowService private readonly _windowService: IWindowService, @@ -104,7 +103,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { private _onDidChangeWorkspace(): void { const workspace = this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : this._contextService.getWorkspace(); this._proxy.$acceptWorkspaceData(workspace ? { - configuration: workspace.configuration, + configuration: workspace.configuration || undefined, folders: workspace.folders, id: workspace.id, name: this._labelService.getWorkspaceLabel(workspace) @@ -113,50 +112,21 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { // --- search --- - $startFileSearch(includePattern: string, _includeFolder: UriComponents, excludePatternOrDisregardExcludes: string | false, maxResults: number, token: CancellationToken): Promise { + $startFileSearch(includePattern: string, _includeFolder: UriComponents, excludePatternOrDisregardExcludes: string | false, maxResults: number, token: CancellationToken): Promise | undefined { const includeFolder = URI.revive(_includeFolder); const workspace = this._contextService.getWorkspace(); if (!workspace.folders.length) { return undefined; } - let folderQueries: IFolderQuery[]; - if (includeFolder) { - folderQueries = [{ folder: includeFolder }]; // if base provided, only search in that folder - } else { - folderQueries = workspace.folders.map(folder => ({ folder: folder.uri })); // absolute pattern: search across all folders - } - - if (!folderQueries) { - return undefined; // invalid query parameters - } - - const ignoreSymlinks = folderQueries.every(folderQuery => { - const folderConfig = this._configurationService.getValue({ resource: folderQuery.folder }); - return !folderConfig.search.followSymlinks; - }); - - // TODO replace wth QueryBuilder - folderQueries.forEach(fq => { - fq.ignoreSymlinks = ignoreSymlinks; - }); - - const query: IFileQuery = { - folderQueries, - type: QueryType.File, - maxResults, - disregardExcludeSettings: excludePatternOrDisregardExcludes === false, - _reason: 'startFileSearch' - }; - if (typeof includePattern === 'string') { - query.includePattern = { [includePattern]: true }; - } - - if (typeof excludePatternOrDisregardExcludes === 'string') { - query.excludePattern = { [excludePatternOrDisregardExcludes]: true }; - } - - this._searchService.extendQuery(query); + const query = this._queryBuilder.file( + includeFolder ? [includeFolder] : workspace.folders.map(f => f.uri), + { + maxResults, + disregardExcludeSettings: (excludePatternOrDisregardExcludes === false) || undefined, + includePattern, + _reason: 'startFileSearch' + }); return this._searchService.fileSearch(query, token).then(result => { return result.results.map(m => m.resource); @@ -172,8 +142,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { const workspace = this._contextService.getWorkspace(); const folders = workspace.folders.map(folder => folder.uri); - const queryBuilder = this._instantiationService.createInstance(QueryBuilder); - const query = queryBuilder.text(pattern, folders, options); + const query = this._queryBuilder.text(pattern, folders, options); query._reason = 'startTextSearch'; const onProgress = (p: ISearchProgressItem) => { @@ -227,7 +196,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { }); } - $resolveProxy(url: string): Promise { + $resolveProxy(url: string): Promise { return this._windowService.resolveProxy(url); } } @@ -241,7 +210,7 @@ CommandsRegistry.registerCommand('_workbench.enterWorkspace', async function (ac const runningExtensions = await extensionService.getExtensions(); // If requested extension to disable is running, then reload window with given workspace if (disableExtensions && runningExtensions.some(runningExtension => disableExtensions.some(id => ExtensionIdentifier.equals(runningExtension.identifier, id)))) { - return windowService.openWindow([URI.file(workspace.fsPath)], { args: { _: [], 'disable-extension': disableExtensions } }); + return windowService.openWindow([{ uri: workspace, typeHint: 'file' }], { args: { _: [], 'disable-extension': disableExtensions } }); } } diff --git a/src/vs/workbench/api/node/apiCommands.ts b/src/vs/workbench/api/node/apiCommands.ts index 0e808dbfed4..02ff1612998 100644 --- a/src/vs/workbench/api/node/apiCommands.ts +++ b/src/vs/workbench/api/node/apiCommands.ts @@ -12,7 +12,7 @@ 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 { EditorGroupLayout } from 'vs/workbench/services/group/common/editorGroupsService'; +import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IWindowsService } from 'vs/platform/windows/common/windows'; @@ -27,7 +27,7 @@ import { generateUuid } from 'vs/base/common/uuid'; // ----------------------------------------------------------------- export interface ICommandsExecutor { - executeCommand(id: string, ...args: any[]): Promise; + executeCommand(id: string, ...args: any[]): Promise; } function adjustHandler(handler: (executor: ICommandsExecutor, ...args: any[]) => any): ICommandHandler { @@ -62,7 +62,7 @@ export class OpenFolderAPICommand { uri = correctedUri; } - return executor.executeCommand('_files.windowOpen', { folderURIs: [uri], forceNewWindow }); + return executor.executeCommand('_files.windowOpen', { urisToOpen: [{ uri }], forceNewWindow }); } } CommandsRegistry.registerCommand(OpenFolderAPICommand.ID, adjustHandler(OpenFolderAPICommand.execute)); @@ -84,8 +84,8 @@ CommandsRegistry.registerCommand(DiffAPICommand.ID, adjustHandler(DiffAPICommand export class OpenAPICommand { public static ID = 'vscode.open'; public static execute(executor: ICommandsExecutor, resource: URI, columnOrOptions?: vscode.ViewColumn | vscode.TextDocumentShowOptions, label?: string): Promise { - let options: ITextEditorOptions; - let position: EditorViewColumn; + let options: ITextEditorOptions | undefined; + let position: EditorViewColumn | undefined; if (columnOrOptions) { if (typeof columnOrOptions === 'number') { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index 32fc94ac687..faa778a2e2e 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -424,6 +424,9 @@ export function createApiFactory( onDidChangeActiveTerminal(listener, thisArg?, disposables?) { return extHostTerminalService.onDidChangeActiveTerminal(listener, thisArg, disposables); }, + onDidChangeTerminalDimensions(listener, thisArg?, disposables?) { + return extHostTerminalService.onDidChangeTerminalDimensions(listener, thisArg, disposables); + }, get state() { return extHostWindow.state; }, @@ -479,9 +482,9 @@ export function createApiFactory( } return extHostTerminalService.createTerminal(nameOrOptions, shellPath, shellArgs); }, - createTerminalRenderer: proposedApiFunction(extension, (name: string) => { + createTerminalRenderer(name: string): vscode.TerminalRenderer { return extHostTerminalService.createTerminalRenderer(name); - }), + }, registerTreeDataProvider(viewId: string, treeDataProvider: vscode.TreeDataProvider): vscode.Disposable { return extHostTreeViews.registerTreeDataProvider(viewId, treeDataProvider, extension); }, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 31de7edb493..075edc6c0a3 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -33,9 +33,9 @@ import { EndOfLine, IFileOperationOptions, TextEditorLineNumbersStyle } from 'vs import { EditorViewColumn } from 'vs/workbench/api/shared/editor'; import { TaskDTO, TaskExecutionDTO, TaskFilterDTO, TaskHandleDTO, TaskProcessEndedDTO, TaskProcessStartedDTO, TaskSystemInfoDTO, TaskSetDTO } from 'vs/workbench/api/shared/tasks'; import { ITreeItem, IRevealOptions } from 'vs/workbench/common/views'; -import { IAdapterDescriptor, IConfig, ITerminalSettings } from 'vs/workbench/parts/debug/common/debug'; -import { ITextQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; -import { ITerminalDimensions } from 'vs/workbench/parts/terminal/common/terminal'; +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 { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IRPCProtocol, createExtHostContextProxyIdentifier as createExtId, createMainContextProxyIdentifier as createMainId } from 'vs/workbench/services/extensions/node/proxyIdentifier'; import { IProgressOptions, IProgressStep } from 'vs/platform/progress/common/progress'; @@ -102,7 +102,7 @@ export interface MainThreadClipboardShape extends IDisposable { export interface MainThreadCommandsShape extends IDisposable { $registerCommand(id: string): void; $unregisterCommand(id: string): void; - $executeCommand(id: string, args: any[]): Promise; + $executeCommand(id: string, args: any[]): Promise; $getCommands(): Promise; } @@ -454,7 +454,7 @@ export interface MainThreadStatusBarShape extends IDisposable { } export interface MainThreadStorageShape extends IDisposable { - $getValue(shared: boolean, key: string): Promise; + $getValue(shared: boolean, key: string): Promise; $setValue(shared: boolean, key: string, value: object): Promise; } @@ -506,12 +506,12 @@ export interface ExtHostUrlsShape { } export interface MainThreadWorkspaceShape extends IDisposable { - $startFileSearch(includePattern: string, includeFolder: URI, excludePatternOrDisregardExcludes: string | false, maxResults: number, token: CancellationToken): Promise; + $startFileSearch(includePattern: string, includeFolder: URI, excludePatternOrDisregardExcludes: string | false, maxResults: number, token: CancellationToken): Promise | undefined; $startTextSearch(query: 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; - $resolveProxy(url: string): Promise; + $resolveProxy(url: string): Promise; } export interface IFileChangeDto { @@ -721,7 +721,7 @@ export interface ExtHostTreeViewsShape { } export interface ExtHostWorkspaceShape { - $acceptWorkspaceData(workspace: IWorkspaceData): void; + $acceptWorkspaceData(workspace: IWorkspaceData | null): void; $handleTextSearchResult(result: IRawFileMatch2, requestId: number): void; } @@ -773,7 +773,7 @@ export interface ExtHostFileSystemEventServiceShape { } export interface ObjectIdentifier { - $ident: number; + $ident?: number; } export namespace ObjectIdentifier { @@ -870,19 +870,25 @@ export function reviveWorkspaceEditDto(data: WorkspaceEditDto): modes.WorkspaceE return data; } +export type CommandDto = ObjectIdentifier & modes.Command; + export interface CodeActionDto { title: string; edit?: WorkspaceEditDto; diagnostics?: IMarkerData[]; - command?: modes.Command; + command?: CommandDto; kind?: string; isPreferred?: boolean; } +export type LinkDto = ObjectIdentifier & modes.ILink; + +export type CodeLensDto = ObjectIdentifier & modes.ICodeLensSymbol; + export interface ExtHostLanguageFeaturesShape { $provideDocumentSymbols(handle: number, resource: UriComponents, token: CancellationToken): Promise; - $provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise; - $resolveCodeLens(handle: number, resource: UriComponents, symbol: modes.ICodeLensSymbol, token: CancellationToken): Promise; + $provideCodeLenses(handle: number, resource: UriComponents, token: CancellationToken): Promise; + $resolveCodeLens(handle: number, resource: UriComponents, symbol: CodeLensDto, token: CancellationToken): Promise; $provideDefinition(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideDeclaration(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; $provideImplementation(handle: number, resource: UriComponents, position: IPosition, token: CancellationToken): Promise; @@ -903,8 +909,8 @@ export interface ExtHostLanguageFeaturesShape { $resolveCompletionItem(handle: number, resource: UriComponents, position: IPosition, suggestion: modes.CompletionItem, token: CancellationToken): Promise; $releaseCompletionItems(handle: number, id: number): void; $provideSignatureHelp(handle: number, resource: UriComponents, position: IPosition, context: modes.SignatureHelpContext, token: CancellationToken): Promise; - $provideDocumentLinks(handle: number, resource: UriComponents, token: CancellationToken): Promise; - $resolveDocumentLink(handle: number, link: modes.ILink, token: CancellationToken): Promise; + $provideDocumentLinks(handle: number, resource: UriComponents, token: CancellationToken): Promise; + $resolveDocumentLink(handle: number, link: LinkDto, token: CancellationToken): Promise; $provideDocumentColors(handle: number, resource: UriComponents, token: CancellationToken): Promise; $provideColorPresentations(handle: number, resource: UriComponents, colorInfo: IRawColorInfo, token: CancellationToken): Promise; $provideFoldingRanges(handle: number, resource: UriComponents, context: modes.FoldingContext, token: CancellationToken): Promise; @@ -938,7 +944,7 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalProcessData(id: number, data: string): void; $acceptTerminalRendererInput(id: number, data: string): void; $acceptTerminalTitleChange(id: number, name: string): void; - $acceptTerminalRendererDimensions(id: number, cols: number, rows: number): void; + $acceptTerminalDimensions(id: number, cols: number, rows: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, activeWorkspaceRootUri: URI, cols: number, rows: number): void; $acceptProcessInput(id: number, data: string): void; $acceptProcessResize(id: number, cols: number, rows: number): void; @@ -1077,7 +1083,7 @@ export interface ExtHostCommentsShape { } export interface ExtHostStorageShape { - $acceptValue(shared: boolean, key: string, value: object): void; + $acceptValue(shared: boolean, key: string, value: object | undefined): void; } // --- proxy identifiers diff --git a/src/vs/workbench/api/node/extHostApiCommands.ts b/src/vs/workbench/api/node/extHostApiCommands.ts index 9b5931a4bac..bb76263617f 100644 --- a/src/vs/workbench/api/node/extHostApiCommands.ts +++ b/src/vs/workbench/api/node/extHostApiCommands.ts @@ -11,12 +11,12 @@ import * as types from 'vs/workbench/api/node/extHostTypes'; import { IRawColorInfo, WorkspaceEditDto } from 'vs/workbench/api/node/extHost.protocol'; import { ISingleEditOperation } from 'vs/editor/common/model'; import * as modes from 'vs/editor/common/modes'; -import * as search from 'vs/workbench/parts/search/common/search'; +import * as search from 'vs/workbench/contrib/search/common/search'; import { ICommandHandlerDescription } from 'vs/platform/commands/common/commands'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { CustomCodeAction } from 'vs/workbench/api/node/extHostLanguageFeatures'; import { ICommandsExecutor, PreviewHTMLAPICommand, OpenFolderAPICommand, DiffAPICommand, OpenAPICommand, RemoveFromRecentlyOpenedAPICommand, SetEditorLayoutAPICommand } from './apiCommands'; -import { EditorGroupLayout } from 'vs/workbench/services/group/common/editorGroupsService'; +import { EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { isFalsyOrEmpty, isNonEmptyArray } from 'vs/base/common/arrays'; export class ExtHostApiCommands { @@ -372,7 +372,7 @@ export class ExtHostApiCommands { return undefined; } if (value.rejectReason) { - return Promise.reject(new Error(value.rejectReason)); + return Promise.reject(new Error(value.rejectReason)); } return typeConverters.WorkspaceEdit.to(value); }); diff --git a/src/vs/workbench/api/node/extHostCommands.ts b/src/vs/workbench/api/node/extHostCommands.ts index 4e91ca97d00..8b73f059351 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 } from './extHost.protocol'; +import { MainContext, MainThreadCommandsShape, ExtHostCommandsShape, ObjectIdentifier, IMainContext, CommandDto } from './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'; @@ -207,15 +207,16 @@ export class CommandsConverter { this._commands.registerCommand(true, this._delegatingCommandId, this._executeConvertedCommand, this); } - toInternal(command: vscode.Command): modes.Command { + toInternal(command: vscode.Command): CommandDto { if (!command) { return undefined; } - const result: modes.Command = { + const result: CommandDto = { + $ident: undefined, id: command.command, - title: command.title + title: command.title, }; if (command.command && isNonEmptyArray(command.arguments)) { @@ -223,7 +224,7 @@ export class CommandsConverter { // means we don't want to send the arguments around const id = this._heap.keep(command); - ObjectIdentifier.mixin(result, id); + result.$ident = id; result.id = this._delegatingCommandId; result.arguments = [id]; diff --git a/src/vs/workbench/api/node/extHostConfiguration.ts b/src/vs/workbench/api/node/extHostConfiguration.ts index 3e73209ffbb..b65cdf1f2bf 100644 --- a/src/vs/workbench/api/node/extHostConfiguration.ts +++ b/src/vs/workbench/api/node/extHostConfiguration.ts @@ -43,7 +43,7 @@ export class ExtHostConfiguration implements ExtHostConfigurationShape { private readonly _proxy: MainThreadConfigurationShape; private readonly _extHostWorkspace: ExtHostWorkspace; private readonly _barrier: Barrier; - private _actual: ExtHostConfigProvider; + private _actual: ExtHostConfigProvider | null; constructor(proxy: MainThreadConfigurationShape, extHostWorkspace: ExtHostWorkspace) { this._proxy = proxy; @@ -53,7 +53,7 @@ export class ExtHostConfiguration implements ExtHostConfigurationShape { } public getConfigProvider(): Promise { - return this._barrier.wait().then(_ => this._actual); + return this._barrier.wait().then(_ => this._actual!); } $initializeConfiguration(data: IConfigurationInitData): void { @@ -93,14 +93,14 @@ export class ExtHostConfigProvider { getConfiguration(section?: string, resource?: URI, extensionId?: ExtensionIdentifier): vscode.WorkspaceConfiguration { const config = this._toReadonlyValue(section - ? lookUp(this._configuration.getValue(null, { resource }, this._extHostWorkspace.workspace), section) - : this._configuration.getValue(null, { resource }, this._extHostWorkspace.workspace)); + ? lookUp(this._configuration.getValue(undefined, { resource }, this._extHostWorkspace.workspace), section) + : this._configuration.getValue(undefined, { resource }, this._extHostWorkspace.workspace)); if (section) { this._validateConfigurationAccess(section, resource, extensionId); } - function parseConfigurationTarget(arg: boolean | ExtHostConfigurationTarget): ConfigurationTarget { + function parseConfigurationTarget(arg: boolean | ExtHostConfigurationTarget): ConfigurationTarget | null { if (arg === undefined || arg === null) { return null; } @@ -218,7 +218,7 @@ export class ExtHostConfigProvider { return readonlyProxy(result); } - private _validateConfigurationAccess(key: string, resource: URI, extensionId: ExtensionIdentifier): void { + private _validateConfigurationAccess(key: string, resource: URI | undefined, extensionId: ExtensionIdentifier): void { const scope = OVERRIDE_PROPERTY_PATTERN.test(key) ? ConfigurationScope.RESOURCE : this._configurationScopes[key]; const extensionIdText = extensionId ? `[${extensionId.value}] ` : ''; if (ConfigurationScope.RESOURCE === scope) { diff --git a/src/vs/workbench/api/node/extHostDebugService.ts b/src/vs/workbench/api/node/extHostDebugService.ts index a4b106f656b..a1c246eab34 100644 --- a/src/vs/workbench/api/node/extHostDebugService.ts +++ b/src/vs/workbench/api/node/extHostDebugService.ts @@ -15,16 +15,16 @@ import { } from 'vs/workbench/api/node/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/parts/debug/node/debugAdapter'; +import { ExecutableDebugAdapter, SocketDebugAdapter, AbstractDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionService'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/node/extHostDocumentsAndEditors'; -import { ITerminalSettings, IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor } from 'vs/workbench/parts/debug/common/debug'; -import { getTerminalLauncher, hasChildProcesses, prepareCommand } from 'vs/workbench/parts/debug/node/terminals'; +import { ITerminalSettings, IDebuggerContribution, IConfig, IDebugAdapter, IDebugAdapterServer, IDebugAdapterExecutable, IAdapterDescriptor } from 'vs/workbench/contrib/debug/common/debug'; +import { getTerminalLauncher, hasChildProcesses, prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { AbstractVariableResolverService } from 'vs/workbench/services/configurationResolver/node/variableResolver'; import { ExtHostConfiguration, ExtHostConfigProvider } from './extHostConfiguration'; -import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/parts/debug/common/debugUtils'; +import { convertToVSCPaths, convertToDAPaths } from 'vs/workbench/contrib/debug/common/debugUtils'; import { ExtHostTerminalService } from 'vs/workbench/api/node/extHostTerminalService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; diff --git a/src/vs/workbench/api/node/extHostFileSystemEventService.ts b/src/vs/workbench/api/node/extHostFileSystemEventService.ts index c42b36dd383..f7f682b6281 100644 --- a/src/vs/workbench/api/node/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/node/extHostFileSystemEventService.ts @@ -163,7 +163,7 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ bucket.push(wrappedThenable); } }; - }).then(() => { + }).then((): any => { if (edits.length === 0) { return undefined; } diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index 76b8b1fbe00..8cbf6ad2d1e 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -15,7 +15,7 @@ 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 } 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 } from './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'; @@ -104,24 +104,25 @@ class CodeLensAdapter { private readonly _provider: vscode.CodeLensProvider ) { } - provideCodeLenses(resource: URI, token: CancellationToken): Promise { + provideCodeLenses(resource: URI, token: CancellationToken): Promise { const doc = this._documents.getDocumentData(resource).document; return asPromise(() => this._provider.provideCodeLenses(doc, token)).then(lenses => { - if (Array.isArray(lenses)) { - return lenses.map(lens => { + let result: CodeLensDto[] = []; + if (isNonEmptyArray(lenses)) { + for (const lens of lenses) { const id = this._heapService.keep(lens); - return ObjectIdentifier.mixin({ + result.push(ObjectIdentifier.mixin({ range: typeConvert.Range.from(lens.range), command: this._commands.toInternal(lens.command) - }, id); - }); + }, id)); + } } - return undefined; + return result; }); } - resolveCodeLens(resource: URI, symbol: modes.ICodeLensSymbol, token: CancellationToken): Promise { + resolveCodeLens(resource: URI, symbol: CodeLensDto, token: CancellationToken): Promise { const lens = this._heapService.get(ObjectIdentifier.of(symbol)); if (!lens) { @@ -553,7 +554,7 @@ class RenameAdapter { if (rejectReason) { return { rejectReason, range: undefined, text: undefined }; } else { - return Promise.reject(err); + return Promise.reject(err); } }); } @@ -778,25 +779,24 @@ class LinkProviderAdapter { private readonly _provider: vscode.DocumentLinkProvider ) { } - provideLinks(resource: URI, token: CancellationToken): Promise { + provideLinks(resource: URI, token: CancellationToken): Promise { const doc = this._documents.getDocumentData(resource).document; return asPromise(() => this._provider.provideDocumentLinks(doc, token)).then(links => { if (!Array.isArray(links)) { return undefined; } - const result: modes.ILink[] = []; + const result: LinkDto[] = []; for (const link of links) { let data = typeConvert.DocumentLink.from(link); let id = this._heapService.keep(link); - ObjectIdentifier.mixin(data, id); - result.push(data); + result.push(ObjectIdentifier.mixin(data, id)); } return result; }); } - resolveLink(link: modes.ILink, token: CancellationToken): Promise { + resolveLink(link: LinkDto, token: CancellationToken): Promise { if (typeof this._provider.resolveDocumentLink !== 'function') { return undefined; } diff --git a/src/vs/workbench/api/node/extHostMessageService.ts b/src/vs/workbench/api/node/extHostMessageService.ts index f24be5f48b0..ea85d1d6d99 100644 --- a/src/vs/workbench/api/node/extHostMessageService.ts +++ b/src/vs/workbench/api/node/extHostMessageService.ts @@ -42,7 +42,7 @@ export class ExtHostMessageService { commands.push({ title: command, handle, isCloseAffordance: false }); } else if (typeof command === 'object') { let { title, isCloseAffordance } = command; - commands.push({ title, isCloseAffordance, handle }); + commands.push({ title, isCloseAffordance: !!isCloseAffordance, handle }); } else { console.warn('Invalid message item:', command); } diff --git a/src/vs/workbench/api/node/extHostOutputService.ts b/src/vs/workbench/api/node/extHostOutputService.ts index 9e64042fc1b..a72e053e94d 100644 --- a/src/vs/workbench/api/node/extHostOutputService.ts +++ b/src/vs/workbench/api/node/extHostOutputService.ts @@ -23,7 +23,7 @@ export abstract class AbstractExtHostOutputChannel extends Disposable implements protected readonly _onDidAppend: Emitter = this._register(new Emitter()); readonly onDidAppend: Event = this._onDidAppend.event; - constructor(name: string, log: boolean, file: URI, proxy: MainThreadOutputServiceShape) { + constructor(name: string, log: boolean, file: URI | undefined, proxy: MainThreadOutputServiceShape) { super(); this._name = name; @@ -58,7 +58,7 @@ export abstract class AbstractExtHostOutputChannel extends Disposable implements show(columnOrPreserveFocus?: vscode.ViewColumn | boolean, preserveFocus?: boolean): void { this.validate(); - this._id.then(id => this._proxy.$reveal(id, typeof columnOrPreserveFocus === 'boolean' ? columnOrPreserveFocus : preserveFocus)); + this._id.then(id => this._proxy.$reveal(id, !!(typeof columnOrPreserveFocus === 'boolean' ? columnOrPreserveFocus : preserveFocus))); } hide(): void { @@ -86,7 +86,7 @@ export abstract class AbstractExtHostOutputChannel extends Disposable implements export class ExtHostPushOutputChannel extends AbstractExtHostOutputChannel { constructor(name: string, proxy: MainThreadOutputServiceShape) { - super(name, false, null, proxy); + super(name, false, undefined, proxy); } append(value: string): void { diff --git a/src/vs/workbench/api/node/extHostStorage.ts b/src/vs/workbench/api/node/extHostStorage.ts index 8925cdbb4d0..32df5a99877 100644 --- a/src/vs/workbench/api/node/extHostStorage.ts +++ b/src/vs/workbench/api/node/extHostStorage.ts @@ -23,7 +23,7 @@ export class ExtHostStorage implements ExtHostStorageShape { this._proxy = mainContext.getProxy(MainContext.MainThreadStorage); } - getValue(shared: boolean, key: string, defaultValue?: T): Promise { + getValue(shared: boolean, key: string, defaultValue?: T): Promise { return this._proxy.$getValue(shared, key).then(value => value || defaultValue); } diff --git a/src/vs/workbench/api/node/extHostTask.ts b/src/vs/workbench/api/node/extHostTask.ts index a96ab0933fc..5d6a485da7a 100644 --- a/src/vs/workbench/api/node/extHostTask.ts +++ b/src/vs/workbench/api/node/extHostTask.ts @@ -216,6 +216,9 @@ namespace TaskDTO { } else { scope = value.scope.uri; } + } else { + // To continue to support the deprecated task constructor that doesn't take a scope, we must add a scope here: + scope = types.TaskScope.Workspace; } if (!definition || !scope) { return undefined; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index e129b6a62bd..ed245af4642 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -6,19 +6,20 @@ import * as vscode from 'vscode'; import { URI, UriComponents } from 'vs/base/common/uri'; import * as platform from 'vs/base/common/platform'; -import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; +import * as terminalEnvironment from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { Event, Emitter } from 'vs/base/common/event'; import { ExtHostTerminalServiceShape, MainContext, MainThreadTerminalServiceShape, IMainContext, ShellLaunchConfigDto } from 'vs/workbench/api/node/extHost.protocol'; import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ILogService } from 'vs/platform/log/common/log'; -import { EXT_HOST_CREATION_DELAY } from 'vs/workbench/parts/terminal/common/terminal'; -import { TerminalProcess } from 'vs/workbench/parts/terminal/node/terminalProcess'; +import { EXT_HOST_CREATION_DELAY } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { timeout } from 'vs/base/common/async'; import { generateRandomPipeName } from 'vs/base/parts/ipc/node/ipc.net'; import * as http from 'http'; import * as fs from 'fs'; import { ExtHostCommands } from 'vs/workbench/api/node/extHostCommands'; import { sanitizeProcessEnvironment } from 'vs/base/node/processes'; +import { IURIToOpen, URIType } from 'vs/platform/windows/common/windows'; const RENDERER_NO_PROCESS_ID = -1; @@ -78,6 +79,8 @@ export class BaseExtHostTerminal { export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Terminal { private _pidPromise: Promise; private _pidPromiseComplete: (value: number) => any; + private _cols: number | undefined; + private _rows: number | undefined; private readonly _onData = new Emitter(); public get onDidWriteData(): Event { @@ -126,6 +129,26 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi this._name = name; } + public get dimensions(): vscode.TerminalDimensions | undefined { + if (this._cols === undefined && this._rows === undefined) { + return undefined; + } + return { + columns: this._cols, + rows: this._rows + }; + } + + public setDimensions(cols: number, rows: number): boolean { + if (cols === this._cols && rows === this._rows) { + // Nothing changed + return false; + } + this._cols = cols; + this._rows = rows; + return true; + } + public get processId(): Promise { return this._pidPromise; } @@ -273,6 +296,8 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { public get onDidOpenTerminal(): Event { return this._onDidOpenTerminal && this._onDidOpenTerminal.event; } private readonly _onDidChangeActiveTerminal: Emitter = new Emitter(); public get onDidChangeActiveTerminal(): Event { return this._onDidChangeActiveTerminal && this._onDidChangeActiveTerminal.event; } + private readonly _onDidChangeTerminalDimensions: Emitter = new Emitter(); + public get onDidChangeTerminalDimensions(): Event { return this._onDidChangeTerminalDimensions && this._onDidChangeTerminalDimensions.event; } constructor( mainContext: IMainContext, @@ -352,7 +377,17 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { }); } - public $acceptTerminalRendererDimensions(id: number, cols: number, rows: number): void { + 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 + }); + } + } + // When a terminal's dimensions change, a renderer's _maximum_ dimensions change const renderer = this._getTerminalRendererById(id); if (renderer) { renderer._setMaximumDimensions(cols, rows); @@ -630,18 +665,16 @@ class CLIServer { return this.ipcHandlePath; } - private toURIs(strs: string[]): URI[] { - const result: URI[] = []; + private collectURIToOpen(strs: string[], typeHint: URIType, result: IURIToOpen[]): void { if (Array.isArray(strs)) { for (const s of strs) { try { - result.push(URI.parse(s)); + result.push({ uri: URI.parse(s), typeHint }); } catch (e) { // ignore } } } - return result; } private onRequest(req: http.IncomingMessage, res: http.ServerResponse): void { @@ -654,7 +687,10 @@ class CLIServer { if (folderURIs && folderURIs.length && !forceReuseWindow) { forceNewWindow = true; } - this._commands.executeCommand('_files.windowOpen', { folderURIs: this.toURIs(folderURIs), fileURIs: this.toURIs(fileURIs), forceNewWindow, diffMode, addMode, forceReuseWindow }); + const urisToOpen: IURIToOpen[] = []; + this.collectURIToOpen(folderURIs, 'folder', urisToOpen); + this.collectURIToOpen(fileURIs, 'file', urisToOpen); + this._commands.executeCommand('_files.windowOpen', { urisToOpen, forceNewWindow, diffMode, addMode, forceReuseWindow }); } res.writeHead(200); res.end(); diff --git a/src/vs/workbench/api/node/extHostTypeConverters.ts b/src/vs/workbench/api/node/extHostTypeConverters.ts index 81e79899972..3cc5c1cb05b 100644 --- a/src/vs/workbench/api/node/extHostTypeConverters.ts +++ b/src/vs/workbench/api/node/extHostTypeConverters.ts @@ -5,7 +5,7 @@ import * as modes from 'vs/editor/common/modes'; import * as types from './extHostTypes'; -import * as search from 'vs/workbench/parts/search/common/search'; +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 { IDecorationOptions, IThemeDecorationRenderOptions, IDecorationRenderOptions, IContentDecorationRenderOptions } from 'vs/editor/common/editorCommon'; diff --git a/src/vs/workbench/api/node/extHostWebview.ts b/src/vs/workbench/api/node/extHostWebview.ts index a39904bd0ff..0906dd92aad 100644 --- a/src/vs/workbench/api/node/extHostWebview.ts +++ b/src/vs/workbench/api/node/extHostWebview.ts @@ -80,7 +80,7 @@ export class ExtHostWebviewPanel implements vscode.WebviewPanel { private readonly _proxy: MainThreadWebviewsShape; private readonly _viewType: string; private _title: string; - private _iconPath: IconPath; + private _iconPath?: IconPath; private readonly _options: vscode.WebviewPanelOptions; private readonly _webview: ExtHostWebview; diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 00fa6ec1cf1..7175e06d423 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -20,7 +20,7 @@ import { Severity } from 'vs/platform/notification/common/notification'; import { IRawFileMatch2, resultIsMatch } from 'vs/platform/search/common/search'; import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { Range, RelativePattern } from 'vs/workbench/api/node/extHostTypes'; -import { ITextQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; +import { ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import * as vscode from 'vscode'; import { ExtHostWorkspaceShape, IMainContext, IWorkspaceData, MainContext, MainThreadMessageServiceShape, MainThreadWorkspaceShape } from './extHost.protocol'; diff --git a/src/vs/workbench/api/shared/editor.ts b/src/vs/workbench/api/shared/editor.ts index 4dcc9e7be85..4797605ba5b 100644 --- a/src/vs/workbench/api/shared/editor.ts +++ b/src/vs/workbench/api/shared/editor.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IEditorGroupsService, IEditorGroup, GroupsOrder } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { GroupIdentifier } from 'vs/workbench/common/editor'; import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/browser/actions/layoutActions.ts b/src/vs/workbench/browser/actions/layoutActions.ts index 95e2db05534..e1112d03cbd 100644 --- a/src/vs/workbench/browser/actions/layoutActions.ts +++ b/src/vs/workbench/browser/actions/layoutActions.ts @@ -13,7 +13,7 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IPartService, Parts, Position } from 'vs/workbench/services/part/common/partService'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { IEditorGroupsService, GroupOrientation } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, GroupOrientation } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/browser/actions/navigationActions.ts b/src/vs/workbench/browser/actions/navigationActions.ts index 6a83374bacb..5e80d459df0 100644 --- a/src/vs/workbench/browser/actions/navigationActions.ts +++ b/src/vs/workbench/browser/actions/navigationActions.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; import { Action } from 'vs/base/common/actions'; -import { IEditorGroupsService, GroupDirection, GroupLocation, IFindGroupScope } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, GroupDirection, GroupLocation, IFindGroupScope } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService, Parts, Position as PartPosition } from 'vs/workbench/services/part/common/partService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; @@ -78,7 +78,11 @@ abstract class BaseNavigationAction extends Action { return Promise.resolve(false); } - const activeViewletId = this.viewletService.getActiveViewlet().getId(); + const activeViewlet = this.viewletService.getActiveViewlet(); + if (!activeViewlet) { + return Promise.resolve(false); + } + const activeViewletId = activeViewlet.getId(); return this.viewletService.openViewlet(activeViewletId, true) .then(value => value === null ? false : value); diff --git a/src/vs/workbench/browser/actions/workspaceActions.ts b/src/vs/workbench/browser/actions/workspaceActions.ts index 9cfdc373556..a8847e2cbb7 100644 --- a/src/vs/workbench/browser/actions/workspaceActions.ts +++ b/src/vs/workbench/browser/actions/workspaceActions.ts @@ -256,7 +256,7 @@ export class DuplicateWorkspaceInNewWindowAction extends Action { return this.workspacesService.createUntitledWorkspace(folders).then(newWorkspace => { return this.workspaceEditingService.copyWorkspaceSettings(newWorkspace).then(() => { - return this.windowService.openWindow([URI.file(newWorkspace.configPath)], { forceNewWindow: true }); + return this.windowService.openWindow([{ uri: newWorkspace.configPath, typeHint: 'file' }], { forceNewWindow: true }); }); }); } diff --git a/src/vs/workbench/browser/dnd.ts b/src/vs/workbench/browser/dnd.ts index e73acff052b..04f21cb6385 100644 --- a/src/vs/workbench/browser/dnd.ts +++ b/src/vs/workbench/browser/dnd.ts @@ -6,7 +6,7 @@ import { WORKSPACE_EXTENSION, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { extname, basename, normalize } from 'vs/base/common/paths'; import { IFileService } from 'vs/platform/files/common/files'; -import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; @@ -30,7 +30,7 @@ import { basenameOrAuthority } from 'vs/base/common/resources'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; import { Disposable } from 'vs/base/common/lifecycle'; import { addDisposableListener, EventType } from 'vs/base/browser/dom'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; export interface IDraggedResource { resource: URI; @@ -60,8 +60,8 @@ export interface IDraggedEditor extends IDraggedResource { export interface ISerializedDraggedEditor { resource: string; - backupResource: string; - viewState: IEditorViewState; + backupResource?: string; + viewState: IEditorViewState | null; } export const CodeDataTransfers = { @@ -71,7 +71,7 @@ export const CodeDataTransfers = { export function extractResources(e: DragEvent, externalOnly?: boolean): Array { const resources: Array = []; - if (e.dataTransfer.types.length > 0) { + if (e.dataTransfer && e.dataTransfer.types.length > 0) { // Check for window-to-window DND if (!externalOnly) { @@ -255,7 +255,7 @@ export class ResourcesDropHandler { } private handleWorkspaceFileDrop(fileOnDiskResources: URI[]): Promise { - const workspaceResources: { workspaces: URI[], folders: URI[] } = { + const workspaceResources: { workspaces: IURIToOpen[], folders: IURIToOpen[] } = { workspaces: [], folders: [] }; @@ -264,7 +264,7 @@ export class ResourcesDropHandler { // Check for Workspace if (extname(fileOnDiskResource.fsPath) === `.${WORKSPACE_EXTENSION}`) { - workspaceResources.workspaces.push(fileOnDiskResource); + workspaceResources.workspaces.push({ uri: fileOnDiskResource, typeHint: 'file' }); return undefined; } @@ -272,7 +272,7 @@ export class ResourcesDropHandler { // Check for Folder return this.fileService.resolveFile(fileOnDiskResource).then(stat => { if (stat.isDirectory) { - workspaceResources.folders.push(stat.resource); + workspaceResources.folders.push({ uri: stat.resource, typeHint: 'folder' }); } }, error => undefined); })).then(_ => { @@ -286,22 +286,24 @@ export class ResourcesDropHandler { // Pass focus to window this.windowService.focusWindow(); - let workspacesToOpen: Promise; + let workspacesToOpen: Promise | undefined; // Open in separate windows if we drop workspaces or just one folder if (workspaces.length > 0 || folders.length === 1) { - workspacesToOpen = Promise.resolve([...workspaces, ...folders].map(resources => resources)); + workspacesToOpen = Promise.resolve([...workspaces, ...folders]); } // Multiple folders: Create new workspace with folders and open else if (folders.length > 1) { - workspacesToOpen = this.workspacesService.createUntitledWorkspace(folders.map(folder => ({ uri: folder }))).then(workspace => [URI.file(workspace.configPath)]); + workspacesToOpen = this.workspacesService.createUntitledWorkspace(folders).then(workspace => [{ uri: workspace.configPath, typeHint: 'file' }]); } // Open - workspacesToOpen.then(workspaces => { - this.windowService.openWindow(workspaces, { forceReuseWindow: true }); - }); + if (workspacesToOpen) { + workspacesToOpen.then(workspaces => { + this.windowService.openWindow(workspaces, { forceReuseWindow: true }); + }); + } return true; }); @@ -317,16 +319,16 @@ export class SimpleFileResourceDragAndDrop extends DefaultDragAndDrop { super(); } - getDragURI(tree: ITree, obj: any): string { + getDragURI(tree: ITree, obj: any): string | null { const resource = this.toResource(obj); if (resource) { return resource.toString(); } - return undefined; + return null; } - getDragLabel(tree: ITree, elements: any[]): string { + getDragLabel(tree: ITree, elements: any[]): string | null { if (elements.length > 1) { return String(elements.length); } @@ -336,7 +338,7 @@ export class SimpleFileResourceDragAndDrop extends DefaultDragAndDrop { return basenameOrAuthority(resource); } - return undefined; + return null; } onDragStart(tree: ITree, data: IDragAndDropData, originalEvent: DragMouseEvent): void { @@ -350,7 +352,7 @@ export class SimpleFileResourceDragAndDrop extends DefaultDragAndDrop { } export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: (URI | { resource: URI, isDirectory: boolean })[], event: DragMouseEvent | DragEvent): void { - if (resources.length === 0) { + if (resources.length === 0 || !event.dataTransfer) { return; } @@ -388,7 +390,7 @@ export function fillResourceDataTransfers(accessor: ServicesAccessor, resources: files.forEach(file => { // Try to find editor view state from the visible editors that match given resource - let viewState: IEditorViewState; + let viewState: IEditorViewState | null = null; const textEditorWidgets = editorService.visibleTextEditorWidgets; for (const textEditorWidget of textEditorWidgets) { if (isCodeEditor(textEditorWidget)) { @@ -420,8 +422,8 @@ export class LocalSelectionTransfer { private static readonly INSTANCE = new LocalSelectionTransfer(); - private data: T[]; - private proto: T; + private data?: T[]; + private proto?: T; private constructor() { // protect against external instantiation @@ -442,7 +444,7 @@ export class LocalSelectionTransfer { } } - getData(proto: T): T[] { + getData(proto: T): T[] | undefined { if (this.hasData(proto)) { return this.data; } diff --git a/src/vs/workbench/browser/labels.ts b/src/vs/workbench/browser/labels.ts index 7c0a15b86f0..e38e0ce1137 100644 --- a/src/vs/workbench/browser/labels.ts +++ b/src/vs/workbench/browser/labels.ts @@ -27,7 +27,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti export interface IResourceLabelProps { resource?: uri; - name: string; + name?: string; description?: string; } @@ -223,13 +223,13 @@ class ResourceLabelWidget extends IconLabel { private _onDidRender = this._register(new Emitter()); get onDidRender(): Event { return this._onDidRender.event; } - private label: IResourceLabelProps; - private options: IResourceLabelOptions; - private computedIconClasses: string[]; - private lastKnownConfiguredLangId: string; - private computedPathLabel: string; + private label?: IResourceLabelProps; + private options?: IResourceLabelOptions; + private computedIconClasses?: string[]; + private lastKnownConfiguredLangId?: string; + private computedPathLabel?: string; - private needsRedraw: Redraw; + private needsRedraw?: Redraw; private isHidden: boolean = false; constructor( @@ -303,7 +303,7 @@ class ResourceLabelWidget extends IconLabel { this.render(hasResourceChanged); } - private hasResourceChanged(label: IResourceLabelProps, options: IResourceLabelOptions): boolean { + private hasResourceChanged(label: IResourceLabelProps, options?: IResourceLabelOptions): boolean { const newResource = label ? label.resource : undefined; const oldResource = this.label ? this.label.resource : undefined; @@ -331,15 +331,15 @@ class ResourceLabelWidget extends IconLabel { setEditor(editor: IEditorInput, options?: IResourceLabelOptions): void { this.setResource({ - resource: toResource(editor, { supportSideBySide: true }), - name: editor.getName(), - description: editor.getDescription() + resource: toResource(editor, { supportSideBySide: true }) || undefined, + name: editor.getName() || undefined, + description: editor.getDescription() || undefined }, options); } setFile(resource: uri, options?: IFileLabelOptions): void { const hideLabel = options && options.hideLabel; - let name: string; + let name: string | undefined; if (!hideLabel) { if (options && options.fileKind === FileKind.ROOT_FOLDER) { const workspaceFolder = this.contextService.getWorkspaceFolder(resource); @@ -353,7 +353,7 @@ class ResourceLabelWidget extends IconLabel { } } - let description: string; + let description: string | undefined; const hidePath = (options && options.hidePath) || (resource.scheme === Schemas.untitled && !this.untitledEditorService.hasAssociatedFilePath(resource)); if (!hidePath) { description = this.labelService.getUriLabel(resources.dirname(resource), { relative: true }); diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 7213400c86f..09e3e1b2b10 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -17,7 +17,7 @@ import { memoize } from 'vs/base/common/decorators'; import { NotificationsCenter } from 'vs/workbench/browser/parts/notifications/notificationsCenter'; import { NotificationsToasts } from 'vs/workbench/browser/parts/notifications/notificationsToasts'; import { Dimension, getClientArea, size, position, hide, show } from 'vs/base/browser/dom'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { TitlebarPart } from 'vs/workbench/browser/parts/titlebar/titlebarPart'; import { ActivitybarPart } from 'vs/workbench/browser/parts/activitybar/activitybarPart'; diff --git a/src/vs/workbench/browser/parts/editor/baseEditor.ts b/src/vs/workbench/browser/parts/editor/baseEditor.ts index 0e2df2423a3..47e26d36411 100644 --- a/src/vs/workbench/browser/parts/editor/baseEditor.ts +++ b/src/vs/workbench/browser/parts/editor/baseEditor.ts @@ -8,7 +8,7 @@ import { EditorInput, EditorOptions, IEditor, GroupIdentifier, IEditorMemento } import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { LRUCache } from 'vs/base/common/map'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts index 5f62cfbb159..917a426bdbd 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsControl.ts @@ -41,7 +41,7 @@ import { BreadcrumbElement, EditorBreadcrumbsModel, FileElement } from 'vs/workb import { BreadcrumbsPicker, createBreadcrumbsPicker } from 'vs/workbench/browser/parts/editor/breadcrumbsPicker'; import { SideBySideEditorInput } from 'vs/workbench/common/editor'; import { ACTIVE_GROUP, ACTIVE_GROUP_TYPE, IEditorService, SIDE_GROUP, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; @@ -381,7 +381,7 @@ export class BreadcrumbsControl { } else { pickerArrowOffset = (data.left + (data.width * 0.3)) - x; } - picker.setInput(element, maxHeight, pickerWidth, pickerArrowSize, Math.max(0, pickerArrowOffset)); + picker.show(element, maxHeight, pickerWidth, pickerArrowSize, Math.max(0, pickerArrowOffset)); return { x, y }; }, onHide: (data) => { diff --git a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts index b027e26f87b..b22e048f38e 100644 --- a/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts +++ b/src/vs/workbench/browser/parts/editor/breadcrumbsPicker.ts @@ -8,30 +8,33 @@ import * as dom from 'vs/base/browser/dom'; import { compareFileNames } from 'vs/base/common/comparers'; import { onUnexpectedError } from 'vs/base/common/errors'; import { Emitter, Event } from 'vs/base/common/event'; -import { createMatches, FuzzyScore, fuzzyScore } from 'vs/base/common/filters'; +import { createMatches, FuzzyScore } from 'vs/base/common/filters'; import * as glob from 'vs/base/common/glob'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { join } from 'vs/base/common/paths'; import { basename, dirname, isEqual } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; -import { IDataSource, IFilter, IRenderer, ISorter, ITree } from 'vs/base/parts/tree/browser/tree'; import 'vs/css!./media/breadcrumbscontrol'; import { OutlineElement, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; -import { OutlineDataSource, OutlineItemComparator, OutlineRenderer, OutlineItemCompareType } from 'vs/editor/contrib/documentSymbols/outlineTree'; -import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { FileKind, IFileService, IFileStat } from 'vs/platform/files/common/files'; import { IConstructorSignature1, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { HighlightingWorkbenchTree, IHighlighter, IHighlightingTreeConfiguration, IHighlightingTreeOptions } from 'vs/platform/list/browser/listService'; +import { WorkbenchDataTree, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; import { breadcrumbsPickerBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { IWorkspace, IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ResourceLabels, IResourceLabel, DEFAULT_LABELS_CONTAINER } from 'vs/workbench/browser/labels'; import { BreadcrumbsConfig } from 'vs/workbench/browser/parts/editor/breadcrumbs'; import { BreadcrumbElement, FileElement } from 'vs/workbench/browser/parts/editor/breadcrumbsModel'; import { IFileIconTheme, IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IAsyncDataSource, ITreeRenderer, ITreeNode, ITreeFilter, TreeVisibility, ITreeSorter } from 'vs/base/browser/ui/tree/tree'; +import { OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItemComparator, OutlineIdentityProvider, OutlineNavigationLabelProvider, OutlineDataSource, OutlineSortOrder, OutlineItem } from 'vs/editor/contrib/documentSymbols/outlineTree'; +import { IIdentityProvider, IListVirtualDelegate, IKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/list/list'; export function createBreadcrumbsPicker(instantiationService: IInstantiationService, parent: HTMLElement, element: BreadcrumbElement): BreadcrumbsPicker { - let ctor: IConstructorSignature1 = element instanceof FileElement ? BreadcrumbsFilePicker : BreadcrumbsOutlinePicker; + const ctor: IConstructorSignature1 = element instanceof FileElement + ? BreadcrumbsFilePicker + : BreadcrumbsOutlinePicker; + return instantiationService.createInstance(ctor, parent); } @@ -43,16 +46,18 @@ interface ILayoutInfo { inputHeight: number; } +type Tree = WorkbenchDataTree | WorkbenchAsyncDataTree; + export abstract class BreadcrumbsPicker { protected readonly _disposables = new Array(); protected readonly _domNode: HTMLDivElement; - protected readonly _arrow: HTMLDivElement; - protected readonly _treeContainer: HTMLDivElement; - protected readonly _tree: HighlightingWorkbenchTree; - protected readonly _focus: dom.IFocusTracker; - protected readonly _symbolSortOrder: BreadcrumbsConfig<'position' | 'name' | 'type'>; - private _layoutInfo: ILayoutInfo; + protected _arrow: HTMLDivElement; + protected _treeContainer: HTMLDivElement; + protected _tree: Tree; + protected _fakeEvent = new UIEvent('fakeEvent'); + protected _focus: dom.IFocusTracker; + protected _layoutInfo: ILayoutInfo; private readonly _onDidPickElement = new Emitter<{ target: any, payload: any }>(); readonly onDidPickElement: Event<{ target: any, payload: any }> = this._onDidPickElement.event; @@ -64,7 +69,7 @@ export abstract class BreadcrumbsPicker { parent: HTMLElement, @IInstantiationService protected readonly _instantiationService: IInstantiationService, @IWorkbenchThemeService protected readonly _themeService: IWorkbenchThemeService, - @IConfigurationService private readonly _configurationService: IConfigurationService, + @IConfigurationService protected readonly _configurationService: IConfigurationService, ) { this._domNode = document.createElement('div'); this._domNode.className = 'monaco-breadcrumbs-picker show-file-icons'; @@ -73,6 +78,16 @@ export abstract class BreadcrumbsPicker { this._focus = dom.trackFocus(this._domNode); this._focus.onDidBlur(_ => this._onDidPickElement.fire({ target: undefined, payload: undefined }), undefined, this._disposables); this._disposables.push(onDidChangeZoomLevel(_ => this._onDidPickElement.fire({ target: undefined, payload: undefined }))); + } + + dispose(): void { + dispose(this._disposables); + this._onDidPickElement.dispose(); + this._tree.dispose(); + this._focus.dispose(); + } + + show(input: any, maxHeight: number, width: number, arrowSize: number, arrowOffset: number): void { const theme = this._themeService.getTheme(); const color = theme.getColor(breadcrumbsPickerBackground); @@ -88,100 +103,45 @@ export abstract class BreadcrumbsPicker { this._treeContainer.style.boxShadow = `0px 5px 8px ${this._themeService.getTheme().getColor(widgetShadow)}`; this._domNode.appendChild(this._treeContainer); - this._symbolSortOrder = BreadcrumbsConfig.SymbolSortOrder.bindTo(this._configurationService); const filterConfig = BreadcrumbsConfig.FilterOnType.bindTo(this._configurationService); this._disposables.push(filterConfig); - const treeConfig = this._completeTreeConfiguration({ dataSource: undefined, renderer: undefined, highlighter: undefined }); - this._tree = this._instantiationService.createInstance( - HighlightingWorkbenchTree, - this._treeContainer, - treeConfig, - { useShadows: false, filterOnType: filterConfig.getValue(), showTwistie: false, twistiePixels: 12 }, - { placeholder: localize('placeholder', "Find") } - ); + this._tree = this._createTree(this._treeContainer); + this._disposables.push(this._tree.onDidChangeSelection(e => { - if (e.payload !== this._tree) { - const target = this._getTargetFromEvent(e.selection[0], e.payload); + if (e.browserEvent !== this._fakeEvent) { + const target = this._getTargetFromEvent(e.elements[0], e.browserEvent); if (target) { setTimeout(_ => {// need to debounce here because this disposes the tree and the tree doesn't like to be disposed on click - this._onDidPickElement.fire({ target, payload: e.payload }); + this._onDidPickElement.fire({ target, payload: undefined }); }, 0); } } })); this._disposables.push(this._tree.onDidChangeFocus(e => { - const target = this._getTargetFromEvent(e.focus, e.payload); + const target = this._getTargetFromEvent(e.elements[0], e.browserEvent); if (target) { - this._onDidFocusElement.fire({ target, payload: e.payload }); + this._onDidFocusElement.fire({ target, payload: undefined }); } })); - this._disposables.push(this._tree.onDidStartFiltering(() => { - this._layoutInfo.inputHeight = 36; + this._disposables.push(this._tree.onDidChangeContentHeight(() => { this._layout(); })); - this._disposables.push(this._tree.onDidExpandItem(() => { - this._layout(); - })); - this._disposables.push(this._tree.onDidCollapseItem(() => { - this._layout(); - })); - - // tree icon theme specials - dom.addClass(this._treeContainer, 'file-icon-themable-tree'); - dom.addClass(this._treeContainer, 'show-file-icons'); - const onFileIconThemeChange = (fileIconTheme: IFileIconTheme) => { - dom.toggleClass(this._treeContainer, 'align-icons-and-twisties', fileIconTheme.hasFileIcons && !fileIconTheme.hasFolderIcons); - dom.toggleClass(this._treeContainer, 'hide-arrows', fileIconTheme.hidesExplorerArrows === true); - }; - this._disposables.push(_themeService.onDidFileIconThemeChange(onFileIconThemeChange)); - onFileIconThemeChange(_themeService.getFileIconTheme()); this._domNode.focus(); - } + this._layoutInfo = { maxHeight, width, arrowSize, arrowOffset, inputHeight: 0 }; - dispose(): void { - dispose(this._disposables); - this._onDidPickElement.dispose(); - this._tree.dispose(); - this._focus.dispose(); - this._symbolSortOrder.dispose(); - } - - setInput(input: any, maxHeight: number, width: number, arrowSize: number, arrowOffset: number): void { - let actualInput = this._getInput(input); - this._tree.setInput(actualInput).then(() => { - - this._layoutInfo = { maxHeight, width, arrowSize, arrowOffset, inputHeight: 0 }; + this._setInput(input).then(() => { this._layout(); - - // use proper selection, reveal - let selection = this._getInitialSelection(this._tree, input); - if (selection) { - return this._tree.reveal(selection, 0.5).then(() => { - this._tree.setSelection([selection], this._tree); - this._tree.setFocus(selection); - this._tree.domFocus(); - }); - } else { - this._tree.focusFirst(); - this._tree.setSelection([this._tree.getFocus()], this._tree); - this._tree.domFocus(); - return Promise.resolve(null); - } - }, onUnexpectedError); + }).catch(onUnexpectedError); } - private _layout(info: ILayoutInfo = this._layoutInfo): void { + protected _layout(info: ILayoutInfo = this._layoutInfo): void { - let count = 0; - let nav = this._tree.getNavigator(undefined, false); - while (nav.next() && count < 13) { count += 1; } - - let headerHeight = 2 * info.arrowSize; - let treeHeight = Math.min(info.maxHeight - headerHeight, count * 22); - let totalHeight = treeHeight + headerHeight; + const headerHeight = 2 * info.arrowSize; + const treeHeight = Math.min(info.maxHeight - headerHeight, this._tree.visibleNodeCount * 22); + const totalHeight = treeHeight + headerHeight; this._domNode.style.height = `${totalHeight}px`; this._domNode.style.width = `${info.width}px`; @@ -195,23 +155,24 @@ export abstract class BreadcrumbsPicker { } - protected abstract _getInput(input: BreadcrumbElement): any; - protected abstract _getInitialSelection(tree: ITree, input: BreadcrumbElement): any; - protected abstract _completeTreeConfiguration(config: IHighlightingTreeConfiguration): IHighlightingTreeConfiguration; - protected abstract _getTargetFromEvent(element: any, payload: any): any | undefined; + protected abstract _setInput(element: BreadcrumbElement): Promise; + protected abstract _createTree(container: HTMLElement): Tree; + protected abstract _getTargetFromEvent(element: any, payload: UIEvent): any | undefined; } //#region - Files -export class FileDataSource implements IDataSource { +class FileVirtualDelegate implements IListVirtualDelegate { + getHeight(_element: IFileStat | IWorkspaceFolder) { + return 22; + } + getTemplateId(_element: IFileStat | IWorkspaceFolder): string { + return 'FileStat'; + } +} - private readonly _parents = new WeakMap(); - - constructor( - @IFileService private readonly _fileService: IFileService, - ) { } - - getId(tree: ITree, element: IWorkspace | IWorkspaceFolder | IFileStat | URI): string { +class FileIdentityProvider implements IIdentityProvider { + getId(element: IWorkspace | IWorkspaceFolder | IFileStat | URI): { toString(): string; } { if (URI.isUri(element)) { return element.toString(); } else if (IWorkspace.isIWorkspace(element)) { @@ -222,12 +183,26 @@ export class FileDataSource implements IDataSource { return element.resource.toString(); } } +} - hasChildren(tree: ITree, element: IWorkspace | IWorkspaceFolder | IFileStat | URI): boolean { - return URI.isUri(element) || IWorkspace.isIWorkspace(element) || IWorkspaceFolder.isIWorkspaceFolder(element) || element.isDirectory; + +class FileDataSource implements IAsyncDataSource { + + private readonly _parents = new WeakMap(); + + constructor( + @IFileService private readonly _fileService: IFileService, + ) { } + + hasChildren(element: IWorkspace | URI | IWorkspaceFolder | IFileStat): boolean { + return URI.isUri(element) + || IWorkspace.isIWorkspace(element) + || IWorkspaceFolder.isIWorkspaceFolder(element) + || element.isDirectory; } - getChildren(tree: ITree, element: IWorkspace | IWorkspaceFolder | IFileStat | URI): Promise { + getChildren(element: IWorkspace | URI | IWorkspaceFolder | IFileStat): Promise<(IWorkspaceFolder | IFileStat)[]> { + if (IWorkspace.isIWorkspace(element)) { return Promise.resolve(element.folders).then(folders => { for (let child of folders) { @@ -251,13 +226,56 @@ export class FileDataSource implements IDataSource { return stat.children; }); } +} - getParent(tree: ITree, element: IWorkspace | URI | IWorkspaceFolder | IFileStat): Promise { - return Promise.resolve(this._parents.get(element)); +class FileRenderer implements ITreeRenderer { + + readonly templateId: string = 'FileStat'; + + constructor( + private readonly _labels: ResourceLabels, + @IConfigurationService private readonly _configService: IConfigurationService, + ) { } + + + renderTemplate(container: HTMLElement): IResourceLabel { + return this._labels.create(container, { supportHighlights: true }); + } + + renderElement(node: ITreeNode, index: number, templateData: IResourceLabel): void { + const fileDecorations = this._configService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations'); + const { element } = node; + let resource: URI; + let fileKind: FileKind; + if (IWorkspaceFolder.isIWorkspaceFolder(element)) { + resource = element.uri; + fileKind = FileKind.ROOT_FOLDER; + } else { + resource = element.resource; + fileKind = element.isDirectory ? FileKind.FOLDER : FileKind.FILE; + } + templateData.setFile(resource, { + fileKind, + hidePath: true, + fileDecorations: fileDecorations, + matches: createMatches(node.filterData), + extraClasses: ['picker-item'] + }); + } + + disposeTemplate(templateData: IResourceLabel): void { + templateData.dispose(); } } -export class FileFilter implements IFilter { +class FileNavigationLabelProvider implements IKeyboardNavigationLabelProvider { + + getKeyboardNavigationLabel(element: IWorkspaceFolder | IFileStat): { toString(): string; } { + return element.name; + } +} + +class FileFilter implements ITreeFilter { private readonly _cachedExpressions = new Map(); private readonly _disposables: IDisposable[] = []; @@ -301,7 +319,7 @@ export class FileFilter implements IFilter { dispose(this._disposables); } - isVisible(tree: ITree, element: IWorkspaceFolder | IFileStat): boolean { + filter(element: IWorkspaceFolder | IFileStat, _parentVisibility: TreeVisibility): boolean { if (IWorkspaceFolder.isIWorkspaceFolder(element)) { // not a file return true; @@ -317,72 +335,19 @@ export class FileFilter implements IFilter { } } -export class FileHighlighter implements IHighlighter { - getHighlightsStorageKey(element: IFileStat | IWorkspaceFolder): string { - return IWorkspaceFolder.isIWorkspaceFolder(element) ? element.uri.toString() : element.resource.toString(); - } - getHighlights(tree: ITree, element: IFileStat | IWorkspaceFolder, pattern: string): FuzzyScore { - return fuzzyScore(pattern, pattern.toLowerCase(), 0, element.name, element.name.toLowerCase(), 0, true); - } -} -export class FileRenderer implements IRenderer { - - constructor( - private readonly _labels: ResourceLabels, - @IConfigurationService private readonly _configService: IConfigurationService, - ) { } - - getHeight(tree: ITree, element: any): number { - return 22; - } - - getTemplateId(tree: ITree, element: any): string { - return 'FileStat'; - } - - renderTemplate(tree: ITree, templateId: string, container: HTMLElement) { - return this._labels.create(container, { supportHighlights: true }); - } - - renderElement(tree: ITree, element: IFileStat | IWorkspaceFolder, templateId: string, templateData: IResourceLabel): void { - let fileDecorations = this._configService.getValue<{ colors: boolean, badges: boolean }>('explorer.decorations'); - let resource: URI; - let fileKind: FileKind; - if (IWorkspaceFolder.isIWorkspaceFolder(element)) { - resource = element.uri; - fileKind = FileKind.ROOT_FOLDER; - } else { - resource = element.resource; - fileKind = element.isDirectory ? FileKind.FOLDER : FileKind.FILE; - } - templateData.setFile(resource, { - fileKind, - hidePath: true, - fileDecorations: fileDecorations, - matches: createMatches((tree as HighlightingWorkbenchTree).getHighlighterScore(element)), - extraClasses: ['picker-item'] - }); - } - - disposeTemplate(tree: ITree, templateId: string, templateData: IResourceLabel): void { - templateData.dispose(); - } -} - -export class FileSorter implements ISorter { - compare(tree: ITree, a: IFileStat | IWorkspaceFolder, b: IFileStat | IWorkspaceFolder): number { +export class FileSorter implements ITreeSorter { + compare(a: IFileStat | IWorkspaceFolder, b: IFileStat | IWorkspaceFolder): number { if (IWorkspaceFolder.isIWorkspaceFolder(a) && IWorkspaceFolder.isIWorkspaceFolder(b)) { return a.index - b.index; + } + if ((a as IFileStat).isDirectory === (b as IFileStat).isDirectory) { + // same type -> compare on names + return compareFileNames(a.name, b.name); + } else if ((a as IFileStat).isDirectory) { + return -1; } else { - if ((a as IFileStat).isDirectory === (b as IFileStat).isDirectory) { - // same type -> compare on names - return compareFileNames(a.name, b.name); - } else if ((a as IFileStat).isDirectory) { - return -1; - } else { - return 1; - } + return 1; } } } @@ -399,44 +364,69 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { super(parent, instantiationService, themeService, configService); } - protected _getInput(input: BreadcrumbElement): any { - let { uri, kind } = (input as FileElement); - if (kind === FileKind.ROOT_FOLDER) { - return this._workspaceService.getWorkspace(); - } else { - return dirname(uri); - } - } + _createTree(container: HTMLElement) { - protected _getInitialSelection(tree: ITree, input: BreadcrumbElement): any { - let { uri } = (input as FileElement); - let nav = tree.getNavigator(); - while (nav.next()) { - let cur = nav.current(); - let candidate = IWorkspaceFolder.isIWorkspaceFolder(cur) ? cur.uri : (cur as IFileStat).resource; - if (isEqual(uri, candidate)) { - return cur; - } - } - return undefined; - } + // tree icon theme specials + dom.addClass(this._treeContainer, 'file-icon-themable-tree'); + dom.addClass(this._treeContainer, 'show-file-icons'); + const onFileIconThemeChange = (fileIconTheme: IFileIconTheme) => { + dom.toggleClass(this._treeContainer, 'align-icons-and-twisties', fileIconTheme.hasFileIcons && !fileIconTheme.hasFolderIcons); + dom.toggleClass(this._treeContainer, 'hide-arrows', fileIconTheme.hidesExplorerArrows === true); + }; + this._disposables.push(this._themeService.onDidFileIconThemeChange(onFileIconThemeChange)); + onFileIconThemeChange(this._themeService.getFileIconTheme()); - protected _completeTreeConfiguration(config: IHighlightingTreeConfiguration): IHighlightingTreeConfiguration { - // todo@joh reuse explorer implementations? - const filter = this._instantiationService.createInstance(FileFilter); - this._disposables.push(filter); - - config.dataSource = this._instantiationService.createInstance(FileDataSource); const labels = this._instantiationService.createInstance(ResourceLabels, DEFAULT_LABELS_CONTAINER /* TODO@Jo visibility propagation */); this._disposables.push(labels); - config.renderer = this._instantiationService.createInstance(FileRenderer, labels); - config.sorter = new FileSorter(); - config.highlighter = new FileHighlighter(); - config.filter = filter; - return config; + + return this._instantiationService.createInstance( + WorkbenchAsyncDataTree, + container, + new FileVirtualDelegate(), + [this._instantiationService.createInstance(FileRenderer, labels)], + this._instantiationService.createInstance(FileDataSource), + { + filterOnType: true, + multipleSelectionSupport: false, + sorter: new FileSorter(), + filter: this._instantiationService.createInstance(FileFilter), + identityProvider: new FileIdentityProvider(), + keyboardNavigationLabelProvider: new FileNavigationLabelProvider() + } + ) as WorkbenchAsyncDataTree; + } + + _setInput(element: BreadcrumbElement): Promise { + const { uri, kind } = (element as FileElement); + let input: IWorkspace | URI; + if (kind === FileKind.ROOT_FOLDER) { + input = this._workspaceService.getWorkspace(); + } else { + input = dirname(uri); + } + + const tree = this._tree as WorkbenchAsyncDataTree; + return tree.setInput(input).then(() => { + let focusElement: IWorkspaceFolder | IFileStat; + for (const { element } of tree.getNode().children) { + if (IWorkspaceFolder.isIWorkspaceFolder(element) && isEqual(element.uri, uri)) { + focusElement = element; + break; + } else if (isEqual((element as IFileStat).resource, uri)) { + focusElement = element as IFileStat; + break; + } + } + if (focusElement) { + tree.reveal(focusElement, 0.5); + tree.setFocus([focusElement], this._fakeEvent); + } + tree.domFocus(); + }); } protected _getTargetFromEvent(element: any, _payload: any): any | undefined { + // todo@joh if (element && !IWorkspaceFolder.isIWorkspaceFolder(element) && !(element as IFileStat).isDirectory) { return new FileElement((element as IFileStat).resource, FileKind.FILE); } @@ -446,52 +436,77 @@ export class BreadcrumbsFilePicker extends BreadcrumbsPicker { //#region - Symbols -class OutlineHighlighter implements IHighlighter { - getHighlights(tree: ITree, element: OutlineElement, pattern: string): FuzzyScore { - OutlineModel.get(element).updateMatches(pattern); - return element.score; - } -} - export class BreadcrumbsOutlinePicker extends BreadcrumbsPicker { - protected _getInput(input: BreadcrumbElement): any { - let element = input as TreeElement; - let model = OutlineModel.get(element); - model.updateMatches(''); - return model; + protected readonly _symbolSortOrder: BreadcrumbsConfig<'position' | 'name' | 'type'>; + + constructor( + parent: HTMLElement, + @IInstantiationService instantiationService: IInstantiationService, + @IWorkbenchThemeService themeService: IWorkbenchThemeService, + @IConfigurationService configurationService: IConfigurationService, + ) { + super(parent, instantiationService, themeService, configurationService); + this._symbolSortOrder = BreadcrumbsConfig.SymbolSortOrder.bindTo(this._configurationService); } - protected _getInitialSelection(_tree: ITree, input: BreadcrumbElement): any { - return input instanceof OutlineModel ? undefined : input; + protected _createTree(container: HTMLElement) { + return this._instantiationService.createInstance( + WorkbenchDataTree, + container, + new OutlineVirtualDelegate(), + [new OutlineGroupRenderer(), this._instantiationService.createInstance(OutlineElementRenderer)], + new OutlineDataSource(), + { + filterOnType: true, + expandOnlyOnTwistieClick: true, + multipleSelectionSupport: false, + sorter: new OutlineItemComparator(this._getOutlineItemCompareType()), + identityProvider: new OutlineIdentityProvider(), + keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider) + } + ) as WorkbenchDataTree; } - protected _completeTreeConfiguration(config: IHighlightingTreeConfiguration): IHighlightingTreeConfiguration { - config.dataSource = this._instantiationService.createInstance(OutlineDataSource); - config.renderer = this._instantiationService.createInstance(OutlineRenderer); - config.sorter = new OutlineItemComparator(this._getOutlineItemComparator()); - config.highlighter = new OutlineHighlighter(); - return config; + dispose(): void { + this._symbolSortOrder.dispose(); + super.dispose(); } - protected _getTargetFromEvent(element: any, payload: any): any | undefined { - if (payload && payload.didClickOnTwistie) { - return; + protected _setInput(input: BreadcrumbElement): Promise { + const element = input as TreeElement; + const model = OutlineModel.get(element); + const tree = this._tree as WorkbenchDataTree; + tree.setInput(model); + + let focusElement: TreeElement; + if (element === model) { + focusElement = tree.navigate().first(); + } else { + focusElement = element; } + tree.reveal(focusElement, 0.5); + tree.setFocus([focusElement], this._fakeEvent); + tree.domFocus(); + + return Promise.resolve(); + } + + protected _getTargetFromEvent(element: any): any | undefined { if (element instanceof OutlineElement) { return element; } } - private _getOutlineItemComparator(): OutlineItemCompareType { + private _getOutlineItemCompareType(): OutlineSortOrder { switch (this._symbolSortOrder.getValue()) { case 'name': - return OutlineItemCompareType.ByName; + return OutlineSortOrder.ByName; case 'type': - return OutlineItemCompareType.ByKind; + return OutlineSortOrder.ByKind; case 'position': default: - return OutlineItemCompareType.ByPosition; + return OutlineSortOrder.ByPosition; } } } diff --git a/src/vs/workbench/browser/parts/editor/editor.ts b/src/vs/workbench/browser/parts/editor/editor.ts index c37f2d0a275..5da1159887f 100644 --- a/src/vs/workbench/browser/parts/editor/editor.ts +++ b/src/vs/workbench/browser/parts/editor/editor.ts @@ -5,7 +5,7 @@ import { GroupIdentifier, IWorkbenchEditorConfiguration, IWorkbenchEditorPartConfiguration, EditorOptions, TextEditorOptions, IEditorInput, IEditorIdentifier, IEditorCloseEvent, IEditor } from 'vs/workbench/common/editor'; import { EditorGroup } from 'vs/workbench/common/editor/editorGroup'; -import { IEditorGroup, GroupDirection, IAddGroupOptions, IMergeGroupOptions, GroupsOrder, IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, GroupDirection, IAddGroupOptions, IMergeGroupOptions, GroupsOrder, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IDisposable } from 'vs/base/common/lifecycle'; import { Dimension } from 'vs/base/browser/dom'; import { Event } from 'vs/base/common/event'; diff --git a/src/vs/workbench/browser/parts/editor/editorActions.ts b/src/vs/workbench/browser/parts/editor/editorActions.ts index cf8c79ab7fe..d2c83f8e88d 100644 --- a/src/vs/workbench/browser/parts/editor/editorActions.ts +++ b/src/vs/workbench/browser/parts/editor/editorActions.ts @@ -18,7 +18,7 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { CLOSE_EDITOR_COMMAND_ID, NAVIGATE_ALL_EDITORS_GROUP_PREFIX, MOVE_ACTIVE_EDITOR_COMMAND_ID, NAVIGATE_IN_ACTIVE_GROUP_PREFIX, ActiveEditorMoveArguments, SPLIT_EDITOR_LEFT, SPLIT_EDITOR_RIGHT, SPLIT_EDITOR_UP, SPLIT_EDITOR_DOWN, splitEditor, LAYOUT_EDITOR_GROUPS_COMMAND_ID, mergeAllGroups } from 'vs/workbench/browser/parts/editor/editorCommands'; -import { IEditorGroupsService, IEditorGroup, GroupsArrangement, EditorsOrder, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsArrangement, EditorsOrder, GroupLocation, GroupDirection, preferredSideBySideGroupDirection, IFindGroupScope, GroupOrientation, EditorGroupLayout, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/browser/parts/editor/editorCommands.ts b/src/vs/workbench/browser/parts/editor/editorCommands.ts index 15a9d7671ee..9a22dbc334b 100644 --- a/src/vs/workbench/browser/parts/editor/editorCommands.ts +++ b/src/vs/workbench/browser/parts/editor/editorCommands.ts @@ -17,7 +17,7 @@ import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { IListService } from 'vs/platform/list/browser/listService'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { distinct } from 'vs/base/common/arrays'; -import { IEditorGroupsService, IEditorGroup, GroupDirection, GroupLocation, GroupsOrder, preferredSideBySideGroupDirection, EditorGroupLayout } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupDirection, GroupLocation, GroupsOrder, preferredSideBySideGroupDirection, EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; @@ -146,7 +146,7 @@ function moveActiveEditorToGroup(args: ActiveEditorMoveArguments, control: IEdit const configurationService = accessor.get(IConfigurationService); const sourceGroup = control.group; - let targetGroup: IEditorGroup; + let targetGroup: IEditorGroup | undefined; switch (args.to) { case 'left': diff --git a/src/vs/workbench/browser/parts/editor/editorControl.ts b/src/vs/workbench/browser/parts/editor/editorControl.ts index 0d6945988f4..a2c347895ff 100644 --- a/src/vs/workbench/browser/parts/editor/editorControl.ts +++ b/src/vs/workbench/browser/parts/editor/editorControl.ts @@ -27,7 +27,7 @@ export class EditorControl extends Disposable { get maximumWidth() { return this._activeControl ? this._activeControl.maximumWidth : DEFAULT_EDITOR_MAX_DIMENSIONS.width; } get maximumHeight() { return this._activeControl ? this._activeControl.maximumHeight : DEFAULT_EDITOR_MAX_DIMENSIONS.height; } - private _onDidFocus: Emitter = this._register(new Emitter()); + private readonly _onDidFocus: Emitter = this._register(new Emitter()); get onDidFocus(): Event { return this._onDidFocus.event; } private _onDidSizeConstraintsChange = this._register(new Emitter<{ width: number; height: number; } | undefined>()); diff --git a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts index 9eca3482658..52272c0d2f4 100644 --- a/src/vs/workbench/browser/parts/editor/editorDropTarget.ts +++ b/src/vs/workbench/browser/parts/editor/editorDropTarget.ts @@ -12,7 +12,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { IEditorIdentifier, EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { isMacintosh } from 'vs/base/common/platform'; -import { GroupDirection, MergeGroupMode } from 'vs/workbench/services/group/common/editorGroupsService'; +import { GroupDirection, MergeGroupMode } from 'vs/workbench/services/editor/common/editorGroupsService'; import { toDisposable } from 'vs/base/common/lifecycle'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { RunOnceScheduler } from 'vs/base/common/async'; diff --git a/src/vs/workbench/browser/parts/editor/editorGroupView.ts b/src/vs/workbench/browser/parts/editor/editorGroupView.ts index edfd5b9aeb5..4abd300bcd0 100644 --- a/src/vs/workbench/browser/parts/editor/editorGroupView.ts +++ b/src/vs/workbench/browser/parts/editor/editorGroupView.ts @@ -16,7 +16,7 @@ import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { editorBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { Themable, EDITOR_GROUP_HEADER_TABS_BORDER, EDITOR_GROUP_HEADER_TABS_BACKGROUND, EDITOR_GROUP_HEADER_NO_TABS_BACKGROUND, EDITOR_GROUP_EMPTY_BACKGROUND, EDITOR_GROUP_FOCUSED_EMPTY_BORDER } from 'vs/workbench/common/theme'; -import { IMoveEditorOptions, ICopyEditorOptions, ICloseEditorsFilter, IGroupChangeEvent, GroupChangeKind, EditorsOrder, GroupsOrder } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IMoveEditorOptions, ICopyEditorOptions, ICloseEditorsFilter, IGroupChangeEvent, GroupChangeKind, EditorsOrder, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { TabsTitleControl } from 'vs/workbench/browser/parts/editor/tabsTitleControl'; import { EditorControl } from 'vs/workbench/browser/parts/editor/editorControl'; import { IProgressService } from 'vs/platform/progress/common/progress'; @@ -66,25 +66,25 @@ export class EditorGroupView extends Themable implements IEditorGroupView { //#region events - private _onDidFocus: Emitter = this._register(new Emitter()); + private readonly _onDidFocus: Emitter = this._register(new Emitter()); get onDidFocus(): Event { return this._onDidFocus.event; } - private _onWillDispose: Emitter = this._register(new Emitter()); + private readonly _onWillDispose: Emitter = this._register(new Emitter()); get onWillDispose(): Event { return this._onWillDispose.event; } - private _onDidGroupChange: Emitter = this._register(new Emitter()); + private readonly _onDidGroupChange: Emitter = this._register(new Emitter()); get onDidGroupChange(): Event { return this._onDidGroupChange.event; } - private _onWillOpenEditor: Emitter = this._register(new Emitter()); + private readonly _onWillOpenEditor: Emitter = this._register(new Emitter()); get onWillOpenEditor(): Event { return this._onWillOpenEditor.event; } - private _onDidOpenEditorFail: Emitter = this._register(new Emitter()); + private readonly _onDidOpenEditorFail: Emitter = this._register(new Emitter()); get onDidOpenEditorFail(): Event { return this._onDidOpenEditorFail.event; } - private _onWillCloseEditor: Emitter = this._register(new Emitter()); + private readonly _onWillCloseEditor: Emitter = this._register(new Emitter()); get onWillCloseEditor(): Event { return this._onWillCloseEditor.event; } - private _onDidCloseEditor: Emitter = this._register(new Emitter()); + private readonly _onDidCloseEditor: Emitter = this._register(new Emitter()); get onDidCloseEditor(): Event { return this._onDidCloseEditor.event; } //#endregion diff --git a/src/vs/workbench/browser/parts/editor/editorPart.ts b/src/vs/workbench/browser/parts/editor/editorPart.ts index e27bd5db5de..2c802fcbe74 100644 --- a/src/vs/workbench/browser/parts/editor/editorPart.ts +++ b/src/vs/workbench/browser/parts/editor/editorPart.ts @@ -9,7 +9,7 @@ import { Part } from 'vs/workbench/browser/part'; import { Dimension, isAncestor, toggleClass, addClass, $ } from 'vs/base/browser/dom'; import { Event, Emitter, Relay } from 'vs/base/common/event'; import { contrastBorder, editorBackground } from 'vs/platform/theme/common/colorRegistry'; -import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, ICopyEditorOptions, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument } from 'vs/workbench/services/group/common/editorGroupsService'; +import { GroupDirection, IAddGroupOptions, GroupsArrangement, GroupOrientation, IMergeGroupOptions, MergeGroupMode, ICopyEditorOptions, GroupsOrder, GroupChangeKind, GroupLocation, IFindGroupScope, EditorGroupLayout, GroupLayoutArgument } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { Direction, SerializableGrid, Sizing, ISerializedGrid, Orientation, GridBranchNode, isGridBranchNode, GridNode, createSerializedGrid, Grid, ISerializableView } from 'vs/base/browser/ui/grid/grid'; import { GroupIdentifier, IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; @@ -88,29 +88,29 @@ export class EditorPart extends Part implements EditorGroupsServiceImpl, IEditor //#region Events - private _onDidLayout: Emitter = this._register(new Emitter()); + private readonly _onDidLayout: Emitter = this._register(new Emitter()); get onDidLayout(): Event { return this._onDidLayout.event; } - private _onDidActiveGroupChange: Emitter = this._register(new Emitter()); + private readonly _onDidActiveGroupChange: Emitter = this._register(new Emitter()); get onDidActiveGroupChange(): Event { return this._onDidActiveGroupChange.event; } - private _onDidAddGroup: Emitter = this._register(new Emitter()); + private readonly _onDidAddGroup: Emitter = this._register(new Emitter()); get onDidAddGroup(): Event { return this._onDidAddGroup.event; } - private _onDidRemoveGroup: Emitter = this._register(new Emitter()); + private readonly _onDidRemoveGroup: Emitter = this._register(new Emitter()); get onDidRemoveGroup(): Event { return this._onDidRemoveGroup.event; } - private _onDidMoveGroup: Emitter = this._register(new Emitter()); + private readonly _onDidMoveGroup: Emitter = this._register(new Emitter()); get onDidMoveGroup(): Event { return this._onDidMoveGroup.event; } private onDidSetGridWidget = this._register(new Emitter<{ width: number; height: number; }>()); private _onDidSizeConstraintsChange = this._register(new Relay<{ width: number; height: number; }>()); get onDidSizeConstraintsChange(): Event<{ width: number; height: number; }> { return Event.any(this.onDidSetGridWidget.event, this._onDidSizeConstraintsChange.event); } - private _onDidPreferredSizeChange: Emitter = this._register(new Emitter()); + private readonly _onDidPreferredSizeChange: Emitter = this._register(new Emitter()); get onDidPreferredSizeChange(): Event { return this._onDidPreferredSizeChange.event; } - private _onDidActivateGroup: Emitter = this._register(new Emitter()); + private readonly _onDidActivateGroup: Emitter = this._register(new Emitter()); get onDidActivateGroup(): Event { return this._onDidActivateGroup.event; } //#endregion @@ -168,7 +168,7 @@ export class EditorPart extends Part implements EditorGroupsServiceImpl, IEditor private enforcedPartOptions: IEditorPartOptions[] = []; - private _onDidEditorPartOptionsChange: Emitter = this._register(new Emitter()); + private readonly _onDidEditorPartOptionsChange: Emitter = this._register(new Emitter()); get onDidEditorPartOptionsChange(): Event { return this._onDidEditorPartOptionsChange.event; } private registerListeners(): void { diff --git a/src/vs/workbench/browser/parts/editor/editorPicker.ts b/src/vs/workbench/browser/parts/editor/editorPicker.ts index fbbf6c9ef05..0731642bb01 100644 --- a/src/vs/workbench/browser/parts/editor/editorPicker.ts +++ b/src/vs/workbench/browser/parts/editor/editorPicker.ts @@ -5,7 +5,6 @@ import 'vs/css!./media/editorpicker'; import * as nls from 'vs/nls'; -import { URI } from 'vs/base/common/uri'; import { IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel'; import { IAutoFocus, Mode, IEntryRunContext, IQuickNavigateConfiguration, IModel } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenModel, QuickOpenEntry, QuickOpenEntryGroup, QuickOpenItemAccessor } from 'vs/base/parts/quickopen/browser/quickOpenModel'; @@ -14,7 +13,7 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { IModelService } from 'vs/editor/common/services/modelService'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup, EditorsOrder, GroupsOrder } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, EditorsOrder, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { EditorInput, toResource } from 'vs/workbench/common/editor'; import { compareItemsByScore, scoreItem, ScorerCache, prepareQuery } from 'vs/base/parts/quickopen/common/quickOpenScorer'; @@ -33,12 +32,12 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { getLabelOptions(): IIconLabelValueOptions { return { - extraClasses: getIconClasses(this.modelService, this.modeService, this.getResource()), + extraClasses: getIconClasses(this.modelService, this.modeService, this.getResource() || undefined), italic: !this._group.isPinned(this.editor) }; } - getLabel(): string { + getLabel() { return this.editor.getName(); } @@ -50,7 +49,7 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { return this._group; } - getResource(): URI { + getResource() { return toResource(this.editor, { supportSideBySide: true }); } @@ -58,7 +57,7 @@ export class EditorPickerEntry extends QuickOpenEntryGroup { return nls.localize('entryAriaLabel', "{0}, editor group picker", this.getLabel()); } - getDescription(): string { + getDescription() { return this.editor.getDescription(); } @@ -109,7 +108,7 @@ export abstract class BaseEditorPicker extends QuickOpenHandler { return false; } - e.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch); + e.setHighlights(itemScore.labelMatch || [], itemScore.descriptionMatch); return true; }); diff --git a/src/vs/workbench/browser/parts/editor/editorWidgets.ts b/src/vs/workbench/browser/parts/editor/editorWidgets.ts index 9b384758177..a59b44c8cd0 100644 --- a/src/vs/workbench/browser/parts/editor/editorWidgets.ts +++ b/src/vs/workbench/browser/parts/editor/editorWidgets.ts @@ -24,7 +24,7 @@ import { isEqual } from 'vs/base/common/resources'; export class FloatingClickWidget extends Widget implements IOverlayWidget { - private _onClick: Emitter = this._register(new Emitter()); + private readonly _onClick: Emitter = this._register(new Emitter()); get onClick(): Event { return this._onClick.event; } private _domNode: HTMLElement; @@ -159,7 +159,7 @@ export class OpenWorkspaceButtonContribution extends Disposable implements IEdit this._register(this.openWorkspaceButton.onClick(() => { const model = this.editor.getModel(); if (model) { - this.windowService.openWindow([model.uri]); + this.windowService.openWindow([{ uri: model.uri, typeHint: 'file' }]); } })); diff --git a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts index 9db3583b18d..a1fb14d5162 100644 --- a/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts +++ b/src/vs/workbench/browser/parts/editor/sideBySideEditor.ts @@ -13,7 +13,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { scrollbarShadow } from 'vs/platform/theme/common/colorRegistry'; import { IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { SplitView, Sizing, Orientation } from 'vs/base/browser/ui/splitview/splitview'; import { Event, Relay, Emitter } from 'vs/base/common/event'; import { IStorageService } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts index 5f957c221a6..a9802ce7ea3 100644 --- a/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts +++ b/src/vs/workbench/browser/parts/editor/tabsTitleControl.ts @@ -31,7 +31,7 @@ import { ResourcesDropHandler, fillResourceDataTransfers, DraggedEditorIdentifie import { Color } from 'vs/base/common/color'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { MergeGroupMode, IMergeGroupOptions } from 'vs/workbench/services/group/common/editorGroupsService'; +import { MergeGroupMode, IMergeGroupOptions } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { addClass, addDisposableListener, hasClass, EventType, EventHelper, removeClass, Dimension, scheduleAtNextAnimationFrame, findParentWithClass, clearNode } from 'vs/base/browser/dom'; import { localize } from 'vs/nls'; diff --git a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts index a987a541f95..b91fc19dbe6 100644 --- a/src/vs/workbench/browser/parts/editor/textDiffEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textDiffEditor.ts @@ -27,7 +27,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { URI } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { EditorMemento } from 'vs/workbench/browser/parts/editor/baseEditor'; diff --git a/src/vs/workbench/browser/parts/editor/textEditor.ts b/src/vs/workbench/browser/parts/editor/textEditor.ts index dadbfe80d4c..3e7ce24a25c 100644 --- a/src/vs/workbench/browser/parts/editor/textEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textEditor.ts @@ -20,7 +20,7 @@ import { ITextFileService, SaveReason, AutoSaveMode } from 'vs/workbench/service import { ITextResourceConfigurationService } from 'vs/editor/common/services/resourceConfiguration'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { isDiffEditor, isCodeEditor, ICodeEditor, getCodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWindowService } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts index 072e5a6f500..7e0e7e52a27 100644 --- a/src/vs/workbench/browser/parts/editor/textResourceEditor.ts +++ b/src/vs/workbench/browser/parts/editor/textResourceEditor.ts @@ -20,7 +20,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { Event } from 'vs/base/common/event'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWindowService } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts index 15a2d68bbf0..e89b7fd021e 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsCenter.ts @@ -16,7 +16,7 @@ import { NotificationsList } from 'vs/workbench/browser/parts/notifications/noti import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { addClass, removeClass, isAncestor, Dimension } from 'vs/base/browser/dom'; import { widgetShadow } from 'vs/platform/theme/common/colorRegistry'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { localize } from 'vs/nls'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { ClearAllNotificationsAction, HideNotificationsCenterAction, NotificationActionRunner } from 'vs/workbench/browser/parts/notifications/notificationsActions'; diff --git a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts index 59a65ed0af1..d3b7e58613f 100644 --- a/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts +++ b/src/vs/workbench/browser/parts/notifications/notificationsToasts.ts @@ -14,7 +14,7 @@ import { IPartService, Parts } from 'vs/workbench/services/part/common/partServi import { Themable, NOTIFICATIONS_TOAST_BORDER } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { widgetShadow } from 'vs/platform/theme/common/colorRegistry'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { NotificationsToastsVisibleContext } from 'vs/workbench/browser/parts/notifications/notificationsCommands'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { localize } from 'vs/nls'; diff --git a/src/vs/workbench/browser/parts/quickinput/quickInput.ts b/src/vs/workbench/browser/parts/quickinput/quickInput.ts index 9926fb1de1f..f0458b7bbff 100644 --- a/src/vs/workbench/browser/parts/quickinput/quickInput.ts +++ b/src/vs/workbench/browser/parts/quickinput/quickInput.ts @@ -29,7 +29,7 @@ import { Emitter, Event } from 'vs/base/common/event'; import { Button } from 'vs/base/browser/ui/button/button'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import Severity from 'vs/base/common/severity'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { ICommandAndKeybindingRule, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { inQuickOpenContext } from 'vs/workbench/browser/parts/quickopen/quickopen'; @@ -115,7 +115,7 @@ class QuickInput implements IQuickInput { this.onDidHideEmitter, ]; - private busyDelay: TimeoutTimer; + private busyDelay: TimeoutTimer | null; constructor(protected ui: QuickInputUI) { } @@ -252,21 +252,21 @@ class QuickInput implements IQuickInput { this.ui.leftActionBar.clear(); const leftButtons = this.buttons.filter(button => button === backButton); this.ui.leftActionBar.push(leftButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => { + const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath!), true, () => { this.onDidTriggerButtonEmitter.fire(button); return Promise.resolve(null); }); - action.tooltip = button.tooltip; + action.tooltip = button.tooltip || ''; return action; }), { icon: true, label: false }); this.ui.rightActionBar.clear(); const rightButtons = this.buttons.filter(button => button !== backButton); this.ui.rightActionBar.push(rightButtons.map((button, index) => { - const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath), true, () => { + const action = new Action(`id-${index}`, '', button.iconClass || getIconClass(button.iconPath!), true, () => { this.onDidTriggerButtonEmitter.fire(button); return Promise.resolve(null); }); - action.tooltip = button.tooltip; + action.tooltip = button.tooltip || ''; return action; }), { icon: true, label: false }); } @@ -311,7 +311,7 @@ class QuickPick extends QuickInput implements IQuickPi private _value = ''; private _placeholder; private onDidChangeValueEmitter = new Emitter(); - private onDidAcceptEmitter = new Emitter(); + private onDidAcceptEmitter = new Emitter(); private _items: Array = []; private itemsUpdated = false; private _canSelectMany = false; @@ -319,11 +319,11 @@ class QuickPick extends QuickInput implements IQuickPi private _matchOnDetail = false; private _activeItems: T[] = []; private activeItemsUpdated = false; - private activeItemsToConfirm: T[] = []; + private activeItemsToConfirm: T[] | null = []; private onDidChangeActiveEmitter = new Emitter(); private _selectedItems: T[] = []; private selectedItemsUpdated = false; - private selectedItemsToConfirm: T[] = []; + private selectedItemsToConfirm: T[] | null = []; private onDidChangeSelectionEmitter = new Emitter(); private onDidTriggerItemButtonEmitter = new Emitter>(); @@ -651,7 +651,7 @@ class InputBox extends QuickInput implements IInputBox { private noValidationMessage = InputBox.noPromptMessage; private _validationMessage: string; private onDidValueChangeEmitter = new Emitter(); - private onDidAcceptEmitter = new Emitter(); + private onDidAcceptEmitter = new Emitter(); constructor(ui: QuickInputUI) { super(ui); @@ -791,7 +791,7 @@ export class QuickInputService extends Component implements IQuickInputService { private onDidTriggerButtonEmitter = this._register(new Emitter()); private keyMods: Writeable = { ctrlCmd: false, alt: false }; - private controller: QuickInput; + private controller: QuickInput | null = null; constructor( @IEnvironmentService private readonly environmentService: IEnvironmentService, @@ -830,7 +830,7 @@ export class QuickInputService extends Component implements IQuickInputService { } private setContextKey(id?: string) { - let key: IContextKey; + let key: IContextKey | undefined; if (id) { key = this.contexts[id]; if (!key) { @@ -971,7 +971,7 @@ export class QuickInputService extends Component implements IQuickInputService { })); this._register(list.onDidChangeFocus(() => { if (this.comboboxAccessibility) { - this.ui.inputBox.setAttribute('aria-activedescendant', this.ui.list.getActiveDescendant()); + this.ui.inputBox.setAttribute('aria-activedescendant', this.ui.list.getActiveDescendant() || ''); } })); @@ -1060,7 +1060,7 @@ export class QuickInputService extends Component implements IQuickInputService { return; } const input = this.createQuickPick(); - let activeItem: T; + let activeItem: T | undefined; const disposables = [ input, input.onDidAccept(() => { @@ -1114,15 +1114,15 @@ export class QuickInputService extends Component implements IQuickInputService { resolve(undefined); }), ]; - input.canSelectMany = options.canPickMany; + input.canSelectMany = !!options.canPickMany; input.placeholder = options.placeHolder; - input.ignoreFocusOut = options.ignoreFocusLost; - input.matchOnDescription = options.matchOnDescription; - input.matchOnDetail = options.matchOnDetail; + input.ignoreFocusOut = !!options.ignoreFocusLost; + input.matchOnDescription = !!options.matchOnDescription; + input.matchOnDetail = !!options.matchOnDetail; input.quickNavigate = options.quickNavigate; input.contextKey = options.contextKey; input.busy = true; - Promise.all([picks, options.activeItem]) + Promise.all[], T | undefined>([picks, options.activeItem]) .then(([items, _activeItem]) => { activeItem = _activeItem; input.busy = false; @@ -1189,12 +1189,12 @@ export class QuickInputService extends Component implements IQuickInputService { resolve(undefined); }), ]; - input.value = options.value; + input.value = options.value || ''; input.valueSelection = options.valueSelection; input.prompt = options.prompt; input.placeholder = options.placeHolder; - input.password = options.password; - input.ignoreFocusOut = options.ignoreFocusLost; + input.password = !!options.password; + input.ignoreFocusOut = !!options.ignoreFocusLost; input.show(); }); } @@ -1259,7 +1259,7 @@ export class QuickInputService extends Component implements IQuickInputService { this.countContainer.style.display = visibilities.count ? '' : 'none'; this.okContainer.style.display = visibilities.ok ? '' : 'none'; this.ui.message.style.display = visibilities.message ? '' : 'none'; - this.ui.list.display(visibilities.list); + this.ui.list.display(!!visibilities.list); this.ui.container.classList[visibilities.checkAll ? 'add' : 'remove']('show-checkboxes'); this.updateLayout(); // TODO } @@ -1271,7 +1271,7 @@ export class QuickInputService extends Component implements IQuickInputService { this.ui.inputBox.setAttribute('role', 'combobox'); this.ui.inputBox.setAttribute('aria-haspopup', 'true'); this.ui.inputBox.setAttribute('aria-autocomplete', 'list'); - this.ui.inputBox.setAttribute('aria-activedescendant', this.ui.list.getActiveDescendant()); + this.ui.inputBox.setAttribute('aria-activedescendant', this.ui.list.getActiveDescendant() || ''); } else { this.ui.inputBox.removeAttribute('role'); this.ui.inputBox.removeAttribute('aria-haspopup'); @@ -1400,7 +1400,7 @@ export const QuickPickManyToggle: ICommandAndKeybindingRule = { id: 'workbench.action.quickPickManyToggle', weight: KeybindingWeight.WorkbenchContrib, when: inQuickOpenContext, - primary: undefined, + primary: 0, handler: accessor => { const quickInputService = accessor.get(IQuickInputService); quickInputService.toggle(); diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenActions.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenActions.ts index 465cc520313..6ff9d1b3496 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenActions.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenActions.ts @@ -54,7 +54,7 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ const registry = Registry.as(ActionExtensions.WorkbenchActions); -const globalQuickOpenKeybinding = { primary: KeyMod.CtrlCmd | KeyCode.KEY_P, secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E], mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_P, secondary: null } }; +const globalQuickOpenKeybinding = { primary: KeyMod.CtrlCmd | KeyCode.KEY_P, secondary: [KeyMod.CtrlCmd | KeyCode.KEY_E], mac: { primary: KeyMod.CtrlCmd | KeyCode.KEY_P, secondary: undefined } }; KeybindingsRegistry.registerKeybindingRule({ id: QUICKOPEN_ACTION_ID, @@ -96,6 +96,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ secondary: [globalQuickOpenKeybinding.secondary[0] | KeyMod.Shift], mac: { primary: globalQuickOpenKeybinding.mac.primary | KeyMod.Shift, - secondary: null + secondary: undefined } }); \ No newline at end of file diff --git a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts index f06b9827812..9b4f8f54995 100644 --- a/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts +++ b/src/vs/workbench/browser/parts/quickopen/quickOpenController.ts @@ -44,7 +44,7 @@ import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Dimension, addClass } from 'vs/base/browser/dom'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ILabelService } from 'vs/platform/label/common/label'; import { timeout } from 'vs/base/common/async'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts index 121bf09bb82..c6712c96605 100644 --- a/src/vs/workbench/browser/parts/titlebar/menubarControl.ts +++ b/src/vs/workbench/browser/parts/titlebar/menubarControl.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { IMenubarMenu, IMenubarMenuItemAction, IMenubarMenuItemSubmenu, IMenubarKeybinding, IMenubarService, IMenubarData, MenubarMenuItem } from 'vs/platform/menubar/common/menubar'; import { IMenuService, MenuId, IMenu, SubmenuItemAction } from 'vs/platform/actions/common/actions'; import { registerThemingParticipant, ITheme, ICssStyleCollector, IThemeService } from 'vs/platform/theme/common/themeService'; -import { IWindowService, MenuBarVisibility, IWindowsService, getTitleBarStyle } from 'vs/platform/windows/common/windows'; +import { IWindowService, MenuBarVisibility, IWindowsService, getTitleBarStyle, URIType } from 'vs/platform/windows/common/windows'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IAction, Action } from 'vs/base/common/actions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -75,8 +75,8 @@ export class MenubarControl extends Disposable { private container: HTMLElement; private recentlyOpened: IRecentlyOpened; - private _onVisibilityChange: Emitter; - private _onFocusStateChange: Emitter; + private readonly _onVisibilityChange: Emitter; + private readonly _onFocusStateChange: Emitter; private static MAX_MENU_RECENT_ENTRIES = 10; @@ -317,26 +317,34 @@ export class MenubarControl extends Disposable { return label; } - private createOpenRecentMenuAction(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI, commandId: string, isFile: boolean): IAction & { uri: URI } { + private createOpenRecentMenuAction(workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | URI, isFile: boolean): IAction & { uri: URI } { let label: string; let uri: URI; + let commandId: string; + let typeHint: URIType | undefined; if (isSingleFolderWorkspaceIdentifier(workspace) && !isFile) { label = this.labelService.getWorkspaceLabel(workspace, { verbose: true }); uri = workspace; + commandId = 'openRecentFolder'; + typeHint = 'folder'; } else if (isWorkspaceIdentifier(workspace)) { label = this.labelService.getWorkspaceLabel(workspace, { verbose: true }); - uri = URI.file(workspace.configPath); + uri = workspace.configPath; + commandId = 'openRecentWorkspace'; + typeHint = 'file'; } else { uri = workspace; label = this.labelService.getUriLabel(uri); + commandId = 'openRecentFile'; + typeHint = 'file'; } const ret: IAction = new Action(commandId, label, undefined, undefined, (event) => { const openInNewWindow = event && ((!isMacintosh && (event.ctrlKey || event.shiftKey)) || (isMacintosh && (event.metaKey || event.altKey))); - return this.windowService.openWindow([uri], { + return this.windowService.openWindow([{ uri, typeHint }], { forceNewWindow: openInNewWindow, forceOpenWorkspaceAsFile: isFile }); @@ -357,7 +365,7 @@ export class MenubarControl extends Disposable { if (workspaces.length > 0) { for (let i = 0; i < MenubarControl.MAX_MENU_RECENT_ENTRIES && i < workspaces.length; i++) { - result.push(this.createOpenRecentMenuAction(workspaces[i], 'openRecentWorkspace', false)); + result.push(this.createOpenRecentMenuAction(workspaces[i], false)); } result.push(new Separator()); @@ -365,7 +373,7 @@ export class MenubarControl extends Disposable { if (files.length > 0) { for (let i = 0; i < MenubarControl.MAX_MENU_RECENT_ENTRIES && i < files.length; i++) { - result.push(this.createOpenRecentMenuAction(files[i], 'openRecentFile', false)); + result.push(this.createOpenRecentMenuAction(files[i], true)); } result.push(new Separator()); diff --git a/src/vs/workbench/browser/parts/views/customView.ts b/src/vs/workbench/browser/parts/views/customView.ts index a6568b49c4e..960d8631a52 100644 --- a/src/vs/workbench/browser/parts/views/customView.ts +++ b/src/vs/workbench/browser/parts/views/customView.ts @@ -193,19 +193,19 @@ export class CustomTreeView extends Disposable implements ITreeView { private markdownRenderer: MarkdownRenderer; private markdownResult: IMarkdownRenderResult; - private _onDidExpandItem: Emitter = this._register(new Emitter()); + private readonly _onDidExpandItem: Emitter = this._register(new Emitter()); readonly onDidExpandItem: Event = this._onDidExpandItem.event; - private _onDidCollapseItem: Emitter = this._register(new Emitter()); + private readonly _onDidCollapseItem: Emitter = this._register(new Emitter()); readonly onDidCollapseItem: Event = this._onDidCollapseItem.event; private _onDidChangeSelection: Emitter = this._register(new Emitter()); readonly onDidChangeSelection: Event = this._onDidChangeSelection.event; - private _onDidChangeVisibility: Emitter = this._register(new Emitter()); + private readonly _onDidChangeVisibility: Emitter = this._register(new Emitter()); readonly onDidChangeVisibility: Event = this._onDidChangeVisibility.event; - private _onDidChangeActions: Emitter = this._register(new Emitter()); + private readonly _onDidChangeActions: Emitter = this._register(new Emitter()); readonly onDidChangeActions: Event = this._onDidChangeActions.event; constructor( diff --git a/src/vs/workbench/browser/quickopen.ts b/src/vs/workbench/browser/quickopen.ts index 97b8b9b2678..0e06fe52a83 100644 --- a/src/vs/workbench/browser/quickopen.ts +++ b/src/vs/workbench/browser/quickopen.ts @@ -50,14 +50,14 @@ export class QuickOpenHandler { /** * The ARIA label to apply when this quick open handler is active in quick open. */ - getAriaLabel() { + getAriaLabel(): string | null { return null; } /** * Extra CSS class name to add to the quick open widget to do custom styling of entries. */ - getClass(): string { + getClass(): string | null { return null; } @@ -102,7 +102,7 @@ export class QuickOpenHandler { /** * Allows to return a label that will be placed to the side of the results from this handler or null if none. */ - getGroupLabel(): string { + getGroupLabel(): string | null { return null; } @@ -129,16 +129,16 @@ export interface QuickOpenHandlerHelpEntry { export class QuickOpenHandlerDescriptor { prefix: string; description: string; - contextKey: string; + contextKey?: string; helpEntries: QuickOpenHandlerHelpEntry[]; instantProgress: boolean; private id: string; private ctor: IConstructorSignature0; - constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string, description: string, instantProgress?: boolean); - constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string, helpEntries: QuickOpenHandlerHelpEntry[], instantProgress?: boolean); - constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string, param: any, instantProgress: boolean = false) { + constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string | undefined, description: string, instantProgress?: boolean); + constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string | undefined, helpEntries: QuickOpenHandlerHelpEntry[], instantProgress?: boolean); + constructor(ctor: IConstructorSignature0, id: string, prefix: string, contextKey: string | undefined, param: any, instantProgress: boolean = false) { this.ctor = ctor; this.id = id; this.prefix = prefix; @@ -185,7 +185,7 @@ export interface IQuickOpenRegistry { /** * Get a specific quick open handler for a given prefix. */ - getQuickOpenHandler(prefix: string): QuickOpenHandlerDescriptor; + getQuickOpenHandler(prefix: string): QuickOpenHandlerDescriptor | null; /** * Returns the default quick open handler. @@ -213,8 +213,8 @@ class QuickOpenRegistry implements IQuickOpenRegistry { return this.handlers.slice(0); } - getQuickOpenHandler(text: string): QuickOpenHandlerDescriptor { - return text ? arrays.first(this.handlers, h => strings.startsWith(text, h.prefix), null) : null; + getQuickOpenHandler(text: string): QuickOpenHandlerDescriptor | null { + return text ? arrays.first(this.handlers, h => strings.startsWith(text, h.prefix), null) : null; } getDefaultQuickOpenHandler(): QuickOpenHandlerDescriptor { @@ -229,12 +229,12 @@ export interface IEditorQuickOpenEntry { /** * The editor input used for this entry when opening. */ - getInput(): IResourceInput | IEditorInput; + getInput(): IResourceInput | IEditorInput | null; /** * The editor options used for this entry when opening. */ - getOptions(): IEditorOptions; + getOptions(): IEditorOptions | null; } /** @@ -250,11 +250,11 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick return this._editorService; } - getInput(): IResourceInput | IEditorInput { + getInput(): IResourceInput | IEditorInput | null { return null; } - getOptions(): IEditorOptions { + getOptions(): IEditorOptions | null { return null; } @@ -264,7 +264,7 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick if (mode === Mode.OPEN || mode === Mode.OPEN_IN_BACKGROUND) { const sideBySide = context.keymods.ctrlCmd; - let openOptions: IEditorOptions; + let openOptions: IEditorOptions | undefined; if (mode === Mode.OPEN_IN_BACKGROUND) { openOptions = { pinned: true, preserveFocus: true }; } else if (context.keymods.alt) { @@ -280,7 +280,7 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick opts = EditorOptions.create(openOptions); } - this.editorService.openEditor(input, opts, sideBySide ? SIDE_GROUP : ACTIVE_GROUP); + this.editorService.openEditor(input, opts || undefined, sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } else { const resourceInput = input; @@ -301,11 +301,11 @@ export class EditorQuickOpenEntry extends QuickOpenEntry implements IEditorQuick */ export class EditorQuickOpenEntryGroup extends QuickOpenEntryGroup implements IEditorQuickOpenEntry { - getInput(): IEditorInput | IResourceInput { + getInput(): IEditorInput | IResourceInput | null { return null; } - getOptions(): IEditorOptions { + getOptions(): IEditorOptions | null { return null; } } diff --git a/src/vs/workbench/browser/viewlet.ts b/src/vs/workbench/browser/viewlet.ts index f071f08339a..1da57592349 100644 --- a/src/vs/workbench/browser/viewlet.ts +++ b/src/vs/workbench/browser/viewlet.ts @@ -16,11 +16,12 @@ import { ToggleSidebarVisibilityAction, ToggleSidebarPositionAction } from 'vs/w import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { URI } from 'vs/base/common/uri'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; +import { AbstractTree } from 'vs/base/browser/ui/tree/abstractTree'; export abstract class Viewlet extends Composite implements IViewlet { @@ -195,7 +196,7 @@ export class CollapseAction extends Action { // Collapse All action for the new tree export class CollapseAction2 extends Action { - constructor(tree: AsyncDataTree, enabled: boolean, clazz: string) { + constructor(tree: AsyncDataTree | AbstractTree, enabled: boolean, clazz: string) { super('workbench.action.collapse', nls.localize('collapse', "Collapse All"), clazz, enabled, () => { tree.collapseAll(); return Promise.resolve(undefined); diff --git a/src/vs/workbench/buildfile.js b/src/vs/workbench/buildfile.js index 8946ef5adb8..83c43b0ace9 100644 --- a/src/vs/workbench/buildfile.js +++ b/src/vs/workbench/buildfile.js @@ -17,12 +17,12 @@ function createModuleDescription(name, exclude) { exports.collectModules = function () { var modules = [ - createModuleDescription('vs/workbench/parts/output/common/outputLinkComputer', ['vs/base/common/worker/simpleWorker', 'vs/editor/common/services/editorSimpleWorker']), + createModuleDescription('vs/workbench/contrib/output/common/outputLinkComputer', ['vs/base/common/worker/simpleWorker', 'vs/editor/common/services/editorSimpleWorker']), - createModuleDescription('vs/workbench/parts/debug/node/telemetryApp', []), + createModuleDescription('vs/workbench/contrib/debug/node/telemetryApp', []), createModuleDescription('vs/workbench/services/search/node/searchApp', []), - + createModuleDescription('vs/workbench/services/files/node/watcher/unix/watcherApp', []), createModuleDescription('vs/workbench/services/files/node/watcher/nsfw/watcherApp', []), diff --git a/src/vs/workbench/common/actions.ts b/src/vs/workbench/common/actions.ts index b2530b09a97..f805576e516 100644 --- a/src/vs/workbench/common/actions.ts +++ b/src/vs/workbench/common/actions.ts @@ -54,7 +54,7 @@ Registry.add(Extensions.WorkbenchActions, new class implements IWorkbenchActionR // menu item // TODO@Rob slightly weird if-check required because of - // https://github.com/Microsoft/vscode/blob/master/src/vs/workbench/parts/search/electron-browser/search.contribution.ts#L266 + // https://github.com/Microsoft/vscode/blob/master/src/vs/workbench/contrib/search/electron-browser/search.contribution.ts#L266 if (descriptor.label) { let idx = alias.indexOf(': '); diff --git a/src/vs/workbench/common/editor.ts b/src/vs/workbench/common/editor.ts index 7b264e5598a..6af7b6dddeb 100644 --- a/src/vs/workbench/common/editor.ts +++ b/src/vs/workbench/common/editor.ts @@ -15,7 +15,7 @@ import { RawContextKey, ContextKeyExpr } from 'vs/platform/contextkey/common/con import { Registry } from 'vs/platform/registry/common/platform'; import { ITextModel } from 'vs/editor/common/model'; import { Schemas } from 'vs/base/common/network'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ICompositeControl } from 'vs/workbench/common/composite'; import { ActionRunner, IAction } from 'vs/base/common/actions'; diff --git a/src/vs/workbench/common/editor/diffEditorInput.ts b/src/vs/workbench/common/editor/diffEditorInput.ts index 3d534f3f87f..44a8af3658a 100644 --- a/src/vs/workbench/common/editor/diffEditorInput.ts +++ b/src/vs/workbench/common/editor/diffEditorInput.ts @@ -16,7 +16,7 @@ export class DiffEditorInput extends SideBySideEditorInput { static readonly ID = 'workbench.editors.diffEditorInput'; - private cachedModel: DiffEditorModel; + private cachedModel: DiffEditorModel | null; constructor(name: string, description: string, original: EditorInput, modified: EditorInput, private forceOpenAsBinary?: boolean) { super(name, description, original, modified); diff --git a/src/vs/workbench/common/editor/resourceEditorInput.ts b/src/vs/workbench/common/editor/resourceEditorInput.ts index 8e9061c79ec..d61b126f22f 100644 --- a/src/vs/workbench/common/editor/resourceEditorInput.ts +++ b/src/vs/workbench/common/editor/resourceEditorInput.ts @@ -92,7 +92,7 @@ export class ResourceEditorInput extends EditorInput { ref.dispose(); this.modelReference = null; - return Promise.reject(new Error(`Unexpected model for ResourceInput: ${this.resource}`)); + return Promise.reject(new Error(`Unexpected model for ResourceInput: ${this.resource}`)); } return model; diff --git a/src/vs/workbench/common/editor/textDiffEditorModel.ts b/src/vs/workbench/common/editor/textDiffEditorModel.ts index fda5a788dd6..3b9c750f528 100644 --- a/src/vs/workbench/common/editor/textDiffEditorModel.ts +++ b/src/vs/workbench/common/editor/textDiffEditorModel.ts @@ -13,7 +13,7 @@ import { DiffEditorModel } from 'vs/workbench/common/editor/diffEditorModel'; * and the modified version. */ export class TextDiffEditorModel extends DiffEditorModel { - private _textDiffEditorModel: IDiffEditorModel; + private _textDiffEditorModel: IDiffEditorModel | null; constructor(originalModel: BaseTextEditorModel, modifiedModel: BaseTextEditorModel) { super(originalModel, modifiedModel); @@ -56,7 +56,7 @@ export class TextDiffEditorModel extends DiffEditorModel { } } - get textDiffEditorModel(): IDiffEditorModel { + get textDiffEditorModel(): IDiffEditorModel | null { return this._textDiffEditorModel; } diff --git a/src/vs/workbench/common/editor/textEditorModel.ts b/src/vs/workbench/common/editor/textEditorModel.ts index 177bd9d249d..b300ee95fb5 100644 --- a/src/vs/workbench/common/editor/textEditorModel.ts +++ b/src/vs/workbench/common/editor/textEditorModel.ts @@ -19,8 +19,8 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd protected createdEditorModel: boolean; - private textEditorModelHandle: URI; - private modelDisposeListener: IDisposable; + private textEditorModelHandle: URI | null; + private modelDisposeListener: IDisposable | null; constructor( @IModelService protected modelService: IModelService, @@ -126,7 +126,7 @@ export abstract class BaseTextEditorModel extends EditorModel implements ITextEd this.modelService.updateModel(this.textEditorModel, newValue); } - createSnapshot(): ITextSnapshot { + createSnapshot(): ITextSnapshot | null { const model = this.textEditorModel; if (model) { return model.createSnapshot(true /* Preserve BOM */); diff --git a/src/vs/workbench/common/editor/untitledEditorInput.ts b/src/vs/workbench/common/editor/untitledEditorInput.ts index 817ec4eefc4..85daece3136 100644 --- a/src/vs/workbench/common/editor/untitledEditorInput.ts +++ b/src/vs/workbench/common/editor/untitledEditorInput.ts @@ -27,7 +27,7 @@ export class UntitledEditorInput extends EditorInput implements IEncodingSupport private _hasAssociatedFilePath: boolean; private cachedModel: UntitledEditorModel; - private modelResolve: Promise; + private modelResolve?: Promise; private readonly _onDidModelChangeContent: Emitter = this._register(new Emitter()); get onDidModelChangeContent(): Event { return this._onDidModelChangeContent.event; } @@ -90,26 +90,20 @@ export class UntitledEditorInput extends EditorInput implements IEncodingSupport return this.labelService.getUriLabel(resources.dirname(this.resource)); } - getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string { + getDescription(verbosity: Verbosity = Verbosity.MEDIUM): string | null { if (!this.hasAssociatedFilePath) { return null; } - let description: string; switch (verbosity) { case Verbosity.SHORT: - description = this.shortDescription; - break; + return this.shortDescription; case Verbosity.LONG: - description = this.longDescription; - break; + return this.longDescription; case Verbosity.MEDIUM: default: - description = this.mediumDescription; - break; + return this.mediumDescription; } - - return description; } @memoize diff --git a/src/vs/workbench/common/theme.ts b/src/vs/workbench/common/theme.ts index c5fc0beab31..7ca06839625 100644 --- a/src/vs/workbench/common/theme.ts +++ b/src/vs/workbench/common/theme.ts @@ -378,8 +378,8 @@ export const SIDE_BAR_TITLE_FOREGROUND = registerColor('sideBarTitle.foreground' export const SIDE_BAR_DRAG_AND_DROP_BACKGROUND = registerColor('sideBar.dropBackground', { dark: Color.white.transparent(0.12), - light: Color.white.transparent(0.12), - hc: Color.white.transparent(0.12), + light: Color.black.transparent(0.1), + hc: Color.white.transparent(0.3), }, nls.localize('sideBarDragAndDropBackground', "Drag and drop feedback color for the side bar sections. The color should have transparency so that the side bar sections can still shine through. The side bar is the container for views like explorer and search.")); export const SIDE_BAR_SECTION_HEADER_BACKGROUND = registerColor('sideBarSectionHeader.background', { diff --git a/src/vs/workbench/common/views.ts b/src/vs/workbench/common/views.ts index f5effa730ab..0889e56bd06 100644 --- a/src/vs/workbench/common/views.ts +++ b/src/vs/workbench/common/views.ts @@ -300,7 +300,7 @@ export interface ITreeView extends IDisposable { showCollapseAllAction: boolean; - message: string | IMarkdownString; + message?: string | IMarkdownString; readonly visible: boolean; diff --git a/src/vs/workbench/parts/backup/common/backup.contribution.ts b/src/vs/workbench/contrib/backup/common/backup.contribution.ts similarity index 84% rename from src/vs/workbench/parts/backup/common/backup.contribution.ts rename to src/vs/workbench/contrib/backup/common/backup.contribution.ts index eefa6d146d5..f3ac6e3a0bd 100644 --- a/src/vs/workbench/parts/backup/common/backup.contribution.ts +++ b/src/vs/workbench/contrib/backup/common/backup.contribution.ts @@ -5,8 +5,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { BackupModelTracker } from 'vs/workbench/parts/backup/common/backupModelTracker'; -import { BackupRestorer } from 'vs/workbench/parts/backup/common/backupRestorer'; +import { BackupModelTracker } from 'vs/workbench/contrib/backup/common/backupModelTracker'; +import { BackupRestorer } from 'vs/workbench/contrib/backup/common/backupRestorer'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // Register Backup Model Tracker diff --git a/src/vs/workbench/parts/backup/common/backupModelTracker.ts b/src/vs/workbench/contrib/backup/common/backupModelTracker.ts similarity index 100% rename from src/vs/workbench/parts/backup/common/backupModelTracker.ts rename to src/vs/workbench/contrib/backup/common/backupModelTracker.ts diff --git a/src/vs/workbench/parts/backup/common/backupRestorer.ts b/src/vs/workbench/contrib/backup/common/backupRestorer.ts similarity index 100% rename from src/vs/workbench/parts/backup/common/backupRestorer.ts rename to src/vs/workbench/contrib/backup/common/backupRestorer.ts diff --git a/src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts b/src/vs/workbench/contrib/cli/electron-browser/cli.contribution.ts similarity index 100% rename from src/vs/workbench/parts/cli/electron-browser/cli.contribution.ts rename to src/vs/workbench/contrib/cli/electron-browser/cli.contribution.ts diff --git a/src/vs/workbench/parts/codeEditor/browser/menuPreventer.ts b/src/vs/workbench/contrib/codeEditor/browser/menuPreventer.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/browser/menuPreventer.ts rename to src/vs/workbench/contrib/codeEditor/browser/menuPreventer.ts diff --git a/src/vs/workbench/parts/codeEditor/browser/simpleEditorOptions.ts b/src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/browser/simpleEditorOptions.ts rename to src/vs/workbench/contrib/codeEditor/browser/simpleEditorOptions.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.css b/src/vs/workbench/contrib/codeEditor/electron-browser/accessibility.css similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/accessibility.css rename to src/vs/workbench/contrib/codeEditor/electron-browser/accessibility.css diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/accessibility.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/accessibility.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/accessibility.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/accessibility.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/codeEditor.contribution.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/codeEditor.contribution.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/inspectKeybindings.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/inspectKeybindings.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/inspectKeybindings.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/languageConfiguration/languageConfigurationExtensionPoint.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/largeFileOptimizations.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/largeFileOptimizations.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/largeFileOptimizations.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/media/WordWrap_16x.svg b/src/vs/workbench/contrib/codeEditor/electron-browser/media/WordWrap_16x.svg similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/media/WordWrap_16x.svg rename to src/vs/workbench/contrib/codeEditor/electron-browser/media/WordWrap_16x.svg diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/media/suggestEnabledInput.css b/src/vs/workbench/contrib/codeEditor/electron-browser/media/suggestEnabledInput.css similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/media/suggestEnabledInput.css rename to src/vs/workbench/contrib/codeEditor/electron-browser/media/suggestEnabledInput.css diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/selectionClipboard.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions.ts similarity index 76% rename from src/vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions.ts index 2aefe2da134..892a59ae182 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions.ts @@ -7,9 +7,9 @@ import { ICodeEditorWidgetOptions } from 'vs/editor/browser/widget/codeEditorWid import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; -import { MenuPreventer } from 'vs/workbench/parts/codeEditor/browser/menuPreventer'; -import { SelectionClipboard } from 'vs/workbench/parts/codeEditor/electron-browser/selectionClipboard'; -import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; +import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; +import { SelectionClipboard } from 'vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard'; +import { TabCompletionController } from 'vs/workbench/contrib/snippets/electron-browser/tabCompletion'; export function getSimpleCodeEditorWidgetOptions(): ICodeEditorWidgetOptions { return { diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/sleepResumeRepaintMinimap.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput.ts similarity index 97% rename from src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput.ts index 8c692b4fcc2..92dcfbb4cbf 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput.ts @@ -29,9 +29,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ColorIdentifier, editorSelectionBackground, inputBackground, inputBorder, inputForeground, inputPlaceholderForeground, selectionBackground } from 'vs/platform/theme/common/colorRegistry'; import { IStyleOverrides, IThemable, attachStyler } from 'vs/platform/theme/common/styler'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { MenuPreventer } from 'vs/workbench/parts/codeEditor/browser/menuPreventer'; -import { getSimpleEditorOptions } from 'vs/workbench/parts/codeEditor/browser/simpleEditorOptions'; -import { SelectionClipboard } from 'vs/workbench/parts/codeEditor/electron-browser/selectionClipboard'; +import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; +import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; +import { SelectionClipboard } from 'vs/workbench/contrib/codeEditor/electron-browser/selectionClipboard'; interface SuggestResultsProvider { /** diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.css b/src/vs/workbench/contrib/codeEditor/electron-browser/textMate/inspectTMScopes.css similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.css rename to src/vs/workbench/contrib/codeEditor/electron-browser/textMate/inspectTMScopes.css diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/textMate/inspectTMScopes.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/textMate/inspectTMScopes.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/textMate/inspectTMScopes.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleMinimap.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/toggleMinimap.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/toggleMinimap.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleMultiCursorModifier.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleMultiCursorModifier.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/toggleMultiCursorModifier.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/toggleMultiCursorModifier.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleRenderControlCharacter.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderControlCharacter.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/toggleRenderControlCharacter.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleRenderWhitespace.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/toggleRenderWhitespace.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/toggleRenderWhitespace.ts diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleWordWrap.ts similarity index 97% rename from src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/toggleWordWrap.ts index 1ef5416fc34..448b3479093 100644 --- a/src/vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap.ts +++ b/src/vs/workbench/contrib/codeEditor/electron-browser/toggleWordWrap.ts @@ -279,7 +279,7 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: TOGGLE_WORD_WRAP_ID, title: nls.localize('unwrapMinified', "Disable wrapping for this file"), - iconLocation: { dark: URI.parse(require.toUrl('vs/workbench/parts/codeEditor/electron-browser/media/WordWrap_16x.svg')) } + iconLocation: { dark: URI.parse(require.toUrl('vs/workbench/contrib/codeEditor/electron-browser/media/WordWrap_16x.svg')) } }, group: 'navigation', order: 1, @@ -293,7 +293,7 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { command: { id: TOGGLE_WORD_WRAP_ID, title: nls.localize('wrapMinified', "Enable wrapping for this file"), - iconLocation: { dark: URI.parse(require.toUrl('vs/workbench/parts/codeEditor/electron-browser/media/WordWrap_16x.svg')) } + iconLocation: { dark: URI.parse(require.toUrl('vs/workbench/contrib/codeEditor/electron-browser/media/WordWrap_16x.svg')) } }, group: 'navigation', order: 1, diff --git a/src/vs/workbench/parts/codeEditor/electron-browser/workbenchReferenceSearch.ts b/src/vs/workbench/contrib/codeEditor/electron-browser/workbenchReferenceSearch.ts similarity index 100% rename from src/vs/workbench/parts/codeEditor/electron-browser/workbenchReferenceSearch.ts rename to src/vs/workbench/contrib/codeEditor/electron-browser/workbenchReferenceSearch.ts diff --git a/src/vs/workbench/parts/comments/common/commentModel.ts b/src/vs/workbench/contrib/comments/common/commentModel.ts similarity index 100% rename from src/vs/workbench/parts/comments/common/commentModel.ts rename to src/vs/workbench/contrib/comments/common/commentModel.ts diff --git a/src/vs/workbench/parts/comments/electron-browser/commentGlyphWidget.ts b/src/vs/workbench/contrib/comments/electron-browser/commentGlyphWidget.ts similarity index 100% rename from src/vs/workbench/parts/comments/electron-browser/commentGlyphWidget.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentGlyphWidget.ts diff --git a/src/vs/workbench/parts/comments/electron-browser/commentNode.ts b/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts similarity index 95% rename from src/vs/workbench/parts/comments/electron-browser/commentNode.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentNode.ts index 5d1c0b3b434..6c61815bdb2 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentNode.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentNode.ts @@ -20,8 +20,8 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { inputValidationErrorBorder } from 'vs/platform/theme/common/colorRegistry'; import { attachButtonStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { ICommentService } from 'vs/workbench/parts/comments/electron-browser/commentService'; -import { SimpleCommentEditor } from 'vs/workbench/parts/comments/electron-browser/simpleCommentEditor'; +import { ICommentService } from 'vs/workbench/contrib/comments/electron-browser/commentService'; +import { SimpleCommentEditor } from 'vs/workbench/contrib/comments/electron-browser/simpleCommentEditor'; import { KeyCode } from 'vs/base/common/keyCodes'; import { isMacintosh } from 'vs/base/common/platform'; import { Selection } from 'vs/editor/common/core/selection'; @@ -47,7 +47,7 @@ export class CommentNode extends Disposable { private _commentDetailsContainer: HTMLElement; private _reactionsActionBar?: ActionBar; private _actionsContainer?: HTMLElement; - private _commentEditor: SimpleCommentEditor; + private _commentEditor: SimpleCommentEditor | null; private _commentEditorModel: ITextModel; private _updateCommentButton: Button; private _errorEditingContainer: HTMLElement; @@ -140,7 +140,7 @@ export class CommentNode extends Disposable { this.registerActionBarListeners(actionsContainer); - let reactionActions = []; + let reactionActions: Action[] = []; let reactionGroup = this.commentService.getReactionGroup(this.owner); if (reactionGroup && reactionGroup.length) { reactionActions = reactionGroup.map((reaction) => { @@ -179,7 +179,7 @@ export class CommentNode extends Disposable { this._reactionsActionBar = new ActionBar(this._actionsContainer, {}); this._toDispose.push(this._reactionsActionBar); - let reactionActions = this.comment.commentReactions.map(reaction => { + let reactionActions = this.comment.commentReactions!.map(reaction => { return new Action(`reaction.${reaction.label}`, `${reaction.label}`, reaction.hasReacted ? 'active' : '', true, async () => { try { if (reaction.hasReacted) { @@ -204,7 +204,7 @@ export class CommentNode extends Disposable { }); }); - reactionActions.forEach(action => this._reactionsActionBar.push(action, { label: true, icon: true })); + reactionActions.forEach(action => this._reactionsActionBar!.push(action, { label: true, icon: true })); } private createCommentEditor(): void { @@ -237,8 +237,10 @@ export class CommentNode extends Disposable { this._body.classList.remove('hidden'); this._commentEditorModel.dispose(); - this._commentEditor.dispose(); - this._commentEditor = null; + if (this._commentEditor) { + this._commentEditor.dispose(); + this._commentEditor = null; + } this._commentEditContainer.remove(); } @@ -253,7 +255,7 @@ export class CommentNode extends Disposable { this._updateCommentButton.enabled = true; this._updateCommentButton.label = UPDATE_COMMENT_LABEL; - this._commentEditor.getDomNode().style.outline = ''; + this._commentEditor!.getDomNode().style.outline = ''; this.removeCommentEditor(); const editedComment = assign({}, this.comment, { body: new MarkdownString(newBody) }); this.update(editedComment); @@ -321,8 +323,8 @@ export class CommentNode extends Disposable { this.editComment(); })); - this._toDispose.push(this._commentEditor.onDidChangeModelContent(_ => { - this._updateCommentButton.enabled = !!this._commentEditor.getValue(); + this._toDispose.push(this._commentEditor!.onDidChangeModelContent(_ => { + this._updateCommentButton.enabled = !!this._commentEditor!.getValue(); })); this._editAction.enabled = false; diff --git a/src/vs/workbench/parts/comments/electron-browser/commentService.ts b/src/vs/workbench/contrib/comments/electron-browser/commentService.ts similarity index 90% rename from src/vs/workbench/parts/comments/electron-browser/commentService.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentService.ts index 7173a1b02db..8d89ebd79b1 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentService.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentService.ts @@ -11,9 +11,8 @@ import { URI } from 'vs/base/common/uri'; import { Range } from 'vs/editor/common/core/range'; import { keys } from 'vs/base/common/map'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { MainThreadDocumentCommentProvider } from 'vs/workbench/api/electron-browser/mainThreadComments'; import { assign } from 'vs/base/common/objects'; -import { ICommentThreadChangedEvent } from 'vs/workbench/parts/comments/common/commentModel'; +import { ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; export const ICommentService = createDecorator('commentService'); @@ -41,23 +40,23 @@ export interface ICommentService { setDocumentComments(resource: URI, commentInfos: ICommentInfo[]): void; setWorkspaceComments(owner: string, commentsByResource: CommentThread[]): void; removeWorkspaceComments(owner: string): void; - registerDataProvider(owner: string, commentProvider: MainThreadDocumentCommentProvider): void; + registerDataProvider(owner: string, commentProvider: DocumentCommentProvider): void; unregisterDataProvider(owner: string): void; updateComments(ownerId: string, event: CommentThreadChangedEvent): void; createNewCommentThread(owner: string, resource: URI, range: Range, text: string): Promise; replyToCommentThread(owner: string, resource: URI, range: Range, thread: CommentThread, text: string): Promise; editComment(owner: string, resource: URI, comment: Comment, text: string): Promise; deleteComment(owner: string, resource: URI, comment: Comment): Promise; - getComments(resource: URI): Promise; + getComments(resource: URI): Promise<(ICommentInfo | null)[]>; startDraft(owner: string, resource: URI): void; deleteDraft(owner: string, resource: URI): void; finishDraft(owner: string, resource: URI): void; - getStartDraftLabel(owner: string): string; - getDeleteDraftLabel(owner: string): string; - getFinishDraftLabel(owner: string): string; + getStartDraftLabel(owner: string): string | undefined; + getDeleteDraftLabel(owner: string): string | undefined; + getFinishDraftLabel(owner: string): string | undefined; addReaction(owner: string, resource: URI, comment: Comment, reaction: CommentReaction): Promise; deleteReaction(owner: string, resource: URI, comment: Comment, reaction: CommentReaction): Promise; - getReactionGroup(owner: string): CommentReaction[]; + getReactionGroup(owner: string): CommentReaction[] | undefined; } export class CommentService extends Disposable implements ICommentService { @@ -96,7 +95,7 @@ export class CommentService extends Disposable implements ICommentService { this._onDidSetAllCommentThreads.fire({ ownerId: owner, commentThreads: [] }); } - registerDataProvider(owner: string, commentProvider: DocumentCommentProvider) { + registerDataProvider(owner: string, commentProvider: DocumentCommentProvider): void { this._commentProviders.set(owner, commentProvider); this._onDidSetDataProvider.fire(); } @@ -201,51 +200,51 @@ export class CommentService extends Disposable implements ICommentService { } } - getReactionGroup(owner: string): CommentReaction[] { + getReactionGroup(owner: string): CommentReaction[] | undefined { const commentProvider = this._commentProviders.get(owner); if (commentProvider) { return commentProvider.reactionGroup; } - return null; + return undefined; } - getStartDraftLabel(owner: string): string | null { + getStartDraftLabel(owner: string): string | undefined { const commentProvider = this._commentProviders.get(owner); if (commentProvider) { return commentProvider.startDraftLabel; } - return null; + return undefined; } - getDeleteDraftLabel(owner: string): string { + getDeleteDraftLabel(owner: string): string | undefined { const commentProvider = this._commentProviders.get(owner); if (commentProvider) { return commentProvider.deleteDraftLabel; } - return null; + return undefined; } - getFinishDraftLabel(owner: string): string { + getFinishDraftLabel(owner: string): string | undefined { const commentProvider = this._commentProviders.get(owner); if (commentProvider) { return commentProvider.finishDraftLabel; } - return null; + return undefined; } - getComments(resource: URI): Promise { - const result: Promise[] = []; + getComments(resource: URI): Promise<(ICommentInfo | null)[]> { + const result: Promise[] = []; for (const owner of keys(this._commentProviders)) { const provider = this._commentProviders.get(owner); - if (provider.provideDocumentComments) { + if (provider && provider.provideDocumentComments) { result.push(provider.provideDocumentComments(resource, CancellationToken.None).then(commentInfo => { if (commentInfo) { return { diff --git a/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts b/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts similarity index 99% rename from src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts index c5eea6a8d01..c288cd08cc9 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentThreadWidget.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentThreadWidget.ts @@ -20,7 +20,7 @@ import { peekViewBorder } from 'vs/editor/contrib/referenceSearch/referencesWidg import { IOptions, ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; import { attachButtonStyler } from 'vs/platform/theme/common/styler'; import { ITheme, IThemeService } from 'vs/platform/theme/common/themeService'; -import { CommentGlyphWidget } from 'vs/workbench/parts/comments/electron-browser/commentGlyphWidget'; +import { CommentGlyphWidget } from 'vs/workbench/contrib/comments/electron-browser/commentGlyphWidget'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IModelService } from 'vs/editor/common/services/modelService'; import { SimpleCommentEditor } from './simpleCommentEditor'; @@ -29,13 +29,13 @@ import { transparent, editorForeground, textLinkActiveForeground, textLinkForegr import { IModeService } from 'vs/editor/common/services/modeService'; import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode } from 'vs/base/common/keyCodes'; -import { ICommentService } from 'vs/workbench/parts/comments/electron-browser/commentService'; +import { ICommentService } from 'vs/workbench/contrib/comments/electron-browser/commentService'; import { Range, IRange } from 'vs/editor/common/core/range'; import { IPosition } from 'vs/editor/common/core/position'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { MarkdownRenderer } from 'vs/editor/contrib/markdown/markdownRenderer'; import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; -import { CommentNode } from 'vs/workbench/parts/comments/electron-browser/commentNode'; +import { CommentNode } from 'vs/workbench/contrib/comments/electron-browser/commentNode'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ITextModel } from 'vs/editor/common/model'; diff --git a/src/vs/workbench/parts/comments/electron-browser/comments.contribution.ts b/src/vs/workbench/contrib/comments/electron-browser/comments.contribution.ts similarity index 87% rename from src/vs/workbench/parts/comments/electron-browser/comments.contribution.ts rename to src/vs/workbench/contrib/comments/electron-browser/comments.contribution.ts index 37421047f9c..4c00b71e1f3 100644 --- a/src/vs/workbench/parts/comments/electron-browser/comments.contribution.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/comments.contribution.ts @@ -6,8 +6,8 @@ import * as nls from 'vs/nls'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Registry } from 'vs/platform/registry/common/platform'; -import 'vs/workbench/parts/comments/electron-browser/commentsEditorContribution'; -import { ICommentService, CommentService } from 'vs/workbench/parts/comments/electron-browser/commentService'; +import 'vs/workbench/contrib/comments/electron-browser/commentsEditorContribution'; +import { ICommentService, CommentService } from 'vs/workbench/contrib/comments/electron-browser/commentService'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; export interface ICommentsConfiguration { diff --git a/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts b/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts similarity index 99% rename from src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts index e761197389b..467d81e927d 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentsEditorContribution.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentsEditorContribution.ts @@ -23,8 +23,8 @@ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/co import { editorForeground } from 'vs/platform/theme/common/colorRegistry'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { CommentThreadCollapsibleState } from 'vs/workbench/api/node/extHostTypes'; -import { ReviewZoneWidget, COMMENTEDITOR_DECORATION_KEY } from 'vs/workbench/parts/comments/electron-browser/commentThreadWidget'; -import { ICommentService, ICommentInfo } from 'vs/workbench/parts/comments/electron-browser/commentService'; +import { ReviewZoneWidget, COMMENTEDITOR_DECORATION_KEY } from 'vs/workbench/contrib/comments/electron-browser/commentThreadWidget'; +import { ICommentService, ICommentInfo } from 'vs/workbench/contrib/comments/electron-browser/commentService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -34,7 +34,7 @@ import { IMarginData } from 'vs/editor/browser/controller/mouseTarget'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; -import { overviewRulerCommentingRangeForeground } from 'vs/workbench/parts/comments/electron-browser/commentGlyphWidget'; +import { overviewRulerCommentingRangeForeground } from 'vs/workbench/contrib/comments/electron-browser/commentGlyphWidget'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { STATUS_BAR_ITEM_HOVER_BACKGROUND, STATUS_BAR_ITEM_ACTIVE_BACKGROUND } from 'vs/workbench/common/theme'; diff --git a/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts b/src/vs/workbench/contrib/comments/electron-browser/commentsPanel.ts similarity index 93% rename from src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentsPanel.ts index 307216ce03d..7c275394f73 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentsPanel.ts @@ -14,10 +14,10 @@ import { TreeResourceNavigator, WorkbenchTree } from 'vs/platform/list/browser/l import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { Panel } from 'vs/workbench/browser/panel'; -import { CommentNode, CommentsModel, ResourceWithCommentThreads, ICommentThreadChangedEvent } from 'vs/workbench/parts/comments/common/commentModel'; -import { ReviewController } from 'vs/workbench/parts/comments/electron-browser/commentsEditorContribution'; -import { CommentsDataFilter, CommentsDataSource, CommentsModelRenderer } from 'vs/workbench/parts/comments/electron-browser/commentsTreeViewer'; -import { ICommentService, IWorkspaceCommentThreadsEvent } from 'vs/workbench/parts/comments/electron-browser/commentService'; +import { CommentNode, CommentsModel, ResourceWithCommentThreads, ICommentThreadChangedEvent } from 'vs/workbench/contrib/comments/common/commentModel'; +import { ReviewController } from 'vs/workbench/contrib/comments/electron-browser/commentsEditorContribution'; +import { CommentsDataFilter, CommentsDataSource, CommentsModelRenderer } from 'vs/workbench/contrib/comments/electron-browser/commentsTreeViewer'; +import { ICommentService, IWorkspaceCommentThreadsEvent } from 'vs/workbench/contrib/comments/electron-browser/commentService'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { textLinkForeground, textLinkActiveForeground, focusBorder, textPreformatForeground } from 'vs/platform/theme/common/colorRegistry'; @@ -160,7 +160,7 @@ export class CommentsPanel extends Panel { })); } - private openFile(element: any, pinned: boolean, preserveFocus: boolean, sideBySide: boolean): boolean { + private openFile(element: any, pinned?: boolean, preserveFocus?: boolean, sideBySide?: boolean): boolean { if (!element) { return false; } @@ -189,16 +189,16 @@ export class CommentsPanel extends Panel { const commentToReveal = element instanceof ResourceWithCommentThreads ? element.commentThreads[0].comment : element.comment; if (commentToReveal.command) { - this.commandService.executeCommand(commentToReveal.command.id, ...commentToReveal.command.arguments).then(_ => { + this.commandService.executeCommand(commentToReveal.command.id, ...(commentToReveal.command.arguments || [])).then(_ => { let activeWidget = this.editorService.activeTextEditorWidget; if (isDiffEditor(activeWidget)) { const originalEditorWidget = activeWidget.getOriginalEditor(); const modifiedEditorWidget = activeWidget.getModifiedEditor(); let controller; - if (originalEditorWidget.getModel().uri.toString() === element.resource.toString()) { + if (originalEditorWidget.getModel()!.uri.toString() === element.resource.toString()) { controller = ReviewController.get(originalEditorWidget); - } else if (modifiedEditorWidget.getModel().uri.toString() === element.resource.toString()) { + } else if (modifiedEditorWidget.getModel()!.uri.toString() === element.resource.toString()) { controller = ReviewController.get(modifiedEditorWidget); } diff --git a/src/vs/workbench/parts/comments/electron-browser/commentsTreeViewer.ts b/src/vs/workbench/contrib/comments/electron-browser/commentsTreeViewer.ts similarity index 96% rename from src/vs/workbench/parts/comments/electron-browser/commentsTreeViewer.ts rename to src/vs/workbench/contrib/comments/electron-browser/commentsTreeViewer.ts index 5989090ec45..b5b2d867c25 100644 --- a/src/vs/workbench/parts/comments/electron-browser/commentsTreeViewer.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/commentsTreeViewer.ts @@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri'; import { IDataSource, IFilter, IRenderer as ITreeRenderer, ITree } from 'vs/base/parts/tree/browser/tree'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; -import { CommentNode, CommentsModel, ResourceWithCommentThreads } from 'vs/workbench/parts/comments/common/commentModel'; +import { CommentNode, CommentsModel, ResourceWithCommentThreads } from 'vs/workbench/contrib/comments/common/commentModel'; export class CommentsDataSource implements IDataSource { public getId(tree: ITree, element: any): string { @@ -42,7 +42,7 @@ export class CommentsDataSource implements IDataSource { if (element instanceof CommentNode) { return Promise.resolve(element.replies); } - return null; + return Promise.resolve([]); } public getParent(tree: ITree, element: any): Promise { @@ -148,15 +148,12 @@ export class CommentsModelRenderer implements ITreeRenderer { inline: true, actionHandler: { callback: (content) => { - let uri: URI; try { - uri = URI.parse(content); + const uri = URI.parse(content); + this.openerService.open(uri).catch(onUnexpectedError); } catch (err) { // ignore } - if (uri) { - this.openerService.open(uri).catch(onUnexpectedError); - } }, disposeables: templateData.disposables } @@ -167,7 +164,7 @@ export class CommentsModelRenderer implements ITreeRenderer { const image = images[i]; const textDescription = dom.$(''); textDescription.textContent = image.alt ? nls.localize('imageWithLabel', "Image: {0}", image.alt) : nls.localize('image', "Image"); - image.parentNode.replaceChild(textDescription, image); + image.parentNode!.replaceChild(textDescription, image); } templateData.commentText.appendChild(renderedComment); diff --git a/src/vs/workbench/parts/comments/electron-browser/media/close.svg b/src/vs/workbench/contrib/comments/electron-browser/media/close.svg similarity index 100% rename from src/vs/workbench/parts/comments/electron-browser/media/close.svg rename to src/vs/workbench/contrib/comments/electron-browser/media/close.svg diff --git a/src/vs/workbench/parts/comments/electron-browser/media/comment.svg b/src/vs/workbench/contrib/comments/electron-browser/media/comment.svg similarity index 100% rename from src/vs/workbench/parts/comments/electron-browser/media/comment.svg rename to src/vs/workbench/contrib/comments/electron-browser/media/comment.svg diff --git a/src/vs/workbench/parts/comments/electron-browser/media/panel.css b/src/vs/workbench/contrib/comments/electron-browser/media/panel.css similarity index 100% rename from src/vs/workbench/parts/comments/electron-browser/media/panel.css rename to src/vs/workbench/contrib/comments/electron-browser/media/panel.css diff --git a/src/vs/workbench/parts/comments/electron-browser/media/review.css b/src/vs/workbench/contrib/comments/electron-browser/media/review.css similarity index 100% rename from src/vs/workbench/parts/comments/electron-browser/media/review.css rename to src/vs/workbench/contrib/comments/electron-browser/media/review.css diff --git a/src/vs/workbench/parts/comments/electron-browser/simpleCommentEditor.ts b/src/vs/workbench/contrib/comments/electron-browser/simpleCommentEditor.ts similarity index 93% rename from src/vs/workbench/parts/comments/electron-browser/simpleCommentEditor.ts rename to src/vs/workbench/contrib/comments/electron-browser/simpleCommentEditor.ts index 779d0e58fe7..dc695dcddfc 100644 --- a/src/vs/workbench/parts/comments/electron-browser/simpleCommentEditor.ts +++ b/src/vs/workbench/contrib/comments/electron-browser/simpleCommentEditor.ts @@ -12,11 +12,11 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ICommandService } from 'vs/platform/commands/common/commands'; // Allowed Editor Contributions: -import { MenuPreventer } from 'vs/workbench/parts/codeEditor/browser/menuPreventer'; +import { MenuPreventer } from 'vs/workbench/contrib/codeEditor/browser/menuPreventer'; import { ContextMenuController } from 'vs/editor/contrib/contextmenu/contextmenu'; import { SuggestController } from 'vs/editor/contrib/suggest/suggestController'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { TabCompletionController } from 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; +import { TabCompletionController } from 'vs/workbench/contrib/snippets/electron-browser/tabCompletion'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/parts/debug/browser/baseDebugView.ts b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts similarity index 97% rename from src/vs/workbench/parts/debug/browser/baseDebugView.ts rename to src/vs/workbench/contrib/debug/browser/baseDebugView.ts index c073bb18876..0a79cb2a500 100644 --- a/src/vs/workbench/parts/debug/browser/baseDebugView.ts +++ b/src/vs/workbench/contrib/debug/browser/baseDebugView.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import * as dom from 'vs/base/browser/dom'; -import { IExpression, IDebugService } from 'vs/workbench/parts/debug/common/debug'; -import { Expression, Variable } from 'vs/workbench/parts/debug/common/debugModel'; +import { IExpression, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; +import { Expression, Variable } from 'vs/workbench/contrib/debug/common/debugModel'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInputValidationOptions, InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/tree/tree'; diff --git a/src/vs/workbench/parts/debug/browser/breakpointsView.ts b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts similarity index 99% rename from src/vs/workbench/parts/debug/browser/breakpointsView.ts rename to src/vs/workbench/contrib/debug/browser/breakpointsView.ts index 7361a91dbb4..aa3f5428681 100644 --- a/src/vs/workbench/parts/debug/browser/breakpointsView.ts +++ b/src/vs/workbench/contrib/debug/browser/breakpointsView.ts @@ -7,9 +7,9 @@ import * as nls from 'vs/nls'; import * as resources from 'vs/base/common/resources'; import * as dom from 'vs/base/browser/dom'; import { IAction, Action } from 'vs/base/common/actions'; -import { IDebugService, IBreakpoint, CONTEXT_BREAKPOINTS_FOCUSED, EDITOR_CONTRIBUTION_ID, State, DEBUG_SCHEME, IFunctionBreakpoint, IExceptionBreakpoint, IEnablement, IDebugEditorContribution } from 'vs/workbench/parts/debug/common/debug'; -import { ExceptionBreakpoint, FunctionBreakpoint, Breakpoint } from 'vs/workbench/parts/debug/common/debugModel'; -import { AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction, RemoveBreakpointAction, EnableAllBreakpointsAction, DisableAllBreakpointsAction, ReapplyBreakpointsAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { IDebugService, IBreakpoint, CONTEXT_BREAKPOINTS_FOCUSED, EDITOR_CONTRIBUTION_ID, State, DEBUG_SCHEME, IFunctionBreakpoint, IExceptionBreakpoint, IEnablement, IDebugEditorContribution } from 'vs/workbench/contrib/debug/common/debug'; +import { ExceptionBreakpoint, FunctionBreakpoint, Breakpoint } from 'vs/workbench/contrib/debug/common/debugModel'; +import { AddFunctionBreakpointAction, ToggleBreakpointsActivatedAction, RemoveAllBreakpointsAction, RemoveBreakpointAction, EnableAllBreakpointsAction, DisableAllBreakpointsAction, ReapplyBreakpointsAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { IContextMenuService, IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; diff --git a/src/vs/workbench/parts/debug/browser/debugANSIHandling.ts b/src/vs/workbench/contrib/debug/browser/debugANSIHandling.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/debugANSIHandling.ts rename to src/vs/workbench/contrib/debug/browser/debugANSIHandling.ts index b373c452689..31b85e0087e 100644 --- a/src/vs/workbench/parts/debug/browser/debugANSIHandling.ts +++ b/src/vs/workbench/contrib/debug/browser/debugANSIHandling.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; /** * @param text The content to stylize. diff --git a/src/vs/workbench/parts/debug/browser/debugActionItems.ts b/src/vs/workbench/contrib/debug/browser/debugActionItems.ts similarity index 99% rename from src/vs/workbench/parts/debug/browser/debugActionItems.ts rename to src/vs/workbench/contrib/debug/browser/debugActionItems.ts index 5982a254e28..07298620ba1 100644 --- a/src/vs/workbench/parts/debug/browser/debugActionItems.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActionItems.ts @@ -12,7 +12,7 @@ import { SelectBox, ISelectOptionItem } from 'vs/base/browser/ui/selectBox/selec import { SelectActionItem, IActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugService, IDebugSession } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachSelectBoxStyler, attachStylerCallback } from 'vs/platform/theme/common/styler'; import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme'; diff --git a/src/vs/workbench/parts/debug/browser/debugActions.ts b/src/vs/workbench/contrib/debug/browser/debugActions.ts similarity index 99% rename from src/vs/workbench/parts/debug/browser/debugActions.ts rename to src/vs/workbench/contrib/debug/browser/debugActions.ts index c00d6590dc7..bf9c754e095 100644 --- a/src/vs/workbench/parts/debug/browser/debugActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugActions.ts @@ -11,8 +11,8 @@ import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; import { IDebugService, State, IDebugSession, IThread, IEnablement, IBreakpoint, IStackFrame, REPL_ID } - from 'vs/workbench/parts/debug/common/debug'; -import { Variable, Expression, Thread, Breakpoint } from 'vs/workbench/parts/debug/common/debugModel'; + from 'vs/workbench/contrib/debug/common/debug'; +import { Variable, Expression, Thread, Breakpoint } from 'vs/workbench/contrib/debug/common/debugModel'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/parts/debug/browser/debugCommands.ts b/src/vs/workbench/contrib/debug/browser/debugCommands.ts similarity index 97% rename from src/vs/workbench/parts/debug/browser/debugCommands.ts rename to src/vs/workbench/contrib/debug/browser/debugCommands.ts index f983c1cc2d0..726e1970104 100644 --- a/src/vs/workbench/parts/debug/browser/debugCommands.ts +++ b/src/vs/workbench/contrib/debug/browser/debugCommands.ts @@ -9,16 +9,16 @@ 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/parts/debug/common/debug'; -import { Expression, Variable, Breakpoint, FunctionBreakpoint } from 'vs/workbench/parts/debug/common/debugModel'; -import { IExtensionsViewlet, VIEWLET_ID as EXTENSIONS_VIEWLET_ID } from 'vs/workbench/parts/extensions/common/extensions'; +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 { 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'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { openBreakpointSource } from 'vs/workbench/parts/debug/browser/breakpointsView'; +import { openBreakpointSource } from 'vs/workbench/contrib/debug/browser/breakpointsView'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { InputFocusedContext } from 'vs/platform/workbench/common/contextkeys'; import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; diff --git a/src/vs/workbench/parts/debug/browser/debugContentProvider.ts b/src/vs/workbench/contrib/debug/browser/debugContentProvider.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/debugContentProvider.ts rename to src/vs/workbench/contrib/debug/browser/debugContentProvider.ts index 8e21de41975..5909b232d63 100644 --- a/src/vs/workbench/parts/debug/browser/debugContentProvider.ts +++ b/src/vs/workbench/contrib/debug/browser/debugContentProvider.ts @@ -11,8 +11,8 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { DEBUG_SCHEME, IDebugService, IDebugSession } from 'vs/workbench/parts/debug/common/debug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { DEBUG_SCHEME, IDebugService, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { EditOperation } from 'vs/editor/common/core/editOperation'; import { Range } from 'vs/editor/common/core/range'; diff --git a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/debugEditorActions.ts rename to src/vs/workbench/contrib/debug/browser/debugEditorActions.ts index 0ee09ead1c7..25a792b2ebf 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorActions.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorActions.ts @@ -9,12 +9,12 @@ import { Range } from 'vs/editor/common/core/range'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ServicesAccessor, registerEditorAction, EditorAction, IActionOptions } from 'vs/editor/browser/editorExtensions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, IBreakpoint } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, CONTEXT_IN_DEBUG_MODE, CONTEXT_DEBUG_STATE, State, REPL_ID, VIEWLET_ID, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, BreakpointWidgetContext, IBreakpoint } from 'vs/workbench/contrib/debug/common/debug'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { openBreakpointSource } from 'vs/workbench/parts/debug/browser/breakpointsView'; +import { openBreakpointSource } from 'vs/workbench/contrib/debug/browser/breakpointsView'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { PanelFocusContext } from 'vs/workbench/browser/parts/panel/panelPart'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; diff --git a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts b/src/vs/workbench/contrib/debug/browser/debugEditorModelManager.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts rename to src/vs/workbench/contrib/debug/browser/debugEditorModelManager.ts index ca2475294da..9e0908183b9 100644 --- a/src/vs/workbench/parts/debug/browser/debugEditorModelManager.ts +++ b/src/vs/workbench/contrib/debug/browser/debugEditorModelManager.ts @@ -8,10 +8,10 @@ import { Constants } from 'vs/editor/common/core/uint'; import { Range } from 'vs/editor/common/core/range'; import { ITextModel, TrackedRangeStickiness, IModelDeltaDecoration, IModelDecorationOptions } from 'vs/editor/common/model'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IDebugService, IBreakpoint, State, IBreakpointUpdateData } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IBreakpoint, State, IBreakpointUpdateData } from 'vs/workbench/contrib/debug/common/debug'; import { IModelService } from 'vs/editor/common/services/modelService'; import { MarkdownString } from 'vs/base/common/htmlContent'; -import { getBreakpointMessageAndClassName } from 'vs/workbench/parts/debug/browser/breakpointsView'; +import { getBreakpointMessageAndClassName } from 'vs/workbench/contrib/debug/browser/breakpointsView'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { localize } from 'vs/nls'; diff --git a/src/vs/workbench/parts/debug/browser/debugQuickOpen.ts b/src/vs/workbench/contrib/debug/browser/debugQuickOpen.ts similarity index 97% rename from src/vs/workbench/parts/debug/browser/debugQuickOpen.ts rename to src/vs/workbench/contrib/debug/browser/debugQuickOpen.ts index 3fe73ff856a..d06528d460b 100644 --- a/src/vs/workbench/parts/debug/browser/debugQuickOpen.ts +++ b/src/vs/workbench/contrib/debug/browser/debugQuickOpen.ts @@ -8,10 +8,10 @@ import * as Filters from 'vs/base/common/filters'; import * as Quickopen from 'vs/workbench/browser/quickopen'; import * as QuickOpen from 'vs/base/parts/quickopen/common/quickOpen'; import * as Model from 'vs/base/parts/quickopen/browser/quickOpenModel'; -import { IDebugService, ILaunch } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, ILaunch } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { StartAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { StartAction } from 'vs/workbench/contrib/debug/browser/debugActions'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/parts/debug/browser/debugStatus.ts b/src/vs/workbench/contrib/debug/browser/debugStatus.ts similarity index 97% rename from src/vs/workbench/parts/debug/browser/debugStatus.ts rename to src/vs/workbench/contrib/debug/browser/debugStatus.ts index 0a069f34415..eb810bf137a 100644 --- a/src/vs/workbench/parts/debug/browser/debugStatus.ts +++ b/src/vs/workbench/contrib/debug/browser/debugStatus.ts @@ -9,10 +9,10 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { IDebugService, State, IDebugConfiguration } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, State, IDebugConfiguration } from 'vs/workbench/contrib/debug/common/debug'; import { Themable, STATUS_BAR_FOREGROUND } from 'vs/workbench/common/theme'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { STATUS_BAR_DEBUGGING_FOREGROUND, isStatusbarInDebugMode } from 'vs/workbench/parts/debug/browser/statusbarColorProvider'; +import { STATUS_BAR_DEBUGGING_FOREGROUND, isStatusbarInDebugMode } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/browser/debugToolbar.ts b/src/vs/workbench/contrib/debug/browser/debugToolbar.ts similarity index 97% rename from src/vs/workbench/parts/debug/browser/debugToolbar.ts rename to src/vs/workbench/contrib/debug/browser/debugToolbar.ts index 98ae68a8914..3ec36f960ca 100644 --- a/src/vs/workbench/parts/debug/browser/debugToolbar.ts +++ b/src/vs/workbench/contrib/debug/browser/debugToolbar.ts @@ -13,9 +13,9 @@ import { IAction, IRunEvent } from 'vs/base/common/actions'; import { ActionBar, ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IDebugConfiguration, IDebugService, State } from 'vs/workbench/parts/debug/common/debug'; -import { AbstractDebugAction, PauseAction, ContinueAction, StepBackAction, ReverseContinueAction, StopAction, DisconnectAction, StepOverAction, StepIntoAction, StepOutAction, RestartAction, FocusSessionAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { FocusSessionActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems'; +import { IDebugConfiguration, IDebugService, State } from 'vs/workbench/contrib/debug/common/debug'; +import { AbstractDebugAction, PauseAction, ContinueAction, StepBackAction, ReverseContinueAction, StopAction, DisconnectAction, StepOverAction, StepIntoAction, StepOutAction, RestartAction, FocusSessionAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { FocusSessionActionItem } from 'vs/workbench/contrib/debug/browser/debugActionItems'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -29,7 +29,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { RunOnceScheduler } from 'vs/base/common/async'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { isExtensionHostDebugging } from 'vs/workbench/parts/debug/common/debugUtils'; +import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; const DEBUG_TOOLBAR_POSITION_KEY = 'debug.actionswidgetposition'; const DEBUG_TOOLBAR_Y_KEY = 'debug.actionswidgety'; diff --git a/src/vs/workbench/parts/debug/browser/debugViewlet.ts b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts similarity index 96% rename from src/vs/workbench/parts/debug/browser/debugViewlet.ts rename to src/vs/workbench/contrib/debug/browser/debugViewlet.ts index 43d5daa5de7..8660286c4fb 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewlet.ts +++ b/src/vs/workbench/contrib/debug/browser/debugViewlet.ts @@ -9,9 +9,9 @@ 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/parts/debug/common/debug'; -import { StartAction, ToggleReplAction, ConfigureAction, AbstractDebugAction, SelectAndStartAction, FocusSessionAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { StartDebugActionItem, FocusSessionActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems'; +import { IDebugService, VIEWLET_ID, State, BREAKPOINTS_VIEW_ID, IDebugConfiguration } from 'vs/workbench/contrib/debug/common/debug'; +import { StartAction, ToggleReplAction, ConfigureAction, AbstractDebugAction, 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'; import { IProgressService, IProgressRunner } from 'vs/platform/progress/common/progress'; @@ -24,7 +24,7 @@ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { memoize } from 'vs/base/common/decorators'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { DebugToolbar } from 'vs/workbench/parts/debug/browser/debugToolbar'; +import { DebugToolbar } from 'vs/workbench/contrib/debug/browser/debugToolbar'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; diff --git a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts similarity index 96% rename from src/vs/workbench/parts/debug/browser/exceptionWidget.ts rename to src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index 3f2dfd1beac..1b971255d7e 100644 --- a/src/vs/workbench/parts/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -8,13 +8,13 @@ import * as nls from 'vs/nls'; import * as dom from 'vs/base/browser/dom'; import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IExceptionInfo } from 'vs/workbench/parts/debug/common/debug'; +import { IExceptionInfo } from 'vs/workbench/contrib/debug/common/debug'; import { RunOnceScheduler } from 'vs/base/common/async'; import { IThemeService, ITheme } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; const $ = dom.$; // theming diff --git a/src/vs/workbench/parts/debug/browser/linkDetector.ts b/src/vs/workbench/contrib/debug/browser/linkDetector.ts similarity index 100% rename from src/vs/workbench/parts/debug/browser/linkDetector.ts rename to src/vs/workbench/contrib/debug/browser/linkDetector.ts diff --git a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/loadedScriptsView.ts rename to src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts index 9379dbf7926..8a85289d1d4 100644 --- a/src/vs/workbench/parts/debug/browser/loadedScriptsView.ts +++ b/src/vs/workbench/contrib/debug/browser/loadedScriptsView.ts @@ -12,9 +12,9 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { renderViewTree } from 'vs/workbench/parts/debug/browser/baseDebugView'; -import { IDebugSession, IDebugService, IDebugModel, CONTEXT_LOADED_SCRIPTS_ITEM_TYPE } from 'vs/workbench/parts/debug/common/debug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { renderViewTree } from 'vs/workbench/contrib/debug/browser/baseDebugView'; +import { IDebugSession, IDebugService, IDebugModel, CONTEXT_LOADED_SCRIPTS_ITEM_TYPE } from 'vs/workbench/contrib/debug/common/debug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -31,7 +31,7 @@ import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { WorkbenchAsyncDataTree, IListService, TreeResourceNavigator2 } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { DebugContentProvider } from 'vs/workbench/parts/debug/browser/debugContentProvider'; +import { DebugContentProvider } from 'vs/workbench/contrib/debug/browser/debugContentProvider'; import { dispose } from 'vs/base/common/lifecycle'; import { createMatches, FuzzyScore } from 'vs/base/common/filters'; diff --git a/src/vs/workbench/parts/debug/browser/media/add-focus.svg b/src/vs/workbench/contrib/debug/browser/media/add-focus.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/add-focus.svg rename to src/vs/workbench/contrib/debug/browser/media/add-focus.svg diff --git a/src/vs/workbench/parts/debug/browser/media/add-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/add-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/add-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/add-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/add.svg b/src/vs/workbench/contrib/debug/browser/media/add.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/add.svg rename to src/vs/workbench/contrib/debug/browser/media/add.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-disabled.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-disabled.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-conditional-unverified.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional-unverified.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-conditional.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-conditional.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-conditional.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-disabled.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-disabled.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-function-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-function-disabled.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-function-disabled.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-function-unverified.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-function-unverified.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-function.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-function.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-function.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-hint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-hint.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-hint.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-log-disabled.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-log-disabled.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-log-disabled.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-log-unverified.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-log-unverified.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-log.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-log.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-log.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-unsupported.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-unsupported.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-unsupported.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint-unverified.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint-unverified.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoint.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoint.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoint.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpointWidget.css b/src/vs/workbench/contrib/debug/browser/media/breakpointWidget.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpointWidget.css rename to src/vs/workbench/contrib/debug/browser/media/breakpointWidget.css diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoints-activate-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoints-activate-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoints-activate-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/breakpoints-activate.svg b/src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/breakpoints-activate.svg rename to src/vs/workbench/contrib/debug/browser/media/breakpoints-activate.svg diff --git a/src/vs/workbench/parts/debug/browser/media/clear-repl-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/clear-repl-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/clear-repl-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/clear-repl.svg b/src/vs/workbench/contrib/debug/browser/media/clear-repl.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/clear-repl.svg rename to src/vs/workbench/contrib/debug/browser/media/clear-repl.svg diff --git a/src/vs/workbench/parts/debug/browser/media/configure-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/configure-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/configure-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/configure.svg b/src/vs/workbench/contrib/debug/browser/media/configure.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/configure.svg rename to src/vs/workbench/contrib/debug/browser/media/configure.svg diff --git a/src/vs/workbench/parts/debug/browser/media/continue-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/continue-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/continue-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/continue.svg b/src/vs/workbench/contrib/debug/browser/media/continue.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/continue.svg rename to src/vs/workbench/contrib/debug/browser/media/continue.svg diff --git a/src/vs/workbench/parts/debug/browser/media/current-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/current-and-breakpoint.svg rename to src/vs/workbench/contrib/debug/browser/media/current-and-breakpoint.svg diff --git a/src/vs/workbench/parts/debug/browser/media/current-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/current-arrow.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/current-arrow.svg rename to src/vs/workbench/contrib/debug/browser/media/current-arrow.svg diff --git a/src/vs/workbench/parts/debug/browser/media/debug-dark.svg b/src/vs/workbench/contrib/debug/browser/media/debug-dark.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/debug-dark.svg rename to src/vs/workbench/contrib/debug/browser/media/debug-dark.svg diff --git a/src/vs/workbench/parts/debug/browser/media/debug.contribution.css b/src/vs/workbench/contrib/debug/browser/media/debug.contribution.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/debug.contribution.css rename to src/vs/workbench/contrib/debug/browser/media/debug.contribution.css diff --git a/src/vs/workbench/parts/debug/browser/media/debugHover.css b/src/vs/workbench/contrib/debug/browser/media/debugHover.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/debugHover.css rename to src/vs/workbench/contrib/debug/browser/media/debugHover.css diff --git a/src/vs/workbench/parts/debug/browser/media/debugToolbar.css b/src/vs/workbench/contrib/debug/browser/media/debugToolbar.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/debugToolbar.css rename to src/vs/workbench/contrib/debug/browser/media/debugToolbar.css diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/contrib/debug/browser/media/debugViewlet.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/debugViewlet.css rename to src/vs/workbench/contrib/debug/browser/media/debugViewlet.css diff --git a/src/vs/workbench/parts/debug/browser/media/disconnect-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/disconnect-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/disconnect-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/disconnect.svg b/src/vs/workbench/contrib/debug/browser/media/disconnect.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/disconnect.svg rename to src/vs/workbench/contrib/debug/browser/media/disconnect.svg diff --git a/src/vs/workbench/parts/debug/browser/media/drag.svg b/src/vs/workbench/contrib/debug/browser/media/drag.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/drag.svg rename to src/vs/workbench/contrib/debug/browser/media/drag.svg diff --git a/src/vs/workbench/parts/debug/browser/media/exceptionWidget.css b/src/vs/workbench/contrib/debug/browser/media/exceptionWidget.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/exceptionWidget.css rename to src/vs/workbench/contrib/debug/browser/media/exceptionWidget.css diff --git a/src/vs/workbench/parts/debug/browser/media/pause-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/pause-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/pause-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/pause.svg b/src/vs/workbench/contrib/debug/browser/media/pause.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/pause.svg rename to src/vs/workbench/contrib/debug/browser/media/pause.svg diff --git a/src/vs/workbench/parts/debug/browser/media/remove-all-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/remove-all-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/remove-all-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/remove-all.svg b/src/vs/workbench/contrib/debug/browser/media/remove-all.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/remove-all.svg rename to src/vs/workbench/contrib/debug/browser/media/remove-all.svg diff --git a/src/vs/workbench/parts/debug/browser/media/repl-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/repl-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/repl-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/repl.css b/src/vs/workbench/contrib/debug/browser/media/repl.css similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/repl.css rename to src/vs/workbench/contrib/debug/browser/media/repl.css diff --git a/src/vs/workbench/parts/debug/browser/media/repl.svg b/src/vs/workbench/contrib/debug/browser/media/repl.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/repl.svg rename to src/vs/workbench/contrib/debug/browser/media/repl.svg diff --git a/src/vs/workbench/parts/debug/browser/media/restart-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/restart-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/restart-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/restart.svg b/src/vs/workbench/contrib/debug/browser/media/restart.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/restart.svg rename to src/vs/workbench/contrib/debug/browser/media/restart.svg diff --git a/src/vs/workbench/parts/debug/browser/media/stackframe-and-breakpoint.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/stackframe-and-breakpoint.svg rename to src/vs/workbench/contrib/debug/browser/media/stackframe-and-breakpoint.svg diff --git a/src/vs/workbench/parts/debug/browser/media/stackframe-arrow.svg b/src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/stackframe-arrow.svg rename to src/vs/workbench/contrib/debug/browser/media/stackframe-arrow.svg diff --git a/src/vs/workbench/parts/debug/browser/media/start-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/start-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/start-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/start-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/start.svg b/src/vs/workbench/contrib/debug/browser/media/start.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/start.svg rename to src/vs/workbench/contrib/debug/browser/media/start.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-into-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-into-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/step-into-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-into.svg b/src/vs/workbench/contrib/debug/browser/media/step-into.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-into.svg rename to src/vs/workbench/contrib/debug/browser/media/step-into.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-out-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-out-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/step-out-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-out.svg b/src/vs/workbench/contrib/debug/browser/media/step-out.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-out.svg rename to src/vs/workbench/contrib/debug/browser/media/step-out.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-over-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-over-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/step-over-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/step-over.svg b/src/vs/workbench/contrib/debug/browser/media/step-over.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/step-over.svg rename to src/vs/workbench/contrib/debug/browser/media/step-over.svg diff --git a/src/vs/workbench/parts/debug/browser/media/stop-inverse.svg b/src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/stop-inverse.svg rename to src/vs/workbench/contrib/debug/browser/media/stop-inverse.svg diff --git a/src/vs/workbench/parts/debug/browser/media/stop.svg b/src/vs/workbench/contrib/debug/browser/media/stop.svg similarity index 100% rename from src/vs/workbench/parts/debug/browser/media/stop.svg rename to src/vs/workbench/contrib/debug/browser/media/stop.svg diff --git a/src/vs/workbench/parts/debug/browser/statusbarColorProvider.ts b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts similarity index 98% rename from src/vs/workbench/parts/debug/browser/statusbarColorProvider.ts rename to src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts index 43591298a91..7ee9bf99083 100644 --- a/src/vs/workbench/parts/debug/browser/statusbarColorProvider.ts +++ b/src/vs/workbench/contrib/debug/browser/statusbarColorProvider.ts @@ -8,7 +8,7 @@ import { localize } from 'vs/nls'; import { registerColor, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; -import { IDebugService, State } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, State } from 'vs/workbench/contrib/debug/common/debug'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { STATUS_BAR_NO_FOLDER_BACKGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND, STATUS_BAR_BACKGROUND, Themable, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_BORDER, STATUS_BAR_BORDER } from 'vs/workbench/common/theme'; import { addClass, removeClass, createStyleSheet } from 'vs/base/browser/dom'; diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/contrib/debug/common/debug.ts similarity index 99% rename from src/vs/workbench/parts/debug/common/debug.ts rename to src/vs/workbench/contrib/debug/common/debug.ts index 903ce32c4e4..0e629cd2d1b 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/contrib/debug/common/debug.ts @@ -14,7 +14,7 @@ import { ITextModel as EditorIModel } from 'vs/editor/common/model'; import { IEditor } from 'vs/workbench/common/editor'; import { Position } from 'vs/editor/common/core/position'; import { CompletionItem } from 'vs/editor/common/modes'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { Range, IRange } from 'vs/editor/common/core/range'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; @@ -22,9 +22,9 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IDisposable } from 'vs/base/common/lifecycle'; import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; -import { TaskIdentifier } from 'vs/workbench/parts/tasks/common/tasks'; +import { TaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; +import { IOutputService } from 'vs/workbench/contrib/output/common/output'; export const VIEWLET_ID = 'workbench.view.debug'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/contrib/debug/common/debugModel.ts similarity index 99% rename from src/vs/workbench/parts/debug/common/debugModel.ts rename to src/vs/workbench/contrib/debug/common/debugModel.ts index 428f37ebc6a..35172eda586 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/contrib/debug/common/debugModel.ts @@ -17,8 +17,8 @@ import { Range, IRange } from 'vs/editor/common/core/range'; import { ITreeElement, IExpression, IExpressionContainer, IDebugSession, IStackFrame, IExceptionBreakpoint, IBreakpoint, IFunctionBreakpoint, IDebugModel, IReplElementSource, IThread, IRawModelUpdate, IScope, IRawStoppedDetails, IEnablement, IBreakpointData, IExceptionInfo, IReplElement, IBreakpointsChangeEvent, IBreakpointUpdateData, IBaseBreakpoint, State -} from 'vs/workbench/parts/debug/common/debug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +} from 'vs/workbench/contrib/debug/common/debug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { commonSuffixLength } from 'vs/base/common/strings'; import { sep } from 'vs/base/common/paths'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; diff --git a/src/vs/workbench/parts/debug/common/debugProtocol.d.ts b/src/vs/workbench/contrib/debug/common/debugProtocol.d.ts similarity index 100% rename from src/vs/workbench/parts/debug/common/debugProtocol.d.ts rename to src/vs/workbench/contrib/debug/common/debugProtocol.d.ts diff --git a/src/vs/workbench/parts/debug/common/debugSchemas.ts b/src/vs/workbench/contrib/debug/common/debugSchemas.ts similarity index 98% rename from src/vs/workbench/parts/debug/common/debugSchemas.ts rename to src/vs/workbench/contrib/debug/common/debugSchemas.ts index 67b573e33d4..6788b899874 100644 --- a/src/vs/workbench/parts/debug/common/debugSchemas.ts +++ b/src/vs/workbench/contrib/debug/common/debugSchemas.ts @@ -5,7 +5,7 @@ import * as extensionsRegistry from 'vs/workbench/services/extensions/common/extensionsRegistry'; import * as nls from 'vs/nls'; -import { IDebuggerContribution, ICompound } from 'vs/workbench/parts/debug/common/debug'; +import { IDebuggerContribution, ICompound } from 'vs/workbench/contrib/debug/common/debug'; import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; import { inputsSchema } from 'vs/workbench/services/configurationResolver/common/configurationResolverSchema'; diff --git a/src/vs/workbench/parts/debug/common/debugSource.ts b/src/vs/workbench/contrib/debug/common/debugSource.ts similarity index 90% rename from src/vs/workbench/parts/debug/common/debugSource.ts rename to src/vs/workbench/contrib/debug/common/debugSource.ts index 35b974baee2..0cfc1e8b6b3 100644 --- a/src/vs/workbench/parts/debug/common/debugSource.ts +++ b/src/vs/workbench/contrib/debug/common/debugSource.ts @@ -7,11 +7,11 @@ import * as nls from 'vs/nls'; import { URI as uri } from 'vs/base/common/uri'; import * as paths from 'vs/base/common/paths'; import * as resources from 'vs/base/common/resources'; -import { DEBUG_SCHEME } from 'vs/workbench/parts/debug/common/debug'; +import { DEBUG_SCHEME } from 'vs/workbench/contrib/debug/common/debug'; import { IRange } from 'vs/editor/common/core/range'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { Schemas } from 'vs/base/common/network'; -import { isUri } from 'vs/workbench/parts/debug/common/debugUtils'; +import { isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; const UNKNOWN_SOURCE_LABEL = nls.localize('unknownSource', "Unknown Source"); @@ -37,7 +37,7 @@ export class Source { constructor(public raw: DebugProtocol.Source, sessionId: string) { let path: string; if (raw) { - path = this.raw.path || this.raw.name; + path = this.raw.path || this.raw.name || ''; this.available = true; } else { this.raw = { name: UNKNOWN_SOURCE_LABEL }; @@ -45,7 +45,7 @@ export class Source { path = `${DEBUG_SCHEME}:${UNKNOWN_SOURCE_LABEL}`; } - if (this.raw.sourceReference > 0) { + if (typeof this.raw.sourceReference === 'number' && this.raw.sourceReference > 0) { this.uri = uri.parse(`${DEBUG_SCHEME}:${encodeURIComponent(path)}?session=${encodeURIComponent(sessionId)}&ref=${this.raw.sourceReference}`); } else { if (isUri(path)) { // path looks like a uri @@ -97,10 +97,10 @@ export class Source { }, sideBySide ? SIDE_GROUP : ACTIVE_GROUP); } - static getEncodedDebugData(modelUri: uri): { name: string, path: string, sessionId: string, sourceReference: number } { + static getEncodedDebugData(modelUri: uri): { name: string, path: string, sessionId?: string, sourceReference?: number } { let path: string; - let sourceReference: number; - let sessionId: string; + let sourceReference: number | undefined; + let sessionId: string | undefined; switch (modelUri.scheme) { case Schemas.file: diff --git a/src/vs/workbench/parts/debug/common/debugUtils.ts b/src/vs/workbench/contrib/debug/common/debugUtils.ts similarity index 95% rename from src/vs/workbench/parts/debug/common/debugUtils.ts rename to src/vs/workbench/contrib/debug/common/debugUtils.ts index 0d00748fd61..b1b54612c29 100644 --- a/src/vs/workbench/parts/debug/common/debugUtils.ts +++ b/src/vs/workbench/contrib/debug/common/debugUtils.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { equalsIgnoreCase } from 'vs/base/common/strings'; -import { IConfig } from 'vs/workbench/parts/debug/common/debug'; +import { IConfig } from 'vs/workbench/contrib/debug/common/debug'; import { URI as uri } from 'vs/base/common/uri'; import { isAbsolute_posix, isAbsolute_win32 } from 'vs/base/common/paths'; import { deepClone } from 'vs/base/common/objects'; @@ -34,7 +34,7 @@ export function getExactExpressionStartAndEnd(lineContent: string, looseStart: n // Some example supported expressions: myVar.prop, a.b.c.d, myVar?.prop, myVar->prop, MyClass::StaticProp, *myVar // Match any character except a set of characters which often break interesting sub-expressions let expression: RegExp = /([^()\[\]{}<>\s+\-/%~#^;=|,`!]|\->)+/g; - let result: RegExpExecArray | undefined = undefined; + let result: RegExpExecArray | null = null; // First find the full expression under the cursor while (result = expression.exec(lineContent)) { @@ -52,7 +52,7 @@ export function getExactExpressionStartAndEnd(lineContent: string, looseStart: n // For example in expression 'a.b.c.d', if the focus was under 'b', 'a.b' would be evaluated. if (matchingExpression) { let subExpression: RegExp = /\w+/g; - let subExpressionResult: RegExpExecArray | undefined = undefined; + let subExpressionResult: RegExpExecArray | null = null; while (subExpressionResult = subExpression.exec(matchingExpression)) { let subEnd = subExpressionResult.index + 1 + startOffset + subExpressionResult[0].length; if (subEnd >= looseEnd) { @@ -122,7 +122,7 @@ export function convertToDAPaths(message: DebugProtocol.ProtocolMessage, toUri: convertPaths(msg, (toDA: boolean, source: PathContainer | undefined) => { if (toDA && source) { - source.path = fixPath(source.path); + source.path = source.path ? fixPath(source.path) : undefined; } }); return msg; @@ -137,7 +137,7 @@ export function convertToVSCPaths(message: DebugProtocol.ProtocolMessage, toUri: convertPaths(msg, (toDA: boolean, source: PathContainer | undefined) => { if (!toDA && source) { - source.path = fixPath(source.path); + source.path = source.path ? fixPath(source.path) : undefined; } }); return msg; diff --git a/src/vs/workbench/parts/debug/common/debugViewModel.ts b/src/vs/workbench/contrib/debug/common/debugViewModel.ts similarity index 98% rename from src/vs/workbench/parts/debug/common/debugViewModel.ts rename to src/vs/workbench/contrib/debug/common/debugViewModel.ts index 4969af831f4..d65b9d9ae09 100644 --- a/src/vs/workbench/parts/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 } from 'vs/workbench/parts/debug/common/debug'; +import { CONTEXT_EXPRESSION_SELECTED, IViewModel, IStackFrame, IDebugSession, IThread, IExpression, IFunctionBreakpoint, CONTEXT_BREAKPOINT_SELECTED, CONTEXT_LOADED_SCRIPTS_SUPPORTED } from 'vs/workbench/contrib/debug/common/debug'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; export class ViewModel implements IViewModel { diff --git a/src/vs/workbench/parts/debug/common/replModel.ts b/src/vs/workbench/contrib/debug/common/replModel.ts similarity index 97% rename from src/vs/workbench/parts/debug/common/replModel.ts rename to src/vs/workbench/contrib/debug/common/replModel.ts index 65c3fe2d7e4..d78e15f9884 100644 --- a/src/vs/workbench/parts/debug/common/replModel.ts +++ b/src/vs/workbench/contrib/debug/common/replModel.ts @@ -5,8 +5,8 @@ import * as nls from 'vs/nls'; import severity from 'vs/base/common/severity'; -import { IReplElement, IStackFrame, IExpression, IReplElementSource, IDebugSession } from 'vs/workbench/parts/debug/common/debug'; -import { Expression, SimpleReplElement, RawObjectReplElement } from 'vs/workbench/parts/debug/common/debugModel'; +import { IReplElement, IStackFrame, IExpression, IReplElementSource, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; +import { Expression, SimpleReplElement, RawObjectReplElement } from 'vs/workbench/contrib/debug/common/debugModel'; import { isUndefinedOrNull, isObject } from 'vs/base/common/types'; import { basenameOrAuthority } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; diff --git a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts b/src/vs/workbench/contrib/debug/electron-browser/breakpointWidget.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts rename to src/vs/workbench/contrib/debug/electron-browser/breakpointWidget.ts index 173de047a1a..f2aa24229b2 100644 --- a/src/vs/workbench/parts/debug/electron-browser/breakpointWidget.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/breakpointWidget.ts @@ -13,7 +13,7 @@ import { Position, IPosition } from 'vs/editor/common/core/position'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { ZoneWidget } from 'vs/editor/contrib/zoneWidget/zoneWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { IDebugService, IBreakpoint, BreakpointWidgetContext as Context, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, DEBUG_SCHEME, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, CONTEXT_IN_BREAKPOINT_WIDGET } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, IBreakpoint, BreakpointWidgetContext as Context, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, DEBUG_SCHEME, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID, CONTEXT_IN_BREAKPOINT_WIDGET } from 'vs/workbench/contrib/debug/common/debug'; import { attachSelectBoxStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -32,8 +32,8 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IDecorationOptions } from 'vs/editor/common/editorCommon'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { getSimpleCodeEditorWidgetOptions } from 'vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions'; -import { getSimpleEditorOptions } from 'vs/workbench/parts/codeEditor/browser/simpleEditorOptions'; +import { getSimpleCodeEditorWidgetOptions } from 'vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions'; +import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { IRange, Range } from 'vs/editor/common/core/range'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts b/src/vs/workbench/contrib/debug/electron-browser/callStackView.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/callStackView.ts rename to src/vs/workbench/contrib/debug/electron-browser/callStackView.ts index 4be39474958..0d300602afa 100644 --- a/src/vs/workbench/parts/debug/electron-browser/callStackView.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/callStackView.ts @@ -7,23 +7,23 @@ import * as nls from 'vs/nls'; import { RunOnceScheduler, ignoreErrors } from 'vs/base/common/async'; import * as dom from 'vs/base/browser/dom'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, State, IStackFrame, IDebugSession, IThread, CONTEXT_CALLSTACK_ITEM_TYPE, IDebugModel } from 'vs/workbench/parts/debug/common/debug'; -import { Thread, StackFrame, ThreadAndSessionIds } from 'vs/workbench/parts/debug/common/debugModel'; +import { IDebugService, State, IStackFrame, IDebugSession, IThread, CONTEXT_CALLSTACK_ITEM_TYPE, IDebugModel } from 'vs/workbench/contrib/debug/common/debug'; +import { Thread, StackFrame, ThreadAndSessionIds } from 'vs/workbench/contrib/debug/common/debugModel'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { MenuId, IMenu, IMenuService } from 'vs/platform/actions/common/actions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { renderViewTree } from 'vs/workbench/parts/debug/browser/baseDebugView'; +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 } from 'vs/workbench/parts/debug/browser/debugActions'; -import { CopyStackTraceAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { RestartAction, StopAction, ContinueAction, StepOverAction, StepIntoAction, StepOutAction, PauseAction, RestartFrameAction, TerminateThreadAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { CopyStackTraceAction } from 'vs/workbench/contrib/debug/electron-browser/electronDebugActions'; 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'; -import { DebugSession } from 'vs/workbench/parts/debug/electron-browser/debugSession'; +import { DebugSession } from 'vs/workbench/contrib/debug/electron-browser/debugSession'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts similarity index 92% rename from src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts rename to src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts index 2d640f1a84c..78fbeb2ea33 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debug.contribution.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debug.contribution.ts @@ -17,43 +17,43 @@ import { ShowViewletAction, Extensions as ViewletExtensions, ViewletRegistry, Vi import { TogglePanelAction, Extensions as PanelExtensions, PanelRegistry, PanelDescriptor } from 'vs/workbench/browser/panel'; import { StatusbarItemDescriptor, IStatusbarRegistry, Extensions as StatusExtensions } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { VariablesView } from 'vs/workbench/parts/debug/electron-browser/variablesView'; -import { BreakpointsView } from 'vs/workbench/parts/debug/browser/breakpointsView'; -import { WatchExpressionsView } from 'vs/workbench/parts/debug/electron-browser/watchExpressionsView'; -import { CallStackView } from 'vs/workbench/parts/debug/electron-browser/callStackView'; +import { VariablesView } from 'vs/workbench/contrib/debug/electron-browser/variablesView'; +import { BreakpointsView } from 'vs/workbench/contrib/debug/browser/breakpointsView'; +import { WatchExpressionsView } from 'vs/workbench/contrib/debug/electron-browser/watchExpressionsView'; +import { CallStackView } from 'vs/workbench/contrib/debug/electron-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_IN_DEBUG_REPL -} from 'vs/workbench/parts/debug/common/debug'; +} from 'vs/workbench/contrib/debug/common/debug'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import { DebugEditorModelManager } from 'vs/workbench/parts/debug/browser/debugEditorModelManager'; +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 -} from 'vs/workbench/parts/debug/browser/debugActions'; -import { DebugToolbar } from 'vs/workbench/parts/debug/browser/debugToolbar'; -import * as service from 'vs/workbench/parts/debug/electron-browser/debugService'; -import { DebugContentProvider } from 'vs/workbench/parts/debug/browser/debugContentProvider'; -import 'vs/workbench/parts/debug/electron-browser/debugEditorContribution'; +} 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 { DebugContentProvider } from 'vs/workbench/contrib/debug/browser/debugContentProvider'; +import 'vs/workbench/contrib/debug/electron-browser/debugEditorContribution'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { registerCommands, ADD_CONFIGURATION_ID, TOGGLE_INLINE_BREAKPOINT_ID } from 'vs/workbench/parts/debug/browser/debugCommands'; +import { registerCommands, ADD_CONFIGURATION_ID, TOGGLE_INLINE_BREAKPOINT_ID } from 'vs/workbench/contrib/debug/browser/debugCommands'; import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; -import { StatusBarColorProvider } from 'vs/workbench/parts/debug/browser/statusbarColorProvider'; +import { StatusBarColorProvider } from 'vs/workbench/contrib/debug/browser/statusbarColorProvider'; import { ViewsRegistry } from 'vs/workbench/common/views'; import { isMacintosh } from 'vs/base/common/platform'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { URI } from 'vs/base/common/uri'; -import { DebugViewlet } from 'vs/workbench/parts/debug/browser/debugViewlet'; -import { Repl, ClearReplAction } from 'vs/workbench/parts/debug/electron-browser/repl'; -import { DebugQuickOpenHandler } from 'vs/workbench/parts/debug/browser/debugQuickOpen'; -import { DebugStatus } from 'vs/workbench/parts/debug/browser/debugStatus'; +import { DebugViewlet } from 'vs/workbench/contrib/debug/browser/debugViewlet'; +import { Repl, ClearReplAction } from 'vs/workbench/contrib/debug/electron-browser/repl'; +import { DebugQuickOpenHandler } from 'vs/workbench/contrib/debug/browser/debugQuickOpen'; +import { DebugStatus } from 'vs/workbench/contrib/debug/browser/debugStatus'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; -import { LoadedScriptsView } from 'vs/workbench/parts/debug/browser/loadedScriptsView'; -import { TOGGLE_LOG_POINT_ID, TOGGLE_CONDITIONAL_BREAKPOINT_ID, TOGGLE_BREAKPOINT_ID } from 'vs/workbench/parts/debug/browser/debugEditorActions'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { LoadedScriptsView } from 'vs/workbench/contrib/debug/browser/loadedScriptsView'; +import { TOGGLE_LOG_POINT_ID, TOGGLE_CONDITIONAL_BREAKPOINT_ID, TOGGLE_BREAKPOINT_ID } from 'vs/workbench/contrib/debug/browser/debugEditorActions'; class OpenDebugViewletAction extends ShowViewletAction { public static readonly ID = VIEWLET_ID; @@ -442,7 +442,7 @@ if (isMacintosh) { const registerTouchBarEntry = (id: string, title: string, order, when: ContextKeyExpr, icon: string) => { MenuRegistry.appendMenuItem(MenuId.TouchBarContext, { command: { - id, title, iconLocation: { dark: URI.parse(require.toUrl(`vs/workbench/parts/debug/electron-browser/media/${icon}`)) } + id, title, iconLocation: { dark: URI.parse(require.toUrl(`vs/workbench/contrib/debug/electron-browser/media/${icon}`)) } }, when, group: '9_debug', diff --git a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts b/src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts rename to src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts index 87c69d51e3f..90d5cbeeeb9 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugConfigurationManager.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugConfigurationManager.ts @@ -21,16 +21,16 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, IWorkspaceFolder, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugAdapterTrackerFactory, IDebugService } from 'vs/workbench/parts/debug/common/debug'; -import { Debugger } from 'vs/workbench/parts/debug/node/debugger'; +import { IDebugConfigurationProvider, ICompound, IDebugConfiguration, IConfig, IGlobalConfig, IConfigurationManager, ILaunch, IDebugAdapterDescriptorFactory, IDebugAdapter, ITerminalSettings, ITerminalLauncher, IDebugSession, IAdapterDescriptor, CONTEXT_DEBUG_CONFIGURATION_TYPE, IDebugAdapterFactory, IDebugAdapterTrackerFactory, IDebugService } from 'vs/workbench/contrib/debug/common/debug'; +import { Debugger } from 'vs/workbench/contrib/debug/node/debugger'; import { IEditorService, ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { launchSchemaId } from 'vs/workbench/services/configuration/common/configuration'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; -import { TerminalLauncher } from 'vs/workbench/parts/debug/electron-browser/terminalSupport'; +import { TerminalLauncher } from 'vs/workbench/contrib/debug/electron-browser/terminalSupport'; import { Registry } from 'vs/platform/registry/common/platform'; import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; -import { launchSchema, debuggersExtPoint, breakpointsExtPoint } from 'vs/workbench/parts/debug/common/debugSchemas'; +import { launchSchema, debuggersExtPoint, breakpointsExtPoint } from 'vs/workbench/contrib/debug/common/debugSchemas'; import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { onUnexpectedError } from 'vs/base/common/errors'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts b/src/vs/workbench/contrib/debug/electron-browser/debugEditorContribution.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts rename to src/vs/workbench/contrib/debug/electron-browser/debugEditorContribution.ts index f6350174f3a..caeb140c6ae 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugEditorContribution.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugEditorContribution.ts @@ -28,11 +28,11 @@ import { IConfigurationService, IConfigurationOverrides } from 'vs/platform/conf import { ICommandService } from 'vs/platform/commands/common/commands'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { DebugHoverWidget } from 'vs/workbench/parts/debug/electron-browser/debugHover'; -import { RemoveBreakpointAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { IDebugEditorContribution, IDebugService, State, IBreakpoint, EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, IStackFrame, IDebugConfiguration, IExpression, IExceptionInfo, BreakpointWidgetContext } from 'vs/workbench/parts/debug/common/debug'; -import { BreakpointWidget } from 'vs/workbench/parts/debug/electron-browser/breakpointWidget'; -import { ExceptionWidget } from 'vs/workbench/parts/debug/browser/exceptionWidget'; +import { DebugHoverWidget } from 'vs/workbench/contrib/debug/electron-browser/debugHover'; +import { RemoveBreakpointAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { IDebugEditorContribution, IDebugService, State, IBreakpoint, EDITOR_CONTRIBUTION_ID, CONTEXT_BREAKPOINT_WIDGET_VISIBLE, IStackFrame, IDebugConfiguration, IExpression, IExceptionInfo, BreakpointWidgetContext } from 'vs/workbench/contrib/debug/common/debug'; +import { BreakpointWidget } from 'vs/workbench/contrib/debug/electron-browser/breakpointWidget'; +import { ExceptionWidget } from 'vs/workbench/contrib/debug/browser/exceptionWidget'; import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets'; import { Position } from 'vs/editor/common/core/position'; import { CoreEditingCommands } from 'vs/editor/browser/controller/coreCommands'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts b/src/vs/workbench/contrib/debug/electron-browser/debugHover.ts similarity index 96% rename from src/vs/workbench/parts/debug/electron-browser/debugHover.ts rename to src/vs/workbench/contrib/debug/electron-browser/debugHover.ts index 788457f386f..5f607046ec1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugHover.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugHover.ts @@ -14,16 +14,16 @@ import { Position } from 'vs/editor/common/core/position'; import { Range } from 'vs/editor/common/core/range'; import { IContentWidget, ICodeEditor, IContentWidgetPosition, ContentWidgetPositionPreference } from 'vs/editor/browser/editorBrowser'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IDebugService, IExpression, IExpressionContainer } from 'vs/workbench/parts/debug/common/debug'; -import { Expression } from 'vs/workbench/parts/debug/common/debugModel'; -import { renderExpressionValue } from 'vs/workbench/parts/debug/browser/baseDebugView'; -import { VariablesRenderer } from 'vs/workbench/parts/debug/electron-browser/variablesView'; +import { IDebugService, IExpression, IExpressionContainer } from 'vs/workbench/contrib/debug/common/debug'; +import { Expression } from 'vs/workbench/contrib/debug/common/debugModel'; +import { renderExpressionValue } from 'vs/workbench/contrib/debug/browser/baseDebugView'; +import { VariablesRenderer } from 'vs/workbench/contrib/debug/electron-browser/variablesView'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorHoverBackground, editorHoverBorder } from 'vs/platform/theme/common/colorRegistry'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; -import { getExactExpressionStartAndEnd } from 'vs/workbench/parts/debug/common/debugUtils'; +import { getExactExpressionStartAndEnd } from 'vs/workbench/contrib/debug/common/debugUtils'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/contrib/debug/electron-browser/debugService.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/debugService.ts rename to src/vs/workbench/contrib/debug/electron-browser/debugService.ts index 1ec06113de4..5aac6bdf13c 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugService.ts @@ -18,14 +18,14 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { FileChangesEvent, FileChangeType, IFileService } from 'vs/platform/files/common/files'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { DebugModel, ExceptionBreakpoint, FunctionBreakpoint, Breakpoint, Expression } from 'vs/workbench/parts/debug/common/debugModel'; -import { ViewModel } from 'vs/workbench/parts/debug/common/debugViewModel'; -import * as debugactions from 'vs/workbench/parts/debug/browser/debugActions'; -import { ConfigurationManager } from 'vs/workbench/parts/debug/electron-browser/debugConfigurationManager'; -import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; -import { ITaskService, ITaskSummary } from 'vs/workbench/parts/tasks/common/taskService'; -import { TaskError } from 'vs/workbench/parts/tasks/common/taskSystem'; -import { VIEWLET_ID as EXPLORER_VIEWLET_ID } from 'vs/workbench/parts/files/common/files'; +import { DebugModel, ExceptionBreakpoint, FunctionBreakpoint, Breakpoint, Expression } from 'vs/workbench/contrib/debug/common/debugModel'; +import { ViewModel } from 'vs/workbench/contrib/debug/common/debugViewModel'; +import * as debugactions from 'vs/workbench/contrib/debug/browser/debugActions'; +import { ConfigurationManager } from 'vs/workbench/contrib/debug/electron-browser/debugConfigurationManager'; +import Constants from 'vs/workbench/contrib/markers/electron-browser/constants'; +import { ITaskService, ITaskSummary } from 'vs/workbench/contrib/tasks/common/taskService'; +import { TaskError } from 'vs/workbench/contrib/tasks/common/taskSystem'; +import { VIEWLET_ID as EXPLORER_VIEWLET_ID } from 'vs/workbench/contrib/files/common/files'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; @@ -36,15 +36,15 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { EXTENSION_LOG_BROADCAST_CHANNEL, EXTENSION_ATTACH_BROADCAST_CHANNEL, EXTENSION_TERMINATE_BROADCAST_CHANNEL, EXTENSION_RELOAD_BROADCAST_CHANNEL, EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL } from 'vs/platform/extensions/common/extensionHost'; import { IBroadcastService } from 'vs/platform/broadcast/electron-browser/broadcastService'; import { IRemoteConsoleLog, parse, getFirstFrame } from 'vs/base/node/console'; -import { TaskEvent, TaskEventKind, TaskIdentifier } from 'vs/workbench/parts/tasks/common/tasks'; +import { TaskEvent, TaskEventKind, TaskIdentifier } from 'vs/workbench/contrib/tasks/common/tasks'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IAction, Action } from 'vs/base/common/actions'; import { deepClone, equals } from 'vs/base/common/objects'; -import { DebugSession } from 'vs/workbench/parts/debug/electron-browser/debugSession'; +import { DebugSession } from 'vs/workbench/contrib/debug/electron-browser/debugSession'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, REPL_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IGlobalConfig, IStackFrame, AdapterEndEvent, getStateLabel } from 'vs/workbench/parts/debug/common/debug'; -import { isExtensionHostDebugging } from 'vs/workbench/parts/debug/common/debugUtils'; +import { IDebugService, State, IDebugSession, CONTEXT_DEBUG_TYPE, CONTEXT_DEBUG_STATE, CONTEXT_IN_DEBUG_MODE, IThread, IDebugConfiguration, VIEWLET_ID, REPL_ID, IConfig, ILaunch, IViewModel, IConfigurationManager, IDebugModel, IEnablement, IBreakpoint, IBreakpointData, ICompound, IGlobalConfig, IStackFrame, AdapterEndEvent, getStateLabel } from 'vs/workbench/contrib/debug/common/debug'; +import { isExtensionHostDebugging } from 'vs/workbench/contrib/debug/common/debugUtils'; import { isErrorWithActions, createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { RunOnceScheduler } from 'vs/base/common/async'; diff --git a/src/vs/workbench/parts/debug/electron-browser/debugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts similarity index 98% rename from src/vs/workbench/parts/debug/electron-browser/debugSession.ts rename to src/vs/workbench/contrib/debug/electron-browser/debugSession.ts index 9f5c32a30c4..6410fd8e966 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/debugSession.ts @@ -12,11 +12,11 @@ import { Event, Emitter } from 'vs/base/common/event'; import { CompletionItem, completionKindFromLegacyString } from 'vs/editor/common/modes'; import { Position } from 'vs/editor/common/core/position'; import * as aria from 'vs/base/browser/ui/aria/aria'; -import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource } from 'vs/workbench/parts/debug/common/debug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource } from 'vs/workbench/contrib/debug/common/debug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { mixin } from 'vs/base/common/objects'; -import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/parts/debug/common/debugModel'; -import { RawDebugSession } from 'vs/workbench/parts/debug/electron-browser/rawDebugSession'; +import { Thread, ExpressionContainer, DebugModel } from 'vs/workbench/contrib/debug/common/debugModel'; +import { RawDebugSession } from 'vs/workbench/contrib/debug/electron-browser/rawDebugSession'; import product from 'vs/platform/node/product'; import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; @@ -25,11 +25,11 @@ import { generateUuid } from 'vs/base/common/uuid'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { normalizeDriveLetter } from 'vs/base/common/labels'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; +import { IOutputService } from 'vs/workbench/contrib/output/common/output'; import { Range } from 'vs/editor/common/core/range'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { ReplModel } from 'vs/workbench/parts/debug/common/replModel'; +import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts b/src/vs/workbench/contrib/debug/electron-browser/electronDebugActions.ts similarity index 94% rename from src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts rename to src/vs/workbench/contrib/debug/electron-browser/electronDebugActions.ts index fb7babcc56b..6dbbe42f377 100644 --- a/src/vs/workbench/parts/debug/electron-browser/electronDebugActions.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/electronDebugActions.ts @@ -5,8 +5,8 @@ import * as nls from 'vs/nls'; import { Action } from 'vs/base/common/actions'; -import { Variable } from 'vs/workbench/parts/debug/common/debugModel'; -import { IDebugService, IStackFrame } from 'vs/workbench/parts/debug/common/debug'; +import { Variable } from 'vs/workbench/contrib/debug/common/debugModel'; +import { IDebugService, IStackFrame } from 'vs/workbench/contrib/debug/common/debug'; import { clipboard } from 'electron'; import { isWindows } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/parts/debug/electron-browser/media/continue-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/continue-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/continue-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/continue-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/continue-without-debugging-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/continue-without-debugging-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/continue-without-debugging-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/continue-without-debugging-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/pause-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/pause-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/pause-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/pause-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/restart-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/restart-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/restart-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/restart-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/stepinto-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/stepinto-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/stepinto-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/stepinto-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/stepout-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/stepout-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/stepout-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/stepout-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/stepover-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/stepover-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/stepover-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/stepover-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/media/stop-tb.png b/src/vs/workbench/contrib/debug/electron-browser/media/stop-tb.png similarity index 100% rename from src/vs/workbench/parts/debug/electron-browser/media/stop-tb.png rename to src/vs/workbench/contrib/debug/electron-browser/media/stop-tb.png diff --git a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts similarity index 99% rename from src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts rename to src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts index 8801d1105ec..8b28b1564f2 100644 --- a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/rawDebugSession.ts @@ -9,8 +9,8 @@ import * as objects from 'vs/base/common/objects'; import { Action } from 'vs/base/common/actions'; import * as errors from 'vs/base/common/errors'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { formatPII, isUri } from 'vs/workbench/parts/debug/common/debugUtils'; -import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/parts/debug/common/debug'; +import { formatPII, isUri } from 'vs/workbench/contrib/debug/common/debugUtils'; +import { IDebugAdapter, IConfig, AdapterEndEvent, IDebugger } from 'vs/workbench/contrib/debug/common/debug'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import * as cp from 'child_process'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/parts/debug/electron-browser/repl.ts b/src/vs/workbench/contrib/debug/electron-browser/repl.ts similarity index 96% rename from src/vs/workbench/parts/debug/electron-browser/repl.ts rename to src/vs/workbench/contrib/debug/electron-browser/repl.ts index 21b493db790..b9df4de1e42 100644 --- a/src/vs/workbench/parts/debug/electron-browser/repl.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/repl.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/css!vs/workbench/parts/debug/browser/media/repl'; +import 'vs/css!vs/workbench/contrib/debug/browser/media/repl'; import * as nls from 'vs/nls'; import { URI as uri } from 'vs/base/common/uri'; import * as errors from 'vs/base/common/errors'; @@ -32,32 +32,32 @@ import { memoize } from 'vs/base/common/decorators'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { CodeEditorWidget } from 'vs/editor/browser/widget/codeEditorWidget'; -import { IDebugService, REPL_ID, DEBUG_SCHEME, CONTEXT_IN_DEBUG_REPL, IDebugSession, State, IReplElement, IExpressionContainer, IExpression, IReplElementSource } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService, REPL_ID, DEBUG_SCHEME, CONTEXT_IN_DEBUG_REPL, IDebugSession, State, IReplElement, IExpressionContainer, IExpression, IReplElementSource } from 'vs/workbench/contrib/debug/common/debug'; import { HistoryNavigator } from 'vs/base/common/history'; import { IHistoryNavigationWidget } from 'vs/base/browser/history'; import { createAndBindHistoryNavigationWidgetScopedContextKeyService } from 'vs/platform/widget/browser/contextScopedHistoryWidget'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { getSimpleCodeEditorWidgetOptions } from 'vs/workbench/parts/codeEditor/electron-browser/simpleEditorOptions'; -import { getSimpleEditorOptions } from 'vs/workbench/parts/codeEditor/browser/simpleEditorOptions'; +import { getSimpleCodeEditorWidgetOptions } from 'vs/workbench/contrib/codeEditor/electron-browser/simpleEditorOptions'; +import { getSimpleEditorOptions } from 'vs/workbench/contrib/codeEditor/browser/simpleEditorOptions'; import { IDecorationOptions } from 'vs/editor/common/editorCommon'; import { transparent, editorForeground } from 'vs/platform/theme/common/colorRegistry'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { FocusSessionActionItem } from 'vs/workbench/parts/debug/browser/debugActionItems'; +import { FocusSessionActionItem } from 'vs/workbench/contrib/debug/browser/debugActionItems'; import { CompletionContext, CompletionList, CompletionProviderRegistry } from 'vs/editor/common/modes'; import { first } from 'vs/base/common/arrays'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { Variable, Expression, SimpleReplElement, RawObjectReplElement } from 'vs/workbench/parts/debug/common/debugModel'; +import { Variable, Expression, SimpleReplElement, RawObjectReplElement } from 'vs/workbench/contrib/debug/common/debugModel'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { VariablesRenderer } from 'vs/workbench/parts/debug/electron-browser/variablesView'; +import { VariablesRenderer } from 'vs/workbench/contrib/debug/electron-browser/variablesView'; import { ITreeRenderer, ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { renderExpressionValue } from 'vs/workbench/parts/debug/browser/baseDebugView'; -import { handleANSIOutput } from 'vs/workbench/parts/debug/browser/debugANSIHandling'; +import { renderExpressionValue } from 'vs/workbench/contrib/debug/browser/baseDebugView'; +import { handleANSIOutput } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { ILabelService } from 'vs/platform/label/common/label'; -import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; -import { CopyAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; -import { ReplCollapseAllAction } from 'vs/workbench/parts/debug/browser/debugActions'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; +import { CopyAction } from 'vs/workbench/contrib/debug/electron-browser/electronDebugActions'; +import { ReplCollapseAllAction } 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, isFullWidthCharacter, endsWith } from 'vs/base/common/strings'; diff --git a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts b/src/vs/workbench/contrib/debug/electron-browser/terminalSupport.ts similarity index 94% rename from src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts rename to src/vs/workbench/contrib/debug/electron-browser/terminalSupport.ts index 810909605db..43be1917204 100644 --- a/src/vs/workbench/parts/debug/electron-browser/terminalSupport.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/terminalSupport.ts @@ -5,10 +5,10 @@ import * as nls from 'vs/nls'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ITerminalService, ITerminalInstance } from 'vs/workbench/parts/terminal/common/terminal'; -import { ITerminalService as IExternalTerminalService } from 'vs/workbench/parts/execution/common/execution'; -import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/parts/debug/common/debug'; -import { hasChildProcesses, prepareCommand } from 'vs/workbench/parts/debug/node/terminals'; +import { ITerminalService, ITerminalInstance } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ITerminalService as IExternalTerminalService } from 'vs/workbench/contrib/execution/common/execution'; +import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; +import { hasChildProcesses, prepareCommand } from 'vs/workbench/contrib/debug/node/terminals'; export class TerminalLauncher implements ITerminalLauncher { diff --git a/src/vs/workbench/parts/debug/electron-browser/variablesView.ts b/src/vs/workbench/contrib/debug/electron-browser/variablesView.ts similarity index 97% rename from src/vs/workbench/parts/debug/electron-browser/variablesView.ts rename to src/vs/workbench/contrib/debug/electron-browser/variablesView.ts index b6b470d6697..87fcd26abaa 100644 --- a/src/vs/workbench/parts/debug/electron-browser/variablesView.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/variablesView.ts @@ -8,14 +8,14 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import * as dom from 'vs/base/browser/dom'; import { CollapseAction2 } from 'vs/workbench/browser/viewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IViewModel } from 'vs/workbench/parts/debug/common/debug'; -import { Variable, Scope } from 'vs/workbench/parts/debug/common/debugModel'; +import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IViewModel } from 'vs/workbench/contrib/debug/common/debug'; +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/parts/debug/browser/baseDebugView'; +import { renderViewTree, renderVariable, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { IAction } from 'vs/base/common/actions'; -import { SetValueAction, AddToWatchExpressionsAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { CopyValueAction, CopyEvaluatePathAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { SetValueAction, AddToWatchExpressionsAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { CopyValueAction, CopyEvaluatePathAction } from 'vs/workbench/contrib/debug/electron-browser/electronDebugActions'; 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'; diff --git a/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts b/src/vs/workbench/contrib/debug/electron-browser/watchExpressionsView.ts similarity index 97% rename from src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts rename to src/vs/workbench/contrib/debug/electron-browser/watchExpressionsView.ts index 24c330faa89..052a012c7d3 100644 --- a/src/vs/workbench/parts/debug/electron-browser/watchExpressionsView.ts +++ b/src/vs/workbench/contrib/debug/electron-browser/watchExpressionsView.ts @@ -8,21 +8,21 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import * as dom from 'vs/base/browser/dom'; import { CollapseAction2 } from 'vs/workbench/browser/viewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDebugService, IExpression, CONTEXT_WATCH_EXPRESSIONS_FOCUSED } from 'vs/workbench/parts/debug/common/debug'; -import { Expression, Variable } from 'vs/workbench/parts/debug/common/debugModel'; -import { AddWatchExpressionAction, RemoveAllWatchExpressionsAction, EditWatchExpressionAction, RemoveWatchExpressionAction } from 'vs/workbench/parts/debug/browser/debugActions'; +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 } 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 { CopyValueAction } from 'vs/workbench/parts/debug/electron-browser/electronDebugActions'; +import { CopyValueAction } from 'vs/workbench/contrib/debug/electron-browser/electronDebugActions'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { renderExpressionValue, renderViewTree, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/parts/debug/browser/baseDebugView'; +import { renderExpressionValue, renderViewTree, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { VariablesRenderer, variableSetEmitter } from 'vs/workbench/parts/debug/electron-browser/variablesView'; +import { VariablesRenderer, variableSetEmitter } from 'vs/workbench/contrib/debug/electron-browser/variablesView'; import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { WorkbenchAsyncDataTree, IListService } from 'vs/platform/list/browser/listService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; diff --git a/src/vs/workbench/parts/debug/node/debugAdapter.ts b/src/vs/workbench/contrib/debug/node/debugAdapter.ts similarity index 99% rename from src/vs/workbench/parts/debug/node/debugAdapter.ts rename to src/vs/workbench/contrib/debug/node/debugAdapter.ts index 81954344b9b..c6948364d4e 100644 --- a/src/vs/workbench/parts/debug/node/debugAdapter.ts +++ b/src/vs/workbench/contrib/debug/node/debugAdapter.ts @@ -15,8 +15,8 @@ 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 { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { IDebugAdapter, IDebugAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IDebugAdapterServer } from 'vs/workbench/parts/debug/common/debug'; +import { IOutputService } from 'vs/workbench/contrib/output/common/output'; +import { IDebugAdapter, IDebugAdapterExecutable, IDebuggerContribution, IPlatformSpecificAdapterContribution, IDebugAdapterServer } from 'vs/workbench/contrib/debug/common/debug'; /** * Abstract implementation of the low level API for a debug adapter. diff --git a/src/vs/workbench/parts/debug/node/debugger.ts b/src/vs/workbench/contrib/debug/node/debugger.ts similarity index 97% rename from src/vs/workbench/parts/debug/node/debugger.ts rename to src/vs/workbench/contrib/debug/node/debugger.ts index 7d0d8bff16d..01f5edd2451 100644 --- a/src/vs/workbench/parts/debug/node/debugger.ts +++ b/src/vs/workbench/contrib/debug/node/debugger.ts @@ -10,18 +10,18 @@ import * as objects from 'vs/base/common/objects'; import { TelemetryAppenderClient } from 'vs/platform/telemetry/node/telemetryIpc'; import { IJSONSchema, IJSONSchemaSnippet } from 'vs/base/common/jsonSchema'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IConfig, IDebuggerContribution, IDebugAdapterExecutable, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, IDebugConfiguration, ITerminalSettings, IDebugger, IDebugSession, IAdapterDescriptor, IDebugAdapterServer } from 'vs/workbench/parts/debug/common/debug'; +import { IConfig, IDebuggerContribution, IDebugAdapterExecutable, INTERNAL_CONSOLE_OPTIONS_SCHEMA, IConfigurationManager, IDebugAdapter, IDebugConfiguration, ITerminalSettings, IDebugger, IDebugSession, IAdapterDescriptor, IDebugAdapterServer } from 'vs/workbench/contrib/debug/common/debug'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { ExecutableDebugAdapter, SocketDebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; +import { IOutputService } from 'vs/workbench/contrib/output/common/output'; +import { ExecutableDebugAdapter, SocketDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import * as ConfigurationResolverUtils from 'vs/workbench/services/configurationResolver/common/configurationResolverUtils'; import { TelemetryService } from 'vs/platform/telemetry/common/telemetryService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { memoize } from 'vs/base/common/decorators'; -import { TaskDefinitionRegistry } from 'vs/workbench/parts/tasks/common/taskDefinitionRegistry'; +import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; import { getPathFromAmdModule } from 'vs/base/common/amd'; import { ITextResourcePropertiesService } from 'vs/editor/common/services/resourceConfiguration'; import { URI } from 'vs/base/common/uri'; @@ -225,7 +225,7 @@ export class Debugger implements IDebugger { env: { ELECTRON_RUN_AS_NODE: 1, PIPE_LOGGING: 'true', - AMD_ENTRYPOINT: 'vs/workbench/parts/debug/node/telemetryApp' + AMD_ENTRYPOINT: 'vs/workbench/contrib/debug/node/telemetryApp' } } ); diff --git a/src/vs/workbench/parts/debug/node/telemetryApp.ts b/src/vs/workbench/contrib/debug/node/telemetryApp.ts similarity index 100% rename from src/vs/workbench/parts/debug/node/telemetryApp.ts rename to src/vs/workbench/contrib/debug/node/telemetryApp.ts diff --git a/src/vs/workbench/parts/debug/node/terminals.ts b/src/vs/workbench/contrib/debug/node/terminals.ts similarity index 99% rename from src/vs/workbench/parts/debug/node/terminals.ts rename to src/vs/workbench/contrib/debug/node/terminals.ts index 177576e9161..31c0332eb54 100644 --- a/src/vs/workbench/parts/debug/node/terminals.ts +++ b/src/vs/workbench/contrib/debug/node/terminals.ts @@ -8,7 +8,7 @@ import * as nls from 'vs/nls'; import * as env from 'vs/base/common/platform'; import * as pfs from 'vs/base/node/pfs'; import { assign } from 'vs/base/common/objects'; -import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/parts/debug/common/debug'; +import { ITerminalLauncher, ITerminalSettings } from 'vs/workbench/contrib/debug/common/debug'; import { getPathFromAmdModule } from 'vs/base/common/amd'; const TERMINAL_TITLE = nls.localize('console.title', "VS Code Console"); @@ -129,7 +129,7 @@ class MacTerminalService extends TerminalLauncher { // and then launches the program inside that window. const script = terminalApp === MacTerminalService.DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/parts/execution/electron-browser/${script}.scpt`); + const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/execution/electron-browser/${script}.scpt`); const osaArgs = [ scriptpath, diff --git a/src/vs/workbench/parts/debug/test/browser/baseDebugView.test.ts b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts similarity index 95% rename from src/vs/workbench/parts/debug/test/browser/baseDebugView.test.ts rename to src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts index e90ea964925..d4549a65671 100644 --- a/src/vs/workbench/parts/debug/test/browser/baseDebugView.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/baseDebugView.test.ts @@ -4,10 +4,10 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { replaceWhitespace, renderExpressionValue, renderVariable } from 'vs/workbench/parts/debug/browser/baseDebugView'; +import { replaceWhitespace, renderExpressionValue, renderVariable } from 'vs/workbench/contrib/debug/browser/baseDebugView'; import * as dom from 'vs/base/browser/dom'; -import { Expression, Variable, Scope, StackFrame, Thread } from 'vs/workbench/parts/debug/common/debugModel'; -import { MockSession } from 'vs/workbench/parts/debug/test/common/mockDebug'; +import { Expression, Variable, Scope, StackFrame, Thread } from 'vs/workbench/contrib/debug/common/debugModel'; +import { MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; const $ = dom.$; diff --git a/src/vs/workbench/parts/debug/test/browser/debugANSIHandling.test.ts b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts similarity index 98% rename from src/vs/workbench/parts/debug/test/browser/debugANSIHandling.test.ts rename to src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts index fe95a2e055a..e42257fb540 100644 --- a/src/vs/workbench/parts/debug/test/browser/debugANSIHandling.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/debugANSIHandling.test.ts @@ -6,10 +6,10 @@ import * as assert from 'assert'; import * as dom from 'vs/base/browser/dom'; import { generateUuid } from 'vs/base/common/uuid'; -import { appendStylizedStringToContainer, handleANSIOutput } from 'vs/workbench/parts/debug/browser/debugANSIHandling'; +import { appendStylizedStringToContainer, handleANSIOutput } from 'vs/workbench/contrib/debug/browser/debugANSIHandling'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; -import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; suite('Debug - ANSI Handling', () => { diff --git a/src/vs/workbench/parts/debug/test/browser/linkDetector.test.ts b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts similarity index 98% rename from src/vs/workbench/parts/debug/test/browser/linkDetector.test.ts rename to src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts index efae57e5ca0..c164d37d9db 100644 --- a/src/vs/workbench/parts/debug/test/browser/linkDetector.test.ts +++ b/src/vs/workbench/contrib/debug/test/browser/linkDetector.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { workbenchInstantiationService } from 'vs/workbench/test/workbenchTestServices'; -import { LinkDetector } from 'vs/workbench/parts/debug/browser/linkDetector'; +import { LinkDetector } from 'vs/workbench/contrib/debug/browser/linkDetector'; import { isWindows } from 'vs/base/common/platform'; suite('Debug - Link Detector', () => { diff --git a/src/vs/workbench/parts/debug/test/common/debugSource.test.ts b/src/vs/workbench/contrib/debug/test/common/debugSource.test.ts similarity index 97% rename from src/vs/workbench/parts/debug/test/common/debugSource.test.ts rename to src/vs/workbench/contrib/debug/test/common/debugSource.test.ts index 807a2c0ba03..4fcfdc46c00 100644 --- a/src/vs/workbench/parts/debug/test/common/debugSource.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/debugSource.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { URI as uri } from 'vs/base/common/uri'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { normalize } from 'vs/base/common/paths'; suite('Debug - Source', () => { diff --git a/src/vs/workbench/parts/debug/test/common/debugUtils.test.ts b/src/vs/workbench/contrib/debug/test/common/debugUtils.test.ts similarity index 98% rename from src/vs/workbench/parts/debug/test/common/debugUtils.test.ts rename to src/vs/workbench/contrib/debug/test/common/debugUtils.test.ts index 8d953ae7052..3be8b8cf1a0 100644 --- a/src/vs/workbench/parts/debug/test/common/debugUtils.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/debugUtils.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { formatPII, getExactExpressionStartAndEnd } from 'vs/workbench/parts/debug/common/debugUtils'; +import { formatPII, getExactExpressionStartAndEnd } from 'vs/workbench/contrib/debug/common/debugUtils'; suite('Debug - Utils', () => { test('formatPII', () => { diff --git a/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts b/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts similarity index 87% rename from src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts rename to src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts index a466b211fe4..4998c79b5d2 100644 --- a/src/vs/workbench/parts/debug/test/common/debugViewModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/common/debugViewModel.test.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ViewModel } from 'vs/workbench/parts/debug/common/debugViewModel'; -import { StackFrame, Expression, Thread } from 'vs/workbench/parts/debug/common/debugModel'; -import { MockSession } from 'vs/workbench/parts/debug/test/common/mockDebug'; +import { ViewModel } from 'vs/workbench/contrib/debug/common/debugViewModel'; +import { StackFrame, Expression, Thread } from 'vs/workbench/contrib/debug/common/debugModel'; +import { MockSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService'; suite('Debug - View Model', () => { diff --git a/src/vs/workbench/parts/debug/test/common/mockDebug.ts b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts similarity index 83% rename from src/vs/workbench/parts/debug/test/common/mockDebug.ts rename to src/vs/workbench/contrib/debug/test/common/mockDebug.ts index fbb34d499e9..d7b4cc2ab76 100644 --- a/src/vs/workbench/parts/debug/test/common/mockDebug.ts +++ b/src/vs/workbench/contrib/debug/test/common/mockDebug.ts @@ -7,8 +7,8 @@ import { URI as uri } from 'vs/base/common/uri'; import { Event } from 'vs/base/common/event'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { Position } from 'vs/editor/common/core/position'; -import { ILaunch, IDebugService, State, IDebugSession, IConfigurationManager, IStackFrame, IBreakpointData, IBreakpointUpdateData, IConfig, IDebugModel, IViewModel, IBreakpoint, LoadedSourceEvent, IThread, IRawModelUpdate, IFunctionBreakpoint, IExceptionBreakpoint, IDebugger, IExceptionInfo, AdapterEndEvent, IReplElement, IExpression, IReplElementSource } from 'vs/workbench/parts/debug/common/debug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; +import { ILaunch, IDebugService, State, IDebugSession, IConfigurationManager, IStackFrame, IBreakpointData, IBreakpointUpdateData, IConfig, IDebugModel, IViewModel, IBreakpoint, LoadedSourceEvent, IThread, IRawModelUpdate, IFunctionBreakpoint, IExceptionBreakpoint, IDebugger, IExceptionInfo, AdapterEndEvent, IReplElement, IExpression, IReplElementSource } from 'vs/workbench/contrib/debug/common/debug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; import { CompletionItem } from 'vs/editor/common/modes'; import Severity from 'vs/base/common/severity'; @@ -17,52 +17,52 @@ export class MockDebugService implements IDebugService { public _serviceBrand: any; public get state(): State { - return null; + throw new Error('not implemented'); } public get onWillNewSession(): Event { - return null; + throw new Error('not implemented'); } public get onDidNewSession(): Event { - return null; + throw new Error('not implemented'); } public get onDidEndSession(): Event { - return null; + throw new Error('not implemented'); } public get onDidChangeState(): Event { - return null; + throw new Error('not implemented'); } public getConfigurationManager(): IConfigurationManager { - return null; + throw new Error('not implemented'); } public focusStackFrame(focusedStackFrame: IStackFrame): void { } sendAllBreakpoints(session?: IDebugSession): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public addBreakpoints(uri: uri, rawBreakpoints: IBreakpointData[]): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public updateBreakpoints(uri: uri, data: { [id: string]: IBreakpointUpdateData }, sendOnResourceSaved: boolean): void { } public enableOrDisableBreakpoints(enabled: boolean): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public setBreakpointsActivated(): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public removeBreakpoints(): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public addFunctionBreakpoint(): void { } @@ -70,25 +70,25 @@ export class MockDebugService implements IDebugService { public moveWatchExpression(id: string, position: number): void { } public renameFunctionBreakpoint(id: string, newFunctionName: string): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public removeFunctionBreakpoints(id?: string): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public addReplExpression(name: string): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public removeReplExpressions(): void { } public addWatchExpression(name?: string): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public renameWatchExpression(id: string, newName: string): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public removeWatchExpressions(id?: string): void { } @@ -98,19 +98,19 @@ export class MockDebugService implements IDebugService { } public restartSession(): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public stopSession(): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public getModel(): IDebugModel { - return null; + throw new Error('not implemented'); } public getViewModel(): IViewModel { - return null; + throw new Error('not implemented'); } public logToRepl(session: IDebugSession, value: string): void { } @@ -118,7 +118,7 @@ export class MockDebugService implements IDebugService { public sourceIsNotAvailable(uri: uri): void { } public tryToAutoFocusStackFrame(thread: IThread): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } } @@ -129,7 +129,7 @@ export class MockSession implements IDebugSession { removeReplExpressions(): void { } get onDidChangeReplElements(): Event { - return null; + throw new Error('not implemented'); } addReplExpression(stackFrame: IStackFrame, name: string): Promise { @@ -154,27 +154,27 @@ export class MockSession implements IDebugSession { } getSourceForUri(modelUri: uri): Source { - return null; + throw new Error('not implemented'); } getThread(threadId: number): IThread { - return null; + throw new Error('not implemented'); } get onDidCustomEvent(): Event { - return null; + throw new Error('not implemented'); } get onDidLoadedSource(): Event { - return null; + throw new Error('not implemented'); } get onDidChangeState(): Event { - return null; + throw new Error('not implemented'); } get onDidEndAdapter(): Event { - return null; + throw new Error('not implemented'); } setConfiguration(configuration: { resolved: IConfig, unresolved: IConfig }) { } @@ -184,7 +184,7 @@ export class MockSession implements IDebugSession { } getSource(raw: DebugProtocol.Source): Source { - return undefined; + throw new Error('not implemented'); } getLoadedSources(): Promise { @@ -311,104 +311,104 @@ export class MockRawSession { } public exceptionInfo(args: DebugProtocol.ExceptionInfoArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public launchOrAttach(args: IConfig): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public scopes(args: DebugProtocol.ScopesArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public variables(args: DebugProtocol.VariablesArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } evaluate(args: DebugProtocol.EvaluateArguments): Promise { - return Promise.resolve(null); + return Promise.resolve(null!); } public custom(request: string, args: any): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public terminate(restart = false): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public disconnect(restart?: boolean): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public threads(): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public stepIn(args: DebugProtocol.StepInArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public stepOut(args: DebugProtocol.StepOutArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public stepBack(args: DebugProtocol.StepBackArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public continue(args: DebugProtocol.ContinueArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public reverseContinue(args: DebugProtocol.ReverseContinueArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public pause(args: DebugProtocol.PauseArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public terminateThreads(args: DebugProtocol.TerminateThreadsArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public setVariable(args: DebugProtocol.SetVariableArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public restartFrame(args: DebugProtocol.RestartFrameArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public completions(args: DebugProtocol.CompletionsArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public next(args: DebugProtocol.NextArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public source(args: DebugProtocol.SourceArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public loadedSources(args: DebugProtocol.LoadedSourcesArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public setBreakpoints(args: DebugProtocol.SetBreakpointsArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public setFunctionBreakpoints(args: DebugProtocol.SetFunctionBreakpointsArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public setExceptionBreakpoints(args: DebugProtocol.SetExceptionBreakpointsArguments): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } - public readonly onDidStop: Event = null; + public readonly onDidStop: Event = null!; } diff --git a/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts b/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts similarity index 97% rename from src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts rename to src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts index 2fe1f43a733..03ae2794d6d 100644 --- a/src/vs/workbench/parts/debug/test/electron-browser/debugModel.test.ts +++ b/src/vs/workbench/contrib/debug/test/electron-browser/debugModel.test.ts @@ -6,12 +6,12 @@ import * as assert from 'assert'; import { URI as uri } from 'vs/base/common/uri'; import severity from 'vs/base/common/severity'; -import { SimpleReplElement, DebugModel, Expression, RawObjectReplElement, StackFrame, Thread } from 'vs/workbench/parts/debug/common/debugModel'; +import { SimpleReplElement, DebugModel, Expression, RawObjectReplElement, StackFrame, Thread } from 'vs/workbench/contrib/debug/common/debugModel'; import * as sinon from 'sinon'; -import { MockRawSession } from 'vs/workbench/parts/debug/test/common/mockDebug'; -import { Source } from 'vs/workbench/parts/debug/common/debugSource'; -import { DebugSession } from 'vs/workbench/parts/debug/electron-browser/debugSession'; -import { ReplModel } from 'vs/workbench/parts/debug/common/replModel'; +import { MockRawSession } from 'vs/workbench/contrib/debug/test/common/mockDebug'; +import { Source } from 'vs/workbench/contrib/debug/common/debugSource'; +import { DebugSession } from 'vs/workbench/contrib/debug/electron-browser/debugSession'; +import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel'; suite('Debug - Model', () => { let model: DebugModel; diff --git a/src/vs/workbench/parts/debug/test/node/debugger.test.ts b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts similarity index 96% rename from src/vs/workbench/parts/debug/test/node/debugger.test.ts rename to src/vs/workbench/contrib/debug/test/node/debugger.test.ts index 936bd120a7a..38c87d51175 100644 --- a/src/vs/workbench/parts/debug/test/node/debugger.test.ts +++ b/src/vs/workbench/contrib/debug/test/node/debugger.test.ts @@ -6,11 +6,11 @@ import * as assert from 'assert'; import * as paths from 'vs/base/common/paths'; import * as platform from 'vs/base/common/platform'; -import { IDebugAdapterExecutable, IConfigurationManager, IConfig, IDebugSession } from 'vs/workbench/parts/debug/common/debug'; -import { Debugger } from 'vs/workbench/parts/debug/node/debugger'; +import { IDebugAdapterExecutable, IConfigurationManager, IConfig, IDebugSession } from 'vs/workbench/contrib/debug/common/debug'; +import { Debugger } from 'vs/workbench/contrib/debug/node/debugger'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { URI } from 'vs/base/common/uri'; -import { ExecutableDebugAdapter } from 'vs/workbench/parts/debug/node/debugAdapter'; +import { ExecutableDebugAdapter } from 'vs/workbench/contrib/debug/node/debugAdapter'; import { TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.ts b/src/vs/workbench/contrib/emmet/browser/actions/showEmmetCommands.ts similarity index 100% rename from src/vs/workbench/parts/emmet/browser/actions/showEmmetCommands.ts rename to src/vs/workbench/contrib/emmet/browser/actions/showEmmetCommands.ts diff --git a/src/vs/workbench/parts/emmet/browser/emmet.browser.contribution.ts b/src/vs/workbench/contrib/emmet/browser/emmet.browser.contribution.ts similarity index 100% rename from src/vs/workbench/parts/emmet/browser/emmet.browser.contribution.ts rename to src/vs/workbench/contrib/emmet/browser/emmet.browser.contribution.ts diff --git a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts b/src/vs/workbench/contrib/emmet/electron-browser/actions/expandAbbreviation.ts similarity index 94% rename from src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts rename to src/vs/workbench/contrib/emmet/electron-browser/actions/expandAbbreviation.ts index 7788fa68469..72c5ed4a9c4 100644 --- a/src/vs/workbench/parts/emmet/electron-browser/actions/expandAbbreviation.ts +++ b/src/vs/workbench/contrib/emmet/electron-browser/actions/expandAbbreviation.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as nls from 'vs/nls'; -import { EmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; +import { EmmetEditorAction } from 'vs/workbench/contrib/emmet/electron-browser/emmetActions'; import { registerEditorAction } from 'vs/editor/browser/editorExtensions'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { KeyCode } from 'vs/base/common/keyCodes'; diff --git a/src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts b/src/vs/workbench/contrib/emmet/electron-browser/emmet.contribution.ts similarity index 100% rename from src/vs/workbench/parts/emmet/electron-browser/emmet.contribution.ts rename to src/vs/workbench/contrib/emmet/electron-browser/emmet.contribution.ts diff --git a/src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts b/src/vs/workbench/contrib/emmet/electron-browser/emmetActions.ts similarity index 100% rename from src/vs/workbench/parts/emmet/electron-browser/emmetActions.ts rename to src/vs/workbench/contrib/emmet/electron-browser/emmetActions.ts diff --git a/src/vs/workbench/parts/emmet/test/electron-browser/emmetAction.test.ts b/src/vs/workbench/contrib/emmet/test/electron-browser/emmetAction.test.ts similarity index 97% rename from src/vs/workbench/parts/emmet/test/electron-browser/emmetAction.test.ts rename to src/vs/workbench/contrib/emmet/test/electron-browser/emmetAction.test.ts index bd34d063500..7aefb85575b 100644 --- a/src/vs/workbench/parts/emmet/test/electron-browser/emmetAction.test.ts +++ b/src/vs/workbench/contrib/emmet/test/electron-browser/emmetAction.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { IGrammarContributions, ILanguageIdentifierResolver, EmmetEditorAction } from 'vs/workbench/parts/emmet/electron-browser/emmetActions'; +import { IGrammarContributions, ILanguageIdentifierResolver, EmmetEditorAction } from 'vs/workbench/contrib/emmet/electron-browser/emmetActions'; import { withTestCodeEditor } from 'vs/editor/test/browser/testCodeEditor'; import * as assert from 'assert'; import { LanguageId, LanguageIdentifier } from 'vs/editor/common/modes'; diff --git a/src/vs/workbench/parts/execution/common/execution.ts b/src/vs/workbench/contrib/execution/common/execution.ts similarity index 100% rename from src/vs/workbench/parts/execution/common/execution.ts rename to src/vs/workbench/contrib/execution/common/execution.ts diff --git a/src/vs/workbench/parts/execution/electron-browser/TerminalHelper.scpt b/src/vs/workbench/contrib/execution/electron-browser/TerminalHelper.scpt similarity index 100% rename from src/vs/workbench/parts/execution/electron-browser/TerminalHelper.scpt rename to src/vs/workbench/contrib/execution/electron-browser/TerminalHelper.scpt diff --git a/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts b/src/vs/workbench/contrib/execution/electron-browser/execution.contribution.ts similarity index 94% rename from src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts rename to src/vs/workbench/contrib/execution/electron-browser/execution.contribution.ts index 3d0f476ddec..f23572852da 100644 --- a/src/vs/workbench/parts/execution/electron-browser/execution.contribution.ts +++ b/src/vs/workbench/contrib/execution/electron-browser/execution.contribution.ts @@ -10,19 +10,19 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import * as paths from 'vs/base/common/paths'; import { URI as uri } from 'vs/base/common/uri'; -import { ITerminalService } from 'vs/workbench/parts/execution/common/execution'; +import { ITerminalService } from 'vs/workbench/contrib/execution/common/execution'; import { MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { Extensions, IConfigurationRegistry, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { ITerminalService as IIntegratedTerminalService, KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/parts/terminal/common/terminal'; -import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX, ITerminalConfiguration } from 'vs/workbench/parts/execution/electron-browser/terminal'; -import { WinTerminalService, MacTerminalService, LinuxTerminalService } from 'vs/workbench/parts/execution/electron-browser/terminalService'; +import { ITerminalService as IIntegratedTerminalService, KEYBINDING_CONTEXT_TERMINAL_NOT_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX, ITerminalConfiguration } from 'vs/workbench/contrib/execution/electron-browser/terminal'; +import { WinTerminalService, MacTerminalService, LinuxTerminalService } from 'vs/workbench/contrib/execution/electron-browser/terminalService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { ResourceContextKey } from 'vs/workbench/common/resources'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IFileService } from 'vs/platform/files/common/files'; import { IListService } from 'vs/platform/list/browser/listService'; -import { getMultiSelectedResources } from 'vs/workbench/parts/files/browser/files'; +import { getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { Schemas } from 'vs/base/common/network'; import { distinct } from 'vs/base/common/arrays'; diff --git a/src/vs/workbench/parts/execution/electron-browser/iTermHelper.scpt b/src/vs/workbench/contrib/execution/electron-browser/iTermHelper.scpt similarity index 100% rename from src/vs/workbench/parts/execution/electron-browser/iTermHelper.scpt rename to src/vs/workbench/contrib/execution/electron-browser/iTermHelper.scpt diff --git a/src/vs/workbench/parts/execution/electron-browser/terminal.ts b/src/vs/workbench/contrib/execution/electron-browser/terminal.ts similarity index 100% rename from src/vs/workbench/parts/execution/electron-browser/terminal.ts rename to src/vs/workbench/contrib/execution/electron-browser/terminal.ts diff --git a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts b/src/vs/workbench/contrib/execution/electron-browser/terminalService.ts similarity index 98% rename from src/vs/workbench/parts/execution/electron-browser/terminalService.ts rename to src/vs/workbench/contrib/execution/electron-browser/terminalService.ts index 5b361d842fd..498a5f9b578 100644 --- a/src/vs/workbench/parts/execution/electron-browser/terminalService.ts +++ b/src/vs/workbench/contrib/execution/electron-browser/terminalService.ts @@ -8,9 +8,9 @@ import * as path from 'path'; import * as processes from 'vs/base/node/processes'; import * as nls from 'vs/nls'; import { assign } from 'vs/base/common/objects'; -import { ITerminalService } from 'vs/workbench/parts/execution/common/execution'; +import { ITerminalService } from 'vs/workbench/contrib/execution/common/execution'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalConfiguration, getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/parts/execution/electron-browser/terminal'; +import { ITerminalConfiguration, getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/execution/electron-browser/terminal'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { getPathFromAmdModule } from 'vs/base/common/amd'; @@ -142,7 +142,7 @@ export class MacTerminalService implements ITerminalService { // and then launches the program inside that window. const script = terminalApp === DEFAULT_TERMINAL_OSX ? 'TerminalHelper' : 'iTermHelper'; - const scriptpath = getPathFromAmdModule(require, `vs/workbench/parts/execution/electron-browser/${script}.scpt`); + const scriptpath = getPathFromAmdModule(require, `vs/workbench/contrib/execution/electron-browser/${script}.scpt`); const osaArgs = [ scriptpath, diff --git a/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts b/src/vs/workbench/contrib/execution/test/electron-browser/terminalService.test.ts similarity index 97% rename from src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts rename to src/vs/workbench/contrib/execution/test/electron-browser/terminalService.test.ts index 7f290ababec..7795082c1fa 100644 --- a/src/vs/workbench/parts/execution/test/electron-browser/terminalService.test.ts +++ b/src/vs/workbench/contrib/execution/test/electron-browser/terminalService.test.ts @@ -4,8 +4,8 @@ *--------------------------------------------------------------------------------------------*/ import { deepEqual, equal } from 'assert'; -import { WinTerminalService, LinuxTerminalService, MacTerminalService } from 'vs/workbench/parts/execution/electron-browser/terminalService'; -import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/parts/execution/electron-browser/terminal'; +import { WinTerminalService, LinuxTerminalService, MacTerminalService } from 'vs/workbench/contrib/execution/electron-browser/terminalService'; +import { getDefaultTerminalWindows, getDefaultTerminalLinuxReady, DEFAULT_TERMINAL_OSX } from 'vs/workbench/contrib/execution/electron-browser/terminal'; suite('Execution - TerminalService', () => { let mockOnExit: Function; diff --git a/src/vs/workbench/parts/experiments/electron-browser/experimentalPrompt.ts b/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts similarity index 96% rename from src/vs/workbench/parts/experiments/electron-browser/experimentalPrompt.ts rename to src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts index 17e312c7221..60396f96a64 100644 --- a/src/vs/workbench/parts/experiments/electron-browser/experimentalPrompt.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experimentalPrompt.ts @@ -5,9 +5,9 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { INotificationService, Severity, IPromptChoice } from 'vs/platform/notification/common/notification'; -import { IExperimentService, IExperiment, ExperimentActionType, IExperimentActionPromptProperties, IExperimentActionPromptCommand, ExperimentState } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, IExperiment, ExperimentActionType, IExperimentActionPromptProperties, IExperimentActionPromptCommand, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { IExtensionsViewlet } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsViewlet } from 'vs/workbench/contrib/extensions/common/extensions'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import { language } from 'vs/base/common/platform'; diff --git a/src/vs/workbench/parts/experiments/electron-browser/experiments.contribution.ts b/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts similarity index 86% rename from src/vs/workbench/parts/experiments/electron-browser/experiments.contribution.ts rename to src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts index db03272bfcb..b11ad64d0ce 100644 --- a/src/vs/workbench/parts/experiments/electron-browser/experiments.contribution.ts +++ b/src/vs/workbench/contrib/experiments/electron-browser/experiments.contribution.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IExperimentService, ExperimentService } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, ExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { ExperimentalPrompts } from 'vs/workbench/parts/experiments/electron-browser/experimentalPrompt'; +import { ExperimentalPrompts } from 'vs/workbench/contrib/experiments/electron-browser/experimentalPrompt'; registerSingleton(IExperimentService, ExperimentService, true); diff --git a/src/vs/workbench/parts/experiments/node/experimentService.ts b/src/vs/workbench/contrib/experiments/node/experimentService.ts similarity index 99% rename from src/vs/workbench/parts/experiments/node/experimentService.ts rename to src/vs/workbench/contrib/experiments/node/experimentService.ts index c1829068d55..da83c12b268 100644 --- a/src/vs/workbench/parts/experiments/node/experimentService.ts +++ b/src/vs/workbench/contrib/experiments/node/experimentService.ts @@ -19,7 +19,7 @@ import { match } from 'vs/base/common/glob'; import { asJson } from 'vs/base/node/request'; import { Emitter, Event } from 'vs/base/common/event'; import { ITextFileService, StateChange } from 'vs/workbench/services/textfile/common/textfiles'; -import { WorkspaceStats } from 'vs/workbench/parts/stats/node/workspaceStats'; +import { WorkspaceStats } from 'vs/workbench/contrib/stats/node/workspaceStats'; import { CancellationToken } from 'vs/base/common/cancellation'; import { distinct } from 'vs/base/common/arrays'; import { lastSessionDateStorageKey } from 'vs/platform/telemetry/node/workbenchCommonProperties'; diff --git a/src/vs/workbench/parts/experiments/test/electron-browser/experimentService.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts similarity index 99% rename from src/vs/workbench/parts/experiments/test/electron-browser/experimentService.test.ts rename to src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts index b9f252d30d1..d1a6f49b1c2 100644 --- a/src/vs/workbench/parts/experiments/test/electron-browser/experimentService.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentService.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { ExperimentService, ExperimentActionType, ExperimentState, IExperiment } from 'vs/workbench/parts/experiments/node/experimentService'; +import { ExperimentService, ExperimentActionType, ExperimentState, IExperiment } from 'vs/workbench/contrib/experiments/node/experimentService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; diff --git a/src/vs/workbench/parts/experiments/test/electron-browser/experimentalPrompts.test.ts b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts similarity index 96% rename from src/vs/workbench/parts/experiments/test/electron-browser/experimentalPrompts.test.ts rename to src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts index dc7d5a00b94..34e838f7df7 100644 --- a/src/vs/workbench/parts/experiments/test/electron-browser/experimentalPrompts.test.ts +++ b/src/vs/workbench/contrib/experiments/test/electron-browser/experimentalPrompts.test.ts @@ -12,9 +12,9 @@ import { TestNotificationService } from 'vs/platform/notification/test/common/te import { IStorageService } from 'vs/platform/storage/common/storage'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import { ExperimentalPrompts } from 'vs/workbench/parts/experiments/electron-browser/experimentalPrompt'; -import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService } from 'vs/workbench/parts/experiments/node/experimentService'; -import { TestExperimentService } from 'vs/workbench/parts/experiments/test/electron-browser/experimentService.test'; +import { ExperimentalPrompts } from 'vs/workbench/contrib/experiments/electron-browser/experimentalPrompt'; +import { ExperimentActionType, ExperimentState, IExperiment, IExperimentActionPromptProperties, IExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { TestLifecycleService } from 'vs/workbench/test/workbenchTestServices'; suite('Experimental Prompts', () => { diff --git a/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.ts b/src/vs/workbench/contrib/extensions/browser/extensionsQuickOpen.ts similarity index 97% rename from src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.ts rename to src/vs/workbench/contrib/extensions/browser/extensionsQuickOpen.ts index 7ab0213525c..b337e054cc5 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsQuickOpen.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsQuickOpen.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { IAutoFocus, Mode, IModel } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; -import { IExtensionsViewlet, VIEWLET_ID } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsViewlet, VIEWLET_ID } from 'vs/workbench/contrib/extensions/common/extensions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IExtensionGalleryService, IExtensionManagementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts similarity index 99% rename from src/vs/workbench/parts/extensions/browser/extensionsViewer.ts rename to src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts index 55891efe29b..1f022b51b7e 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsViewer.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewer.ts @@ -9,7 +9,7 @@ import { IMouseEvent } from 'vs/base/browser/mouseEvent'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IDataSource, ITree, IRenderer } from 'vs/base/parts/tree/browser/tree'; import { Action } from 'vs/base/common/actions'; -import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/contrib/extensions/common/extensions'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/parts/extensions/common/extensionQuery.ts b/src/vs/workbench/contrib/extensions/common/extensionQuery.ts similarity index 100% rename from src/vs/workbench/parts/extensions/common/extensionQuery.ts rename to src/vs/workbench/contrib/extensions/common/extensionQuery.ts diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/contrib/extensions/common/extensions.ts similarity index 99% rename from src/vs/workbench/parts/extensions/common/extensions.ts rename to src/vs/workbench/contrib/extensions/common/extensions.ts index 4684950b9a0..3d3ec28b199 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/contrib/extensions/common/extensions.ts @@ -139,4 +139,4 @@ export class ExtensionContainers extends Disposable { } } } -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts b/src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts similarity index 100% rename from src/vs/workbench/parts/extensions/common/extensionsFileTemplate.ts rename to src/vs/workbench/contrib/extensions/common/extensionsFileTemplate.ts diff --git a/src/vs/workbench/parts/extensions/common/extensionsInput.ts b/src/vs/workbench/contrib/extensions/common/extensionsInput.ts similarity index 94% rename from src/vs/workbench/parts/extensions/common/extensionsInput.ts rename to src/vs/workbench/contrib/extensions/common/extensionsInput.ts index 7ca9f6ec200..c845f7e9cba 100644 --- a/src/vs/workbench/parts/extensions/common/extensionsInput.ts +++ b/src/vs/workbench/contrib/extensions/common/extensionsInput.ts @@ -5,7 +5,7 @@ import { localize } from 'vs/nls'; import { EditorInput } from 'vs/workbench/common/editor'; -import { IExtension } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtension } from 'vs/workbench/contrib/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; export class ExtensionsInput extends EditorInput { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts similarity index 98% rename from src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts index 65574224a7d..46f1a2dc0bd 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionEditor.ts @@ -23,13 +23,13 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionManifest, IKeyBinding, IView, IViewContainer, ExtensionType } from 'vs/platform/extensions/common/extensions'; import { ResolvedKeybinding, KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; -import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension, IExtensionDependencies, ExtensionContainers } from 'vs/workbench/parts/extensions/common/extensions'; -import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget } from 'vs/workbench/parts/extensions/electron-browser/extensionsWidgets'; +import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; +import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension, IExtensionDependencies, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; +import { RatingsWidget, InstallCountWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; -import { WebviewElement } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; +import { CombinedInstallAction, UpdateAction, ExtensionEditorDropDownAction, ReloadAction, MaliciousStatusLabelAction, IgnoreExtensionRecommendationAction, UndoIgnoreExtensionRecommendationAction, EnableDropDownAction, DisableDropDownAction, StatusLabelAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { WebviewElement } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { DomScrollableElement } from 'vs/base/browser/ui/scrollbar/scrollableElement'; import { IOpenerService } from 'vs/platform/opener/common/opener'; @@ -45,8 +45,8 @@ import { Color } from 'vs/base/common/color'; import { assign } from 'vs/base/common/objects'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { ExtensionsTree, IExtensionData } from 'vs/workbench/parts/extensions/browser/extensionsViewer'; -import { ShowCurrentReleaseNotesAction } from 'vs/workbench/parts/update/electron-browser/update'; +import { ExtensionsTree, IExtensionData } from 'vs/workbench/contrib/extensions/browser/extensionsViewer'; +import { ShowCurrentReleaseNotesAction } from 'vs/workbench/contrib/update/electron-browser/update'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -604,7 +604,7 @@ export class ExtensionEditor extends BaseEditor { } return this.loadContents(() => this.extensionDependencies.get()) - .then(extensionDependencies => { + .then(extensionDependencies => { if (extensionDependencies) { const content = $('div', { class: 'subcontent' }); const scrollableContent = new DomScrollableElement(content, {}); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts similarity index 98% rename from src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts index 40e96dba898..36b76f71fcd 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionProfileService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionProfileService.ts @@ -13,7 +13,7 @@ import { append, $, addDisposableListener } from 'vs/base/browser/dom'; import { IStatusbarRegistry, StatusbarItemDescriptor, Extensions, IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { Registry } from 'vs/platform/registry/common/platform'; -import { IExtensionHostProfileService, ProfileSessionState } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { IExtensionHostProfileService, ProfileSessionState } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts similarity index 99% rename from src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts index ca8b7f45b26..32adbff953d 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionTipsService.ts @@ -18,11 +18,11 @@ import { ITextModel } from 'vs/editor/common/model'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import product from 'vs/platform/node/product'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; +import { ShowRecommendedExtensionsAction, InstallWorkspaceRecommendedExtensionsAction, InstallRecommendedExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import Severity from 'vs/base/common/severity'; import { IWorkspaceContextService, IWorkspaceFolder, IWorkspace, IWorkspaceFoldersChangeEvent, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; -import { IExtensionsConfiguration, ConfigurationKey, ShowRecommendationsOnlyOnDemandKey, IExtensionsViewlet, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsConfiguration, ConfigurationKey, ShowRecommendationsOnlyOnDemandKey, IExtensionsViewlet, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import * as pfs from 'vs/base/node/pfs'; @@ -31,7 +31,7 @@ import { flatten, distinct, shuffle, coalesce } from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { guessMimeTypes, MIME_UNKNOWN } from 'vs/base/common/mime'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; -import { getHashedRemotesFromUri } from 'vs/workbench/parts/stats/node/workspaceStats'; +import { getHashedRemotesFromUri } from 'vs/workbench/contrib/stats/node/workspaceStats'; import { IRequestService } from 'vs/platform/request/node/request'; import { asJson } from 'vs/base/node/request'; import { isNumber } from 'vs/base/common/types'; @@ -41,9 +41,9 @@ import { Emitter, Event } from 'vs/base/common/event'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IExperimentService, ExperimentActionType, ExperimentState } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, ExperimentActionType, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { getKeywordsForExtension } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; +import { getKeywordsForExtension } from 'vs/workbench/contrib/extensions/electron-browser/extensionsUtils'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; const milliSecondsInADay = 1000 * 60 * 60 * 24; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts similarity index 89% rename from src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts index 9d5f08e733b..5c136213b98 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensions.contribution.ts @@ -12,40 +12,40 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IExtensionTipsService, ExtensionsLabel, ExtensionsChannelId, PreferencesLabel } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { IOutputChannelRegistry, Extensions as OutputExtensions } from 'vs/workbench/parts/output/common/output'; +import { IOutputChannelRegistry, Extensions as OutputExtensions } from 'vs/workbench/contrib/output/common/output'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { VIEWLET_ID, IExtensionsWorkbenchService } from '../common/extensions'; -import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; +import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { OpenExtensionsViewletAction, InstallExtensionsAction, ShowOutdatedExtensionsAction, ShowRecommendedExtensionsAction, ShowRecommendedKeymapExtensionsAction, ShowPopularExtensionsAction, ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowDisabledExtensionsAction, ShowBuiltInExtensionsAction, UpdateAllAction, EnableAllAction, EnableAllWorkpsaceAction, DisableAllAction, DisableAllWorkpsaceAction, CheckForUpdatesAction, ShowLanguageExtensionsAction, ShowAzureExtensionsAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ConfigureRecommendedExtensionsCommandsContributor, OpenExtensionsFolderAction, InstallVSIXAction, ReinstallAction, InstallSpecificVersionOfExtensionAction -} from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; -import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; +} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor } from 'vs/workbench/browser/viewlet'; -import { ExtensionEditor } from 'vs/workbench/parts/extensions/electron-browser/extensionEditor'; -import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker, ExtensionsViewletViewsContribution } from 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; +import { ExtensionEditor } from 'vs/workbench/contrib/extensions/electron-browser/extensionEditor'; +import { StatusUpdater, ExtensionsViewlet, MaliciousExtensionChecker, ExtensionsViewletViewsContribution } from 'vs/workbench/contrib/extensions/electron-browser/extensionsViewlet'; import { IQuickOpenRegistry, Extensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; import * as jsonContributionRegistry from 'vs/platform/jsonschemas/common/jsonContributionRegistry'; -import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; +import { ExtensionsConfigurationSchema, ExtensionsConfigurationSchemaId } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { KeymapExtensions } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; +import { KeymapExtensions } from 'vs/workbench/contrib/extensions/electron-browser/extensionsUtils'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; +import { GalleryExtensionsHandler, ExtensionsHandler } from 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen'; import { EditorDescriptor, IEditorRegistry, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; -import { RuntimeExtensionsEditor, ShowRuntimeExtensionsAction, IExtensionHostProfileService, DebugExtensionHostAction, StartExtensionHostProfileAction, StopExtensionHostProfileAction, CONTEXT_PROFILE_SESSION_STATE, SaveExtensionHostProfileAction, CONTEXT_EXTENSION_HOST_PROFILE_RECORDED } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { RuntimeExtensionsEditor, ShowRuntimeExtensionsAction, IExtensionHostProfileService, DebugExtensionHostAction, StartExtensionHostProfileAction, StopExtensionHostProfileAction, CONTEXT_PROFILE_SESSION_STATE, SaveExtensionHostProfileAction, CONTEXT_EXTENSION_HOST_PROFILE_RECORDED } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; import { EditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions, ActiveEditorContext } from 'vs/workbench/common/editor'; -import { ExtensionHostProfileService } from 'vs/workbench/parts/extensions/electron-browser/extensionProfileService'; +import { ExtensionHostProfileService } from 'vs/workbench/contrib/extensions/electron-browser/extensionProfileService'; import { RuntimeExtensionsInput } from 'vs/workbench/services/extensions/electron-browser/runtimeExtensionsInput'; import { URI } from 'vs/base/common/uri'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { ExtensionActivationProgress } from 'vs/workbench/parts/extensions/electron-browser/extensionsActivationProgress'; -import { ExtensionsAutoProfiler } from 'vs/workbench/parts/extensions/electron-browser/extensionsAutoProfiler'; +import { ExtensionActivationProgress } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress'; +import { ExtensionsAutoProfiler } from 'vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler'; // Singletons registerSingleton(IExtensionsWorkbenchService, ExtensionsWorkbenchService); @@ -323,8 +323,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: DebugExtensionHostAction.ID, title: DebugExtensionHostAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/start-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/start.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/start.svg`)), } }, group: 'navigation', @@ -336,8 +336,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: StartExtensionHostProfileAction.ID, title: StartExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/profile-start.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg`)), } }, group: 'navigation', @@ -349,8 +349,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: StopExtensionHostProfileAction.ID, title: StopExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg`)), } }, group: 'navigation', @@ -362,8 +362,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: SaveExtensionHostProfileAction.ID, title: SaveExtensionHostProfileAction.LABEL, iconLocation: { - dark: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg`)), - light: URI.parse(require.toUrl(`vs/workbench/parts/extensions/electron-browser/media/save.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg`)), + light: URI.parse(require.toUrl(`vs/workbench/contrib/extensions/electron-browser/media/save.svg`)), }, precondition: CONTEXT_EXTENSION_HOST_PROFILE_RECORDED }, diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts similarity index 99% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts index 33ff76a0343..ee26c75549d 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActions.ts @@ -14,15 +14,15 @@ import * as json from 'vs/base/common/json'; import { ActionItem, Separator, IActionItemOptions } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey, IExtensionContainer } from 'vs/workbench/parts/extensions/common/extensions'; -import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey, IExtensionContainer } from 'vs/workbench/contrib/extensions/common/extensions'; +import { ExtensionsConfigurationInitialContent } from 'vs/workbench/contrib/extensions/common/extensionsFileTemplate'; import { IExtensionEnablementService, IExtensionTipsService, EnablementState, ExtensionsLabel, IExtensionRecommendation, IGalleryExtension, IExtensionsConfigContent, IExtensionGalleryService, INSTALL_ERROR_MALICIOUS, INSTALL_ERROR_INCOMPATIBLE, IGalleryExtensionVersion, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { ShowViewletAction } from 'vs/workbench/browser/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { Query } from 'vs/workbench/parts/extensions/common/extensionQuery'; +import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { IFileService, IContent } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; @@ -46,8 +46,8 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; -import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import product from 'vs/platform/node/product'; import { IQuickPickItem, IQuickInputService } from 'vs/platform/quickinput/common/quickInput'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -180,7 +180,7 @@ export class InstallAction extends ExtensionAction { return this.install(this.extension); } - private install(extension: IExtension): Promise { + private install(extension: IExtension): Promise { return this.extensionsWorkbenchService.install(extension).then(null, err => { if (!extension.gallery) { return this.notificationService.error(err); @@ -940,7 +940,7 @@ export class UpdateAllAction extends Action { return Promise.all(this.outdated.map(e => this.install(e))); } - private install(extension: IExtension): Promise { + private install(extension: IExtension): Promise { return this.extensionsWorkbenchService.install(extension).then(undefined, err => { if (!extension.gallery) { return this.notificationService.error(err); @@ -984,16 +984,16 @@ export class ReloadAction extends ExtensionAction { this.enabled = false; this.tooltip = ''; if (!this.extension) { - return Promise.resolve(); + return Promise.resolve(undefined); } const state = this.extension.state; if (state === ExtensionState.Installing || state === ExtensionState.Uninstalling) { - return Promise.resolve(); + return Promise.resolve(undefined); } const installed = this.extensionsWorkbenchService.local.filter(e => areSameExtensions(e.identifier, this.extension.identifier))[0]; const local = this.extension.local || (installed && installed.local); if (local && local.manifest && local.manifest.contributes && local.manifest.contributes.localizations && local.manifest.contributes.localizations.length > 0) { - return Promise.resolve(); + return Promise.resolve(undefined); } return this.extensionService.getExtensions() .then(runningExtensions => this.computeReloadState(runningExtensions, installed)); @@ -1312,7 +1312,7 @@ export class InstallWorkspaceRecommendedExtensionsAction extends Action { viewlet.focus(); const names = this.recommendations.map(({ extensionId }) => extensionId); return this.extensionWorkbenchService.queryGallery({ names, source: 'install-all-workspace-recommendations' }).then(pager => { - let installPromises: Promise[] = []; + let installPromises: Promise[] = []; let model = new PagedModel(pager); for (let i = 0; i < pager.total; i++) { installPromises.push(model.resolve(i, CancellationToken.None).then(e => { @@ -1779,7 +1779,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio }); } - private getSelectionPosition(content: string, resource: URI, path: json.JSONPath): Promise { + private getSelectionPosition(content: string, resource: URI, path: json.JSONPath): Promise { const tree = json.parseTree(content); const node = json.findNodeAtLocation(tree, path); if (node && node.parent && node.parent.children) { @@ -1798,7 +1798,7 @@ export abstract class AbstractConfigureRecommendedExtensionsAction extends Actio }; }); } - return Promise.resolve(); + return Promise.resolve(undefined); } private getOrCreateExtensionsFile(extensionsFileResource: URI): Promise<{ created: boolean, extensionsFileResource: URI, content: string }> { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActivationProgress.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsActivationProgress.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsActivationProgress.ts diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsAutoProfiler.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts similarity index 97% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsAutoProfiler.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts index eed49b380a6..9e1fd882810 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsAutoProfiler.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsAutoProfiler.ts @@ -13,13 +13,13 @@ import { onUnexpectedError } from 'vs/base/common/errors'; import { tmpdir } from 'os'; import { join } from 'path'; import { writeFile } from 'vs/base/node/pfs'; -import { IExtensionHostProfileService, ReportExtensionIssueAction } from 'vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor'; +import { IExtensionHostProfileService, ReportExtensionIssueAction } from 'vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { localize } from 'vs/nls'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { RuntimeExtensionsInput } from 'vs/workbench/services/extensions/electron-browser/runtimeExtensionsInput'; import { generateUuid } from 'vs/base/common/uuid'; -import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; export class ExtensionsAutoProfiler extends Disposable implements IWorkbenchContribution { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts similarity index 97% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index 24c894eca8c..75a817b8b41 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -12,10 +12,10 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IExtension, IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/parts/extensions/common/extensions'; -import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionItem, StatusLabelAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; +import { IExtension, IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; +import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionItem, StatusLabelAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget } from 'vs/workbench/parts/extensions/electron-browser/extensionsWidgets'; +import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsUtils.ts similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsUtils.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsUtils.ts diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts similarity index 98% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts index 352820e161a..c4fdb57b959 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViewlet.ts @@ -23,13 +23,13 @@ import { ShowEnabledExtensionsAction, ShowInstalledExtensionsAction, ShowRecommendedExtensionsAction, ShowPopularExtensionsAction, ShowDisabledExtensionsAction, ShowOutdatedExtensionsAction, ClearExtensionsInputAction, ChangeSortAction, UpdateAllAction, CheckForUpdatesAction, DisableAllAction, EnableAllAction, EnableAutoUpdateAction, DisableAutoUpdateAction, ShowBuiltInExtensionsAction, InstallVSIXAction -} from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; +} from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { IExtensionManagementService, IExtensionManagementServerService, IExtensionManagementServer, EnablementState } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; +import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import { ExtensionsListView, EnabledExtensionsView, DisabledExtensionsView, RecommendedExtensionsView, WorkspaceRecommendedExtensionsView, BuiltInExtensionsView, BuiltInThemesExtensionsView, BuiltInBasicsExtensionsView, GroupByServerExtensionsView, DefaultRecommendedExtensionsView } from './extensionsViews'; -import { OpenGlobalSettingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions'; +import { OpenGlobalSettingsAction } from 'vs/workbench/contrib/preferences/browser/preferencesActions'; import { IProgressService2, ProgressLocation } from 'vs/platform/progress/common/progress'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import Severity from 'vs/base/common/severity'; import { IActivityService, ProgressBadge, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { IThemeService } from 'vs/platform/theme/common/themeService'; @@ -47,8 +47,8 @@ import { IWindowService } from 'vs/platform/windows/common/windows'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/views'; import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; -import { Query } from 'vs/workbench/parts/extensions/common/extensionQuery'; -import { SuggestEnabledInput, attachSuggestEnabledInputBoxStyler } from 'vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput'; +import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; +import { SuggestEnabledInput, attachSuggestEnabledInputBoxStyler } from 'vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts similarity index 98% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts index 58e70c850e1..849f8161da7 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViews.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsViews.ts @@ -15,32 +15,32 @@ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { append, $, toggleClass } from 'vs/base/browser/dom'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { Delegate, Renderer, IExtensionsViewState } from 'vs/workbench/parts/extensions/electron-browser/extensionsList'; +import { Delegate, Renderer, IExtensionsViewState } from 'vs/workbench/contrib/extensions/electron-browser/extensionsList'; import { IExtension, IExtensionsWorkbenchService } from '../common/extensions'; import { Query } from '../common/extensionQuery'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { OpenGlobalSettingsAction } from 'vs/workbench/parts/preferences/browser/preferencesActions'; +import { OpenGlobalSettingsAction } from 'vs/workbench/contrib/preferences/browser/preferencesActions'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IModeService } from 'vs/editor/common/services/modeService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ActionBar, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; +import { InstallWorkspaceRecommendedExtensionsAction, ConfigureWorkspaceFolderRecommendedExtensionsAction, ManageExtensionAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { WorkbenchPagedList } from 'vs/platform/list/browser/listService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { distinct } from 'vs/base/common/arrays'; -import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, IExperiment, ExperimentActionType } from 'vs/workbench/contrib/experiments/node/experimentService'; import { alert } from 'vs/base/browser/ui/aria/aria'; import { IListContextMenuEvent } from 'vs/base/browser/ui/list/list'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; import { CancellationToken } from 'vs/base/common/cancellation'; -import { getKeywordsForExtension } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; +import { getKeywordsForExtension } from 'vs/workbench/contrib/extensions/electron-browser/extensionsUtils'; import { IAction } from 'vs/base/common/actions'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts similarity index 96% rename from src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts rename to src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts index 09f35375ec2..b5f3b7d5af5 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWidgets.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsWidgets.ts @@ -11,7 +11,7 @@ import * as platform from 'vs/base/common/platform'; import { localize } from 'vs/nls'; import { IExtensionManagementServerService, IExtensionTipsService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ILabelService } from 'vs/platform/label/common/label'; -import { extensionButtonProminentBackground, extensionButtonProminentForeground } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; +import { extensionButtonProminentBackground, extensionButtonProminentForeground } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { STATUS_BAR_HOST_NAME_BACKGROUND, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; @@ -135,7 +135,8 @@ export class RatingsWidget extends ExtensionWidget { } } } - this.container.title = this.extension.ratingCount > 1 ? localize('ratedByUsers', "Rated by {0} users", this.extension.ratingCount) : localize('ratedBySingleUser', "Rated by 1 user"); + this.container.title = this.extension.ratingCount === 1 ? localize('ratedBySingleUser', "Rated by 1 user") + : this.extension.ratingCount > 1 ? localize('ratedByUsers', "Rated by {0} users", this.extension.ratingCount) : localize('noRating', "No rating"); } } diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/EmptyStar.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/EmptyStar.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/EmptyStar.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/FullStarLight.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/FullStarLight.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/FullStarLight.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/HalfStarLight.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/HalfStarLight.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/HalfStarLight.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/clear-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/clear-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/clear-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/clear.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/clear.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/clear.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/defaultIcon.png b/src/vs/workbench/contrib/extensions/electron-browser/media/defaultIcon.png similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/defaultIcon.png rename to src/vs/workbench/contrib/extensions/electron-browser/media/defaultIcon.png diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionActions.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensionActions.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensionActions.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensionEditor.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensionEditor.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensions-dark.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions-dark.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensions-dark.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensions-dark.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensions.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensions.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensions.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensions.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensionsViewlet.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensionsViewlet.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/extensionsWidgets.css b/src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/extensionsWidgets.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/extensionsWidgets.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/language-icon.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/language-icon.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/language-icon.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/language-icon.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/loading.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/loading.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/loading.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/loading.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/manage-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/manage-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/manage-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/manage.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/manage.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/manage.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/markdown.css b/src/vs/workbench/contrib/extensions/electron-browser/media/markdown.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/markdown.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/markdown.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/profile-start-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/profile-start-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/profile-start.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/profile-start.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/profile-stop-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/profile-stop.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/profile-stop.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css b/src/vs/workbench/contrib/extensions/electron-browser/media/runtimeExtensionsEditor.css similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/runtimeExtensionsEditor.css rename to src/vs/workbench/contrib/extensions/electron-browser/media/runtimeExtensionsEditor.css diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/save-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/save-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/save.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/save.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/save.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/save.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/start-inverse.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/start-inverse.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/start-inverse.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/start.svg b/src/vs/workbench/contrib/extensions/electron-browser/media/start.svg similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/start.svg rename to src/vs/workbench/contrib/extensions/electron-browser/media/start.svg diff --git a/src/vs/workbench/parts/extensions/electron-browser/media/theme-icon.png b/src/vs/workbench/contrib/extensions/electron-browser/media/theme-icon.png similarity index 100% rename from src/vs/workbench/parts/extensions/electron-browser/media/theme-icon.png rename to src/vs/workbench/contrib/extensions/electron-browser/media/theme-icon.png diff --git a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts similarity index 99% rename from src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts rename to src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index d8b3b30fe8b..357adbe4cf0 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -12,7 +12,7 @@ import { Action, IAction } from 'vs/base/common/actions'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsWorkbenchService, IExtension } from 'vs/workbench/contrib/extensions/common/extensions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService, IExtensionDescription, IExtensionsStatus, IExtensionHostProfile } from 'vs/workbench/services/extensions/common/extensions'; @@ -33,7 +33,7 @@ import { isNonEmptyArray } from 'vs/base/common/arrays'; import { Event } from 'vs/base/common/event'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { RuntimeExtensionsInput } from 'vs/workbench/services/extensions/electron-browser/runtimeExtensionsInput'; -import { IDebugService } from 'vs/workbench/parts/debug/common/debug'; +import { IDebugService } from 'vs/workbench/contrib/debug/common/debug'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { randomPort } from 'vs/base/node/ports'; import { IContextKeyService, RawContextKey, IContextKey } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts similarity index 99% rename from src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts rename to src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 6d25977a663..d096b50e2b5 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -22,10 +22,10 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { IWindowService } from 'vs/platform/windows/common/windows'; import Severity from 'vs/base/common/severity'; import { URI } from 'vs/base/common/uri'; -import { IExtension, IExtensionDependencies, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtension, IExtensionDependencies, ExtensionState, IExtensionsWorkbenchService, AutoUpdateConfigurationKey, AutoCheckUpdatesConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; -import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; +import { ExtensionsInput } from 'vs/workbench/contrib/extensions/common/extensionsInput'; import product from 'vs/platform/node/product'; import { ILogService } from 'vs/platform/log/common/log'; import { IProgressService2, ProgressLocation } from 'vs/platform/progress/common/progress'; @@ -673,7 +673,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, installVersion(extension: IExtension, version: string): Promise { if (!(extension instanceof Extension)) { - return Promise.resolve(); + return Promise.resolve(extension); } if (!extension.gallery) { diff --git a/src/vs/workbench/parts/extensions/test/common/extensionQuery.test.ts b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts similarity index 98% rename from src/vs/workbench/parts/extensions/test/common/extensionQuery.test.ts rename to src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts index 0b631635e5f..c998dc997d5 100644 --- a/src/vs/workbench/parts/extensions/test/common/extensionQuery.test.ts +++ b/src/vs/workbench/contrib/extensions/test/common/extensionQuery.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Query } from 'vs/workbench/parts/extensions/common/extensionQuery'; +import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; suite('Extension query', () => { test('parse', () => { diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts similarity index 99% rename from src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts rename to src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index 3cebcc96d55..8f631fb0220 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -6,16 +6,16 @@ import * as assert from 'assert'; import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; -import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; -import * as ExtensionsActions from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; -import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; +import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; +import * as ExtensionsActions from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; +import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, IGalleryExtension, DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, EnablementState, InstallOperation, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/electron-browser/extensionEnablementService.test'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IURLService } from 'vs/platform/url/common/url'; diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts similarity index 98% rename from src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts rename to src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts index 64a23326120..00a577f03d5 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsTipsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsTipsService.test.ts @@ -14,7 +14,7 @@ import { IExtensionGalleryService, IGalleryExtensionAssets, IGalleryExtension, IExtensionManagementService, IExtensionEnablementService, DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { Emitter } from 'vs/base/common/event'; @@ -34,7 +34,7 @@ import { IPager } from 'vs/base/common/paging'; import { assign } from 'vs/base/common/objects'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; -import { ConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; +import { ConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/electron-browser/extensionEnablementService.test'; import { IURLService } from 'vs/platform/url/common/url'; @@ -44,8 +44,8 @@ import { IModelService } from 'vs/editor/common/services/modelService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { INotificationService, Severity, IPromptChoice, IPromptOptions } from 'vs/platform/notification/common/notification'; import { URLService } from 'vs/platform/url/common/urlService'; -import { IExperimentService } from 'vs/workbench/parts/experiments/node/experimentService'; -import { TestExperimentService } from 'vs/workbench/parts/experiments/test/electron-browser/experimentService.test'; +import { IExperimentService } from 'vs/workbench/contrib/experiments/node/experimentService'; +import { TestExperimentService } from 'vs/workbench/contrib/experiments/test/electron-browser/experimentService.test'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts similarity index 98% rename from src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts rename to src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts index 72ca6a677ea..0a1f69387ab 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsViews.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsViews.test.ts @@ -6,17 +6,17 @@ import * as assert from 'assert'; import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; -import { ExtensionsListView } from 'vs/workbench/parts/extensions/electron-browser/extensionsViews'; +import { ExtensionsListView } from 'vs/workbench/contrib/extensions/electron-browser/extensionsViews'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; -import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; +import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; +import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, IGalleryExtension, IQueryOptions, DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IExtensionIdentifier, IExtensionManagementServerService, IExtensionManagementServer, EnablementState, ExtensionRecommendationReason, SortBy } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/electron-browser/extensionEnablementService.test'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IURLService } from 'vs/platform/url/common/url'; @@ -34,7 +34,7 @@ import { URLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { SinonStub } from 'sinon'; -import { IExperimentService, ExperimentService, ExperimentState, ExperimentActionType } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, ExperimentService, ExperimentState, ExperimentActionType } from 'vs/workbench/contrib/experiments/node/experimentService'; import { IRemoteAgentService } from 'vs/workbench/services/remote/node/remoteAgentService'; import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browser/remoteAgentServiceImpl'; import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts similarity index 99% rename from src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts rename to src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 2abd6bb2a40..12aaa830bf9 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -8,15 +8,15 @@ import * as assert from 'assert'; import * as fs from 'fs'; import { assign } from 'vs/base/common/objects'; import { generateUuid } from 'vs/base/common/uuid'; -import { IExtensionsWorkbenchService, ExtensionState, AutoCheckUpdatesConfigurationKey, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; -import { ExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/node/extensionsWorkbenchService'; +import { IExtensionsWorkbenchService, ExtensionState, AutoCheckUpdatesConfigurationKey, AutoUpdateConfigurationKey } from 'vs/workbench/contrib/extensions/common/extensions'; +import { ExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/node/extensionsWorkbenchService'; import { IExtensionManagementService, IExtensionGalleryService, IExtensionEnablementService, IExtensionTipsService, ILocalExtension, IGalleryExtension, DidInstallExtensionEvent, DidUninstallExtensionEvent, InstallExtensionEvent, IGalleryExtensionAssets, IExtensionIdentifier, EnablementState, InstallOperation, IExtensionManagementServerService, IExtensionManagementServer } from 'vs/platform/extensionManagement/common/extensionManagement'; import { getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionManagementService } from 'vs/platform/extensionManagement/node/extensionManagementService'; -import { ExtensionTipsService } from 'vs/workbench/parts/extensions/electron-browser/extensionTipsService'; +import { ExtensionTipsService } from 'vs/workbench/contrib/extensions/electron-browser/extensionTipsService'; import { TestExtensionEnablementService } from 'vs/platform/extensionManagement/test/electron-browser/extensionEnablementService.test'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { IURLService } from 'vs/platform/url/common/url'; diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts b/src/vs/workbench/contrib/feedback/electron-browser/feedback.contribution.ts similarity index 93% rename from src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts rename to src/vs/workbench/contrib/feedback/electron-browser/feedback.contribution.ts index ef27bf5a6e8..42adc6b0d99 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedback.contribution.ts +++ b/src/vs/workbench/contrib/feedback/electron-browser/feedback.contribution.ts @@ -6,7 +6,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IStatusbarRegistry, Extensions, StatusbarItemDescriptor } from 'vs/workbench/browser/parts/statusbar/statusbar'; import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; -import { FeedbackStatusbarItem } from 'vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem'; +import { FeedbackStatusbarItem } from 'vs/workbench/contrib/feedback/electron-browser/feedbackStatusbarItem'; import { localize } from 'vs/nls'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedback.ts b/src/vs/workbench/contrib/feedback/electron-browser/feedback.ts similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/feedback.ts rename to src/vs/workbench/contrib/feedback/electron-browser/feedback.ts diff --git a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts b/src/vs/workbench/contrib/feedback/electron-browser/feedbackStatusbarItem.ts similarity index 99% rename from src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts rename to src/vs/workbench/contrib/feedback/electron-browser/feedbackStatusbarItem.ts index 05db4b3c1db..ab3448d9b61 100644 --- a/src/vs/workbench/parts/feedback/electron-browser/feedbackStatusbarItem.ts +++ b/src/vs/workbench/contrib/feedback/electron-browser/feedbackStatusbarItem.ts @@ -5,7 +5,7 @@ import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; import { IStatusbarItem } from 'vs/workbench/browser/parts/statusbar/statusbar'; -import { FeedbackDropdown, IFeedback, IFeedbackDelegate, FEEDBACK_VISIBLE_CONFIG, IFeedbackDropdownOptions } from 'vs/workbench/parts/feedback/electron-browser/feedback'; +import { FeedbackDropdown, IFeedback, IFeedbackDelegate, FEEDBACK_VISIBLE_CONFIG, IFeedbackDropdownOptions } from 'vs/workbench/contrib/feedback/electron-browser/feedback'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import product from 'vs/platform/node/product'; diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/close-dark.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/close-dark.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/close-dark.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/close-dark.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/close.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/close.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/close.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/close.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/feedback.css b/src/vs/workbench/contrib/feedback/electron-browser/media/feedback.css similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/feedback.css rename to src/vs/workbench/contrib/feedback/electron-browser/media/feedback.css diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/happy.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/happy.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/happy.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/happy.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/info.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/info.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/info.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/info.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/sad.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/sad.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/sad.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/sad.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/smiley.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/smiley.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/smiley.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/smiley.svg diff --git a/src/vs/workbench/parts/feedback/electron-browser/media/twitter.svg b/src/vs/workbench/contrib/feedback/electron-browser/media/twitter.svg similarity index 100% rename from src/vs/workbench/parts/feedback/electron-browser/media/twitter.svg rename to src/vs/workbench/contrib/feedback/electron-browser/media/twitter.svg diff --git a/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts similarity index 93% rename from src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts rename to src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts index bb43de19df7..a928e36712a 100644 --- a/src/vs/workbench/parts/files/browser/editors/binaryFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/binaryFileEditor.ts @@ -9,9 +9,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { URI } from 'vs/base/common/uri'; -import { BINARY_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; +import { BINARY_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; import { IFileService } from 'vs/platform/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IStorageService } from 'vs/platform/storage/common/storage'; diff --git a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts b/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts similarity index 98% rename from src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts rename to src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts index 3bcdf9b9fdc..5bc167ed371 100644 --- a/src/vs/workbench/parts/files/browser/editors/fileEditorTracker.ts +++ b/src/vs/workbench/contrib/files/browser/editors/fileEditorTracker.ts @@ -10,7 +10,7 @@ import { IEditorViewState } from 'vs/editor/common/editorCommon'; import { toResource, SideBySideEditorInput, IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; import { ITextFileService, ITextFileEditorModel } from 'vs/workbench/services/textfile/common/textfiles'; import { FileOperationEvent, FileOperation, IFileService, FileChangeType, FileChangesEvent } from 'vs/platform/files/common/files'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { Disposable } from 'vs/base/common/lifecycle'; import { distinct } from 'vs/base/common/arrays'; @@ -22,9 +22,9 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace import { isCodeEditor } from 'vs/editor/browser/editorBrowser'; import { SideBySideEditor } from 'vs/workbench/browser/parts/editor/sideBySideEditor'; import { IWindowService } from 'vs/platform/windows/common/windows'; -import { BINARY_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; +import { BINARY_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ResourceQueue, timeout } from 'vs/base/common/async'; import { onUnexpectedError } from 'vs/base/common/errors'; diff --git a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts similarity index 97% rename from src/vs/workbench/parts/files/browser/editors/textFileEditor.ts rename to src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts index dceca11ee4d..6d840584a3b 100644 --- a/src/vs/workbench/parts/files/browser/editors/textFileEditor.ts +++ b/src/vs/workbench/contrib/files/browser/editors/textFileEditor.ts @@ -8,12 +8,12 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import * as types from 'vs/base/common/types'; import * as paths from 'vs/base/common/paths'; import { Action } from 'vs/base/common/actions'; -import { VIEWLET_ID, TEXT_FILE_EDITOR_ID, IExplorerService } from 'vs/workbench/parts/files/common/files'; +import { VIEWLET_ID, TEXT_FILE_EDITOR_ID, IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { ITextFileEditorModel, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { BaseTextEditor, IEditorConfiguration } from 'vs/workbench/browser/parts/editor/textEditor'; import { EditorOptions, TextEditorOptions, IEditorCloseEvent } from 'vs/workbench/common/editor'; import { BinaryEditorModel } from 'vs/workbench/common/editor/binaryEditorModel'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { FileOperationError, FileOperationResult, FileChangesEvent, IFileService, FALLBACK_MAX_MEMORY_SIZE_MB, MIN_MAX_MEMORY_SIZE_MB } from 'vs/platform/files/common/files'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -26,7 +26,7 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ScrollType } from 'vs/editor/common/editorCommon'; import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorGroupView } from 'vs/workbench/browser/parts/editor/editor'; import { createErrorWithActions } from 'vs/base/common/errorsWithActions'; @@ -177,7 +177,7 @@ export class TextFileEditor extends BaseTextEditor { if ((error).fileOperationResult === FileOperationResult.FILE_IS_DIRECTORY) { this.openAsFolder(input); - return Promise.reject(new Error(nls.localize('openFolderError', "File is a directory"))); + return Promise.reject(new Error(nls.localize('openFolderError', "File is a directory"))); } // Offer to create a file from the error if we have a file not found and the name is valid diff --git a/src/vs/workbench/parts/files/browser/files.ts b/src/vs/workbench/contrib/files/browser/files.ts similarity index 95% rename from src/vs/workbench/parts/files/browser/files.ts rename to src/vs/workbench/contrib/files/browser/files.ts index 006ae8c00db..73428f84eda 100644 --- a/src/vs/workbench/parts/files/browser/files.ts +++ b/src/vs/workbench/contrib/files/browser/files.ts @@ -5,11 +5,11 @@ import { URI } from 'vs/base/common/uri'; import { IListService, WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService'; -import { OpenEditor } from 'vs/workbench/parts/files/common/files'; +import { OpenEditor } from 'vs/workbench/contrib/files/common/files'; import { toResource } from 'vs/workbench/common/editor'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { coalesce } from 'vs/base/common/arrays'; // Commands can get exeucted from a command pallete, from a context menu or from some list using a keybinding diff --git a/src/vs/workbench/parts/files/common/dirtyFilesTracker.ts b/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts similarity index 98% rename from src/vs/workbench/parts/files/common/dirtyFilesTracker.ts rename to src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts index 4ab6e130c6a..201452f8d45 100644 --- a/src/vs/workbench/parts/files/common/dirtyFilesTracker.ts +++ b/src/vs/workbench/contrib/files/common/dirtyFilesTracker.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { VIEWLET_ID } from 'vs/workbench/parts/files/common/files'; +import { VIEWLET_ID } from 'vs/workbench/contrib/files/common/files'; import { TextFileModelChangeEvent, ITextFileService, AutoSaveMode, ModelState } from 'vs/workbench/services/textfile/common/textfiles'; import { platform, Platform } from 'vs/base/common/platform'; import { IWindowService } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts similarity index 99% rename from src/vs/workbench/parts/files/common/editors/fileEditorInput.ts rename to src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts index 78c08b20065..5d141dac753 100644 --- a/src/vs/workbench/parts/files/common/editors/fileEditorInput.ts +++ b/src/vs/workbench/contrib/files/common/editors/fileEditorInput.ts @@ -18,7 +18,7 @@ import { IReference } from 'vs/base/common/lifecycle'; import { telemetryURIDescriptor } from 'vs/platform/telemetry/common/telemetryUtils'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; -import { FILE_EDITOR_INPUT_ID, TEXT_FILE_EDITOR_ID, BINARY_FILE_EDITOR_ID } from 'vs/workbench/parts/files/common/files'; +import { FILE_EDITOR_INPUT_ID, TEXT_FILE_EDITOR_ID, BINARY_FILE_EDITOR_ID } from 'vs/workbench/contrib/files/common/files'; import { ILabelService } from 'vs/platform/label/common/label'; /** diff --git a/src/vs/workbench/parts/files/common/explorerModel.ts b/src/vs/workbench/contrib/files/common/explorerModel.ts similarity index 100% rename from src/vs/workbench/parts/files/common/explorerModel.ts rename to src/vs/workbench/contrib/files/common/explorerModel.ts diff --git a/src/vs/workbench/parts/files/common/files.ts b/src/vs/workbench/contrib/files/common/files.ts similarity index 98% rename from src/vs/workbench/parts/files/common/files.ts rename to src/vs/workbench/contrib/files/common/files.ts index 9b8cbdf5d29..0e1a87939cc 100644 --- a/src/vs/workbench/parts/files/common/files.ts +++ b/src/vs/workbench/contrib/files/common/files.ts @@ -20,8 +20,8 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IViewContainersRegistry, Extensions as ViewContainerExtensions, ViewContainer } from 'vs/workbench/common/views'; import { Schemas } from 'vs/base/common/network'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; /** * Explorer viewlet id. diff --git a/src/vs/workbench/parts/files/electron-browser/explorerService.ts b/src/vs/workbench/contrib/files/electron-browser/explorerService.ts similarity index 97% rename from src/vs/workbench/parts/files/electron-browser/explorerService.ts rename to src/vs/workbench/contrib/files/electron-browser/explorerService.ts index 7bcd9095155..a4e4689adb7 100644 --- a/src/vs/workbench/parts/files/electron-browser/explorerService.ts +++ b/src/vs/workbench/contrib/files/electron-browser/explorerService.ts @@ -6,8 +6,8 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IExplorerService, IEditableData, IFilesConfiguration, SortOrder, SortOrderConfiguration } from 'vs/workbench/parts/files/common/files'; -import { ExplorerItem, ExplorerModel } from 'vs/workbench/parts/files/common/explorerModel'; +import { IExplorerService, IEditableData, IFilesConfiguration, SortOrder, SortOrderConfiguration } from 'vs/workbench/contrib/files/common/files'; +import { ExplorerItem, ExplorerModel } from 'vs/workbench/contrib/files/common/explorerModel'; import { URI } from 'vs/base/common/uri'; import { FileOperationEvent, FileOperation, IFileStat, IFileService, FileChangesEvent, FILES_EXCLUDE_CONFIG, FileChangeType, IResolveFileOptions } from 'vs/platform/files/common/files'; import { dirname } from 'vs/base/common/resources'; @@ -108,8 +108,13 @@ export class ExplorerService implements IExplorerService { return this.model.findClosest(resource); } - setEditable(stat: ExplorerItem, data: IEditableData): void { - this.editableStats.set(stat, data); + setEditable(stat: ExplorerItem, data: IEditableData | null): void { + if (!data) { + this.editableStats.delete(stat); + } else { + this.editableStats.set(stat, data); + } + this._onDidChangeEditable.fire(stat); } diff --git a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts b/src/vs/workbench/contrib/files/electron-browser/explorerViewlet.ts similarity index 96% rename from src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts rename to src/vs/workbench/contrib/files/electron-browser/explorerViewlet.ts index 5d546ccb1a6..9d581341970 100644 --- a/src/vs/workbench/parts/files/electron-browser/explorerViewlet.ts +++ b/src/vs/workbench/contrib/files/electron-browser/explorerViewlet.ts @@ -6,12 +6,12 @@ import 'vs/css!./media/explorerviewlet'; import { localize } from 'vs/nls'; import * as DOM from 'vs/base/browser/dom'; -import { VIEWLET_ID, ExplorerViewletVisibleContext, IFilesConfiguration, OpenEditorsVisibleContext, OpenEditorsVisibleCondition, VIEW_CONTAINER } from 'vs/workbench/parts/files/common/files'; +import { VIEWLET_ID, ExplorerViewletVisibleContext, IFilesConfiguration, OpenEditorsVisibleContext, OpenEditorsVisibleCondition, VIEW_CONTAINER } from 'vs/workbench/contrib/files/common/files'; import { ViewContainerViewlet, IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { ExplorerView } from 'vs/workbench/parts/files/electron-browser/views/explorerView'; -import { EmptyView } from 'vs/workbench/parts/files/electron-browser/views/emptyView'; -import { OpenEditorsView } from 'vs/workbench/parts/files/electron-browser/views/openEditorsView'; +import { ExplorerView } from 'vs/workbench/contrib/files/electron-browser/views/explorerView'; +import { EmptyView } from 'vs/workbench/contrib/files/electron-browser/views/emptyView'; +import { OpenEditorsView } from 'vs/workbench/contrib/files/electron-browser/views/openEditorsView'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -27,7 +27,7 @@ import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { DelegatingEditorService } from 'vs/workbench/services/editor/browser/editorService'; -import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorOptions } from 'vs/platform/editor/common/editor'; import { IEditorInput } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.ts b/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts similarity index 96% rename from src/vs/workbench/parts/files/electron-browser/fileActions.contribution.ts rename to src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts index 3a75d49e119..c9be944b28f 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-browser/fileActions.contribution.ts @@ -5,17 +5,17 @@ import * as nls from 'vs/nls'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, ShowOpenedFileInNewWindow, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler } from 'vs/workbench/parts/files/electron-browser/fileActions'; -import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/parts/files/electron-browser/saveErrorHandler'; +import { ToggleAutoSaveAction, GlobalNewUntitledFileAction, ShowOpenedFileInNewWindow, FocusFilesExplorer, GlobalCompareResourcesAction, SaveAllAction, ShowActiveFileInExplorer, CollapseExplorerView, RefreshExplorerView, CompareWithClipboardAction, NEW_FILE_COMMAND_ID, NEW_FILE_LABEL, NEW_FOLDER_COMMAND_ID, NEW_FOLDER_LABEL, TRIGGER_RENAME_LABEL, MOVE_FILE_TO_TRASH_LABEL, COPY_FILE_LABEL, PASTE_FILE_LABEL, FileCopiedContext, renameHandler, moveFileToTrashHandler, copyFileHandler, pasteFileHandler, deleteFileHandler, cutFileHandler } from 'vs/workbench/contrib/files/electron-browser/fileActions'; +import { revertLocalChangesCommand, acceptLocalChangesCommand, CONFLICT_RESOLUTION_CONTEXT } from 'vs/workbench/contrib/files/electron-browser/saveErrorHandler'; import { SyncActionDescriptor, MenuId, MenuRegistry, ILocalizedString } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; -import { openWindowCommand, REVEAL_IN_OS_COMMAND_ID, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, REVEAL_IN_OS_LABEL, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL } from 'vs/workbench/parts/files/electron-browser/fileCommands'; +import { openWindowCommand, REVEAL_IN_OS_COMMAND_ID, COPY_PATH_COMMAND_ID, REVEAL_IN_EXPLORER_COMMAND_ID, OPEN_TO_SIDE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_COMMAND_ID, SAVE_FILE_LABEL, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID, OpenEditorsGroupContext, COMPARE_WITH_SAVED_COMMAND_ID, COMPARE_RESOURCE_COMMAND_ID, SELECT_FOR_COMPARE_COMMAND_ID, ResourceSelectedForCompareContext, REVEAL_IN_OS_LABEL, DirtyEditorContext, COMPARE_SELECTED_COMMAND_ID, REMOVE_ROOT_FOLDER_COMMAND_ID, REMOVE_ROOT_FOLDER_LABEL, SAVE_FILES_COMMAND_ID, COPY_RELATIVE_PATH_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_COMMAND_ID, SAVE_FILE_WITHOUT_FORMATTING_LABEL } from 'vs/workbench/contrib/files/electron-browser/fileCommands'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { isWindows, isMacintosh } from 'vs/base/common/platform'; -import { FilesExplorerFocusCondition, ExplorerRootContext, ExplorerFolderContext, ExplorerResourceNotReadonlyContext, ExplorerResourceCut, IExplorerService } from 'vs/workbench/parts/files/common/files'; +import { FilesExplorerFocusCondition, ExplorerRootContext, ExplorerFolderContext, ExplorerResourceNotReadonlyContext, ExplorerResourceCut, IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { ADD_ROOT_FOLDER_COMMAND_ID, ADD_ROOT_FOLDER_LABEL } from 'vs/workbench/browser/actions/workspaceCommands'; import { CLOSE_SAVED_EDITORS_COMMAND_ID, CLOSE_EDITORS_IN_GROUP_COMMAND_ID, CLOSE_EDITOR_COMMAND_ID, CLOSE_OTHER_EDITORS_IN_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands'; import { AutoSaveContext } from 'vs/workbench/services/textfile/common/textfiles'; @@ -159,12 +159,12 @@ function appendEditorTitleContextMenuItem(id: string, title: string, when: Conte // Editor Title Menu for Conflict Resolution appendSaveConflictEditorTitleAction('workbench.files.action.acceptLocalChanges', nls.localize('acceptLocalChanges', "Use your changes and overwrite disk contents"), { - light: URI.parse(require.toUrl(`vs/workbench/parts/files/electron-browser/media/check.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/files/electron-browser/media/check-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/files/electron-browser/media/check.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/electron-browser/media/check-inverse.svg`)) }, -10, acceptLocalChangesCommand); appendSaveConflictEditorTitleAction('workbench.files.action.revertLocalChanges', nls.localize('revertLocalChanges', "Discard your changes and revert to content on disk"), { - light: URI.parse(require.toUrl(`vs/workbench/parts/files/electron-browser/media/undo.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/files/electron-browser/media/undo-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/files/electron-browser/media/undo.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/files/electron-browser/media/undo-inverse.svg`)) }, -9, revertLocalChangesCommand); function appendSaveConflictEditorTitleAction(id: string, title: string, iconLocation: { dark: URI; light?: URI; }, order: number, command: ICommandHandler): void { diff --git a/src/vs/workbench/parts/files/electron-browser/fileActions.ts b/src/vs/workbench/contrib/files/electron-browser/fileActions.ts similarity index 98% rename from src/vs/workbench/parts/files/electron-browser/fileActions.ts rename to src/vs/workbench/contrib/files/electron-browser/fileActions.ts index 420a845ae97..bd8c77fd5a0 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileActions.ts +++ b/src/vs/workbench/contrib/files/electron-browser/fileActions.ts @@ -14,18 +14,18 @@ import { toErrorMessage } from 'vs/base/common/errorMessage'; import * as strings from 'vs/base/common/strings'; import { Action } from 'vs/base/common/actions'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; -import { VIEWLET_ID, IExplorerService } from 'vs/workbench/parts/files/common/files'; +import { VIEWLET_ID, IExplorerService } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IFileService, AutoSaveConfiguration } from 'vs/platform/files/common/files'; import { toResource, IUntitledResourceInput } from 'vs/workbench/common/editor'; -import { ExplorerViewlet } from 'vs/workbench/parts/files/electron-browser/explorerViewlet'; +import { ExplorerViewlet } from 'vs/workbench/contrib/files/electron-browser/explorerViewlet'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IInstantiationService, ServicesAccessor, IConstructorSignature1 } from 'vs/platform/instantiation/common/instantiation'; import { ITextModel } from 'vs/editor/common/model'; import { IWindowService } from 'vs/platform/windows/common/windows'; -import { REVEAL_IN_EXPLORER_COMMAND_ID, SAVE_ALL_COMMAND_ID, SAVE_ALL_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID } from 'vs/workbench/parts/files/electron-browser/fileCommands'; +import { REVEAL_IN_EXPLORER_COMMAND_ID, SAVE_ALL_COMMAND_ID, SAVE_ALL_LABEL, SAVE_ALL_IN_GROUP_COMMAND_ID } from 'vs/workbench/contrib/files/electron-browser/fileCommands'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; @@ -43,7 +43,7 @@ import { CLOSE_EDITORS_AND_GROUP_COMMAND_ID } from 'vs/workbench/browser/parts/e import { IViewlet } from 'vs/workbench/common/viewlet'; import { coalesce } from 'vs/base/common/arrays'; import { AsyncDataTree } from 'vs/base/browser/ui/tree/asyncDataTree'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; import { sequence } from 'vs/base/common/async'; @@ -876,7 +876,7 @@ export class ShowOpenedFileInNewWindow extends Action { public run(): Promise { const fileResource = toResource(this.editorService.activeEditor, { supportSideBySide: true, filter: Schemas.file /* todo@remote */ }); if (fileResource) { - this.windowService.openWindow([fileResource], { forceNewWindow: true, forceOpenWorkspaceAsFile: true }); + this.windowService.openWindow([{ uri: fileResource, typeHint: 'file' }], { forceNewWindow: true, forceOpenWorkspaceAsFile: true }); } else { this.notificationService.info(nls.localize('openFileToShowInNewWindow', "Open a file first to open in new window")); } diff --git a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts b/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts similarity index 95% rename from src/vs/workbench/parts/files/electron-browser/fileCommands.ts rename to src/vs/workbench/contrib/files/electron-browser/fileCommands.ts index 0bd9b93fcc5..77564393606 100644 --- a/src/vs/workbench/parts/files/electron-browser/fileCommands.ts +++ b/src/vs/workbench/contrib/files/electron-browser/fileCommands.ts @@ -7,12 +7,12 @@ import * as nls from 'vs/nls'; import * as paths from 'vs/base/common/paths'; import { URI } from 'vs/base/common/uri'; import { toResource, IEditorCommandsContext } from 'vs/workbench/common/editor'; -import { IWindowsService, IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, IURIToOpen } from 'vs/platform/windows/common/windows'; import { ServicesAccessor, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ExplorerFocusCondition, FileOnDiskContentProvider, VIEWLET_ID, IExplorerService } from 'vs/workbench/parts/files/common/files'; -import { ExplorerViewlet } from 'vs/workbench/parts/files/electron-browser/explorerViewlet'; +import { ExplorerFocusCondition, FileOnDiskContentProvider, VIEWLET_ID, IExplorerService } from 'vs/workbench/contrib/files/common/files'; +import { ExplorerViewlet } from 'vs/workbench/contrib/files/electron-browser/explorerViewlet'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ITextFileService, ISaveOptions } from 'vs/workbench/services/textfile/common/textfiles'; import { toErrorMessage } from 'vs/base/common/errorMessage'; @@ -29,14 +29,14 @@ import { KeyMod, KeyCode, KeyChord } from 'vs/base/common/keyCodes'; import { isWindows, isMacintosh } from 'vs/base/common/platform'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { sequence } from 'vs/base/common/async'; -import { getResourceForCommand, getMultiSelectedResources } from 'vs/workbench/parts/files/browser/files'; +import { getResourceForCommand, getMultiSelectedResources } from 'vs/workbench/contrib/files/browser/files'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { getMultiSelectedEditorContexts } from 'vs/workbench/browser/parts/editor/editorCommands'; import { Schemas } from 'vs/base/common/network'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ILabelService } from 'vs/platform/label/common/label'; import { onUnexpectedError } from 'vs/base/common/errors'; @@ -76,17 +76,13 @@ export const ResourceSelectedForCompareContext = new RawContextKey('res export const REMOVE_ROOT_FOLDER_COMMAND_ID = 'removeRootFolder'; export const REMOVE_ROOT_FOLDER_LABEL = nls.localize('removeFolderFromWorkspace', "Remove Folder from Workspace"); -export const openWindowCommand = (accessor: ServicesAccessor, input: Array | { fileURIs: URI[], folderURIs: URI[], forceNewWindow: boolean, forceReuseWindow?: boolean, diffMode?: boolean, addMode?: boolean }, forceNewWindow: boolean) => { +export const openWindowCommand = (accessor: ServicesAccessor, input: Array | { urisToOpen: IURIToOpen[], forceNewWindow: boolean, forceReuseWindow?: boolean, diffMode?: boolean, addMode?: boolean }, forceNewWindow: boolean) => { const windowService = accessor.get(IWindowService); + if (Array.isArray(input)) { - windowService.openWindow(input.map(p => typeof p === 'string' ? URI.file(p) : p), { forceNewWindow }); + windowService.openWindow(input.map(p => ({ uri: typeof p === 'string' ? URI.file(p) : p }), { forceNewWindow })); } else if (input) { - if (Array.isArray(input.folderURIs) && input.folderURIs.length) { - windowService.openWindow(input.folderURIs, { forceNewWindow: input.forceNewWindow, diffMode: input.diffMode, addMode: input.addMode, forceReuseWindow: input.forceReuseWindow }); - } - if (Array.isArray(input.fileURIs) && input.fileURIs.length) { - windowService.openWindow(input.fileURIs, { forceNewWindow: input.forceNewWindow, forceOpenWorkspaceAsFile: true, diffMode: input.diffMode, addMode: input.addMode, forceReuseWindow: input.forceReuseWindow }); - } + windowService.openWindow(input.urisToOpen, { forceNewWindow: input.forceNewWindow, diffMode: input.diffMode, addMode: input.addMode, forceReuseWindow: input.forceReuseWindow }); } }; diff --git a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts b/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts similarity index 95% rename from src/vs/workbench/parts/files/electron-browser/files.contribution.ts rename to src/vs/workbench/contrib/files/electron-browser/files.contribution.ts index a0bfe75ae60..be0be8bf599 100644 --- a/src/vs/workbench/parts/files/electron-browser/files.contribution.ts +++ b/src/vs/workbench/contrib/files/electron-browser/files.contribution.ts @@ -13,30 +13,30 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IEditorInputFactory, EditorInput, IFileEditorInput, IEditorInputFactoryRegistry, Extensions as EditorInputExtensions } from 'vs/workbench/common/editor'; import { AutoSaveConfiguration, HotExitConfiguration, SUPPORTED_ENCODINGS } from 'vs/platform/files/common/files'; -import { VIEWLET_ID, SortOrderConfiguration, FILE_EDITOR_INPUT_ID, IExplorerService } from 'vs/workbench/parts/files/common/files'; -import { FileEditorTracker } from 'vs/workbench/parts/files/browser/editors/fileEditorTracker'; -import { SaveErrorHandler } from 'vs/workbench/parts/files/electron-browser/saveErrorHandler'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; -import { TextFileEditor } from 'vs/workbench/parts/files/browser/editors/textFileEditor'; -import { BinaryFileEditor } from 'vs/workbench/parts/files/browser/editors/binaryFileEditor'; +import { VIEWLET_ID, SortOrderConfiguration, FILE_EDITOR_INPUT_ID, IExplorerService } from 'vs/workbench/contrib/files/common/files'; +import { FileEditorTracker } from 'vs/workbench/contrib/files/browser/editors/fileEditorTracker'; +import { SaveErrorHandler } from 'vs/workbench/contrib/files/electron-browser/saveErrorHandler'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; +import { TextFileEditor } from 'vs/workbench/contrib/files/browser/editors/textFileEditor'; +import { BinaryFileEditor } from 'vs/workbench/contrib/files/browser/editors/binaryFileEditor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import * as platform from 'vs/base/common/platform'; -import { DirtyFilesTracker } from 'vs/workbench/parts/files/common/dirtyFilesTracker'; -import { ExplorerViewlet, ExplorerViewletViewsContribution } from 'vs/workbench/parts/files/electron-browser/explorerViewlet'; +import { DirtyFilesTracker } from 'vs/workbench/contrib/files/common/dirtyFilesTracker'; +import { ExplorerViewlet, ExplorerViewletViewsContribution } from 'vs/workbench/contrib/files/electron-browser/explorerViewlet'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; import { DataUriEditorInput } from 'vs/workbench/common/editor/dataUriEditorInput'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ILabelService } from 'vs/platform/label/common/label'; import { nativeSep } from 'vs/base/common/paths'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { ExplorerService } from 'vs/workbench/parts/files/electron-browser/explorerService'; +import { ExplorerService } from 'vs/workbench/contrib/files/electron-browser/explorerService'; // Viewlet Action export class OpenExplorerViewletAction extends ShowViewletAction { diff --git a/src/vs/workbench/parts/files/electron-browser/media/AddFile.svg b/src/vs/workbench/contrib/files/electron-browser/media/AddFile.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/AddFile.svg rename to src/vs/workbench/contrib/files/electron-browser/media/AddFile.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/AddFile_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/AddFile_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/AddFile_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/AddFile_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/AddFolder.svg b/src/vs/workbench/contrib/files/electron-browser/media/AddFolder.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/AddFolder.svg rename to src/vs/workbench/contrib/files/electron-browser/media/AddFolder.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/AddFolder_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/AddFolder_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/AddFolder_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/AddFolder_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/CollapseAll.svg b/src/vs/workbench/contrib/files/electron-browser/media/CollapseAll.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/CollapseAll.svg rename to src/vs/workbench/contrib/files/electron-browser/media/CollapseAll.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/CollapseAll_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/CollapseAll_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/CollapseAll_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/CollapseAll_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/Preview.svg b/src/vs/workbench/contrib/files/electron-browser/media/Preview.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/Preview.svg rename to src/vs/workbench/contrib/files/electron-browser/media/Preview.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/Preview_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/Preview_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/Preview_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/Preview_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/Refresh.svg b/src/vs/workbench/contrib/files/electron-browser/media/Refresh.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/Refresh.svg rename to src/vs/workbench/contrib/files/electron-browser/media/Refresh.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/Refresh_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/Refresh_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/Refresh_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/Refresh_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close-dark.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close-dark.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close-dark.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close-dark.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-dark.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty-dark.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-dark.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty-dark.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-focus.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty-focus.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close-dirty-focus.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty-focus.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close-dirty.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close-dirty.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close-dirty.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close-focus.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close-focus.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close-focus.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close-focus.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/action-close.svg b/src/vs/workbench/contrib/files/electron-browser/media/action-close.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/action-close.svg rename to src/vs/workbench/contrib/files/electron-browser/media/action-close.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/check-inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/check-inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/check-inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/check-inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/check.svg b/src/vs/workbench/contrib/files/electron-browser/media/check.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/check.svg rename to src/vs/workbench/contrib/files/electron-browser/media/check.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/closeall.svg b/src/vs/workbench/contrib/files/electron-browser/media/closeall.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/closeall.svg rename to src/vs/workbench/contrib/files/electron-browser/media/closeall.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/closeall_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/closeall_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/closeall_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/closeall_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css b/src/vs/workbench/contrib/files/electron-browser/media/explorerviewlet.css similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/explorerviewlet.css rename to src/vs/workbench/contrib/files/electron-browser/media/explorerviewlet.css diff --git a/src/vs/workbench/parts/files/electron-browser/media/fileactions.css b/src/vs/workbench/contrib/files/electron-browser/media/fileactions.css similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/fileactions.css rename to src/vs/workbench/contrib/files/electron-browser/media/fileactions.css diff --git a/src/vs/workbench/parts/files/electron-browser/media/files-dark.svg b/src/vs/workbench/contrib/files/electron-browser/media/files-dark.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/files-dark.svg rename to src/vs/workbench/contrib/files/electron-browser/media/files-dark.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/saveall.svg b/src/vs/workbench/contrib/files/electron-browser/media/saveall.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/saveall.svg rename to src/vs/workbench/contrib/files/electron-browser/media/saveall.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/saveall_inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/saveall_inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/saveall_inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/saveall_inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal-inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/split-editor-horizontal-inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal-inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/split-editor-horizontal-inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal.svg b/src/vs/workbench/contrib/files/electron-browser/media/split-editor-horizontal.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/split-editor-horizontal.svg rename to src/vs/workbench/contrib/files/electron-browser/media/split-editor-horizontal.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical-inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/split-editor-vertical-inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical-inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/split-editor-vertical-inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical.svg b/src/vs/workbench/contrib/files/electron-browser/media/split-editor-vertical.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/split-editor-vertical.svg rename to src/vs/workbench/contrib/files/electron-browser/media/split-editor-vertical.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/undo-inverse.svg b/src/vs/workbench/contrib/files/electron-browser/media/undo-inverse.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/undo-inverse.svg rename to src/vs/workbench/contrib/files/electron-browser/media/undo-inverse.svg diff --git a/src/vs/workbench/parts/files/electron-browser/media/undo.svg b/src/vs/workbench/contrib/files/electron-browser/media/undo.svg similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/media/undo.svg rename to src/vs/workbench/contrib/files/electron-browser/media/undo.svg diff --git a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts b/src/vs/workbench/contrib/files/electron-browser/saveErrorHandler.ts similarity index 98% rename from src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts rename to src/vs/workbench/contrib/files/electron-browser/saveErrorHandler.ts index 896fe0e9717..c6ebe282cac 100644 --- a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts +++ b/src/vs/workbench/contrib/files/electron-browser/saveErrorHandler.ts @@ -19,10 +19,10 @@ import { ResourceMap } from 'vs/base/common/map'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey'; -import { FileOnDiskContentProvider } from 'vs/workbench/parts/files/common/files'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileOnDiskContentProvider } from 'vs/workbench/contrib/files/common/files'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { SAVE_FILE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL } from 'vs/workbench/parts/files/electron-browser/fileCommands'; +import { SAVE_FILE_COMMAND_ID, REVERT_FILE_COMMAND_ID, SAVE_FILE_AS_COMMAND_ID, SAVE_FILE_AS_LABEL } from 'vs/workbench/contrib/files/electron-browser/fileCommands'; import { createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { INotificationService, INotificationHandle, INotificationActions, Severity } from 'vs/platform/notification/common/notification'; import { IOpenerService } from 'vs/platform/opener/common/opener'; diff --git a/src/vs/workbench/parts/files/electron-browser/views/emptyView.ts b/src/vs/workbench/contrib/files/electron-browser/views/emptyView.ts similarity index 100% rename from src/vs/workbench/parts/files/electron-browser/views/emptyView.ts rename to src/vs/workbench/contrib/files/electron-browser/views/emptyView.ts diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts b/src/vs/workbench/contrib/files/electron-browser/views/explorerDecorationsProvider.ts similarity index 96% rename from src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts rename to src/vs/workbench/contrib/files/electron-browser/views/explorerDecorationsProvider.ts index 46cc8f53195..f6c4e49f923 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts +++ b/src/vs/workbench/contrib/files/electron-browser/views/explorerDecorationsProvider.ts @@ -11,7 +11,7 @@ import { IDecorationsProvider, IDecorationData } from 'vs/workbench/services/dec import { listInvalidItemForeground } from 'vs/platform/theme/common/colorRegistry'; import { IDisposable } from 'vscode-xterm'; import { dispose } from 'vs/base/common/lifecycle'; -import { IExplorerService } from 'vs/workbench/parts/files/common/files'; +import { IExplorerService } from 'vs/workbench/contrib/files/common/files'; export class ExplorerDecorationsProvider implements IDecorationsProvider { readonly label: string = localize('label', "Explorer"); diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts b/src/vs/workbench/contrib/files/electron-browser/views/explorerView.ts similarity index 97% rename from src/vs/workbench/parts/files/electron-browser/views/explorerView.ts rename to src/vs/workbench/contrib/files/electron-browser/views/explorerView.ts index f42a9d00cce..04251ca5fb9 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerView.ts +++ b/src/vs/workbench/contrib/files/electron-browser/views/explorerView.ts @@ -9,14 +9,14 @@ import * as perf from 'vs/base/common/performance'; import { sequence } from 'vs/base/common/async'; import { Action, IAction } from 'vs/base/common/actions'; import { memoize } from 'vs/base/common/decorators'; -import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, IExplorerService, ExplorerResourceCut } from 'vs/workbench/parts/files/common/files'; -import { NewFolderAction, NewFileAction, FileCopiedContext, RefreshExplorerView } from 'vs/workbench/parts/files/electron-browser/fileActions'; +import { IFilesConfiguration, ExplorerFolderContext, FilesExplorerFocusedContext, ExplorerFocusedContext, ExplorerRootContext, ExplorerResourceReadonlyContext, IExplorerService, ExplorerResourceCut } from 'vs/workbench/contrib/files/common/files'; +import { NewFolderAction, NewFileAction, FileCopiedContext, RefreshExplorerView } from 'vs/workbench/contrib/files/electron-browser/fileActions'; import { toResource } from 'vs/workbench/common/editor'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import * as DOM from 'vs/base/browser/dom'; import { CollapseAction2 } from 'vs/workbench/browser/viewlet'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ExplorerDecorationsProvider } from 'vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider'; +import { ExplorerDecorationsProvider } from 'vs/workbench/contrib/files/electron-browser/views/explorerDecorationsProvider'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -31,14 +31,14 @@ import { DelayedDragHandler } from 'vs/base/browser/dnd'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IViewletPanelOptions, ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { ILabelService } from 'vs/platform/label/common/label'; -import { ExplorerDelegate, ExplorerAccessibilityProvider, ExplorerDataSource, FilesRenderer, FilesFilter, FileSorter, FileDragAndDrop } from 'vs/workbench/parts/files/electron-browser/views/explorerViewer'; +import { ExplorerDelegate, ExplorerAccessibilityProvider, ExplorerDataSource, FilesRenderer, FilesFilter, FileSorter, FileDragAndDrop } from 'vs/workbench/contrib/files/electron-browser/views/explorerViewer'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/workbenchThemeService'; import { ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { onUnexpectedError } from 'vs/base/common/errors'; import { ResourceLabels, IResourceLabelsContainer } from 'vs/workbench/browser/labels'; import { createFileIconThemableTreeContainerScope } from 'vs/workbench/browser/parts/views/views'; @@ -342,12 +342,13 @@ export class ExplorerView extends ViewletPanel { if (e.browserEvent instanceof MouseEvent) { isDoubleClick = e.browserEvent.detail === 2; + isMiddleClick = e.browserEvent.button === 1; + const isLeftButton = e.browserEvent.button === 0; - if (!this.tree.openOnSingleClick && !isDoubleClick) { + if (isLeftButton && !this.tree.openOnSingleClick && !isDoubleClick) { return; } - isMiddleClick = e.browserEvent.button === 1; sideBySide = this.tree.useAltAsMultipleSelectionModifier ? (e.browserEvent.ctrlKey || e.browserEvent.metaKey) : e.browserEvent.altKey; } diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts b/src/vs/workbench/contrib/files/electron-browser/views/explorerViewer.ts similarity index 98% rename from src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts rename to src/vs/workbench/contrib/files/electron-browser/views/explorerViewer.ts index e66f74f034a..cc9213badac 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerViewer.ts +++ b/src/vs/workbench/contrib/files/electron-browser/views/explorerViewer.ts @@ -19,7 +19,7 @@ import { ITreeRenderer, ITreeNode, ITreeFilter, TreeVisibility, TreeFilterResult import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { IFilesConfiguration, IExplorerService, IEditableData } from 'vs/workbench/parts/files/common/files'; +import { IFilesConfiguration, IExplorerService, IEditableData } from 'vs/workbench/contrib/files/common/files'; import { dirname, joinPath, isEqualOrParent, basename, hasToIgnoreCase, distinctParents } from 'vs/base/common/resources'; import { InputBox, MessageType } from 'vs/base/browser/ui/inputbox/inputBox'; import { localize } from 'vs/nls'; @@ -29,7 +29,7 @@ import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { normalize } from 'vs/base/common/paths'; import { equals, deepClone } from 'vs/base/common/objects'; import * as path from 'path'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; import { compareFileExtensions, compareFileNames } from 'vs/base/common/comparers'; import { fillResourceDataTransfers, CodeDataTransfers, extractResources } from 'vs/workbench/browser/dnd'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -45,7 +45,7 @@ import { URI } from 'vs/base/common/uri'; import { ITask, sequence } from 'vs/base/common/async'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWorkspaceFolderCreationData } from 'vs/platform/workspaces/common/workspaces'; -import { findValidPasteFileTarget } from 'vs/workbench/parts/files/electron-browser/fileActions'; +import { findValidPasteFileTarget } from 'vs/workbench/contrib/files/electron-browser/fileActions'; import { FuzzyScore, createMatches } from 'vs/base/common/filters'; export class ExplorerDelegate implements IListVirtualDelegate { @@ -533,7 +533,11 @@ export class FileDragAndDrop implements ITreeDragAndDrop { return false; } - getDragURI(element: ExplorerItem): string { + getDragURI(element: ExplorerItem): string | null { + if (this.explorerService.isEditable(element)) { + return null; + } + return element.resource.toString(); } diff --git a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts b/src/vs/workbench/contrib/files/electron-browser/views/openEditorsView.ts similarity index 96% rename from src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts rename to src/vs/workbench/contrib/files/electron-browser/views/openEditorsView.ts index 398894eee0a..3e610aba897 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts +++ b/src/vs/workbench/contrib/files/electron-browser/views/openEditorsView.ts @@ -9,12 +9,12 @@ import { IAction, ActionRunner } from 'vs/base/common/actions'; import * as dom from 'vs/base/browser/dom'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorGroupsService, IEditorGroup, GroupChangeKind, GroupsOrder } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupChangeKind, GroupsOrder } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IEditorInput } from 'vs/workbench/common/editor'; -import { SaveAllAction, SaveAllInGroupAction, CloseGroupAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; -import { OpenEditorsFocusedContext, ExplorerFocusedContext, IFilesConfiguration, OpenEditor } from 'vs/workbench/parts/files/common/files'; +import { SaveAllAction, SaveAllInGroupAction, CloseGroupAction } from 'vs/workbench/contrib/files/electron-browser/fileActions'; +import { OpenEditorsFocusedContext, ExplorerFocusedContext, IFilesConfiguration, OpenEditor } from 'vs/workbench/contrib/files/common/files'; import { ITextFileService, AutoSaveMode } from 'vs/workbench/services/textfile/common/textfiles'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { CloseAllEditorsAction, CloseEditorAction } from 'vs/workbench/browser/parts/editor/editorActions'; @@ -32,14 +32,14 @@ import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/ import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { fillInContextMenuActions } from 'vs/platform/actions/browser/menuItemActionItem'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; -import { DirtyEditorContext, OpenEditorsGroupContext } from 'vs/workbench/parts/files/electron-browser/fileCommands'; +import { DirtyEditorContext, OpenEditorsGroupContext } from 'vs/workbench/contrib/files/electron-browser/fileCommands'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { ResourcesDropHandler, fillResourceDataTransfers } from 'vs/workbench/browser/dnd'; +import { ResourcesDropHandler, fillResourceDataTransfers, CodeDataTransfers } from 'vs/workbench/browser/dnd'; import { ViewletPanel, IViewletPanelOptions } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { IDragAndDropData } from 'vs/base/browser/dnd'; +import { IDragAndDropData, DataTransfers } from 'vs/base/browser/dnd'; import { memoize } from 'vs/base/common/decorators'; -import { DesktopDragAndDropData, ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; +import { ElementsDragAndDropData, DesktopDragAndDropData } from 'vs/base/browser/ui/list/listView'; import { URI } from 'vs/base/common/uri'; const $ = dom.$; @@ -645,6 +645,18 @@ class OpenEditorsDragAndDrop implements IListDragAndDrop group, () => group.focus(), index); - } else { - const elementsData = (data as ElementsDragAndDropData).elements; + if (data instanceof ElementsDragAndDropData) { + const elementsData = data.elements; elementsData.forEach((oe, offset) => { oe.group.moveEditor(oe.editor, group, { index: index + offset, preserveFocus: true }); }); this.editorGroupService.activateGroup(group); + } else { + this.dropHandler.handleDrop(originalEvent, () => group, () => group.focus(), index); } - } } diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts similarity index 98% rename from src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts rename to src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts index 2e5676deab9..45881b72ff9 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorInput.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorInput.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/paths'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { workbenchInstantiationService, TestTextFileService } from 'vs/workbench/test/workbenchTestServices'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; diff --git a/src/vs/workbench/parts/files/test/browser/fileEditorTracker.test.ts b/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts similarity index 93% rename from src/vs/workbench/parts/files/test/browser/fileEditorTracker.test.ts rename to src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts index 9bbe10b1640..d43e6793f1c 100644 --- a/src/vs/workbench/parts/files/test/browser/fileEditorTracker.test.ts +++ b/src/vs/workbench/contrib/files/test/browser/fileEditorTracker.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { FileEditorTracker } from 'vs/workbench/parts/files/browser/editors/fileEditorTracker'; +import { FileEditorTracker } from 'vs/workbench/contrib/files/browser/editors/fileEditorTracker'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/paths'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; @@ -13,7 +13,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { FileChangesEvent, FileChangeType, IFileService, snapshotToString } from 'vs/platform/files/common/files'; import { TextFileEditorModel } from 'vs/workbench/services/textfile/common/textFileEditorModel'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { timeout } from 'vs/base/common/async'; function toResource(self: any, path: string) { diff --git a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts b/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts similarity index 98% rename from src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts rename to src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts index c7dc1ab2380..255aa26b5c3 100644 --- a/src/vs/workbench/parts/files/test/electron-browser/explorerModel.test.ts +++ b/src/vs/workbench/contrib/files/test/electron-browser/explorerModel.test.ts @@ -7,8 +7,8 @@ import * as assert from 'assert'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { URI } from 'vs/base/common/uri'; import { join } from 'vs/base/common/paths'; -import { validateFileName } from 'vs/workbench/parts/files/electron-browser/fileActions'; -import { ExplorerItem } from 'vs/workbench/parts/files/common/explorerModel'; +import { validateFileName } from 'vs/workbench/contrib/files/electron-browser/fileActions'; +import { ExplorerItem } from 'vs/workbench/contrib/files/common/explorerModel'; function createStat(path: string, name: string, isFolder: boolean, hasChildren: boolean, size: number, mtime: number): ExplorerItem { return new ExplorerItem(toResource(path), null, isFolder, false, false, name, mtime); diff --git a/src/vs/workbench/parts/files/test/electron-browser/fileActions.test.ts b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts similarity index 98% rename from src/vs/workbench/parts/files/test/electron-browser/fileActions.test.ts rename to src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts index 9e81712e79c..c0235370147 100644 --- a/src/vs/workbench/parts/files/test/electron-browser/fileActions.test.ts +++ b/src/vs/workbench/contrib/files/test/electron-browser/fileActions.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { incrementFileName } from 'vs/workbench/parts/files/electron-browser/fileActions'; +import { incrementFileName } from 'vs/workbench/contrib/files/electron-browser/fileActions'; suite('Files - Increment file name', () => { diff --git a/src/vs/workbench/parts/html/common/htmlInput.ts b/src/vs/workbench/contrib/html/common/htmlInput.ts similarity index 100% rename from src/vs/workbench/parts/html/common/htmlInput.ts rename to src/vs/workbench/contrib/html/common/htmlInput.ts diff --git a/src/vs/workbench/parts/html/electron-browser/html.contribution.ts b/src/vs/workbench/contrib/html/electron-browser/html.contribution.ts similarity index 74% rename from src/vs/workbench/parts/html/electron-browser/html.contribution.ts rename to src/vs/workbench/contrib/html/electron-browser/html.contribution.ts index 73eea401555..693109a0624 100644 --- a/src/vs/workbench/parts/html/electron-browser/html.contribution.ts +++ b/src/vs/workbench/contrib/html/electron-browser/html.contribution.ts @@ -13,18 +13,10 @@ import { HtmlInput, HtmlInputOptions } from '../common/htmlInput'; import { HtmlPreviewPart } from './htmlPreviewPart'; import { Registry } from 'vs/platform/registry/common/platform'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; -import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; +import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { IEditorRegistry, EditorDescriptor, Extensions as EditorExtensions } from 'vs/workbench/browser/editor'; -import { registerWebViewCommands } from 'vs/workbench/parts/webview/electron-browser/webview.contribution'; - -function getActivePreviewsForResource(accessor: ServicesAccessor, resource: URI | string) { - const uri = resource instanceof URI ? resource : URI.parse(resource); - return accessor.get(IEditorService).visibleControls - .filter(c => c instanceof HtmlPreviewPart && c.model) - .map(e => e as HtmlPreviewPart) - .filter(e => e.model.uri.scheme === uri.scheme && e.model.uri.toString() === uri.toString()); -} +import { registerWebViewCommands } from 'vs/workbench/contrib/webview/electron-browser/webview.contribution'; // --- Register Editor @@ -45,7 +37,7 @@ CommandsRegistry.registerCommand('_workbench.previewHtml', function ( const uri = resource instanceof URI ? resource : URI.parse(resource); label = label || uri.fsPath; - let input: HtmlInput; + let input: HtmlInput | undefined; const editorGroupService = accessor.get(IEditorGroupsService); @@ -86,16 +78,4 @@ CommandsRegistry.registerCommand('_workbench.previewHtml', function ( .then(editor => true); }); -CommandsRegistry.registerCommand('_workbench.htmlPreview.postMessage', function ( - accessor: ServicesAccessor, - resource: URI | string, - message: any -) { - const activePreviews = getActivePreviewsForResource(accessor, resource); - for (const preview of activePreviews) { - preview.sendMessage(message); - } - return activePreviews.length > 0; -}); - registerWebViewCommands(HtmlPreviewPart.ID); \ No newline at end of file diff --git a/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.ts b/src/vs/workbench/contrib/html/electron-browser/htmlPreviewPart.ts similarity index 90% rename from src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.ts rename to src/vs/workbench/contrib/html/electron-browser/htmlPreviewPart.ts index 1c33d07ae78..fc54e558fff 100644 --- a/src/vs/workbench/parts/html/electron-browser/htmlPreviewPart.ts +++ b/src/vs/workbench/contrib/html/electron-browser/htmlPreviewPart.ts @@ -4,12 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { ITextModel } from 'vs/editor/common/model'; import { Disposable, IDisposable, dispose, IReference } from 'vs/base/common/lifecycle'; import { EditorOptions, EditorInput, IEditorMemento } from 'vs/workbench/common/editor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { BaseTextEditorModel } from 'vs/workbench/common/editor/textEditorModel'; -import { HtmlInput, HtmlInputOptions, areHtmlInputOptionsEqual } from 'vs/workbench/parts/html/common/htmlInput'; +import { HtmlInput, HtmlInputOptions, areHtmlInputOptionsEqual } from 'vs/workbench/contrib/html/common/htmlInput'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { ITextModelService, ITextEditorModel } from 'vs/editor/common/services/resolverService'; @@ -17,10 +16,10 @@ import { Parts, IPartService } from 'vs/workbench/services/part/common/partServi import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { Dimension } from 'vs/base/browser/dom'; -import { BaseWebviewEditor } from 'vs/workbench/parts/webview/electron-browser/baseWebviewEditor'; -import { WebviewElement, WebviewOptions } from 'vs/workbench/parts/webview/electron-browser/webviewElement'; +import { BaseWebviewEditor } from 'vs/workbench/contrib/webview/electron-browser/baseWebviewEditor'; +import { WebviewElement, WebviewOptions } from 'vs/workbench/contrib/webview/electron-browser/webviewElement'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { Event, Emitter } from 'vs/base/common/event'; @@ -38,8 +37,8 @@ export class HtmlPreviewPart extends BaseWebviewEditor { private _webviewDisposables: IDisposable[]; - private _modelRef: IReference; - public get model(): ITextModel { return this._modelRef && this._modelRef.object.textEditorModel; } + private _modelRef?: IReference; + public get model() { return this._modelRef ? this._modelRef.object.textEditorModel : undefined; } private _modelChangeSubscription = Disposable.None; private _themeChangeSubscription = Disposable.None; @@ -138,14 +137,14 @@ export class HtmlPreviewPart extends BaseWebviewEditor { this._themeChangeSubscription = this.themeService.onThemeChange(this.onThemeChange.bind(this)); if (this._hasValidModel()) { - this._modelChangeSubscription = this.model.onDidChangeContent(() => this.webview.contents = this.model.getLinesContent().join('\n')); - this.webview.contents = this.model.getLinesContent().join('\n'); + this._modelChangeSubscription = this.model!.onDidChangeContent(() => this.webview.contents = this.model!.getLinesContent().join('\n')); + this.webview.contents = this.model!.getLinesContent().join('\n'); } } } private _hasValidModel(): boolean { - return this._modelRef && this.model && !this.model.isDisposed(); + return !!(this._modelRef && this.model && !this.model.isDisposed()); } public layout(dimension: Dimension): void { @@ -248,10 +247,10 @@ export class HtmlPreviewPart extends BaseWebviewEditor { } private saveHTMLPreviewViewState(input: HtmlInput, editorViewState: HtmlPreviewEditorViewState): void { - this.editorMemento.saveEditorState(this.group, input, editorViewState); + this.editorMemento.saveEditorState(this.group!, input, editorViewState); } - private loadHTMLPreviewViewState(input: HtmlInput): HtmlPreviewEditorViewState { - return this.editorMemento.loadEditorState(this.group, input); + private loadHTMLPreviewViewState(input: HtmlInput): HtmlPreviewEditorViewState | undefined { + return this.editorMemento.loadEditorState(this.group!, input); } } diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/contrib/localizations/electron-browser/localizations.contribution.ts similarity index 98% rename from src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts rename to src/vs/workbench/contrib/localizations/electron-browser/localizations.contribution.ts index f1d45ce3caa..5f18522d574 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/contrib/localizations/electron-browser/localizations.contribution.ts @@ -10,7 +10,7 @@ import { IJSONContributionRegistry, Extensions as JSONExtensions } from 'vs/plat import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { Disposable } from 'vs/base/common/lifecycle'; -import { ConfigureLocaleAction } from 'vs/workbench/parts/localizations/electron-browser/localizationsActions'; +import { ConfigureLocaleAction } from 'vs/workbench/contrib/localizations/electron-browser/localizationsActions'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; @@ -25,7 +25,7 @@ import { join } from 'vs/base/common/paths'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { VIEWLET_ID as EXTENSIONS_VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/parts/extensions/common/extensions'; +import { VIEWLET_ID as EXTENSIONS_VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/contrib/extensions/common/extensions'; import { minimumTranslatedStrings } from 'vs/platform/node/minimalTranslations'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizationsActions.ts b/src/vs/workbench/contrib/localizations/electron-browser/localizationsActions.ts similarity index 100% rename from src/vs/workbench/parts/localizations/electron-browser/localizationsActions.ts rename to src/vs/workbench/contrib/localizations/electron-browser/localizationsActions.ts diff --git a/src/vs/workbench/parts/logs/common/logConstants.ts b/src/vs/workbench/contrib/logs/common/logConstants.ts similarity index 100% rename from src/vs/workbench/parts/logs/common/logConstants.ts rename to src/vs/workbench/contrib/logs/common/logConstants.ts diff --git a/src/vs/workbench/parts/logs/electron-browser/logs.contribution.ts b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts similarity index 95% rename from src/vs/workbench/parts/logs/electron-browser/logs.contribution.ts rename to src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts index 4015c9cd5de..c68dc48444b 100644 --- a/src/vs/workbench/parts/logs/electron-browser/logs.contribution.ts +++ b/src/vs/workbench/contrib/logs/electron-browser/logs.contribution.ts @@ -7,16 +7,16 @@ import * as nls from 'vs/nls'; import { join } from 'vs/base/common/paths'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/parts/output/common/output'; +import { IOutputChannelRegistry, Extensions as OutputExt, } from 'vs/workbench/contrib/output/common/output'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { Disposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; -import * as Constants from 'vs/workbench/parts/logs/common/logConstants'; +import * as Constants from 'vs/workbench/contrib/logs/common/logConstants'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { OpenLogsFolderAction, SetLogLevelAction } from 'vs/workbench/parts/logs/electron-browser/logsActions'; +import { OpenLogsFolderAction, SetLogLevelAction } from 'vs/workbench/contrib/logs/electron-browser/logsActions'; import { ILogService, LogLevel } from 'vs/platform/log/common/log'; class LogOutputChannels extends Disposable implements IWorkbenchContribution { diff --git a/src/vs/workbench/parts/logs/electron-browser/logsActions.ts b/src/vs/workbench/contrib/logs/electron-browser/logsActions.ts similarity index 100% rename from src/vs/workbench/parts/logs/electron-browser/logsActions.ts rename to src/vs/workbench/contrib/logs/electron-browser/logsActions.ts diff --git a/src/vs/workbench/parts/markers/electron-browser/constants.ts b/src/vs/workbench/contrib/markers/electron-browser/constants.ts similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/constants.ts rename to src/vs/workbench/contrib/markers/electron-browser/constants.ts diff --git a/src/vs/workbench/parts/markers/electron-browser/markers.contribution.ts b/src/vs/workbench/contrib/markers/electron-browser/markers.contribution.ts similarity index 95% rename from src/vs/workbench/parts/markers/electron-browser/markers.contribution.ts rename to src/vs/workbench/contrib/markers/electron-browser/markers.contribution.ts index 765a7908f83..3b0941c9085 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markers.contribution.ts +++ b/src/vs/workbench/contrib/markers/electron-browser/markers.contribution.ts @@ -12,16 +12,16 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor import { KeybindingsRegistry, KeybindingWeight, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { localize } from 'vs/nls'; -import { Marker, RelatedInformation } from 'vs/workbench/parts/markers/electron-browser/markersModel'; -import { MarkersPanel } from 'vs/workbench/parts/markers/electron-browser/markersPanel'; +import { Marker, RelatedInformation } from 'vs/workbench/contrib/markers/electron-browser/markersModel'; +import { MarkersPanel } from 'vs/workbench/contrib/markers/electron-browser/markersPanel'; import { MenuId, MenuRegistry, SyncActionDescriptor } from 'vs/platform/actions/common/actions'; import { PanelRegistry, Extensions as PanelExtensions, PanelDescriptor } from 'vs/workbench/browser/panel'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ToggleMarkersPanelAction, ShowProblemsPanelAction } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; -import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; -import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; +import { ToggleMarkersPanelAction, ShowProblemsPanelAction } from 'vs/workbench/contrib/markers/electron-browser/markersPanelActions'; +import Constants from 'vs/workbench/contrib/markers/electron-browser/constants'; +import Messages from 'vs/workbench/contrib/markers/electron-browser/messages'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { IMarkersWorkbenchService, MarkersWorkbenchService, ActivityUpdater } from 'vs/workbench/parts/markers/electron-browser/markers'; +import { IMarkersWorkbenchService, MarkersWorkbenchService, ActivityUpdater } from 'vs/workbench/contrib/markers/electron-browser/markers'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; diff --git a/src/vs/workbench/contrib/markers/electron-browser/markers.ts b/src/vs/workbench/contrib/markers/electron-browser/markers.ts new file mode 100644 index 00000000000..706cd7ba117 --- /dev/null +++ b/src/vs/workbench/contrib/markers/electron-browser/markers.ts @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { MarkersModel, compareMarkersByUri } from './markersModel'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IMarkerService, MarkerSeverity, IMarker } from 'vs/platform/markers/common/markers'; +import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; +import { localize } from 'vs/nls'; +import Constants from './constants'; +import { URI } from 'vs/base/common/uri'; +import { groupBy } from 'vs/base/common/arrays'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; + +export const IMarkersWorkbenchService = createDecorator('markersWorkbenchService'); + +export interface IFilter { + filterText: string; + useFilesExclude: boolean; +} + +export interface IMarkersWorkbenchService { + _serviceBrand: any; + readonly markersModel: MarkersModel; +} + +export class MarkersWorkbenchService extends Disposable implements IMarkersWorkbenchService { + _serviceBrand: any; + + readonly markersModel: MarkersModel; + + constructor( + @IMarkerService private readonly markerService: IMarkerService, + @IInstantiationService instantiationService: IInstantiationService, + ) { + super(); + this.markersModel = this._register(instantiationService.createInstance(MarkersModel, this.readMarkers())); + + for (const group of groupBy(this.readMarkers(), compareMarkersByUri)) { + this.markersModel.setResourceMarkers(group[0].resource, group); + } + + this._register(markerService.onMarkerChanged(resources => this.onMarkerChanged(resources))); + } + + private onMarkerChanged(resources: URI[]): void { + for (const resource of resources) { + this.markersModel.setResourceMarkers(resource, this.readMarkers(resource)); + } + } + + private readMarkers(resource?: URI): IMarker[] { + return this.markerService.read({ resource, severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info }); + } + +} + +export class ActivityUpdater extends Disposable implements IWorkbenchContribution { + + constructor( + @IActivityService private readonly activityService: IActivityService, + @IMarkersWorkbenchService private readonly markersWorkbenchService: IMarkersWorkbenchService + ) { + super(); + this._register(this.markersWorkbenchService.markersModel.onDidChange(() => this.updateBadge())); + this.updateBadge(); + } + + private updateBadge(): void { + const total = this.markersWorkbenchService.markersModel.resourceMarkers.reduce((r, rm) => r + rm.markers.length, 0); + const message = localize('totalProblems', 'Total {0} Problems', total); + this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(total, () => message)); + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts b/src/vs/workbench/contrib/markers/electron-browser/markersFileDecorations.ts similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/markersFileDecorations.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersFileDecorations.ts diff --git a/src/vs/workbench/parts/markers/electron-browser/markersFilterOptions.ts b/src/vs/workbench/contrib/markers/electron-browser/markersFilterOptions.ts similarity index 97% rename from src/vs/workbench/parts/markers/electron-browser/markersFilterOptions.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersFilterOptions.ts index aa198c662d9..d60a281553c 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersFilterOptions.ts +++ b/src/vs/workbench/contrib/markers/electron-browser/markersFilterOptions.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; +import Messages from 'vs/workbench/contrib/markers/electron-browser/messages'; import { IFilter, matchesPrefix, matchesFuzzy, matchesFuzzy2 } from 'vs/base/common/filters'; import { ParsedExpression, IExpression, splitGlobAware, getEmptyExpression, parse } from 'vs/base/common/glob'; import * as strings from 'vs/base/common/strings'; diff --git a/src/vs/workbench/parts/markers/electron-browser/markersModel.ts b/src/vs/workbench/contrib/markers/electron-browser/markersModel.ts similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/markersModel.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersModel.ts diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts b/src/vs/workbench/contrib/markers/electron-browser/markersPanel.ts similarity index 93% rename from src/vs/workbench/parts/markers/electron-browser/markersPanel.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersPanel.ts index c86ac4dca7c..ff973cff879 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanel.ts +++ b/src/vs/workbench/contrib/markers/electron-browser/markersPanel.ts @@ -11,16 +11,16 @@ import { IAction, IActionItem, Action } from 'vs/base/common/actions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { Panel } from 'vs/workbench/browser/panel'; import { IEditorService, SIDE_GROUP, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; -import { Marker, ResourceMarkers, RelatedInformation, MarkersModel } from 'vs/workbench/parts/markers/electron-browser/markersModel'; +import Constants from 'vs/workbench/contrib/markers/electron-browser/constants'; +import { Marker, ResourceMarkers, RelatedInformation, MarkersModel } from 'vs/workbench/contrib/markers/electron-browser/markersModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { MarkersFilterActionItem, MarkersFilterAction, IMarkersFilterActionChangeEvent, IMarkerFilterController } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; +import { MarkersFilterActionItem, MarkersFilterAction, IMarkersFilterActionChangeEvent, IMarkerFilterController } from 'vs/workbench/contrib/markers/electron-browser/markersPanelActions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; +import Messages from 'vs/workbench/contrib/markers/electron-browser/messages'; import { RangeHighlightDecorations } from 'vs/workbench/browser/parts/editor/rangeDecorations'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-browser/markers'; +import { IMarkersWorkbenchService } from 'vs/workbench/contrib/markers/electron-browser/markers'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; @@ -28,12 +28,12 @@ import { Iterator } from 'vs/base/common/iterator'; import { ITreeElement, ITreeNode, ITreeContextMenuEvent } from 'vs/base/browser/ui/tree/tree'; import { Relay, Event, Emitter } from 'vs/base/common/event'; import { WorkbenchObjectTree, TreeResourceNavigator2 } from 'vs/platform/list/browser/listService'; -import { FilterOptions } from 'vs/workbench/parts/markers/electron-browser/markersFilterOptions'; +import { FilterOptions } from 'vs/workbench/contrib/markers/electron-browser/markersFilterOptions'; import { IExpression, getEmptyExpression } from 'vs/base/common/glob'; import { mixin, deepClone } from 'vs/base/common/objects'; import { IWorkspaceFolder, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { isAbsolute, join } from 'vs/base/common/paths'; -import { FilterData, Filter, VirtualDelegate, ResourceMarkersRenderer, MarkerRenderer, RelatedInformationRenderer, TreeElement, MarkersTreeAccessibilityProvider, MarkersViewModel } from 'vs/workbench/parts/markers/electron-browser/markersTreeViewer'; +import { FilterData, Filter, VirtualDelegate, ResourceMarkersRenderer, MarkerRenderer, RelatedInformationRenderer, TreeElement, MarkersTreeAccessibilityProvider, MarkersViewModel, ResourceDragAndDrop } from 'vs/workbench/contrib/markers/electron-browser/markersTreeViewer'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { Separator, ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IMenuService, MenuId } from 'vs/platform/actions/common/actions'; @@ -335,7 +335,8 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { { filter: this.filter, accessibilityProvider, - identityProvider + identityProvider, + dnd: new ResourceDragAndDrop(this.instantiationService) } ) as any as WorkbenchObjectTree; @@ -384,6 +385,18 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { this.filterInputActionItem.focus(); } })); + + this._register(Event.any(this.tree.onDidChangeSelection, this.tree.onDidChangeFocus)(() => { + const elements: TreeElement[] = [...this.tree.getSelection(), ...this.tree.getFocus()]; + for (const element of elements) { + if (element instanceof Marker) { + const viewModel = this.markersViewModel.getViewModel(element); + if (viewModel) { + viewModel.showLightBulb(); + } + } + } + })); } private createActions(): void { @@ -610,34 +623,35 @@ export class MarkersPanel extends Panel implements IMarkerFilterController { e.browserEvent.preventDefault(); e.browserEvent.stopPropagation(); - this._getMenuActions(e.element).then(actions => { - this.contextMenuService.showContextMenu({ - getAnchor: () => e.anchor, - getActions: () => actions, - getActionItem: (action) => { - const keybinding = this.keybindingService.lookupKeybinding(action.id); - if (keybinding) { - return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); - } - return null; - }, - onHide: (wasCancelled?: boolean) => { - if (wasCancelled) { - this.tree.domFocus(); - } + this.contextMenuService.showContextMenu({ + getAnchor: () => e.anchor, + getActions: () => this.getMenuActions(e.element), + getActionItem: (action) => { + const keybinding = this.keybindingService.lookupKeybinding(action.id); + if (keybinding) { + return new ActionItem(action, action, { label: true, keybinding: keybinding.getLabel() }); } - }); + return null; + }, + onHide: (wasCancelled?: boolean) => { + if (wasCancelled) { + this.tree.domFocus(); + } + } }); } - private async _getMenuActions(element: TreeElement): Promise { + private getMenuActions(element: TreeElement): IAction[] { const result: IAction[] = []; if (element instanceof Marker) { - const quickFixActions = await this.markersWorkbenchService.getQuickFixActions(element); - if (quickFixActions.length) { - result.push(...quickFixActions); - result.push(new Separator()); + const viewModel = this.markersViewModel.getViewModel(element); + if (viewModel) { + const quickFixActions = viewModel.quickFixAction.quickFixes; + if (quickFixActions.length) { + result.push(...quickFixActions); + result.push(new Separator()); + } } } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts b/src/vs/workbench/contrib/markers/electron-browser/markersPanelActions.ts similarity index 88% rename from src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersPanelActions.ts index 43090745bbb..2d305d300ae 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersPanelActions.ts +++ b/src/vs/workbench/contrib/markers/electron-browser/markersPanelActions.ts @@ -5,32 +5,30 @@ import { Delayer } from 'vs/base/common/async'; import * as DOM from 'vs/base/browser/dom'; -import { Action, IActionChangeEvent } from 'vs/base/common/actions'; +import { Action, IActionChangeEvent, IAction } from 'vs/base/common/actions'; import { HistoryInputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { KeyCode } from 'vs/base/common/keyCodes'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { TogglePanelAction } from 'vs/workbench/browser/panel'; -import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; -import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; +import Messages from 'vs/workbench/contrib/markers/electron-browser/messages'; +import Constants from 'vs/workbench/contrib/markers/electron-browser/constants'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { attachInputBoxStyler, attachStylerCallback, attachCheckboxStyler } from 'vs/platform/theme/common/styler'; -import { IMarkersWorkbenchService } from 'vs/workbench/parts/markers/electron-browser/markers'; +import { IMarkersWorkbenchService } from 'vs/workbench/contrib/markers/electron-browser/markers'; import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { BaseActionItem, ActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { badgeBackground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; +import { badgeBackground, badgeForeground, contrastBorder } from 'vs/platform/theme/common/colorRegistry'; import { localize } from 'vs/nls'; import { Checkbox } from 'vs/base/browser/ui/checkbox/checkbox'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ContextScopedHistoryInputBox } from 'vs/platform/widget/browser/contextScopedHistoryWidget'; -import { Marker } from 'vs/workbench/parts/markers/electron-browser/markersModel'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { isEqual } from 'vs/base/common/resources'; +import { Marker } from 'vs/workbench/contrib/markers/electron-browser/markersModel'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Event, Emitter } from 'vs/base/common/event'; -import { FilterOptions } from 'vs/workbench/parts/markers/electron-browser/markersFilterOptions'; +import { FilterOptions } from 'vs/workbench/contrib/markers/electron-browser/markersFilterOptions'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; export class ToggleMarkersPanelAction extends TogglePanelAction { @@ -197,8 +195,9 @@ export class MarkersFilterActionItem extends BaseActionItem { private createBadge(container: HTMLElement): void { this.filterBadge = DOM.append(container, DOM.$('.markers-panel-filter-badge')); - this._register(attachStylerCallback(this.themeService, { badgeBackground, contrastBorder }, colors => { + this._register(attachStylerCallback(this.themeService, { badgeBackground, badgeForeground, contrastBorder }, colors => { const background = colors.badgeBackground ? colors.badgeBackground.toString() : null; + const foreground = colors.badgeForeground ? colors.badgeForeground.toString() : null; const border = colors.contrastBorder ? colors.contrastBorder.toString() : null; this.filterBadge.style.backgroundColor = background; @@ -206,6 +205,7 @@ export class MarkersFilterActionItem extends BaseActionItem { this.filterBadge.style.borderWidth = border ? '1px' : null; this.filterBadge.style.borderStyle = border ? 'solid' : null; this.filterBadge.style.borderColor = border; + this.filterBadge.style.color = foreground; })); this.updateBadge(); this._register(this.filterController.onDidFilter(() => this.updateBadge())); @@ -294,28 +294,25 @@ export class QuickFixAction extends Action { public static readonly ID: string = 'workbench.actions.problems.quickfix'; - private updated: boolean = false; private disposables: IDisposable[] = []; - private _onShowQuickFixes: Emitter = new Emitter(); + private readonly _onShowQuickFixes: Emitter = new Emitter(); readonly onShowQuickFixes: Event = this._onShowQuickFixes.event; + private _quickFixes: IAction[] = []; + get quickFixes(): IAction[] { + return this._quickFixes; + } + set quickFixes(quickFixes: IAction[]) { + this._quickFixes = quickFixes; + this.enabled = this._quickFixes.length > 0; + } + + constructor( readonly marker: Marker, - @IModelService modelService: IModelService, - @IMarkersWorkbenchService private readonly markerWorkbenchService: IMarkersWorkbenchService, ) { super(QuickFixAction.ID, Messages.MARKERS_PANEL_ACTION_TOOLTIP_QUICKFIX, 'markers-panel-action-quickfix', false); - this.disposables.push(this._onShowQuickFixes); - if (modelService.getModel(this.marker.resource)) { - this.update(); - } else { - modelService.onModelAdded(model => { - if (isEqual(model.uri, marker.resource)) { - this.update(); - } - }, this, this.disposables); - } } run(): Promise { @@ -323,13 +320,6 @@ export class QuickFixAction extends Action { return Promise.resolve(); } - private update(): void { - if (!this.updated) { - this.markerWorkbenchService.hasQuickFixes(this.marker).then(hasFixes => this.enabled = hasFixes); - this.updated = true; - } - } - dispose(): void { dispose(this.disposables); super.dispose(); @@ -340,7 +330,6 @@ export class QuickFixActionItem extends ActionItem { constructor(action: QuickFixAction, @IContextMenuService private readonly contextMenuService: IContextMenuService, - @IMarkersWorkbenchService private readonly markerWorkbenchService: IMarkersWorkbenchService ) { super(null, action, { icon: true, label: false }); } @@ -358,11 +347,12 @@ export class QuickFixActionItem extends ActionItem { return; } const elementPosition = DOM.getDomNodePagePosition(this.element); - this.markerWorkbenchService.getQuickFixActions((this.getAction()).marker).then(actions => { + const quickFixes = (this.getAction()).quickFixes; + if (quickFixes.length) { this.contextMenuService.showContextMenu({ getAnchor: () => ({ x: elementPosition.left + 10, y: elementPosition.top + elementPosition.height + 4 }), - getActions: () => actions + getActions: () => quickFixes }); - }); + } } } diff --git a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts b/src/vs/workbench/contrib/markers/electron-browser/markersTreeViewer.ts similarity index 75% rename from src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts rename to src/vs/workbench/contrib/markers/electron-browser/markersTreeViewer.ts index e7cb8ee2bbd..d1632335485 100644 --- a/src/vs/workbench/parts/markers/electron-browser/markersTreeViewer.ts +++ b/src/vs/workbench/contrib/markers/electron-browser/markersTreeViewer.ts @@ -10,26 +10,40 @@ import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { ResourceLabels, IResourceLabel } from 'vs/workbench/browser/labels'; import { HighlightedLabel } from 'vs/base/browser/ui/highlightedlabel/highlightedLabel'; import { IMarker, MarkerSeverity } from 'vs/platform/markers/common/markers'; -import { ResourceMarkers, Marker, RelatedInformation } from 'vs/workbench/parts/markers/electron-browser/markersModel'; -import Messages from 'vs/workbench/parts/markers/electron-browser/messages'; +import { ResourceMarkers, Marker, RelatedInformation } from 'vs/workbench/contrib/markers/electron-browser/markersModel'; +import Messages from 'vs/workbench/contrib/markers/electron-browser/messages'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IDisposable, dispose, Disposable, toDisposable } from 'vs/base/common/lifecycle'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; -import { QuickFixAction, QuickFixActionItem } from 'vs/workbench/parts/markers/electron-browser/markersPanelActions'; +import { QuickFixAction, QuickFixActionItem } from 'vs/workbench/contrib/markers/electron-browser/markersPanelActions'; import { ILabelService } from 'vs/platform/label/common/label'; -import { dirname } from 'vs/base/common/resources'; +import { dirname, basename, isEqual } from 'vs/base/common/resources'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; -import { ITreeFilter, TreeVisibility, TreeFilterResult, ITreeRenderer, ITreeNode } from 'vs/base/browser/ui/tree/tree'; -import { FilterOptions } from 'vs/workbench/parts/markers/electron-browser/markersFilterOptions'; +import { ITreeFilter, TreeVisibility, TreeFilterResult, ITreeRenderer, ITreeNode, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; +import { FilterOptions } from 'vs/workbench/contrib/markers/electron-browser/markersFilterOptions'; import { IMatch } from 'vs/base/common/filters'; import { Event, Emitter } from 'vs/base/common/event'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { isUndefinedOrNull } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; -import { Action } from 'vs/base/common/actions'; +import { Action, IAction } from 'vs/base/common/actions'; import { localize } from 'vs/nls'; +import { IDragAndDropData } from 'vs/base/browser/dnd'; +import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; +import { fillResourceDataTransfers } from 'vs/workbench/browser/dnd'; +import { CancelablePromise, createCancelablePromise, Delayer } from 'vs/base/common/async'; +import { IModelService } from 'vs/editor/common/services/modelService'; +import { Range } from 'vs/editor/common/core/range'; +import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger'; +import { ITextModel } from 'vs/editor/common/model'; +import { CodeAction } from 'vs/editor/common/modes'; +import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; +import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; +import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; export type TreeElement = ResourceMarkers | Marker | RelatedInformation; @@ -232,7 +246,7 @@ class MarkerWidget extends Disposable { private disposables: IDisposable[] = []; constructor( - parent: HTMLElement, + private parent: HTMLElement, private readonly markersViewModel: MarkersViewModel, instantiationService: IInstantiationService ) { @@ -259,6 +273,8 @@ class MarkerWidget extends Disposable { this.renderMultilineActionbar(element); this.renderMessageAndDetails(element, filterData); + this.disposables.push(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_OVER, () => this.markersViewModel.onMarkerMouseHover(element))); + this.disposables.push(dom.addDisposableListener(this.parent, dom.EventType.MOUSE_LEAVE, () => this.markersViewModel.onMarkerMouseLeave(element))); } private renderQuickfixActionbar(marker: Marker): void { @@ -471,11 +487,26 @@ export class MarkerViewModel extends Disposable { private readonly _onDidChange: Emitter = this._register(new Emitter()); readonly onDidChange: Event = this._onDidChange.event; + private modelPromise: CancelablePromise | null = null; + private codeActionsPromise: CancelablePromise | null = null; + constructor( private readonly marker: Marker, - @IInstantiationService private instantiationService: IInstantiationService + @IModelService private modelService: IModelService, + @IInstantiationService private instantiationService: IInstantiationService, + @IBulkEditService private readonly bulkEditService: IBulkEditService, + @ICommandService private readonly commandService: ICommandService, + @IEditorService private readonly editorService: IEditorService ) { super(); + this._register(toDisposable(() => { + if (this.modelPromise) { + this.modelPromise.cancel(); + } + if (this.codeActionsPromise) { + this.codeActionsPromise.cancel(); + } + })); } private _multiline: boolean = true; @@ -497,6 +528,90 @@ export class MarkerViewModel extends Disposable { } return this._quickFixAction; } + + showLightBulb(): void { + this.setQuickFixes(true); + } + + showQuickfixes(): void { + this.setQuickFixes(false).then(() => this.quickFixAction.run()); + } + + async getQuickFixes(waitForModel: boolean): Promise { + const codeActions = await this.getCodeActions(waitForModel); + return codeActions ? this.toActions(codeActions) : []; + } + + private async setQuickFixes(waitForModel: boolean): Promise { + const quickFixes = await this.getQuickFixes(waitForModel); + this.quickFixAction.quickFixes = quickFixes; + } + + private getCodeActions(waitForModel: boolean): Promise { + if (this.codeActionsPromise !== null) { + return this.codeActionsPromise; + } + return this.getModel(waitForModel) + .then(model => { + if (model) { + if (!this.codeActionsPromise) { + this.codeActionsPromise = createCancelablePromise(cancellationToken => { + return getCodeActions(model, new Range(this.marker.range.startLineNumber, this.marker.range.startColumn, this.marker.range.endLineNumber, this.marker.range.endColumn), { type: 'manual', filter: { kind: CodeActionKind.QuickFix } }, cancellationToken); + }); + } + return this.codeActionsPromise; + } + return null; + }); + } + + private toActions(codeActions: CodeAction[]): IAction[] { + return codeActions.map(codeAction => new Action( + codeAction.command ? codeAction.command.id : codeAction.title, + codeAction.title, + undefined, + true, + () => { + return this.openFileAtMarker(this.marker) + .then(() => applyCodeAction(codeAction, this.bulkEditService, this.commandService)); + })); + } + + private openFileAtMarker(element: Marker): Promise { + const { resource, selection } = { resource: element.resource, selection: element.range }; + return this.editorService.openEditor({ + resource, + options: { + selection, + preserveFocus: true, + pinned: false, + revealIfVisible: true + }, + }, ACTIVE_GROUP).then(() => undefined); + } + + private getModel(waitForModel: boolean): Promise { + const model = this.modelService.getModel(this.marker.resource); + if (model) { + return Promise.resolve(model); + } + if (waitForModel) { + if (this.modelPromise === null) { + this.modelPromise = createCancelablePromise(cancellationToken => { + return new Promise((c) => { + this._register(this.modelService.onModelAdded(model => { + if (isEqual(model.uri, this.marker.resource)) { + c(model); + } + })); + }); + }); + } + return this.modelPromise; + } + return Promise.resolve(null); + } + } export class MarkersViewModel extends Disposable { @@ -509,6 +624,9 @@ export class MarkersViewModel extends Disposable { private bulkUpdate: boolean = false; + private hoveredMarker: Marker; + private hoverDelayer: Delayer = new Delayer(300); + constructor( multiline: boolean = true, @IInstantiationService private instantiationService: IInstantiationService @@ -543,6 +661,9 @@ export class MarkersViewModel extends Disposable { dispose(value.disposables); } this.markersViewStates.delete(marker.hash); + if (this.hoveredMarker === marker) { + this.hoveredMarker = null; + } } this.markersPerResource.delete(resource.toString()); } @@ -552,6 +673,24 @@ export class MarkersViewModel extends Disposable { return value ? value.viewModel : null; } + onMarkerMouseHover(marker: Marker): void { + this.hoveredMarker = marker; + this.hoverDelayer.trigger(() => { + if (this.hoveredMarker) { + const model = this.getViewModel(this.hoveredMarker); + if (model) { + model.showLightBulb(); + } + } + }); + } + + onMarkerMouseLeave(marker: Marker): void { + if (this.hoveredMarker === marker) { + this.hoveredMarker = null; + } + } + private _multiline: boolean = true; get multiline(): boolean { return this._multiline; @@ -584,3 +723,43 @@ export class MarkersViewModel extends Disposable { } } + +export class ResourceDragAndDrop implements ITreeDragAndDrop { + constructor( + private instantiationService: IInstantiationService + ) { } + + onDragOver(data: IDragAndDropData, targetElement: TreeElement, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { + return false; + } + + getDragURI(element: TreeElement): string | null { + if (element instanceof ResourceMarkers) { + return element.resource.toString(); + } + return null; + } + + getDragLabel?(elements: TreeElement[]): string | undefined { + if (elements.length > 1) { + return String(elements.length); + } + const element = elements[0]; + return element instanceof ResourceMarkers ? basename(element.resource) : undefined; + } + + onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { + const elements = (data as ElementsDragAndDropData).elements; + const resources: URI[] = elements + .filter(e => e instanceof ResourceMarkers) + .map((resourceMarker: ResourceMarkers) => resourceMarker.resource); + + if (resources.length) { + // Apply some datatransfer types to allow for dragging the element outside of the application + this.instantiationService.invokeFunction(fillResourceDataTransfers, resources, originalEvent); + } + } + + drop(data: IDragAndDropData, targetElement: TreeElement, targetIndex: number, originalEvent: DragEvent): void { + } +} diff --git a/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg b/src/vs/workbench/contrib/markers/electron-browser/media/excludeSettings-dark.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/excludeSettings-dark.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/excludeSettings-dark.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg b/src/vs/workbench/contrib/markers/electron-browser/media/excludeSettings.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/excludeSettings.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/excludeSettings.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/lightbulb-dark.svg b/src/vs/workbench/contrib/markers/electron-browser/media/lightbulb-dark.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/lightbulb-dark.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/lightbulb-dark.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/lightbulb.svg b/src/vs/workbench/contrib/markers/electron-browser/media/lightbulb.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/lightbulb.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/lightbulb.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/markers.css b/src/vs/workbench/contrib/markers/electron-browser/media/markers.css similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/markers.css rename to src/vs/workbench/contrib/markers/electron-browser/media/markers.css diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-error-inverse.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-error-inverse.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-error-inverse.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-error-inverse.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-error.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-error.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-error.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-error.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-info-inverse.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-info-inverse.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-info-inverse.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-info-inverse.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-info.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-info.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-info.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-info.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-warning-inverse.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-warning-inverse.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-warning-inverse.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-warning-inverse.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/media/status-warning.svg b/src/vs/workbench/contrib/markers/electron-browser/media/status-warning.svg similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/media/status-warning.svg rename to src/vs/workbench/contrib/markers/electron-browser/media/status-warning.svg diff --git a/src/vs/workbench/parts/markers/electron-browser/messages.ts b/src/vs/workbench/contrib/markers/electron-browser/messages.ts similarity index 100% rename from src/vs/workbench/parts/markers/electron-browser/messages.ts rename to src/vs/workbench/contrib/markers/electron-browser/messages.ts diff --git a/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts b/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts similarity index 99% rename from src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts rename to src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts index 34eb1dfe3fc..c94ed7d2d1e 100644 --- a/src/vs/workbench/parts/markers/test/electron-browser/markersModel.test.ts +++ b/src/vs/workbench/contrib/markers/test/electron-browser/markersModel.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { IMarker, MarkerSeverity, IRelatedInformation } from 'vs/platform/markers/common/markers'; -import { MarkersModel, Marker, ResourceMarkers, RelatedInformation } from 'vs/workbench/parts/markers/electron-browser/markersModel'; +import { MarkersModel, Marker, ResourceMarkers, RelatedInformation } from 'vs/workbench/contrib/markers/electron-browser/markersModel'; import { groupBy } from 'vs/base/common/collections'; class TestMarkersModel extends MarkersModel { diff --git a/src/vs/workbench/parts/outline/electron-browser/outline.contribution.ts b/src/vs/workbench/contrib/outline/electron-browser/outline.contribution.ts similarity index 92% rename from src/vs/workbench/parts/outline/electron-browser/outline.contribution.ts rename to src/vs/workbench/contrib/outline/electron-browser/outline.contribution.ts index 4b85e7261a2..a53f3eae4d7 100644 --- a/src/vs/workbench/parts/outline/electron-browser/outline.contribution.ts +++ b/src/vs/workbench/contrib/outline/electron-browser/outline.contribution.ts @@ -6,10 +6,10 @@ import { localize } from 'vs/nls'; import { ViewsRegistry, IViewDescriptor } from 'vs/workbench/common/views'; import { OutlinePanel } from './outlinePanel'; -import { VIEW_CONTAINER } from 'vs/workbench/parts/files/common/files'; +import { VIEW_CONTAINER } from 'vs/workbench/contrib/files/common/files'; import { Registry } from 'vs/platform/registry/common/platform'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { OutlineConfigKeys, OutlineViewId } from 'vs/workbench/parts/outline/electron-browser/outline'; +import { OutlineConfigKeys, OutlineViewId } from 'vs/editor/contrib/documentSymbols/outline'; const _outlineDesc = { id: OutlineViewId, diff --git a/src/vs/workbench/parts/outline/electron-browser/outlinePanel.css b/src/vs/workbench/contrib/outline/electron-browser/outlinePanel.css similarity index 77% rename from src/vs/workbench/parts/outline/electron-browser/outlinePanel.css rename to src/vs/workbench/contrib/outline/electron-browser/outlinePanel.css index c8efd60317f..950fb41088b 100644 --- a/src/vs/workbench/parts/outline/electron-browser/outlinePanel.css +++ b/src/vs/workbench/contrib/outline/electron-browser/outlinePanel.css @@ -12,6 +12,7 @@ width: 100%; height: 2px; padding-bottom: 3px; + position: absolute; } .monaco-workbench .outline-panel .outline-progress .monaco-progress-container { @@ -22,20 +23,6 @@ height: 2px; } -.monaco-workbench .outline-panel .outline-input { - box-sizing: border-box; - padding: 2px 9px 5px 9px; - position: relative; -} - -.monaco-workbench .outline-panel .outline-input .monaco-inputbox { - width: 100%; -} - -.monaco-workbench .outline-panel .outline-input .monaco-inputbox .input { - padding-right: 22px; -} - .monaco-workbench .outline-panel .outline-tree { height: 100%; } @@ -50,10 +37,6 @@ display: inherit; } -.monaco-workbench .outline-panel.message .outline-input { - display: none; -} - .monaco-workbench .outline-panel.message .outline-progress { display: none; } @@ -72,7 +55,3 @@ /* allows text color to use the default when selected */ color: inherit !important; } - -.monaco-workbench .outline-panel.no-icons .outline-element .outline-element-icon { - display: none; -} diff --git a/src/vs/workbench/parts/outline/electron-browser/outlinePanel.ts b/src/vs/workbench/contrib/outline/electron-browser/outlinePanel.ts similarity index 64% rename from src/vs/workbench/parts/outline/electron-browser/outlinePanel.ts rename to src/vs/workbench/contrib/outline/electron-browser/outlinePanel.ts index f2fda75d216..70684ff8365 100644 --- a/src/vs/workbench/parts/outline/electron-browser/outlinePanel.ts +++ b/src/vs/workbench/contrib/outline/electron-browser/outlinePanel.ts @@ -5,26 +5,20 @@ import { posix } from 'path'; import * as dom from 'vs/base/browser/dom'; -import { IKeyboardEvent } from 'vs/base/browser/keyboardEvent'; -import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { Separator } from 'vs/base/browser/ui/actionbar/actionbar'; -import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox'; import { ProgressBar } from 'vs/base/browser/ui/progressbar/progressbar'; import { Action, IAction, RadioGroup } from 'vs/base/common/actions'; import { firstIndex } from 'vs/base/common/arrays'; import { createCancelablePromise, TimeoutTimer } from 'vs/base/common/async'; -import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors'; +import { isPromiseCanceledError } from 'vs/base/common/errors'; import { Emitter } from 'vs/base/common/event'; import { defaultGenerator } from 'vs/base/common/idGenerator'; -import { KeyCode } from 'vs/base/common/keyCodes'; import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { LRUCache } from 'vs/base/common/map'; import { escape } from 'vs/base/common/strings'; import { URI } from 'vs/base/common/uri'; -import { ITree } from 'vs/base/parts/tree/browser/tree'; import 'vs/css!./outlinePanel'; import { ICodeEditor, isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { ServicesAccessor } from 'vs/editor/browser/editorExtensions'; import { Range } from 'vs/editor/common/core/range'; import { Selection } from 'vs/editor/common/core/selection'; import { ITextModel } from 'vs/editor/common/model'; @@ -34,24 +28,25 @@ import { LanguageFeatureRegistry } from 'vs/editor/common/modes/languageFeatureR import { OutlineElement, OutlineModel, TreeElement } from 'vs/editor/contrib/documentSymbols/outlineModel'; import { localize } from 'vs/nls'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ContextKeyExpr, IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IResourceInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { WorkbenchTree } from 'vs/platform/list/browser/listService'; +import { WorkbenchDataTree } from 'vs/platform/list/browser/listService'; import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { attachInputBoxStyler, attachProgressBarStyler } from 'vs/platform/theme/common/styler'; +import { attachProgressBarStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet'; -import { CollapseAction } from 'vs/workbench/browser/viewlet'; -import { IViewsService } from 'vs/workbench/common/views'; +import { CollapseAction2 } from 'vs/workbench/browser/viewlet'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { OutlineController, OutlineDataSource, OutlineItemComparator, OutlineItemCompareType, OutlineItemFilter, OutlineRenderer, OutlineTreeState } from 'vs/editor/contrib/documentSymbols/outlineTree'; -import { OutlineConfigKeys, OutlineViewFiltered, OutlineViewFocused, OutlineViewId } from './outline'; +import { OutlineConfigKeys, OutlineViewFiltered, OutlineViewFocused } from '../../../../editor/contrib/documentSymbols/outline'; +import { FuzzyScore } from 'vs/base/common/filters'; +import { OutlineDataSource, OutlineItemComparator, OutlineSortOrder, OutlineVirtualDelegate, OutlineGroupRenderer, OutlineElementRenderer, OutlineItem, OutlineIdentityProvider, OutlineNavigationLabelProvider } from 'vs/editor/contrib/documentSymbols/outlineTree'; +import { IDataTreeViewState } from 'vs/base/browser/ui/tree/dataTree'; +import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; class RequestState { @@ -164,7 +159,7 @@ class OutlineViewState { private _followCursor = false; private _filterOnType = true; - private _sortBy = OutlineItemCompareType.ByKind; + private _sortBy = OutlineSortOrder.ByKind; private _onDidChange = new Emitter<{ followCursor?: boolean, sortBy?: boolean, filterOnType?: boolean }>(); readonly onDidChange = this._onDidChange.event; @@ -191,14 +186,14 @@ class OutlineViewState { } } - set sortBy(value: OutlineItemCompareType) { + set sortBy(value: OutlineSortOrder) { if (value !== this._sortBy) { this._sortBy = value; this._onDidChange.fire({ sortBy: true }); } } - get sortBy(): OutlineItemCompareType { + get sortBy(): OutlineSortOrder { return this._sortBy; } @@ -233,14 +228,14 @@ export class OutlinePanel extends ViewletPanel { private _domNode: HTMLElement; private _message: HTMLDivElement; private _inputContainer: HTMLDivElement; - private _input: InputBox; private _progressBar: ProgressBar; - private _tree: WorkbenchTree; + private _tree: WorkbenchDataTree; private _treeDataSource: OutlineDataSource; - private _treeRenderer: OutlineRenderer; - private _treeFilter: OutlineItemFilter; + private _treeRenderer: OutlineElementRenderer; private _treeComparator: OutlineItemComparator; - private _treeStates = new LRUCache(10); + private _treeStates = new LRUCache(10); + + private _treeFakeUIEvent = new UIEvent('me'); private readonly _contextKeyFocused: IContextKey; private readonly _contextKeyFiltered: IContextKey; @@ -253,12 +248,12 @@ export class OutlinePanel extends ViewletPanel { @IEditorService private readonly _editorService: IEditorService, @IMarkerService private readonly _markerService: IMarkerService, @IConfigurationService private readonly _configurationService: IConfigurationService, - @IKeybindingService private readonly _keybindingService: IKeybindingService, + @IKeybindingService keybindingService: IKeybindingService, @IConfigurationService configurationService: IConfigurationService, @IContextKeyService contextKeyService: IContextKeyService, @IContextMenuService contextMenuService: IContextMenuService, ) { - super(options, _keybindingService, contextMenuService, configurationService); + super(options, keybindingService, contextMenuService, configurationService); this._outlineViewState.restore(this._storageService); this._contextKeyFocused = OutlineViewFocused.bindTo(contextKeyService); this._contextKeyFiltered = OutlineViewFiltered.bindTo(contextKeyService); @@ -303,73 +298,38 @@ export class OutlinePanel extends ViewletPanel { progressContainer, this._message, this._inputContainer, treeContainer ); - this._input = new InputBox(this._inputContainer, null, { - placeholder: this._outlineViewState.filterOnType ? localize('filter.placeholder', "Filter") : localize('find.placeholder', "Find") - }); - this._input.disable(); - - this.disposables.push(attachInputBoxStyler(this._input, this._themeService)); - this.disposables.push(dom.addStandardDisposableListener(this._input.inputElement, 'keyup', event => { - if (event.keyCode === KeyCode.DownArrow) { - this._tree.focusNext(); - this._tree.domFocus(); - } else if (event.keyCode === KeyCode.UpArrow) { - this._tree.focusPrevious(); - this._tree.domFocus(); - } else if (event.keyCode === KeyCode.Enter) { - let element = this._tree.getFocus(); - if (element instanceof OutlineElement) { - this._revealTreeSelection(OutlineModel.get(element), element, true, false); - } - } else if (event.keyCode === KeyCode.Escape) { - this._input.value = ''; - this._tree.domFocus(); - } - })); - - const $this = this; - const controller = new class extends OutlineController { - - constructor() { - super({}, $this.configurationService); - } - - onKeyDown(tree: ITree, event: IKeyboardEvent) { - let handled = super.onKeyDown(tree, event); - if (handled) { - return true; - } - if (this.upKeyBindingDispatcher.has(event.keyCode)) { - return false; - } - // crazy -> during keydown focus moves to the input box - // and because of that the keyup event is handled by the - // input field - if ($this._keybindingService.mightProducePrintableCharacter(event)) { - $this._input.focus(); - return true; - } - return false; - } - }; - - this._treeRenderer = this._instantiationService.createInstance(OutlineRenderer); + this._treeRenderer = this._instantiationService.createInstance(OutlineElementRenderer); this._treeDataSource = new OutlineDataSource(); this._treeComparator = new OutlineItemComparator(this._outlineViewState.sortBy); - this._treeFilter = new OutlineItemFilter(); - this._tree = this._instantiationService.createInstance(WorkbenchTree, treeContainer, { controller, renderer: this._treeRenderer, dataSource: this._treeDataSource, sorter: this._treeComparator, filter: this._treeFilter }, {}); + this._tree = this._instantiationService.createInstance( + WorkbenchDataTree, + treeContainer, + new OutlineVirtualDelegate(), + [new OutlineGroupRenderer(), this._treeRenderer], + this._treeDataSource, + { + expandOnlyOnTwistieClick: true, + multipleSelectionSupport: false, + filterOnType: this._outlineViewState.filterOnType, + sorter: this._treeComparator, + identityProvider: new OutlineIdentityProvider(), + keyboardNavigationLabelProvider: this._instantiationService.createInstance(OutlineNavigationLabelProvider) + } + ) as WorkbenchDataTree; - this._treeRenderer.renderProblemColors = this._configurationService.getValue(OutlineConfigKeys.problemsColors); - this._treeRenderer.renderProblemBadges = this._configurationService.getValue(OutlineConfigKeys.problemsBadges); - - this._disposables.push(this._tree, this._input); + this._disposables.push(this._tree); this._disposables.push(this._outlineViewState.onDidChange(this._onDidChangeUserState, this)); + // todo@joh workaournd for the tree resetting the filter behaviour + // to something globally defined + this._tree.updateOptions({ + filterOnType: this._outlineViewState.filterOnType + }); + // feature: toggle icons - dom.toggleClass(this._domNode, 'no-icons', !this._configurationService.getValue(OutlineConfigKeys.icons)); this.disposables.push(this._configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(OutlineConfigKeys.icons)) { - dom.toggleClass(this._domNode, 'no-icons', !this._configurationService.getValue(OutlineConfigKeys.icons)); + this._tree.updateChildren(); } })); @@ -386,25 +346,23 @@ export class OutlinePanel extends ViewletPanel { protected layoutBody(height: number): void { if (height !== this._cachedHeight) { - this._cachedHeight = height; - const treeHeight = height - (5 /*progressbar height*/ + 33 /*input height*/); - this._tree.layout(treeHeight); + this._tree.layout(height); } } getActions(): IAction[] { return [ new Action('collapse', localize('collapse', "Collapse All"), 'explorer-action collapse-explorer', true, () => { - return new CollapseAction(this._tree, true, undefined).run(); + return new CollapseAction2(this._tree, true, undefined).run(); }) ]; } getSecondaryActions(): IAction[] { let group = new RadioGroup([ - new SimpleToggleAction(localize('sortByPosition', "Sort By: Position"), this._outlineViewState.sortBy === OutlineItemCompareType.ByPosition, _ => this._outlineViewState.sortBy = OutlineItemCompareType.ByPosition), - new SimpleToggleAction(localize('sortByName', "Sort By: Name"), this._outlineViewState.sortBy === OutlineItemCompareType.ByName, _ => this._outlineViewState.sortBy = OutlineItemCompareType.ByName), - new SimpleToggleAction(localize('sortByKind', "Sort By: Type"), this._outlineViewState.sortBy === OutlineItemCompareType.ByKind, _ => this._outlineViewState.sortBy = OutlineItemCompareType.ByKind), + new SimpleToggleAction(localize('sortByPosition', "Sort By: Position"), this._outlineViewState.sortBy === OutlineSortOrder.ByPosition, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByPosition), + new SimpleToggleAction(localize('sortByName', "Sort By: Name"), this._outlineViewState.sortBy === OutlineSortOrder.ByName, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByName), + new SimpleToggleAction(localize('sortByKind', "Sort By: Type"), this._outlineViewState.sortBy === OutlineSortOrder.ByKind, _ => this._outlineViewState.sortBy = OutlineSortOrder.ByKind), ]); let result = [ new SimpleToggleAction(localize('followCur', "Follow Cursor"), this._outlineViewState.followCursor, action => this._outlineViewState.followCursor = action.checked), @@ -425,10 +383,13 @@ export class OutlinePanel extends ViewletPanel { } if (e.sortBy) { this._treeComparator.type = this._outlineViewState.sortBy; - this._tree.refresh(undefined, true); + // todo@joh resort + this._tree.updateChildren(); } if (e.filterOnType) { - this._applyTypeToFilter(); + this._tree.updateOptions({ + filterOnType: this._outlineViewState.filterOnType + }); } } @@ -455,9 +416,13 @@ export class OutlinePanel extends ViewletPanel { this._editorDisposables = new Array(); this._progressBar.infinite().show(150); - this._input.disable(); - if (!event) { - this._input.value = ''; + + let oldModel = this._tree.getInput(); + + // persist state + if (oldModel) { + let state = this._tree.getViewState(); + this._treeStates.set(oldModel.textModel.uri.toString(), state); } if (!editor || !DocumentSymbolProviderRegistry.has(editor.getModel())) { @@ -466,7 +431,6 @@ export class OutlinePanel extends ViewletPanel { let textModel = editor.getModel(); let loadingMessage: IDisposable; - let oldModel = this._tree.getInput(); if (!oldModel) { loadingMessage = new TimeoutTimer( () => this._showMessage(localize('loading', "Loading document symbols for '{0}'...", posix.basename(textModel.uri.path))), @@ -474,17 +438,17 @@ export class OutlinePanel extends ViewletPanel { ); } - let model = await OutlinePanel._createOutlineModel(textModel, this._editorDisposables); + let newModel = await OutlinePanel._createOutlineModel(textModel, this._editorDisposables); dispose(loadingMessage); - if (!model) { + if (!newModel) { return; } - if (TreeElement.empty(model)) { + if (TreeElement.empty(newModel)) { return this._showMessage(localize('no-symbols', "No symbols found in document '{0}'", posix.basename(textModel.uri.path))); } - let newSize = TreeElement.size(model); + let newSize = TreeElement.size(newModel); if (newSize > 7500) { // this is a workaround for performance issues with the tree: https://github.com/Microsoft/vscode/issues/18180 return this._showMessage(localize('too-many-symbols', "We are sorry, but this file is too large for showing an outline.")); @@ -523,22 +487,14 @@ export class OutlinePanel extends ViewletPanel { this._progressBar.stop().hide(); - if (oldModel && oldModel.merge(model)) { - this._tree.refresh(undefined, true); - model = oldModel; - + if (oldModel && oldModel.merge(newModel)) { + this._tree.updateChildren(); + newModel = oldModel; } else { - // persist state - if (oldModel) { - let state = OutlineTreeState.capture(this._tree); - this._treeStates.set(oldModel.textModel.uri.toString(), state); - } - await this._tree.setInput(model); - let state = this._treeStates.get(model.textModel.uri.toString()); - await OutlineTreeState.restore(this._tree, state, this); + let state = this._treeStates.get(newModel.textModel.uri.toString()); + await this._tree.setInput(newModel, state); } - this._input.enable(); this.layoutBody(this._cachedHeight); // transfer focus from domNode to the tree @@ -546,74 +502,44 @@ export class OutlinePanel extends ViewletPanel { this._tree.domFocus(); } - // feature: filter on type - // on type -> update filters - // on first type -> capture tree state - // on erase -> restore captured tree state - let beforePatternState: OutlineTreeState; - let onInputValueChanged = async pattern => { - - this._contextKeyFiltered.set(pattern.length > 0); - - if (pattern && !beforePatternState) { - beforePatternState = OutlineTreeState.capture(this._tree); - } - let item = model.updateMatches(pattern); - await this._tree.refresh(undefined, true); - if (item) { - await this._tree.expandAll(undefined /*all*/); - await this._tree.reveal(item); - this._tree.setFocus(item, this); - this._tree.setSelection([item], this); - } - - if (!pattern && beforePatternState) { - await OutlineTreeState.restore(this._tree, beforePatternState, this); - beforePatternState = undefined; - } - }; - if (this._input.value) { - onInputValueChanged(this._input.value); - } - this._editorDisposables.push(this._input.onDidChange(onInputValueChanged)); - this._editorDisposables.push(toDisposable(() => this._contextKeyFiltered.reset())); // feature: reveal outline selection in editor // on change -> reveal/select defining range this._editorDisposables.push(this._tree.onDidChangeSelection(e => { - if (e.payload === this || e.payload && e.payload.didClickOnTwistie) { + if (e.browserEvent === this._treeFakeUIEvent /* || e.payload && e.payload.didClickOnTwistie */) { return; } - let [first] = e.selection; + let [first] = e.elements; if (!(first instanceof OutlineElement)) { return; } let focus = false; let aside = false; - if (e.payload) { - if (e.payload.origin === 'keyboard') { + // todo@Joh + if (e.browserEvent) { + if (e.browserEvent.type === 'keydown') { focus = true; - - } else if (e.payload.origin === 'mouse' && e.payload.originalEvent instanceof StandardMouseEvent) { - let event = e.payload.originalEvent; - focus = event.detail === 2; - aside = !this._tree.useAltAsMultipleSelectionModifier && event.altKey || this._tree.useAltAsMultipleSelectionModifier && (event.ctrlKey || event.metaKey); + } else if (e.browserEvent.type === 'click') { + const event = new StandardMouseEvent(e.browserEvent as MouseEvent); + focus = e.browserEvent.detail === 2; + aside = (!this._tree.useAltAsMultipleSelectionModifier && event.altKey) + || (this._tree.useAltAsMultipleSelectionModifier && (event.ctrlKey || event.metaKey)); } } - this._revealTreeSelection(model, first, focus, aside); + this._revealTreeSelection(newModel, first, focus, aside); })); // feature: reveal editor selection in outline - this._revealEditorSelection(model, editor.getSelection()); - const versionIdThen = model.textModel.getVersionId(); + this._revealEditorSelection(newModel, editor.getSelection()); + const versionIdThen = newModel.textModel.getVersionId(); this._editorDisposables.push(editor.onDidChangeCursorSelection(e => { // first check if the document has changed and stop revealing the // cursor position iff it has -> we will update/recompute the // outline view then anyways - if (!model.textModel.isDisposed() && model.textModel.getVersionId() === versionIdThen) { - this._revealEditorSelection(model, e.selection); + if (!newModel.textModel.isDisposed() && newModel.textModel.getVersionId() === versionIdThen) { + this._revealEditorSelection(newModel, e.selection); } })); @@ -627,8 +553,8 @@ export class OutlinePanel extends ViewletPanel { } const marker = this._markerService.read({ resource: textModel.uri, severities: MarkerSeverity.Error | MarkerSeverity.Warning }); if (marker.length > 0 || !ignoreEmpty) { - model.updateMarker(marker); - this._tree.refresh(undefined, true); + newModel.updateMarker(marker); + this._tree.updateChildren(); } }; updateMarker([textModel.uri], true); @@ -636,39 +562,21 @@ export class OutlinePanel extends ViewletPanel { this._editorDisposables.push(this.configurationService.onDidChangeConfiguration(e => { if (e.affectsConfiguration(OutlineConfigKeys.problemsBadges) || e.affectsConfiguration(OutlineConfigKeys.problemsColors)) { - this._treeRenderer.renderProblemColors = this._configurationService.getValue(OutlineConfigKeys.problemsColors); - this._treeRenderer.renderProblemBadges = this._configurationService.getValue(OutlineConfigKeys.problemsBadges); - this._tree.refresh(undefined, true); + this._tree.updateChildren(); return; } if (!e.affectsConfiguration(OutlineConfigKeys.problemsEnabled)) { return; } if (!this._configurationService.getValue(OutlineConfigKeys.problemsEnabled)) { - model.updateMarker([]); - this._tree.refresh(undefined, true); + newModel.updateMarker([]); + this._tree.updateChildren(); } else { updateMarker([textModel.uri], true); } })); } - private _applyTypeToFilter(): void { - // depending on the user setting we filter or find elements - if (this._outlineViewState.filterOnType) { - this._treeFilter.enabled = true; - this._treeDataSource.filterOnScore = true; - this._input.setPlaceHolder(localize('filter', "Filter")); - } else { - this._treeFilter.enabled = false; - this._treeDataSource.filterOnScore = false; - this._input.setPlaceHolder(localize('find', "Find")); - } - if (this._tree.getInput()) { - this._tree.refresh(undefined, true); - } - } - private async _revealTreeSelection(model: OutlineModel, element: OutlineElement, focus: boolean, aside: boolean): Promise { await this._editorService.openEditor({ @@ -699,50 +607,7 @@ export class OutlinePanel extends ViewletPanel { // only when outside view port await this._tree.reveal(item, 0.5); } - this._tree.setFocus(item, this); - this._tree.setSelection([item], this); - } - - focusHighlightedElement(up: boolean): void { - if (!this._tree.getInput()) { - return; - } - if (!this._tree.isDOMFocused()) { - this._tree.domFocus(); - return; - } - let navi = this._tree.getNavigator(this._tree.getFocus(), false); - let candidate: any; - while (candidate = up ? navi.previous() : navi.next()) { - if (candidate instanceof OutlineElement && candidate.score && candidate.score[1] > 0) { - this._tree.setFocus(candidate, this); - this._tree.reveal(candidate).then(undefined, onUnexpectedError); - break; - } - } + this._tree.setFocus([item], this._treeFakeUIEvent); + this._tree.setSelection([item], this._treeFakeUIEvent); } } - -async function goUpOrDownToHighligthedElement(accessor: ServicesAccessor, prev: boolean) { - const viewsService = accessor.get(IViewsService); - const view = await viewsService.openView(OutlineViewId); - if (view instanceof OutlinePanel) { - view.focusHighlightedElement(prev); - } -} - -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'outline.focusDownHighlighted', - weight: KeybindingWeight.WorkbenchContrib, - primary: KeyCode.DownArrow, - when: ContextKeyExpr.and(OutlineViewFiltered, OutlineViewFocused), - handler: accessor => goUpOrDownToHighligthedElement(accessor, false) -}); - -KeybindingsRegistry.registerCommandAndKeybindingRule({ - id: 'outline.focusUpHighlighted', - weight: KeybindingWeight.WorkbenchContrib, - primary: KeyCode.UpArrow, - when: ContextKeyExpr.and(OutlineViewFiltered, OutlineViewFocused), - handler: accessor => goUpOrDownToHighligthedElement(accessor, true) -}); diff --git a/src/vs/workbench/parts/output/browser/logViewer.ts b/src/vs/workbench/contrib/output/browser/logViewer.ts similarity index 96% rename from src/vs/workbench/parts/output/browser/logViewer.ts rename to src/vs/workbench/contrib/output/browser/logViewer.ts index 12786761194..6fb19a3e569 100644 --- a/src/vs/workbench/parts/output/browser/logViewer.ts +++ b/src/vs/workbench/contrib/output/browser/logViewer.ts @@ -17,8 +17,8 @@ import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorIn import { URI } from 'vs/base/common/uri'; import { ITextModelService } from 'vs/editor/common/services/resolverService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; -import { LOG_SCHEME, IOutputChannelDescriptor } from 'vs/workbench/parts/output/common/output'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { LOG_SCHEME, IOutputChannelDescriptor } from 'vs/workbench/contrib/output/common/output'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWindowService } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/parts/output/browser/media/clear_output.svg b/src/vs/workbench/contrib/output/browser/media/clear_output.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/clear_output.svg rename to src/vs/workbench/contrib/output/browser/media/clear_output.svg diff --git a/src/vs/workbench/parts/output/browser/media/clear_output_inverse.svg b/src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/clear_output_inverse.svg rename to src/vs/workbench/contrib/output/browser/media/clear_output_inverse.svg diff --git a/src/vs/workbench/parts/output/browser/media/open_log_file.svg b/src/vs/workbench/contrib/output/browser/media/open_log_file.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/open_log_file.svg rename to src/vs/workbench/contrib/output/browser/media/open_log_file.svg diff --git a/src/vs/workbench/parts/output/browser/media/open_log_file_inverse.svg b/src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/open_log_file_inverse.svg rename to src/vs/workbench/contrib/output/browser/media/open_log_file_inverse.svg diff --git a/src/vs/workbench/parts/output/browser/media/output.css b/src/vs/workbench/contrib/output/browser/media/output.css similarity index 100% rename from src/vs/workbench/parts/output/browser/media/output.css rename to src/vs/workbench/contrib/output/browser/media/output.css diff --git a/src/vs/workbench/parts/output/browser/media/output_lock.svg b/src/vs/workbench/contrib/output/browser/media/output_lock.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/output_lock.svg rename to src/vs/workbench/contrib/output/browser/media/output_lock.svg diff --git a/src/vs/workbench/parts/output/browser/media/output_lock_inverse.svg b/src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/output_lock_inverse.svg rename to src/vs/workbench/contrib/output/browser/media/output_lock_inverse.svg diff --git a/src/vs/workbench/parts/output/browser/media/output_unlock.svg b/src/vs/workbench/contrib/output/browser/media/output_unlock.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/output_unlock.svg rename to src/vs/workbench/contrib/output/browser/media/output_unlock.svg diff --git a/src/vs/workbench/parts/output/browser/media/output_unlock_inverse.svg b/src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg similarity index 100% rename from src/vs/workbench/parts/output/browser/media/output_unlock_inverse.svg rename to src/vs/workbench/contrib/output/browser/media/output_unlock_inverse.svg diff --git a/src/vs/workbench/parts/output/browser/outputActions.ts b/src/vs/workbench/contrib/output/browser/outputActions.ts similarity index 98% rename from src/vs/workbench/parts/output/browser/outputActions.ts rename to src/vs/workbench/contrib/output/browser/outputActions.ts index f895e0bb3b0..fb0cfa131c7 100644 --- a/src/vs/workbench/parts/output/browser/outputActions.ts +++ b/src/vs/workbench/contrib/output/browser/outputActions.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import * as aria from 'vs/base/browser/ui/aria/aria'; import { IAction, Action } from 'vs/base/common/actions'; -import { IOutputService, OUTPUT_PANEL_ID, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannelDescriptor } from 'vs/workbench/parts/output/common/output'; +import { IOutputService, OUTPUT_PANEL_ID, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannelDescriptor } from 'vs/workbench/contrib/output/common/output'; import { SelectActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; @@ -20,7 +20,7 @@ import { groupBy } from 'vs/base/common/arrays'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { LogViewerInput } from 'vs/workbench/parts/output/browser/logViewer'; +import { LogViewerInput } from 'vs/workbench/contrib/output/browser/logViewer'; import { ISelectOptionItem } from 'vs/base/browser/ui/selectBox/selectBox'; export class ToggleOutputAction extends TogglePanelAction { diff --git a/src/vs/workbench/parts/output/browser/outputPanel.ts b/src/vs/workbench/contrib/output/browser/outputPanel.ts similarity index 97% rename from src/vs/workbench/parts/output/browser/outputPanel.ts rename to src/vs/workbench/contrib/output/browser/outputPanel.ts index 6c469924c54..d1e887071e8 100644 --- a/src/vs/workbench/parts/output/browser/outputPanel.ts +++ b/src/vs/workbench/contrib/output/browser/outputPanel.ts @@ -17,12 +17,12 @@ import { ServiceCollection } from 'vs/platform/instantiation/common/serviceColle import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { EditorInput, EditorOptions } from 'vs/workbench/common/editor'; import { AbstractTextResourceEditor } from 'vs/workbench/browser/parts/editor/textResourceEditor'; -import { OUTPUT_PANEL_ID, IOutputService, CONTEXT_IN_OUTPUT } from 'vs/workbench/parts/output/common/output'; -import { SwitchOutputAction, SwitchOutputActionItem, ClearOutputAction, ToggleOrSetOutputScrollLockAction, OpenLogOutputFile } from 'vs/workbench/parts/output/browser/outputActions'; +import { OUTPUT_PANEL_ID, IOutputService, CONTEXT_IN_OUTPUT } from 'vs/workbench/contrib/output/common/output'; +import { SwitchOutputAction, SwitchOutputActionItem, ClearOutputAction, ToggleOrSetOutputScrollLockAction, OpenLogOutputFile } from 'vs/workbench/contrib/output/browser/outputActions'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IWindowService } from 'vs/platform/windows/common/windows'; diff --git a/src/vs/workbench/parts/output/common/output.ts b/src/vs/workbench/contrib/output/common/output.ts similarity index 100% rename from src/vs/workbench/parts/output/common/output.ts rename to src/vs/workbench/contrib/output/common/output.ts diff --git a/src/vs/workbench/parts/output/common/outputLinkComputer.ts b/src/vs/workbench/contrib/output/common/outputLinkComputer.ts similarity index 100% rename from src/vs/workbench/parts/output/common/outputLinkComputer.ts rename to src/vs/workbench/contrib/output/common/outputLinkComputer.ts diff --git a/src/vs/workbench/parts/output/common/outputLinkProvider.ts b/src/vs/workbench/contrib/output/common/outputLinkProvider.ts similarity index 92% rename from src/vs/workbench/parts/output/common/outputLinkProvider.ts rename to src/vs/workbench/contrib/output/common/outputLinkProvider.ts index 6d9451401a2..efa955eb5c2 100644 --- a/src/vs/workbench/parts/output/common/outputLinkProvider.ts +++ b/src/vs/workbench/contrib/output/common/outputLinkProvider.ts @@ -8,9 +8,9 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { IModelService } from 'vs/editor/common/services/modelService'; import { LinkProviderRegistry, ILink } from 'vs/editor/common/modes'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { OUTPUT_MODE_ID, LOG_MODE_ID } from 'vs/workbench/parts/output/common/output'; +import { OUTPUT_MODE_ID, LOG_MODE_ID } from 'vs/workbench/contrib/output/common/output'; import { MonacoWebWorker, createWebWorker } from 'vs/editor/common/services/webWorker'; -import { ICreateData, OutputLinkComputer } from 'vs/workbench/parts/output/common/outputLinkComputer'; +import { ICreateData, OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; export class OutputLinkProvider { @@ -65,7 +65,7 @@ export class OutputLinkProvider { }; this.worker = createWebWorker(this.modelService, { - moduleId: 'vs/workbench/parts/output/common/outputLinkComputer', + moduleId: 'vs/workbench/contrib/output/common/outputLinkComputer', createData, label: 'outputLinkComputer' }); diff --git a/src/vs/workbench/parts/output/electron-browser/output.contribution.ts b/src/vs/workbench/contrib/output/electron-browser/output.contribution.ts similarity index 95% rename from src/vs/workbench/parts/output/electron-browser/output.contribution.ts rename to src/vs/workbench/contrib/output/electron-browser/output.contribution.ts index b653b93bb06..e72863b7840 100644 --- a/src/vs/workbench/parts/output/electron-browser/output.contribution.ts +++ b/src/vs/workbench/contrib/output/electron-browser/output.contribution.ts @@ -11,15 +11,15 @@ import { MenuId, MenuRegistry, SyncActionDescriptor } from 'vs/platform/actions/ import { KeybindingsRegistry, IKeybindings } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { OutputService, LogContentProvider } from 'vs/workbench/parts/output/electron-browser/outputServices'; -import { ToggleOutputAction, ClearOutputAction, OpenLogOutputFile, ShowLogsOutputChannelAction, OpenOutputLogFileAction } from 'vs/workbench/parts/output/browser/outputActions'; -import { OUTPUT_MODE_ID, OUTPUT_MIME, OUTPUT_PANEL_ID, IOutputService, CONTEXT_IN_OUTPUT, LOG_SCHEME, LOG_MODE_ID, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT } from 'vs/workbench/parts/output/common/output'; +import { OutputService, LogContentProvider } from 'vs/workbench/contrib/output/electron-browser/outputServices'; +import { ToggleOutputAction, ClearOutputAction, OpenLogOutputFile, ShowLogsOutputChannelAction, OpenOutputLogFileAction } from 'vs/workbench/contrib/output/browser/outputActions'; +import { OUTPUT_MODE_ID, OUTPUT_MIME, OUTPUT_PANEL_ID, IOutputService, CONTEXT_IN_OUTPUT, LOG_SCHEME, LOG_MODE_ID, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT } from 'vs/workbench/contrib/output/common/output'; import { PanelRegistry, Extensions, PanelDescriptor } from 'vs/workbench/browser/panel'; import { CommandsRegistry, ICommandHandler } from 'vs/platform/commands/common/commands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { OutputPanel } from 'vs/workbench/parts/output/browser/outputPanel'; +import { OutputPanel } from 'vs/workbench/contrib/output/browser/outputPanel'; import { IEditorRegistry, Extensions as EditorExtensions, EditorDescriptor } from 'vs/workbench/browser/editor'; -import { LogViewer, LogViewerInput } from 'vs/workbench/parts/output/browser/logViewer'; +import { LogViewer, LogViewerInput } from 'vs/workbench/contrib/output/browser/logViewer'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions, IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; diff --git a/src/vs/workbench/parts/output/electron-browser/outputServices.ts b/src/vs/workbench/contrib/output/electron-browser/outputServices.ts similarity index 99% rename from src/vs/workbench/parts/output/electron-browser/outputServices.ts rename to src/vs/workbench/contrib/output/electron-browser/outputServices.ts index e83e6fe759d..6a9a65811a8 100644 --- a/src/vs/workbench/parts/output/electron-browser/outputServices.ts +++ b/src/vs/workbench/contrib/output/electron-browser/outputServices.ts @@ -14,12 +14,12 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { Registry } from 'vs/platform/registry/common/platform'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { IOutputChannelDescriptor, IOutputChannel, IOutputService, Extensions, OUTPUT_PANEL_ID, IOutputChannelRegistry, OUTPUT_SCHEME, OUTPUT_MIME, LOG_SCHEME, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT, MAX_OUTPUT_LENGTH } from 'vs/workbench/parts/output/common/output'; -import { OutputPanel } from 'vs/workbench/parts/output/browser/outputPanel'; +import { IOutputChannelDescriptor, IOutputChannel, IOutputService, Extensions, OUTPUT_PANEL_ID, IOutputChannelRegistry, OUTPUT_SCHEME, OUTPUT_MIME, LOG_SCHEME, LOG_MIME, CONTEXT_ACTIVE_LOG_OUTPUT, MAX_OUTPUT_LENGTH } from 'vs/workbench/contrib/output/common/output'; +import { OutputPanel } from 'vs/workbench/contrib/output/browser/outputPanel'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { OutputLinkProvider } from 'vs/workbench/parts/output/common/outputLinkProvider'; +import { OutputLinkProvider } from 'vs/workbench/contrib/output/common/outputLinkProvider'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { ITextModel } from 'vs/editor/common/model'; import { IModeService } from 'vs/editor/common/services/modeService'; @@ -340,7 +340,7 @@ class FileOutputChannel extends AbstractFileOutputChannel implements OutputChann private updateInProgress: boolean = false; private etag: string = ''; - private loadModelPromise: Promise = Promise.resolve(); + private loadModelPromise: Promise = Promise.resolve(undefined); constructor( outputChannelDescriptor: IOutputChannelDescriptor, diff --git a/src/vs/workbench/parts/output/test/outputLinkProvider.test.ts b/src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts similarity index 99% rename from src/vs/workbench/parts/output/test/outputLinkProvider.test.ts rename to src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts index a974c7f6e67..3d455d5db3b 100644 --- a/src/vs/workbench/parts/output/test/outputLinkProvider.test.ts +++ b/src/vs/workbench/contrib/output/test/outputLinkProvider.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { URI } from 'vs/base/common/uri'; import { isMacintosh, isLinux } from 'vs/base/common/platform'; -import { OutputLinkComputer } from 'vs/workbench/parts/output/common/outputLinkComputer'; +import { OutputLinkComputer } from 'vs/workbench/contrib/output/common/outputLinkComputer'; import { TestContextService } from 'vs/workbench/test/workbenchTestServices'; function toOSPath(p: string): string { diff --git a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts b/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts similarity index 95% rename from src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts rename to src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts index 45434d18c48..af13ad4f69f 100644 --- a/src/vs/workbench/parts/performance/electron-browser/performance.contribution.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/performance.contribution.ts @@ -11,7 +11,7 @@ import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { Extensions as Input, IEditorInputFactory, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; -import { PerfviewContrib, PerfviewInput } from 'vs/workbench/parts/performance/electron-browser/perfviewEditor'; +import { PerfviewContrib, PerfviewInput } from 'vs/workbench/contrib/performance/electron-browser/perfviewEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { StartupProfiler } from './startupProfiler'; import { StartupTimings } from './startupTimings'; diff --git a/src/vs/workbench/parts/performance/electron-browser/perfviewEditor.ts b/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts similarity index 99% rename from src/vs/workbench/parts/performance/electron-browser/perfviewEditor.ts rename to src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts index 016531777e8..9bb55a53b25 100644 --- a/src/vs/workbench/parts/performance/electron-browser/perfviewEditor.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/perfviewEditor.ts @@ -19,7 +19,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import * as perf from 'vs/base/common/performance'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { writeTransientState } from 'vs/workbench/parts/codeEditor/electron-browser/toggleWordWrap'; +import { writeTransientState } from 'vs/workbench/contrib/codeEditor/electron-browser/toggleWordWrap'; import { mergeSort } from 'vs/base/common/arrays'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import product from 'vs/platform/node/product'; diff --git a/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts similarity index 98% rename from src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts rename to src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts index 86c0b153da5..c9ad9a6a401 100644 --- a/src/vs/workbench/parts/performance/electron-browser/startupProfiler.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupProfiler.ts @@ -14,7 +14,7 @@ import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/ import product from 'vs/platform/node/product'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { PerfviewInput } from 'vs/workbench/parts/performance/electron-browser/perfviewEditor'; +import { PerfviewInput } from 'vs/workbench/contrib/performance/electron-browser/perfviewEditor'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; diff --git a/src/vs/workbench/parts/performance/electron-browser/startupTimings.ts b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts similarity index 96% rename from src/vs/workbench/parts/performance/electron-browser/startupTimings.ts rename to src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts index c1a0b9a2a42..e677f3cc55f 100644 --- a/src/vs/workbench/parts/performance/electron-browser/startupTimings.ts +++ b/src/vs/workbench/contrib/performance/electron-browser/startupTimings.ts @@ -15,7 +15,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IUpdateService } from 'vs/platform/update/common/update'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import * as files from 'vs/workbench/parts/files/common/files'; +import * as files from 'vs/workbench/contrib/files/common/files'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { didUseCachedData, ITimerService } from 'vs/workbench/services/timer/electron-browser/timerService'; @@ -95,7 +95,8 @@ export class StartupTimings implements IWorkbenchContribution { this._logService.info('no standard startup: not just one window'); return false; } - if (!this._viewletService.getActiveViewlet() || this._viewletService.getActiveViewlet().getId() !== files.VIEWLET_ID) { + const activeViewlet = this._viewletService.getActiveViewlet(); + if (!activeViewlet || activeViewlet.getId() !== files.VIEWLET_ID) { this._logService.info('no standard startup: not the explorer viewlet'); return false; } diff --git a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts similarity index 99% rename from src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts rename to src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts index 38ce9d93477..15374d83530 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingWidgets.ts @@ -22,7 +22,7 @@ import { attachInputBoxStyler, attachStylerCallback } from 'vs/platform/theme/co import { IThemeService } from 'vs/platform/theme/common/themeService'; import { editorWidgetBackground, widgetShadow } from 'vs/platform/theme/common/colorRegistry'; import { ScrollType } from 'vs/editor/common/editorCommon'; -import { SearchWidget, SearchOptions } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; +import { SearchWidget, SearchOptions } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; export interface KeybindingsSearchOptions extends SearchOptions { recordEnter?: boolean; diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts similarity index 98% rename from src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts rename to src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts index 72e4cd23c34..32ceacbb842 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditor.ts @@ -21,12 +21,12 @@ import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService import { KeybindingsEditorModel, IKeybindingItemEntry, IListEntry, KEYBINDING_ENTRY_TEMPLATE_ID } from 'vs/workbench/services/preferences/common/keybindingsEditorModel'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IKeybindingService, IUserFriendlyKeybinding } from 'vs/platform/keybinding/common/keybinding'; -import { DefineKeybindingWidget, KeybindingsSearchWidget, KeybindingsSearchOptions } from 'vs/workbench/parts/preferences/browser/keybindingWidgets'; +import { DefineKeybindingWidget, KeybindingsSearchWidget, KeybindingsSearchOptions } from 'vs/workbench/contrib/preferences/browser/keybindingWidgets'; import { IKeybindingsEditor, CONTEXT_KEYBINDING_FOCUS, CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS -} from 'vs/workbench/parts/preferences/common/preferences'; +} from 'vs/workbench/contrib/preferences/common/preferences'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IKeybindingEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { List } from 'vs/base/browser/ui/list/listWidget'; @@ -35,7 +35,7 @@ import { IThemeService, registerThemingParticipant, ITheme, ICssStyleCollector } import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { StandardKeyboardEvent } from 'vs/base/browser/keyboardEvent'; import { KeyCode, ResolvedKeybinding } from 'vs/base/common/keyCodes'; -import { listHighlightForeground, badgeBackground, contrastBorder, badgeForeground } from 'vs/platform/theme/common/colorRegistry'; +import { listHighlightForeground, badgeBackground, contrastBorder, badgeForeground, listActiveSelectionForeground } from 'vs/platform/theme/common/colorRegistry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { EditorExtensionsRegistry } from 'vs/editor/browser/editorExtensions'; import { WorkbenchList } from 'vs/platform/list/browser/listService'; @@ -926,6 +926,7 @@ class WhenColumn extends Column { whenLabel.element.title = keybindingItemEntry.keybindingItem.when; } else { this.whenColumn.textContent = '—'; + this.whenColumn.title = ''; } } @@ -939,4 +940,8 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { if (listHighlightForegroundColor) { collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list-row > .column .highlight { color: ${listHighlightForegroundColor}; }`); } + const listFocusAndSelectionForegroundColor = theme.getColor(listActiveSelectionForeground); + if (listFocusAndSelectionForegroundColor) { + collector.addRule(`.keybindings-editor > .keybindings-body > .keybindings-list-container .monaco-list:focus .monaco-list-row.selected.focused > .column .monaco-keybinding-key { color: ${listFocusAndSelectionForegroundColor}; }`); + } }); diff --git a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts similarity index 98% rename from src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts rename to src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts index 1a678f65c7b..eeac873c1d4 100644 --- a/src/vs/workbench/parts/preferences/browser/keybindingsEditorContribution.ts +++ b/src/vs/workbench/contrib/preferences/browser/keybindingsEditorContribution.ts @@ -16,8 +16,8 @@ import * as editorCommon from 'vs/editor/common/editorCommon'; import { registerEditorContribution, ServicesAccessor, registerEditorCommand, EditorCommand } from 'vs/editor/browser/editorExtensions'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; -import { SmartSnippetInserter } from 'vs/workbench/parts/preferences/common/smartSnippetInserter'; -import { DefineKeybindingOverlayWidget } from 'vs/workbench/parts/preferences/browser/keybindingWidgets'; +import { SmartSnippetInserter } from 'vs/workbench/contrib/preferences/common/smartSnippetInserter'; +import { DefineKeybindingOverlayWidget } from 'vs/workbench/contrib/preferences/browser/keybindingWidgets'; import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWidgets'; import { parseTree, Node } from 'vs/base/common/json'; import { ScanCodeBinding } from 'vs/base/common/scanCode'; diff --git a/src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/action-remove-dark.svg rename to src/vs/workbench/contrib/preferences/browser/media/action-remove-dark.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/action-remove.svg b/src/vs/workbench/contrib/preferences/browser/media/action-remove.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/action-remove.svg rename to src/vs/workbench/contrib/preferences/browser/media/action-remove.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/add.svg b/src/vs/workbench/contrib/preferences/browser/media/add.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/add.svg rename to src/vs/workbench/contrib/preferences/browser/media/add.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/add_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/add_inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/add_inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/add_inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/clean-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/clean-dark.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/clean-dark.svg rename to src/vs/workbench/contrib/preferences/browser/media/clean-dark.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/clean.svg b/src/vs/workbench/contrib/preferences/browser/media/clean.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/clean.svg rename to src/vs/workbench/contrib/preferences/browser/media/clean.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/clear-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/clear-inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/clear-inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/clear.svg b/src/vs/workbench/contrib/preferences/browser/media/clear.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/clear.svg rename to src/vs/workbench/contrib/preferences/browser/media/clear.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/collapseAll.svg b/src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/collapseAll.svg rename to src/vs/workbench/contrib/preferences/browser/media/collapseAll.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/collapseAll_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/collapseAll_inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/collapseAll_inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/collapsed-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/collapsed-dark.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/collapsed-dark.svg rename to src/vs/workbench/contrib/preferences/browser/media/collapsed-dark.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/collapsed.svg b/src/vs/workbench/contrib/preferences/browser/media/collapsed.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/collapsed.svg rename to src/vs/workbench/contrib/preferences/browser/media/collapsed.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/edit.svg b/src/vs/workbench/contrib/preferences/browser/media/edit.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/edit.svg rename to src/vs/workbench/contrib/preferences/browser/media/edit.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/edit_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/edit_inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/edit_inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/edit_inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/ellipsis-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/ellipsis-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/ellipsis-inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/ellipsis-inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/ellipsis.svg b/src/vs/workbench/contrib/preferences/browser/media/ellipsis.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/ellipsis.svg rename to src/vs/workbench/contrib/preferences/browser/media/ellipsis.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/expanded-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/expanded-dark.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/expanded-dark.svg rename to src/vs/workbench/contrib/preferences/browser/media/expanded-dark.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/expanded.svg b/src/vs/workbench/contrib/preferences/browser/media/expanded.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/expanded.svg rename to src/vs/workbench/contrib/preferences/browser/media/expanded.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/info.svg b/src/vs/workbench/contrib/preferences/browser/media/info.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/info.svg rename to src/vs/workbench/contrib/preferences/browser/media/info.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindings.css b/src/vs/workbench/contrib/preferences/browser/media/keybindings.css similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/keybindings.css rename to src/vs/workbench/contrib/preferences/browser/media/keybindings.css diff --git a/src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css b/src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/keybindingsEditor.css rename to src/vs/workbench/contrib/preferences/browser/media/keybindingsEditor.css diff --git a/src/vs/workbench/parts/preferences/browser/media/open-file-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/open-file-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/open-file-inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/open-file-inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/open-file.svg b/src/vs/workbench/contrib/preferences/browser/media/open-file.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/open-file.svg rename to src/vs/workbench/contrib/preferences/browser/media/open-file.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/preferences.css b/src/vs/workbench/contrib/preferences/browser/media/preferences.css similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/preferences.css rename to src/vs/workbench/contrib/preferences/browser/media/preferences.css diff --git a/src/vs/workbench/parts/preferences/browser/media/record-keys-inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/record-keys-inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/record-keys-inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/record-keys.svg b/src/vs/workbench/contrib/preferences/browser/media/record-keys.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/record-keys.svg rename to src/vs/workbench/contrib/preferences/browser/media/record-keys.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/regex-dark.svg b/src/vs/workbench/contrib/preferences/browser/media/regex-dark.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/regex-dark.svg rename to src/vs/workbench/contrib/preferences/browser/media/regex-dark.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/regex.svg b/src/vs/workbench/contrib/preferences/browser/media/regex.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/regex.svg rename to src/vs/workbench/contrib/preferences/browser/media/regex.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/settingsWidgets.css b/src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/settingsWidgets.css rename to src/vs/workbench/contrib/preferences/browser/media/settingsWidgets.css diff --git a/src/vs/workbench/parts/preferences/browser/media/sort_precedence.svg b/src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/sort_precedence.svg rename to src/vs/workbench/contrib/preferences/browser/media/sort_precedence.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/sort_precedence_inverse.svg b/src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/sort_precedence_inverse.svg rename to src/vs/workbench/contrib/preferences/browser/media/sort_precedence_inverse.svg diff --git a/src/vs/workbench/parts/preferences/browser/media/status-error.svg b/src/vs/workbench/contrib/preferences/browser/media/status-error.svg similarity index 100% rename from src/vs/workbench/parts/preferences/browser/media/status-error.svg rename to src/vs/workbench/contrib/preferences/browser/media/status-error.svg diff --git a/src/vs/workbench/parts/preferences/browser/preferencesActions.ts b/src/vs/workbench/contrib/preferences/browser/preferencesActions.ts similarity index 100% rename from src/vs/workbench/parts/preferences/browser/preferencesActions.ts rename to src/vs/workbench/contrib/preferences/browser/preferencesActions.ts diff --git a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts similarity index 99% rename from src/vs/workbench/parts/preferences/browser/preferencesEditor.ts rename to src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts index 8e8da3a6699..21c46e7f5fb 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesEditor.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesEditor.ts @@ -44,11 +44,11 @@ import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { BaseTextEditor } from 'vs/workbench/browser/parts/editor/textEditor'; import { EditorInput, EditorOptions, IEditorControl } from 'vs/workbench/common/editor'; import { ResourceEditorModel } from 'vs/workbench/common/editor/resourceEditorModel'; -import { DefaultSettingsRenderer, FolderSettingsRenderer, IPreferencesRenderer, UserSettingsRenderer, WorkspaceSettingsRenderer } from 'vs/workbench/parts/preferences/browser/preferencesRenderers'; -import { SearchWidget, SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, IPreferencesSearchService, ISearchProvider, CONTEXT_SETTINGS_JSON_EDITOR } from 'vs/workbench/parts/preferences/common/preferences'; +import { DefaultSettingsRenderer, FolderSettingsRenderer, IPreferencesRenderer, UserSettingsRenderer, WorkspaceSettingsRenderer } from 'vs/workbench/contrib/preferences/browser/preferencesRenderers'; +import { SearchWidget, SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; +import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, IPreferencesSearchService, ISearchProvider, CONTEXT_SETTINGS_JSON_EDITOR } from 'vs/workbench/contrib/preferences/common/preferences'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IFilterResult, IPreferencesService, ISearchResult, ISetting, ISettingsEditorModel, ISettingsGroup, SettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultPreferencesEditorInput, PreferencesEditorInput } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { DefaultSettingsEditorModel, SettingsEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts similarity index 99% rename from src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts rename to src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts index 0ba9ee2e032..2a41d7d7568 100644 --- a/src/vs/workbench/parts/preferences/browser/preferencesRenderers.ts +++ b/src/vs/workbench/contrib/preferences/browser/preferencesRenderers.ts @@ -26,7 +26,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { RangeHighlightDecorations } from 'vs/workbench/browser/parts/editor/rangeDecorations'; -import { DefaultSettingsHeaderWidget, EditPreferenceWidget, SettingsGroupTitleWidget, SettingsHeaderWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; +import { DefaultSettingsHeaderWidget, EditPreferenceWidget, SettingsGroupTitleWidget, SettingsHeaderWidget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; import { IFilterResult, IPreferencesEditorModel, IPreferencesService, ISetting, ISettingsEditorModel, ISettingsGroup } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultSettingsEditorModel, SettingsEditorModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; diff --git a/src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts b/src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts similarity index 100% rename from src/vs/workbench/parts/preferences/browser/preferencesWidgets.ts rename to src/vs/workbench/contrib/preferences/browser/preferencesWidgets.ts diff --git a/src/vs/workbench/parts/preferences/browser/settingsLayout.ts b/src/vs/workbench/contrib/preferences/browser/settingsLayout.ts similarity index 100% rename from src/vs/workbench/parts/preferences/browser/settingsLayout.ts rename to src/vs/workbench/contrib/preferences/browser/settingsLayout.ts diff --git a/src/vs/workbench/parts/preferences/browser/settingsTree.ts b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts similarity index 95% rename from src/vs/workbench/parts/preferences/browser/settingsTree.ts rename to src/vs/workbench/contrib/preferences/browser/settingsTree.ts index 9f13b1ae66e..2cf8a3ab2c2 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTree.ts @@ -41,10 +41,10 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { editorBackground, errorForeground, focusBorder, foreground, inputValidationErrorBackground, inputValidationErrorBorder, inputValidationErrorForeground } from 'vs/platform/theme/common/colorRegistry'; import { attachButtonStyler, attachInputBoxStyler, attachSelectBoxStyler, attachStyler } from 'vs/platform/theme/common/styler'; import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; -import { ITOCEntry } from 'vs/workbench/parts/preferences/browser/settingsLayout'; -import { ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; -import { ExcludeSettingWidget, IExcludeChangeEvent, IExcludeDataItem, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/parts/preferences/browser/settingsWidgets'; -import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/parts/preferences/common/preferences'; +import { ITOCEntry } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; +import { ISettingsEditorViewState, settingKeyToDisplayFormat, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeNewExtensionsElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; +import { ExcludeSettingWidget, IExcludeChangeEvent, IExcludeDataItem, settingsHeaderForeground, settingsNumberInputBackground, settingsNumberInputBorder, settingsNumberInputForeground, settingsSelectBackground, settingsSelectBorder, settingsSelectForeground, settingsSelectListBorder, settingsTextInputBackground, settingsTextInputBorder, settingsTextInputForeground } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; import { ISetting, ISettingsGroup, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; const $ = DOM.$; @@ -256,6 +256,8 @@ export abstract class AbstractSettingRenderer implements ITreeRenderer { templateId = SETTINGS_TEXT_TEMPLATE_ID; - renderTemplate(container: HTMLElement): ISettingTextItemTemplate { - const common = this.renderCommonTemplate(null, container, 'text'); - const validationErrorMessageElement = DOM.append(container, $('.setting-item-validation-message')); + renderTemplate(_container: HTMLElement): ISettingTextItemTemplate { + const common = this.renderCommonTemplate(null, _container, 'text'); + const validationErrorMessageElement = DOM.append(common.containerElement, $('.setting-item-validation-message')); const inputBox = new InputBox(common.controlElement, this._contextViewService); common.toDispose.push(inputBox); @@ -851,9 +855,9 @@ export class SettingEnumRenderer extends AbstractSettingRenderer implements ITre export class SettingNumberRenderer extends AbstractSettingRenderer implements ITreeRenderer { templateId = SETTINGS_NUMBER_TEMPLATE_ID; - renderTemplate(container: HTMLElement): ISettingNumberItemTemplate { - const common = super.renderCommonTemplate(null, container, 'number'); - const validationErrorMessageElement = DOM.append(container, $('.setting-item-validation-message')); + renderTemplate(_container: HTMLElement): ISettingNumberItemTemplate { + const common = super.renderCommonTemplate(null, _container, 'number'); + const validationErrorMessageElement = DOM.append(common.containerElement, $('.setting-item-validation-message')); const inputBox = new InputBox(common.controlElement, this._contextViewService, { type: 'number' }); common.toDispose.push(inputBox); @@ -906,9 +910,11 @@ export class SettingNumberRenderer extends AbstractSettingRenderer implements IT export class SettingBoolRenderer extends AbstractSettingRenderer implements ITreeRenderer { templateId = SETTINGS_BOOL_TEMPLATE_ID; - renderTemplate(container: HTMLElement): ISettingBoolItemTemplate { - DOM.addClass(container, 'setting-item'); - DOM.addClass(container, 'setting-item-bool'); + renderTemplate(_container: HTMLElement): ISettingBoolItemTemplate { + DOM.addClass(_container, 'setting-item'); + DOM.addClass(_container, 'setting-item-bool'); + + const container = DOM.append(_container, $(AbstractSettingRenderer.CONTENTS_SELECTOR)); const titleElement = DOM.append(container, $('.setting-item-title')); const categoryElement = DOM.append(titleElement, $('span.setting-item-category')); @@ -1073,7 +1079,7 @@ export class SettingTreeRenderers { } getSettingDOMElementForDOMElement(domElement: HTMLElement): HTMLElement { - const parent = DOM.findParentWithClass(domElement, 'setting-item'); + const parent = DOM.findParentWithClass(domElement, AbstractSettingRenderer.CONTENTS_CLASS); if (parent) { return parent; } @@ -1324,27 +1330,27 @@ export class SettingsTree extends ObjectTree { // Links appear inside other elements in markdown. CSS opacity acts like a mask. So we have to dynamically compute the description color to avoid // applying an opacity to the link color. const fgWithOpacity = new Color(new RGBA(foregroundColor.rgba.r, foregroundColor.rgba.g, foregroundColor.rgba.b, 0.9)); - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description { color: ${fgWithOpacity}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description { color: ${fgWithOpacity}; }`); } const errorColor = theme.getColor(errorForeground); if (errorColor) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-deprecation-message { color: ${errorColor}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-deprecation-message { color: ${errorColor}; }`); } const invalidInputBackground = theme.getColor(inputValidationErrorBackground); if (invalidInputBackground) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-validation-message { background-color: ${invalidInputBackground}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-validation-message { background-color: ${invalidInputBackground}; }`); } const invalidInputForeground = theme.getColor(inputValidationErrorForeground); if (invalidInputForeground) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-validation-message { color: ${invalidInputForeground}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-validation-message { color: ${invalidInputForeground}; }`); } const invalidInputBorder = theme.getColor(inputValidationErrorBorder); if (invalidInputBorder) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-validation-message { border-style:solid; border-width: 1px; border-color: ${invalidInputBorder}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-validation-message { border-style:solid; border-width: 1px; border-color: ${invalidInputBorder}; }`); collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item.invalid-input .setting-item-control .monaco-inputbox.idle { outline-width: 0; border-style:solid; border-width: 1px; border-color: ${invalidInputBorder}; }`); } @@ -1356,7 +1362,7 @@ export class SettingsTree extends ObjectTree { const focusBorderColor = theme.getColor(focusBorder); if (focusBorderColor) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:focus { outline-color: ${focusBorderColor} }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:focus { outline-color: ${focusBorderColor} }`); } })); diff --git a/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts similarity index 98% rename from src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts rename to src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts index 7deca62b6af..879d9a9e49f 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsTreeModels.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsTreeModels.ts @@ -9,10 +9,10 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; -import { SettingsTarget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { ITOCEntry, knownAcronyms } from 'vs/workbench/parts/preferences/browser/settingsLayout'; +import { SettingsTarget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; +import { ITOCEntry, knownAcronyms } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; import { IExtensionSetting, ISearchResult, ISetting, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; -import { MODIFIED_SETTING_TAG } from 'vs/workbench/parts/preferences/common/preferences'; +import { MODIFIED_SETTING_TAG } from 'vs/workbench/contrib/preferences/common/preferences'; export const ONLINE_SERVICES_SETTING_TAG = 'usesOnlineServices'; diff --git a/src/vs/workbench/parts/preferences/browser/settingsWidgets.ts b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts similarity index 96% rename from src/vs/workbench/parts/preferences/browser/settingsWidgets.ts rename to src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts index bde2e02e2b0..39d3f19aae5 100644 --- a/src/vs/workbench/parts/preferences/browser/settingsWidgets.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsWidgets.ts @@ -63,16 +63,16 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { const link = theme.getColor(textLinkForeground); if (link) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a { color: ${link}; }`); - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a > code { color: ${link}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a { color: ${link}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a > code { color: ${link}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a { color: ${link}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a > code { color: ${link}; }`); } const activeLink = theme.getColor(textLinkActiveForeground); if (activeLink) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:hover, .settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:active { color: ${activeLink}; }`); - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:hover > code, .settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:active > code { color: ${activeLink}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:hover, .settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:active { color: ${activeLink}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:hover > code, .settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:active > code { color: ${activeLink}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover, .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active { color: ${activeLink}; }`); collector.addRule(`.monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:hover > code, .monaco-select-box-dropdown-container > .select-box-details-pane > .select-box-description-markdown a:active > code { color: ${activeLink}; }`); } @@ -127,7 +127,7 @@ registerThemingParticipant((theme: ITheme, collector: ICssStyleCollector) => { const modifiedItemIndicatorColor = theme.getColor(modifiedItemIndicator); if (modifiedItemIndicatorColor) { - collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item > .setting-item-modified-indicator { border-color: ${modifiedItemIndicatorColor}; }`); + collector.addRule(`.settings-editor > .settings-body > .settings-tree-container .setting-item-contents > .setting-item-modified-indicator { border-color: ${modifiedItemIndicatorColor}; }`); } }); diff --git a/src/vs/workbench/parts/preferences/browser/tocTree.ts b/src/vs/workbench/contrib/preferences/browser/tocTree.ts similarity index 96% rename from src/vs/workbench/parts/preferences/browser/tocTree.ts rename to src/vs/workbench/contrib/preferences/browser/tocTree.ts index ac87ea537d6..0928faa4d2b 100644 --- a/src/vs/workbench/parts/preferences/browser/tocTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/tocTree.ts @@ -13,9 +13,9 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { editorBackground } from 'vs/platform/theme/common/colorRegistry'; import { attachStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; -import { SettingsTreeFilter } from 'vs/workbench/parts/preferences/browser/settingsTree'; -import { ISettingsEditorViewState, SearchResultModel, SettingsTreeElement, SettingsTreeGroupElement, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; -import { settingsHeaderForeground } from 'vs/workbench/parts/preferences/browser/settingsWidgets'; +import { SettingsTreeFilter } from 'vs/workbench/contrib/preferences/browser/settingsTree'; +import { ISettingsEditorViewState, SearchResultModel, SettingsTreeElement, SettingsTreeGroupElement, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; +import { settingsHeaderForeground } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; const $ = DOM.$; diff --git a/src/vs/workbench/parts/preferences/common/preferences.ts b/src/vs/workbench/contrib/preferences/common/preferences.ts similarity index 100% rename from src/vs/workbench/parts/preferences/common/preferences.ts rename to src/vs/workbench/contrib/preferences/common/preferences.ts diff --git a/src/vs/workbench/parts/preferences/common/preferencesContribution.ts b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts similarity index 98% rename from src/vs/workbench/parts/preferences/common/preferencesContribution.ts rename to src/vs/workbench/contrib/preferences/common/preferencesContribution.ts index 5a5854a41c1..c1a65046bc1 100644 --- a/src/vs/workbench/parts/preferences/common/preferencesContribution.ts +++ b/src/vs/workbench/contrib/preferences/common/preferencesContribution.ts @@ -21,7 +21,7 @@ import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IEditorInput } from 'vs/workbench/common/editor'; import { IEditorService, IOpenEditorOverride } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { FOLDER_SETTINGS_PATH, IPreferencesService, USE_SPLIT_JSON_SETTING } from 'vs/workbench/services/preferences/common/preferences'; const schemaRegistry = Registry.as(JSONContributionRegistry.Extensions.JSONContribution); diff --git a/src/vs/workbench/parts/preferences/common/smartSnippetInserter.ts b/src/vs/workbench/contrib/preferences/common/smartSnippetInserter.ts similarity index 100% rename from src/vs/workbench/parts/preferences/common/smartSnippetInserter.ts rename to src/vs/workbench/contrib/preferences/common/smartSnippetInserter.ts diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/check-inverse.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/check-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/check-inverse.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/check-inverse.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/check.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/check.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/check.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/check.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/configure-inverse.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/configure-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/configure-inverse.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/configure-inverse.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/configure.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/configure.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/configure.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/configure.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/edit-json-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/edit-json-inverse.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/edit-json.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/edit-json.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/edit-json.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg b/src/vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg similarity index 100% rename from src/vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg rename to src/vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg diff --git a/src/vs/workbench/parts/preferences/electron-browser/media/settingsEditor2.css b/src/vs/workbench/contrib/preferences/electron-browser/media/settingsEditor2.css similarity index 85% rename from src/vs/workbench/parts/preferences/electron-browser/media/settingsEditor2.css rename to src/vs/workbench/contrib/preferences/electron-browser/media/settingsEditor2.css index 0674380596b..3c84a5c7efe 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/media/settingsEditor2.css +++ b/src/vs/workbench/contrib/preferences/electron-browser/media/settingsEditor2.css @@ -122,31 +122,9 @@ text-decoration: underline; } -.settings-editor.narrow-width > .settings-body .settings-tree-container .monaco-list-rows { - margin-left: 0px; -} - -.settings-editor > .settings-body .settings-tree-container .monaco-list-rows { - max-width: 1000px; - margin: auto; -} - -.settings-editor > .settings-body .settings-tree-container .monaco-list-row { - line-height: 1.4em !important; /* TODO */ - padding-left: 208px; - padding-right: 24px; - /* box-sizing: border-box; */ -} - -.settings-editor > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-row { - position: relative; -} - -.settings-editor.no-toc-search > .settings-body .settings-tree-container .monaco-list-row, -.settings-editor.narrow-width > .settings-body .settings-tree-container .monaco-list-row { - /* 3 margin + 20 padding + 2 border */ - width: calc(100% - 25px); - padding-left: 25px; +.settings-editor.no-toc-search > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-contents, +.settings-editor.narrow-width > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-contents { + padding-left: 33px; } .settings-editor > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-twistie { @@ -162,14 +140,15 @@ .settings-editor > .settings-body > .settings-tree-container .shadow.top { left: 50%; - max-width: 952px; /* 1000 - 24*2 padding */ + max-width: 952px; + /* 1000 - 24*2 padding */ margin-left: -476px; z-index: 1000; } .settings-editor > .settings-body .settings-tree-container .setting-toolbar-container { position: absolute; - left: -23px; + left: -32px; top: 11px; bottom: 0px; width: 26px; @@ -270,7 +249,6 @@ padding-left: 31px; } -.settings-editor > .settings-body .settings-tree-container .monaco-list-rows, .settings-editor > .settings-body .settings-toc-wrapper { height: 100%; max-width: 1000px; @@ -283,94 +261,105 @@ } .settings-editor > .settings-body > .settings-tree-container .monaco-list-row { + line-height: 1.4em !important; + + /* so validation messages don't get clipped */ overflow: visible; - /* so validation messages dont get clipped */ cursor: default; } -.settings-editor > .settings-body > .settings-tree-container .setting-item { - padding-top: 12px; - padding-bottom: 18px; +.settings-editor > .settings-body .settings-tree-container .monaco-list-row .monaco-tl-contents { + max-width: 1000px; + margin: auto; box-sizing: border-box; - white-space: normal; - height: 100%; + padding-left: 217px; + padding-right: 20px; + overflow: visible; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-title { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents { + position: relative; + padding-top: 12px; + padding-bottom: 18px; + white-space: normal; +} + +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; - display: inline-block; /* size to contents for hover to show context button */ + display: inline-block; + /* size to contents for hover to show context button */ } -.settings-editor > .settings-body > .settings-tree-container .setting-item > .setting-item-modified-indicator { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-modified-indicator { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.is-configured > .setting-item-modified-indicator { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents.is-configured .setting-item-modified-indicator { display: block; content: ' '; position: absolute; width: 6px; border-left-width: 2px; border-left-style: solid; - left: 0px; + left: -9px; top: 15px; bottom: 16px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item-bool.is-configured > .setting-item-modified-indicator { +.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-item-contents.is-configured .setting-item-modified-indicator { bottom: 23px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-title .setting-item-overrides { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides { opacity: 0.5; font-style: italic; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-title .setting-item-overrides a.modified-scope { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-title .setting-item-overrides a.modified-scope { text-decoration: underline; cursor: pointer; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-label { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-label { margin-right: 7px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-cat-label-container { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-cat-label-container { float: left; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-label, -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-category { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-label, +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-category { font-weight: 600; user-select: text; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-category { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-category { opacity: 0.9; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-deprecation-message { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-deprecation-message { margin-top: 3px; user-select: text; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description { margin-top: -1px; user-select: text; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-deprecation-message { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-deprecation-message { position: absolute; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-validation-message { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-validation-message { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.invalid-input .setting-item-validation-message { +.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-contents.invalid-input .setting-item-validation-message { display: block; position: absolute; padding: 5px; @@ -392,35 +381,35 @@ -webkit-appearance: none !important; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown * { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown * { margin: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:focus { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:focus { outline: 1px solid -webkit-focus-ring-color; outline-offset: -1px; text-decoration: underline; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown a:hover { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown a:hover { text-decoration: underline; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-description-markdown code { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-description-markdown code { line-height: 15px; /** For some reason, this is needed, otherwise will take up 20px height */ font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback"; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-enumDescription { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-enumDescription { display: none; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-enumDescription { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-enumDescription { display: block; } -.settings-editor > .settings-body > .settings-tree-container .setting-item.setting-item-bool { +.settings-editor > .settings-body > .settings-tree-container .setting-item-bool .setting-item-contents { padding-bottom: 26px; } @@ -449,7 +438,7 @@ background: url('check-inverse.svg') center center no-repeat; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-value { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value { margin-top: 9px; display: flex; } @@ -471,15 +460,15 @@ width: 320px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-value .edit-in-settings-button, -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-value .edit-in-settings-button:hover, -.settings-editor > .settings-body > .settings-tree-container .setting-item .setting-item-value .edit-in-settings-button:active { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button, +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:hover, +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .setting-item-value .edit-in-settings-button:active { text-align: left; text-decoration: underline; padding-left: 0px; } -.settings-editor > .settings-body > .settings-tree-container .setting-item .monaco-select-box { +.settings-editor > .settings-body > .settings-tree-container .setting-item-contents .monaco-select-box { width: initial; font: inherit; height: 26px; @@ -495,12 +484,6 @@ padding: 4px 10px; } -.settings-editor > .settings-body > .settings-tree-container .group-title, -.settings-editor > .settings-body > .settings-tree-container .setting-item { - padding-left: 9px; - padding-right: 9px; -} - .settings-editor > .settings-body > .settings-tree-container .group-title { cursor: default; } diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts b/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts similarity index 94% rename from src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts rename to src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts index 3e43d22c5e7..b1668428f7d 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferences.contribution.ts +++ b/src/vs/workbench/contrib/preferences/electron-browser/preferences.contribution.ts @@ -26,17 +26,17 @@ import { Extensions, IWorkbenchActionRegistry } from 'vs/workbench/common/action import { Extensions as WorkbenchExtensions, IWorkbenchContribution, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { EditorInput, Extensions as EditorInputExtensions, IEditorInputFactory, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { KeybindingsEditor } from 'vs/workbench/parts/preferences/browser/keybindingsEditor'; -import { ConfigureLanguageBasedSettingsAction, OpenDefaultKeybindingsFileAction, OpenFolderSettingsAction, OpenGlobalKeybindingsAction, OpenGlobalKeybindingsFileAction, OpenGlobalSettingsAction, OpenRawDefaultSettingsAction, OpenSettings2Action, OpenSettingsJsonAction, OpenWorkspaceSettingsAction, OPEN_FOLDER_SETTINGS_COMMAND, OPEN_FOLDER_SETTINGS_LABEL } from 'vs/workbench/parts/preferences/browser/preferencesActions'; -import { PreferencesEditor } from 'vs/workbench/parts/preferences/browser/preferencesEditor'; -import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IKeybindingsEditor, IPreferencesSearchService, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING, SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED, SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, SETTINGS_EDITOR_COMMAND_FOCUS_FILE, SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST, SETTINGS_EDITOR_COMMAND_SEARCH, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON, SETTINGS_COMMAND_OPEN_SETTINGS } from 'vs/workbench/parts/preferences/common/preferences'; -import { PreferencesContribution } from 'vs/workbench/parts/preferences/common/preferencesContribution'; -import { PreferencesSearchService } from 'vs/workbench/parts/preferences/electron-browser/preferencesSearch'; -import { SettingsEditor2 } from 'vs/workbench/parts/preferences/electron-browser/settingsEditor2'; +import { KeybindingsEditor } from 'vs/workbench/contrib/preferences/browser/keybindingsEditor'; +import { ConfigureLanguageBasedSettingsAction, OpenDefaultKeybindingsFileAction, OpenFolderSettingsAction, OpenGlobalKeybindingsAction, OpenGlobalKeybindingsFileAction, OpenGlobalSettingsAction, OpenRawDefaultSettingsAction, OpenSettings2Action, OpenSettingsJsonAction, OpenWorkspaceSettingsAction, OPEN_FOLDER_SETTINGS_COMMAND, OPEN_FOLDER_SETTINGS_LABEL } from 'vs/workbench/contrib/preferences/browser/preferencesActions'; +import { PreferencesEditor } from 'vs/workbench/contrib/preferences/browser/preferencesEditor'; +import { CONTEXT_KEYBINDINGS_EDITOR, CONTEXT_KEYBINDINGS_SEARCH_FOCUS, CONTEXT_KEYBINDING_FOCUS, CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_JSON_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IKeybindingsEditor, IPreferencesSearchService, KEYBINDINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, KEYBINDINGS_EDITOR_COMMAND_COPY, KEYBINDINGS_EDITOR_COMMAND_COPY_COMMAND, KEYBINDINGS_EDITOR_COMMAND_DEFINE, KEYBINDINGS_EDITOR_COMMAND_FOCUS_KEYBINDINGS, KEYBINDINGS_EDITOR_COMMAND_RECORD_SEARCH_KEYS, KEYBINDINGS_EDITOR_COMMAND_REMOVE, KEYBINDINGS_EDITOR_COMMAND_RESET, KEYBINDINGS_EDITOR_COMMAND_SEARCH, KEYBINDINGS_EDITOR_COMMAND_SHOW_SIMILAR, KEYBINDINGS_EDITOR_COMMAND_SORTBY_PRECEDENCE, KEYBINDINGS_EDITOR_SHOW_DEFAULT_KEYBINDINGS, KEYBINDINGS_EDITOR_SHOW_USER_KEYBINDINGS, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_CLEAR_SEARCH_RESULTS, SETTINGS_EDITOR_COMMAND_EDIT_FOCUSED_SETTING, SETTINGS_EDITOR_COMMAND_FILTER_MODIFIED, SETTINGS_EDITOR_COMMAND_FILTER_ONLINE, SETTINGS_EDITOR_COMMAND_FOCUS_FILE, SETTINGS_EDITOR_COMMAND_FOCUS_NEXT_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_PREVIOUS_SETTING, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_FROM_SEARCH, SETTINGS_EDITOR_COMMAND_FOCUS_SETTINGS_LIST, SETTINGS_EDITOR_COMMAND_SEARCH, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU, SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON, SETTINGS_COMMAND_OPEN_SETTINGS } from 'vs/workbench/contrib/preferences/common/preferences'; +import { PreferencesContribution } from 'vs/workbench/contrib/preferences/common/preferencesContribution'; +import { PreferencesSearchService } from 'vs/workbench/contrib/preferences/electron-browser/preferencesSearch'; +import { SettingsEditor2 } from 'vs/workbench/contrib/preferences/electron-browser/settingsEditor2'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultPreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; -import { ExplorerRootContext, ExplorerFolderContext } from 'vs/workbench/parts/files/common/files'; +import { ExplorerRootContext, ExplorerFolderContext } from 'vs/workbench/contrib/files/common/files'; registerSingleton(IPreferencesSearchService, PreferencesSearchService, true); @@ -366,8 +366,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: OpenGlobalKeybindingsAction.ID, title: OpenGlobalKeybindingsAction.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg`)) } }, when: ResourceContextKey.Resource.isEqualTo(URI.file(environmentService.appKeybindingsPath).toString()), @@ -382,8 +382,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg`)) } }, when: ResourceContextKey.Resource.isEqualTo(URI.file(environmentService.appSettingsPath).toString()), @@ -406,8 +406,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg`)) } }, when: ContextKeyExpr.and(ResourceContextKey.Resource.isEqualTo(this.preferencesService.workspaceSettingsResource.toString()), new RawContextKey('workbenchState', '').isEqualTo('workspace')), @@ -434,8 +434,8 @@ class PreferencesActionsContribution extends Disposable implements IWorkbenchCon id: commandId, title: OpenSettings2Action.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/preferences-editor-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/preferences-editor-inverse.svg`)) } }, when: ContextKeyExpr.and(ResourceContextKey.Resource.isEqualTo(this.preferencesService.getFolderSettingsResource(folder.uri).toString())), @@ -499,8 +499,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: OpenGlobalKeybindingsFileAction.ID, title: OpenGlobalKeybindingsFileAction.LABEL, iconLocation: { - light: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/edit-json.svg`)), - dark: URI.parse(require.toUrl(`vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg`)) + light: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/edit-json.svg`)), + dark: URI.parse(require.toUrl(`vs/workbench/contrib/preferences/electron-browser/media/edit-json-inverse.svg`)) } }, when: ContextKeyExpr.and(CONTEXT_KEYBINDINGS_EDITOR), @@ -737,8 +737,8 @@ MenuRegistry.appendMenuItem(MenuId.EditorTitle, { id: SETTINGS_EDITOR_COMMAND_SWITCH_TO_JSON, title: nls.localize('openSettingsJson', "Open Settings (JSON)"), iconLocation: { - dark: URI.parse(require.toUrl('vs/workbench/parts/preferences/electron-browser/media/edit-json-inverse.svg')), - light: URI.parse(require.toUrl('vs/workbench/parts/preferences/electron-browser/media/edit-json.svg')) + dark: URI.parse(require.toUrl('vs/workbench/contrib/preferences/electron-browser/media/edit-json-inverse.svg')), + light: URI.parse(require.toUrl('vs/workbench/contrib/preferences/electron-browser/media/edit-json.svg')) } }, group: 'navigation', diff --git a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts b/src/vs/workbench/contrib/preferences/electron-browser/preferencesSearch.ts similarity index 99% rename from src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts rename to src/vs/workbench/contrib/preferences/electron-browser/preferencesSearch.ts index 3a6380c53e4..431ab1c2b3b 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/preferencesSearch.ts +++ b/src/vs/workbench/contrib/preferences/electron-browser/preferencesSearch.ts @@ -19,7 +19,7 @@ import { asJson } from 'vs/base/node/request'; import { Disposable } from 'vs/base/common/lifecycle'; import { IExtensionManagementService, ILocalExtension, IExtensionEnablementService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ILogService } from 'vs/platform/log/common/log'; -import { IPreferencesSearchService, ISearchProvider, IWorkbenchSettingsConfiguration } from 'vs/workbench/parts/preferences/common/preferences'; +import { IPreferencesSearchService, ISearchProvider, IWorkbenchSettingsConfiguration } from 'vs/workbench/contrib/preferences/common/preferences'; import { CancellationToken } from 'vs/base/common/cancellation'; import { canceled } from 'vs/base/common/errors'; import { ExtensionType } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/electron-browser/settingsEditor2.ts similarity index 93% rename from src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts rename to src/vs/workbench/contrib/preferences/electron-browser/settingsEditor2.ts index 3d677bad6fd..d29ebd7cf75 100644 --- a/src/vs/workbench/parts/preferences/electron-browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/electron-browser/settingsEditor2.ts @@ -28,15 +28,15 @@ import { attachStylerCallback } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { IEditor, IEditorMemento } from 'vs/workbench/common/editor'; -import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/workbench/parts/codeEditor/electron-browser/suggestEnabledInput'; -import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/parts/preferences/browser/preferencesWidgets'; -import { commonlyUsedData, tocData } from 'vs/workbench/parts/preferences/browser/settingsLayout'; -import { AbstractSettingRenderer, ISettingLinkClickEvent, ISettingOverrideClickEvent, resolveExtensionsSettings, resolveSettingsTree, SettingsTree, SettingTreeRenderers } from 'vs/workbench/parts/preferences/browser/settingsTree'; -import { ISettingsEditorViewState, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; -import { settingsTextInputBorder } from 'vs/workbench/parts/preferences/browser/settingsWidgets'; -import { createTOCIterator, TOCTree, TOCTreeModel } from 'vs/workbench/parts/preferences/browser/tocTree'; -import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/parts/preferences/common/preferences'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { attachSuggestEnabledInputBoxStyler, SuggestEnabledInput } from 'vs/workbench/contrib/codeEditor/electron-browser/suggestEnabledInput'; +import { SettingsTarget, SettingsTargetsWidget } from 'vs/workbench/contrib/preferences/browser/preferencesWidgets'; +import { commonlyUsedData, tocData } from 'vs/workbench/contrib/preferences/browser/settingsLayout'; +import { AbstractSettingRenderer, ISettingLinkClickEvent, ISettingOverrideClickEvent, resolveExtensionsSettings, resolveSettingsTree, SettingsTree, SettingTreeRenderers } from 'vs/workbench/contrib/preferences/browser/settingsTree'; +import { ISettingsEditorViewState, parseQuery, SearchResultIdx, SearchResultModel, SettingsTreeElement, SettingsTreeGroupChild, SettingsTreeGroupElement, SettingsTreeModel, SettingsTreeSettingElement } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; +import { settingsTextInputBorder } from 'vs/workbench/contrib/preferences/browser/settingsWidgets'; +import { createTOCIterator, TOCTree, TOCTreeModel } from 'vs/workbench/contrib/preferences/browser/tocTree'; +import { CONTEXT_SETTINGS_EDITOR, CONTEXT_SETTINGS_SEARCH_FOCUS, CONTEXT_TOC_ROW_FOCUS, IPreferencesSearchService, ISearchProvider, MODIFIED_SETTING_TAG, SETTINGS_EDITOR_COMMAND_SHOW_CONTEXT_MENU } from 'vs/workbench/contrib/preferences/common/preferences'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPreferencesService, ISearchResult, ISettingsEditorModel, ISettingsEditorOptions, SettingsEditorOptions, SettingValueType } from 'vs/workbench/services/preferences/common/preferences'; import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; @@ -488,57 +488,81 @@ export class SettingsEditor2 extends BaseEditor { this.createTOC(bodyContainer); - // this.createFocusSink( - // bodyContainer, - // e => { - // if (DOM.findParentWithClass(e.relatedTarget, 'settings-editor-tree')) { - // if (this.settingsTree.getScrollPosition() > 0) { - // const firstElement = this.settingsTree.getFirstVisibleElement(); - // this.settingsTree.reveal(firstElement, 0.1); - // return true; - // } - // } else { - // const firstControl = this.settingsTree.getHTMLElement().querySelector(SettingsRenderer.CONTROL_SELECTOR); - // if (firstControl) { - // (firstControl).focus(); - // } - // } + this.createFocusSink( + bodyContainer, + e => { + if (DOM.findParentWithClass(e.relatedTarget, 'settings-editor-tree')) { + if (this.settingsTree.scrollTop > 0) { + const firstElement = this.getFirstVisibleElement(); + this.settingsTree.reveal(firstElement, 0.1); + return true; + } + } else { + const firstControl = this.settingsTree.getHTMLElement().querySelector(AbstractSettingRenderer.CONTROL_SELECTOR); + if (firstControl) { + (firstControl).focus(); + } + } - // return false; - // }, - // 'settings list focus helper'); + return false; + }, + 'settings list focus helper'); this.createSettingsTree(bodyContainer); - // this.createFocusSink( - // bodyContainer, - // e => { - // if (DOM.findParentWithClass(e.relatedTarget, 'settings-editor-tree')) { - // if (this.settingsTree.getScrollPosition() < 1) { - // const lastElement = this.settingsTree.getLastVisibleElement(); - // this.settingsTree.reveal(lastElement, 0.9); - // return true; - // } - // } + this.createFocusSink( + bodyContainer, + e => { + if (DOM.findParentWithClass(e.relatedTarget, 'settings-editor-tree')) { + if (this.settingsTree.scrollTop < this.settingsTree.scrollHeight) { + const lastElement = this.getLastVisibleElement(); + this.settingsTree.reveal(lastElement, 0.9); + return true; + } + } - // return false; - // }, - // 'settings list focus helper' - // ); + return false; + }, + 'settings list focus helper' + ); } - // private createFocusSink(container: HTMLElement, callback: (e: any) => boolean, label: string): HTMLElement { - // const listFocusSink = DOM.append(container, $('.settings-tree-focus-sink')); - // listFocusSink.setAttribute('aria-label', label); - // listFocusSink.tabIndex = 0; - // this._register(DOM.addDisposableListener(listFocusSink, 'focus', (e: any) => { - // if (e.relatedTarget && callback(e)) { - // e.relatedTarget.focus(); - // } - // })); + private getFirstVisibleElement(nth = 0): SettingsTreeElement | null { + // Hack, see https://github.com/Microsoft/vscode/issues/64749 + const settingItems = this.settingsTree.getHTMLElement().querySelectorAll(AbstractSettingRenderer.CONTENTS_SELECTOR); + const firstEl = settingItems[nth] || settingItems[0]; + if (!firstEl) { + return null; + } - // return listFocusSink; - // } + const firstSettingId = this.settingRenderers.getIdForDOMElementInSetting(firstEl); + return this.settingsTreeModel.getElementById(firstSettingId); + } + + private getLastVisibleElement(): SettingsTreeElement | null { + // Hack, see https://github.com/Microsoft/vscode/issues/64749 + const settingItems = this.settingsTree.getHTMLElement().querySelectorAll(AbstractSettingRenderer.CONTENTS_SELECTOR); + const firstEl = settingItems[settingItems.length - 1]; + if (!firstEl) { + return null; + } + + const firstSettingId = this.settingRenderers.getIdForDOMElementInSetting(firstEl); + return this.settingsTreeModel.getElementById(firstSettingId); + } + + private createFocusSink(container: HTMLElement, callback: (e: any) => boolean, label: string): HTMLElement { + const listFocusSink = DOM.append(container, $('.settings-tree-focus-sink')); + listFocusSink.setAttribute('aria-label', label); + listFocusSink.tabIndex = 0; + this._register(DOM.addDisposableListener(listFocusSink, 'focus', (e: any) => { + if (e.relatedTarget && callback(e)) { + e.relatedTarget.focus(); + } + })); + + return listFocusSink; + } private createTOC(parent: HTMLElement): void { this.tocTreeModel = new TOCTreeModel(this.viewState); @@ -663,15 +687,7 @@ export class SettingsEditor2 extends BaseEditor { return; } - // Hack, see https://github.com/Microsoft/vscode/issues/64749 - const settingItems = this.settingsTree.getHTMLElement().querySelectorAll('.setting-item'); - const firstEl = settingItems[1] || settingItems[0]; - if (!firstEl) { - return; - } - - const firstSettingId = this.settingRenderers.getIdForDOMElementInSetting(firstEl); - const elementToSync = this.settingsTreeModel.getElementById(firstSettingId); + const elementToSync = this.getFirstVisibleElement(1); const element = elementToSync instanceof SettingsTreeSettingElement ? elementToSync.parent : elementToSync instanceof SettingsTreeGroupElement ? elementToSync : null; diff --git a/src/vs/workbench/parts/preferences/test/browser/keybindingsEditorContribution.test.ts b/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts similarity index 95% rename from src/vs/workbench/parts/preferences/test/browser/keybindingsEditorContribution.test.ts rename to src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts index 5c96f33b2f2..53b1167b8e8 100644 --- a/src/vs/workbench/parts/preferences/test/browser/keybindingsEditorContribution.test.ts +++ b/src/vs/workbench/contrib/preferences/test/browser/keybindingsEditorContribution.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { KeybindingEditorDecorationsRenderer } from 'vs/workbench/parts/preferences/browser/keybindingsEditorContribution'; +import { KeybindingEditorDecorationsRenderer } from 'vs/workbench/contrib/preferences/browser/keybindingsEditorContribution'; suite('KeybindingsEditorContribution', () => { diff --git a/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts similarity index 98% rename from src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts rename to src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts index 4765bd00733..0348c5e9dd8 100644 --- a/src/vs/workbench/parts/preferences/test/browser/settingsTreeModels.test.ts +++ b/src/vs/workbench/contrib/preferences/test/browser/settingsTreeModels.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { settingKeyToDisplayFormat, parseQuery, IParsedQuery } from 'vs/workbench/parts/preferences/browser/settingsTreeModels'; +import { settingKeyToDisplayFormat, parseQuery, IParsedQuery } from 'vs/workbench/contrib/preferences/browser/settingsTreeModels'; suite('SettingsTree', () => { test('settingKeyToDisplayFormat', () => { diff --git a/src/vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts b/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts similarity index 98% rename from src/vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts rename to src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts index a1dd85b4703..90a2e3a7bbb 100644 --- a/src/vs/workbench/parts/preferences/test/common/smartSnippetInserter.test.ts +++ b/src/vs/workbench/contrib/preferences/test/common/smartSnippetInserter.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SmartSnippetInserter } from 'vs/workbench/parts/preferences/common/smartSnippetInserter'; +import { SmartSnippetInserter } from 'vs/workbench/contrib/preferences/common/smartSnippetInserter'; import { TextModel } from 'vs/editor/common/model/textModel'; import { Position } from 'vs/editor/common/core/position'; diff --git a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts similarity index 79% rename from src/vs/workbench/parts/quickopen/browser/commandsHandler.ts rename to src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts index c1c6e03e2c3..13019490a5b 100644 --- a/src/vs/workbench/parts/quickopen/browser/commandsHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/commandsHandler.ts @@ -31,6 +31,7 @@ import { INotificationService } from 'vs/platform/notification/common/notificati import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { Disposable } from 'vs/base/common/lifecycle'; +import { timeout } from 'vs/base/common/async'; export const ALL_COMMANDS_PREFIX = '>'; @@ -90,7 +91,7 @@ class CommandsHistory extends Disposable { private load(): void { const raw = this.storageService.get(CommandsHistory.PREF_KEY_CACHE, StorageScope.GLOBAL); - let serializedCache: ISerializedCommandHistory; + let serializedCache: ISerializedCommandHistory | undefined; if (raw) { try { serializedCache = JSON.parse(raw); @@ -117,7 +118,7 @@ class CommandsHistory extends Disposable { commandHistory.set(commandId, commandCounter++); // set counter to command } - peek(commandId: string): number { + peek(commandId: string): number | undefined { return commandHistory.peek(commandId); } @@ -213,14 +214,14 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { private description: string; private alias: string; private labelLowercase: string; - private keybindingAriaLabel: string; + private readonly keybindingAriaLabel?: string; constructor( private commandId: string, private keybinding: ResolvedKeybinding, private label: string, alias: string, - highlights: { label: IHighlight[], alias: IHighlight[] }, + highlights: { label: IHighlight[], alias?: IHighlight[] }, private onBeforeRun: (commandId: string) => void, @INotificationService private readonly notificationService: INotificationService, @ITelemetryService protected telemetryService: ITelemetryService @@ -228,15 +229,15 @@ abstract class BaseCommandEntry extends QuickOpenEntryGroup { super(); this.labelLowercase = this.label.toLowerCase(); - this.keybindingAriaLabel = keybinding ? keybinding.getAriaLabel() : undefined; + this.keybindingAriaLabel = keybinding ? keybinding.getAriaLabel() || undefined : undefined; if (this.label !== alias) { this.alias = alias; } else { - highlights.alias = null; + highlights.alias = undefined; } - this.setHighlights(highlights.label, null, highlights.alias); + this.setHighlights(highlights.label, undefined, highlights.alias); } getCommandId(): string { @@ -376,6 +377,7 @@ export class CommandsHandler extends QuickOpenHandler { private commandHistoryEnabled: boolean; private commandsHistory: CommandsHistory; + private extensionsRegistered: boolean; constructor( @IEditorService private readonly editorService: IEditorService, @@ -389,6 +391,8 @@ export class CommandsHandler extends QuickOpenHandler { this.commandsHistory = this.instantiationService.createInstance(CommandsHistory); + this.extensionService.whenInstalledExtensionsRegistered().then(() => this.extensionsRegistered = true); + this.configurationService.onDidChangeConfiguration(e => this.updateConfiguration()); this.updateConfiguration(); } @@ -398,89 +402,96 @@ export class CommandsHandler extends QuickOpenHandler { } getResults(searchValue: string, token: CancellationToken): Promise { + if (this.extensionsRegistered) { + return this.doGetResults(searchValue, token); + } - // wait for extensions being registered to cover all commands - // also from extensions - return this.extensionService.whenInstalledExtensionsRegistered().then(() => { - if (token.isCancellationRequested) { - return new QuickOpenModel([]); + // If extensions are not yet registered, we wait for a little moment to give them + // a chance to register so that the complete set of commands shows up as result + // We do not want to delay functionality beyond that time though to keep the commands + // functional. + return Promise.race([timeout(800), this.extensionService.whenInstalledExtensionsRegistered().then(() => undefined)]).then(() => this.doGetResults(searchValue, token)); + } + + private doGetResults(searchValue: string, token: CancellationToken): Promise { + if (token.isCancellationRequested) { + return Promise.resolve(new QuickOpenModel([])); + } + + searchValue = searchValue.trim(); + + // Remember as last command palette input + lastCommandPaletteInput = searchValue; + + // Editor Actions + const activeTextEditorWidget = this.editorService.activeTextEditorWidget; + let editorActions: IEditorAction[] = []; + if (activeTextEditorWidget && types.isFunction(activeTextEditorWidget.getSupportedActions)) { + editorActions = activeTextEditorWidget.getSupportedActions(); + } + + const editorEntries = this.editorActionsToEntries(editorActions, searchValue); + + // Other Actions + const menu = this.editorService.invokeWithinEditorContext(accessor => this.menuService.createMenu(MenuId.CommandPalette, accessor.get(IContextKeyService))); + const menuActions = menu.getActions().reduce((r, [, actions]) => [...r, ...actions], []).filter(action => action instanceof MenuItemAction) as MenuItemAction[]; + const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue); + menu.dispose(); + + // Concat + let entries = [...editorEntries, ...commandEntries]; + + // Remove duplicates + entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`); + + // Handle label clashes + const commandLabels = new Set(); + entries.forEach(entry => { + const commandLabel = `${entry.getLabel()}${entry.getGroupLabel()}`; + if (commandLabels.has(commandLabel)) { + entry.setDescription(entry.getCommandId()); + } else { + commandLabels.add(commandLabel); } - - searchValue = searchValue.trim(); - - // Remember as last command palette input - lastCommandPaletteInput = searchValue; - - // Editor Actions - const activeTextEditorWidget = this.editorService.activeTextEditorWidget; - let editorActions: IEditorAction[] = []; - if (activeTextEditorWidget && types.isFunction(activeTextEditorWidget.getSupportedActions)) { - editorActions = activeTextEditorWidget.getSupportedActions(); - } - - const editorEntries = this.editorActionsToEntries(editorActions, searchValue); - - // Other Actions - const menu = this.editorService.invokeWithinEditorContext(accessor => this.menuService.createMenu(MenuId.CommandPalette, accessor.get(IContextKeyService))); - const menuActions = menu.getActions().reduce((r, [, actions]) => [...r, ...actions], []).filter(action => action instanceof MenuItemAction) as MenuItemAction[]; - const commandEntries = this.menuItemActionsToEntries(menuActions, searchValue); - menu.dispose(); - - // Concat - let entries = [...editorEntries, ...commandEntries]; - - // Remove duplicates - entries = arrays.distinct(entries, entry => `${entry.getLabel()}${entry.getGroupLabel()}${entry.getCommandId()}`); - - // Handle label clashes - const commandLabels = new Set(); - entries.forEach(entry => { - const commandLabel = `${entry.getLabel()}${entry.getGroupLabel()}`; - if (commandLabels.has(commandLabel)) { - entry.setDescription(entry.getCommandId()); - } else { - commandLabels.add(commandLabel); - } - }); - - // Sort by MRU order and fallback to name otherwie - entries = entries.sort((elementA, elementB) => { - const counterA = this.commandsHistory.peek(elementA.getCommandId()); - const counterB = this.commandsHistory.peek(elementB.getCommandId()); - - if (counterA && counterB) { - return counterA > counterB ? -1 : 1; // use more recently used command before older - } - - if (counterA) { - return -1; // first command was used, so it wins over the non used one - } - - if (counterB) { - return 1; // other command was used so it wins over the command - } - - // both commands were never used, so we sort by name - return elementA.getSortLabel().localeCompare(elementB.getSortLabel()); - }); - - // Introduce group marker border between recently used and others - // only if we have recently used commands in the result set - const firstEntry = entries[0]; - if (firstEntry && this.commandsHistory.peek(firstEntry.getCommandId())) { - firstEntry.setGroupLabel(nls.localize('recentlyUsed', "recently used")); - for (let i = 1; i < entries.length; i++) { - const entry = entries[i]; - if (!this.commandsHistory.peek(entry.getCommandId())) { - entry.setShowBorder(true); - entry.setGroupLabel(nls.localize('morecCommands', "other commands")); - break; - } - } - } - - return new QuickOpenModel(entries); }); + + // Sort by MRU order and fallback to name otherwie + entries = entries.sort((elementA, elementB) => { + const counterA = this.commandsHistory.peek(elementA.getCommandId()); + const counterB = this.commandsHistory.peek(elementB.getCommandId()); + + if (counterA && counterB) { + return counterA > counterB ? -1 : 1; // use more recently used command before older + } + + if (counterA) { + return -1; // first command was used, so it wins over the non used one + } + + if (counterB) { + return 1; // other command was used so it wins over the command + } + + // both commands were never used, so we sort by name + return elementA.getSortLabel().localeCompare(elementB.getSortLabel()); + }); + + // Introduce group marker border between recently used and others + // only if we have recently used commands in the result set + const firstEntry = entries[0]; + if (firstEntry && this.commandsHistory.peek(firstEntry.getCommandId())) { + firstEntry.setGroupLabel(nls.localize('recentlyUsed', "recently used")); + for (let i = 1; i < entries.length; i++) { + const entry = entries[i]; + if (!this.commandsHistory.peek(entry.getCommandId())) { + entry.setShowBorder(true); + entry.setGroupLabel(nls.localize('morecCommands', "other commands")); + break; + } + } + } + + return Promise.resolve(new QuickOpenModel(entries)); } private editorActionsToEntries(actions: IEditorAction[], searchValue: string): EditorActionCommandEntry[] { @@ -530,7 +541,7 @@ export class CommandsHandler extends QuickOpenHandler { // Add an 'alias' in original language when running in different locale const aliasTitle = (language !== LANGUAGE_DEFAULT && typeof action.item.title !== 'string') ? action.item.title.original : null; - const aliasCategory = (language !== LANGUAGE_DEFAULT && category && typeof action.item.category !== 'string') ? action.item.category.original : null; + const aliasCategory = (language !== LANGUAGE_DEFAULT && category && action.item.category && typeof action.item.category !== 'string') ? action.item.category.original : null; let alias; if (aliasTitle && category) { alias = aliasCategory ? `${aliasCategory}: ${aliasTitle}` : `${category}: ${aliasTitle}`; @@ -549,7 +560,7 @@ export class CommandsHandler extends QuickOpenHandler { } getAutoFocus(searchValue: string, context: { model: IModel, quickNavigateConfiguration?: IQuickNavigateConfiguration }): IAutoFocus { - let autoFocusPrefixMatch = searchValue.trim(); + let autoFocusPrefixMatch: string | undefined = searchValue.trim(); if (autoFocusPrefixMatch && this.commandHistoryEnabled) { const firstEntry = context.model && context.model.entries[0]; diff --git a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts b/src/vs/workbench/contrib/quickopen/browser/gotoLineHandler.ts similarity index 87% rename from src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts rename to src/vs/workbench/contrib/quickopen/browser/gotoLineHandler.ts index a29d34e5c9c..cd3d53d455e 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoLineHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/gotoLineHandler.ts @@ -19,7 +19,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { IEditorOptions, RenderLineNumbersType } from 'vs/editor/common/config/editorOptions'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { isCodeEditor, isDiffEditor } from 'vs/editor/browser/editorBrowser'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { Event } from 'vs/base/common/event'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -61,7 +61,7 @@ export class GotoLineAction extends QuickOpenAction { if (restoreOptions) { Event.once(this._quickOpenService.onHide)(() => { - activeTextEditorWidget.updateOptions(restoreOptions); + activeTextEditorWidget.updateOptions(restoreOptions!); }); } @@ -93,13 +93,16 @@ class GotoLineEntry extends EditorQuickOpenEntry { const maxLineNumber = this.getMaxLineNumber(); if (this.invalidRange(maxLineNumber)) { - const currentLine = this.editorService.activeTextEditorWidget.getPosition().lineNumber; + const position = this.editorService.activeTextEditorWidget.getPosition(); + if (position) { + const currentLine = position.lineNumber; - if (maxLineNumber > 0) { - return nls.localize('gotoLineLabelEmptyWithLimit', "Current Line: {0}. Type a line number between 1 and {1} to navigate to.", currentLine, maxLineNumber); + if (maxLineNumber > 0) { + return nls.localize('gotoLineLabelEmptyWithLimit', "Current Line: {0}. Type a line number between 1 and {1} to navigate to.", currentLine, maxLineNumber); + } + + return nls.localize('gotoLineLabelEmpty', "Current Line: {0}. Type a line number to navigate to.", currentLine); } - - return nls.localize('gotoLineLabelEmpty', "Current Line: {0}. Type a line number to navigate to.", currentLine); } // Input valid, indicate action @@ -181,7 +184,7 @@ class GotoLineEntry extends EditorQuickOpenEntry { // Decorate if possible if (types.isFunction(activeTextEditorWidget.changeDecorations)) { - this.handler.decorateOutline(range, activeTextEditorWidget, this.editorService.activeControl.group); + this.handler.decorateOutline(range, activeTextEditorWidget, this.editorService.activeControl.group!); } } @@ -208,8 +211,8 @@ export class GotoLineHandler extends QuickOpenHandler { static readonly ID = 'workbench.picker.line'; - private rangeHighlightDecorationId: IEditorLineDecoration; - private lastKnownEditorViewState: IEditorViewState; + private rangeHighlightDecorationId: IEditorLineDecoration | null; + private lastKnownEditorViewState: IEditorViewState | null; constructor(@IEditorService private readonly editorService: IEditorService) { super(); @@ -217,9 +220,11 @@ export class GotoLineHandler extends QuickOpenHandler { getAriaLabel(): string { if (this.editorService.activeTextEditorWidget) { - const currentLine = this.editorService.activeTextEditorWidget.getPosition().lineNumber; - - return nls.localize('gotoLineLabelEmpty', "Current Line: {0}. Type a line number to navigate to.", currentLine); + const position = this.editorService.activeTextEditorWidget.getPosition(); + if (position) { + const currentLine = position.lineNumber; + return nls.localize('gotoLineLabelEmpty', "Current Line: {0}. Type a line number to navigate to.", currentLine); + } } return nls.localize('cannotRunGotoLine', "Open a text file first to go to a line."); @@ -288,14 +293,15 @@ export class GotoLineHandler extends QuickOpenHandler { } clearDecorations(): void { - if (this.rangeHighlightDecorationId) { + const rangeHighlightDecorationId = this.rangeHighlightDecorationId; + if (rangeHighlightDecorationId) { this.editorService.visibleControls.forEach(editor => { - if (editor.group.id === this.rangeHighlightDecorationId.groupId) { + if (editor.group && editor.group.id === rangeHighlightDecorationId.groupId) { const editorControl = editor.getControl(); editorControl.changeDecorations(changeAccessor => { changeAccessor.deltaDecorations([ - this.rangeHighlightDecorationId.lineDecorationId, - this.rangeHighlightDecorationId.rangeHighlightId + rangeHighlightDecorationId.lineDecorationId, + rangeHighlightDecorationId.rangeHighlightId ], []); }); } diff --git a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts b/src/vs/workbench/contrib/quickopen/browser/gotoSymbolHandler.ts similarity index 92% rename from src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts rename to src/vs/workbench/contrib/quickopen/browser/gotoSymbolHandler.ts index 4e161da020a..c9d2b8d47f3 100644 --- a/src/vs/workbench/parts/quickopen/browser/gotoSymbolHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/gotoSymbolHandler.ts @@ -22,7 +22,7 @@ import { themeColorFromId } from 'vs/platform/theme/common/themeService'; import { overviewRulerRangeHighlight } from 'vs/editor/common/view/editorColorRegistry'; import { GroupIdentifier, IEditorInput } from 'vs/workbench/common/editor'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { asPromise } from 'vs/base/common/async'; import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; @@ -82,9 +82,9 @@ class OutlineModel extends QuickOpenModel { this.entries.forEach((entry: SymbolEntry) => { // Clear all state first - entry.setGroupLabel(null); + entry.setGroupLabel(undefined); entry.setShowBorder(false); - entry.setHighlights(null); + entry.setHighlights([]); entry.setHidden(false); // Filter by search @@ -128,7 +128,7 @@ class OutlineModel extends QuickOpenModel { // Update previous result with count if (currentResult) { - currentResult.setGroupLabel(this.renderGroupLabel(currentType, typeCounter)); + currentResult.setGroupLabel(typeof currentType === 'number' ? this.renderGroupLabel(currentType, typeCounter) : undefined); } currentType = result.getKind(); @@ -146,7 +146,7 @@ class OutlineModel extends QuickOpenModel { // Update previous result with count if (currentResult) { - currentResult.setGroupLabel(this.renderGroupLabel(currentType, typeCounter)); + currentResult.setGroupLabel(typeof currentType === 'number' ? this.renderGroupLabel(currentType, typeCounter) : undefined); } } @@ -338,7 +338,7 @@ class SymbolEntry extends EditorQuickOpenEntryGroup { // Decorate if possible if (types.isFunction(activeTextEditorWidget.changeDecorations)) { - this.handler.decorateOutline(this.range, range, activeTextEditorWidget, this.editorService.activeControl.group); + this.handler.decorateOutline(this.range, range, activeTextEditorWidget, this.editorService.activeControl.group!); } } @@ -365,11 +365,11 @@ export class GotoSymbolHandler extends QuickOpenHandler { static readonly ID = 'workbench.picker.filesymbols'; - private rangeHighlightDecorationId: IEditorLineDecoration; - private lastKnownEditorViewState: IEditorViewState; + private rangeHighlightDecorationId?: IEditorLineDecoration; + private lastKnownEditorViewState: IEditorViewState | null; - private cachedOutlineRequest: Promise; - private pendingOutlineRequest: CancellationTokenSource; + private cachedOutlineRequest?: Promise; + private pendingOutlineRequest?: CancellationTokenSource; constructor( @IEditorService private readonly editorService: IEditorService @@ -386,11 +386,11 @@ export class GotoSymbolHandler extends QuickOpenHandler { private onDidActiveEditorChange(): void { this.clearOutlineRequest(); - this.lastKnownEditorViewState = undefined; + this.lastKnownEditorViewState = null; this.rangeHighlightDecorationId = undefined; } - getResults(searchValue: string, token: CancellationToken): Promise { + getResults(searchValue: string, token: CancellationToken): Promise { searchValue = searchValue.trim(); // Support to cancel pending outline requests @@ -406,6 +406,10 @@ export class GotoSymbolHandler extends QuickOpenHandler { // Resolve Outline Model return this.getOutline().then(outline => { + if (!outline) { + return outline; + } + if (token.isCancellationRequested) { return outline; } @@ -469,20 +473,20 @@ export class GotoSymbolHandler extends QuickOpenHandler { const label = strings.trim(element.name); // Show parent scope as description - const description: string = element.containerName; + const description = element.containerName || ''; const icon = symbolKindToCssClass(element.kind); // Add results.push(new SymbolEntry(i, label, element.kind, description, `symbol-icon ${icon}`, - element.range, element.selectionRange, null, this.editorService, this + element.range, element.selectionRange, [], this.editorService, this )); } return results; } - private getOutline(): Promise { + private getOutline(): Promise { if (!this.cachedOutlineRequest) { this.cachedOutlineRequest = this.doGetActiveOutline(); } @@ -499,7 +503,7 @@ export class GotoSymbolHandler extends QuickOpenHandler { } if (model && types.isFunction((model).getLanguageIdentifier)) { - return Promise.resolve(asPromise(() => getDocumentSymbols(model, true, this.pendingOutlineRequest.token)).then(entries => { + return Promise.resolve(asPromise(() => getDocumentSymbols(model, true, this.pendingOutlineRequest!.token)).then(entries => { return new OutlineModel(this.toQuickOpenEntries(entries)); })); } @@ -515,7 +519,7 @@ export class GotoSymbolHandler extends QuickOpenHandler { if (this.rangeHighlightDecorationId) { deleteDecorations.push(this.rangeHighlightDecorationId.lineDecorationId); deleteDecorations.push(this.rangeHighlightDecorationId.rangeHighlightId); - this.rangeHighlightDecorationId = null; + this.rangeHighlightDecorationId = undefined; } const newDecorations: IModelDeltaDecoration[] = [ @@ -555,20 +559,21 @@ export class GotoSymbolHandler extends QuickOpenHandler { } private clearDecorations(): void { - if (this.rangeHighlightDecorationId) { + const rangeHighlightDecorationId = this.rangeHighlightDecorationId; + if (rangeHighlightDecorationId) { this.editorService.visibleControls.forEach(editor => { - if (editor.group.id === this.rangeHighlightDecorationId.groupId) { + if (editor.group && editor.group.id === rangeHighlightDecorationId.groupId) { const editorControl = editor.getControl(); editorControl.changeDecorations((changeAccessor: IModelDecorationsChangeAccessor) => { changeAccessor.deltaDecorations([ - this.rangeHighlightDecorationId.lineDecorationId, - this.rangeHighlightDecorationId.rangeHighlightId + rangeHighlightDecorationId.lineDecorationId, + rangeHighlightDecorationId.rangeHighlightId ], []); }); } }); - this.rangeHighlightDecorationId = null; + this.rangeHighlightDecorationId = undefined; } } @@ -598,6 +603,6 @@ export class GotoSymbolHandler extends QuickOpenHandler { this.pendingOutlineRequest = undefined; } - this.cachedOutlineRequest = null; + this.cachedOutlineRequest = undefined; } } diff --git a/src/vs/workbench/parts/quickopen/browser/helpHandler.ts b/src/vs/workbench/contrib/quickopen/browser/helpHandler.ts similarity index 100% rename from src/vs/workbench/parts/quickopen/browser/helpHandler.ts rename to src/vs/workbench/contrib/quickopen/browser/helpHandler.ts diff --git a/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.ts b/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts similarity index 93% rename from src/vs/workbench/parts/quickopen/browser/quickopen.contribution.ts rename to src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts index e6ffdb918bb..92f9b7cd868 100644 --- a/src/vs/workbench/parts/quickopen/browser/quickopen.contribution.ts +++ b/src/vs/workbench/contrib/quickopen/browser/quickopen.contribution.ts @@ -10,11 +10,11 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { SyncActionDescriptor, MenuId, MenuRegistry } from 'vs/platform/actions/common/actions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; -import { GotoSymbolAction, GOTO_SYMBOL_PREFIX, SCOPE_PREFIX, GotoSymbolHandler } from 'vs/workbench/parts/quickopen/browser/gotoSymbolHandler'; -import { ShowAllCommandsAction, ALL_COMMANDS_PREFIX, ClearCommandHistoryAction, CommandsHandler } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; -import { GotoLineAction, GOTO_LINE_PREFIX, GotoLineHandler } from 'vs/workbench/parts/quickopen/browser/gotoLineHandler'; -import { HELP_PREFIX, HelpHandler } from 'vs/workbench/parts/quickopen/browser/helpHandler'; -import { VIEW_PICKER_PREFIX, OpenViewPickerAction, QuickOpenViewPickerAction, ViewPickerHandler } from 'vs/workbench/parts/quickopen/browser/viewPickerHandler'; +import { GotoSymbolAction, GOTO_SYMBOL_PREFIX, SCOPE_PREFIX, GotoSymbolHandler } from 'vs/workbench/contrib/quickopen/browser/gotoSymbolHandler'; +import { ShowAllCommandsAction, ALL_COMMANDS_PREFIX, ClearCommandHistoryAction, CommandsHandler } from 'vs/workbench/contrib/quickopen/browser/commandsHandler'; +import { GotoLineAction, GOTO_LINE_PREFIX, GotoLineHandler } from 'vs/workbench/contrib/quickopen/browser/gotoLineHandler'; +import { HELP_PREFIX, HelpHandler } from 'vs/workbench/contrib/quickopen/browser/helpHandler'; +import { VIEW_PICKER_PREFIX, OpenViewPickerAction, QuickOpenViewPickerAction, ViewPickerHandler } from 'vs/workbench/contrib/quickopen/browser/viewPickerHandler'; import { inQuickOpenContext, getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -86,7 +86,7 @@ Registry.as(QuickOpenExtensions.Quickopen).registerQuickOpen GotoLineHandler, GotoLineHandler.ID, GOTO_LINE_PREFIX, - null, + undefined, [ { prefix: GOTO_LINE_PREFIX, @@ -123,7 +123,7 @@ Registry.as(QuickOpenExtensions.Quickopen).registerQuickOpen HelpHandler, HelpHandler.ID, HELP_PREFIX, - null, + undefined, nls.localize('helpDescription', "Show Help") ) ); diff --git a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts b/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts similarity index 95% rename from src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts rename to src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts index 5c6b0713db8..c0f1cac747c 100644 --- a/src/vs/workbench/parts/quickopen/browser/viewPickerHandler.ts +++ b/src/vs/workbench/contrib/quickopen/browser/viewPickerHandler.ts @@ -8,8 +8,8 @@ import { Mode, IEntryRunContext, IAutoFocus, IQuickNavigateConfiguration, IModel import { QuickOpenModel, QuickOpenEntryGroup, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler, QuickOpenAction } from 'vs/workbench/browser/quickopen'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; -import { IOutputService } from 'vs/workbench/parts/output/common/output'; -import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; +import { IOutputService } from 'vs/workbench/contrib/output/common/output'; +import { ITerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { Action } from 'vs/base/common/actions'; @@ -137,7 +137,7 @@ export class ViewPickerHandler extends QuickOpenHandler { const result: ViewEntry[] = []; if (views.length) { for (const view of views) { - if (this.contextKeyService.contextMatchesRules(view.when)) { + if (this.contextKeyService.contextMatchesRules(view.when || null)) { result.push(new ViewEntry(view.name, viewlet.name, () => this.viewsService.openView(view.id, true))); } } @@ -155,7 +155,7 @@ export class ViewPickerHandler extends QuickOpenHandler { // Viewlet Views viewlets.forEach((viewlet, index) => { - const viewContainer: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).get(viewlet.id); + const viewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).get(viewlet.id); if (viewContainer) { const viewEntriesForViewlet: ViewEntry[] = getViewEntriesForViewlet(viewlet, viewContainer); viewEntries.push(...viewEntriesForViewlet); diff --git a/src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts similarity index 100% rename from src/vs/workbench/parts/relauncher/electron-browser/relauncher.contribution.ts rename to src/vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution.ts diff --git a/src/vs/workbench/services/scm/common/scm.ts b/src/vs/workbench/contrib/scm/common/scm.ts similarity index 89% rename from src/vs/workbench/services/scm/common/scm.ts rename to src/vs/workbench/contrib/scm/common/scm.ts index 30efc419ad4..15c29cda4c5 100644 --- a/src/vs/workbench/services/scm/common/scm.ts +++ b/src/vs/workbench/contrib/scm/common/scm.ts @@ -3,6 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { Registry } from 'vs/platform/registry/common/platform'; +import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { URI } from 'vs/base/common/uri'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { Event } from 'vs/base/common/event'; @@ -11,6 +13,9 @@ import { Command } from 'vs/editor/common/modes'; import { ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { ISequence } from 'vs/base/common/sequence'; +export const VIEWLET_ID = 'workbench.view.scm'; +export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); + export interface IBaselineResourceProvider { getBaselineResource(resource: URI): Promise; } diff --git a/src/vs/workbench/services/scm/common/scmService.ts b/src/vs/workbench/contrib/scm/common/scmService.ts similarity index 100% rename from src/vs/workbench/services/scm/common/scmService.ts rename to src/vs/workbench/contrib/scm/common/scmService.ts diff --git a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts b/src/vs/workbench/contrib/scm/electron-browser/dirtydiffDecorator.ts similarity index 99% rename from src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts rename to src/vs/workbench/contrib/scm/electron-browser/dirtydiffDecorator.ts index d0a303be842..864b3c1d100 100644 --- a/src/vs/workbench/parts/scm/electron-browser/dirtydiffDecorator.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/dirtydiffDecorator.ts @@ -17,7 +17,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { IEditorWorkerService } from 'vs/editor/common/services/editorWorkerService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { URI } from 'vs/base/common/uri'; -import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; +import { ISCMService, ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; import { ModelDecorationOptions } from 'vs/editor/common/model/textModel'; import { registerThemingParticipant, ITheme, ICssStyleCollector, themeColorFromId, IThemeService } from 'vs/platform/theme/common/themeService'; import { registerColor } from 'vs/platform/theme/common/colorRegistry'; @@ -156,7 +156,7 @@ function getChangeType(change: IChange): ChangeType { } } -function getChangeTypeColor(theme: ITheme, changeType: ChangeType): Color | null { +function getChangeTypeColor(theme: ITheme, changeType: ChangeType): Color | undefined { switch (changeType) { case ChangeType.Modify: return theme.getColor(editorGutterModifiedBackground); case ChangeType.Add: return theme.getColor(editorGutterAddedBackground); diff --git a/src/vs/workbench/parts/scm/electron-browser/media/check-inverse.svg b/src/vs/workbench/contrib/scm/electron-browser/media/check-inverse.svg similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/check-inverse.svg rename to src/vs/workbench/contrib/scm/electron-browser/media/check-inverse.svg diff --git a/src/vs/workbench/parts/scm/electron-browser/media/check.svg b/src/vs/workbench/contrib/scm/electron-browser/media/check.svg similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/check.svg rename to src/vs/workbench/contrib/scm/electron-browser/media/check.svg diff --git a/src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css b/src/vs/workbench/contrib/scm/electron-browser/media/dirtydiffDecorator.css similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/dirtydiffDecorator.css rename to src/vs/workbench/contrib/scm/electron-browser/media/dirtydiffDecorator.css diff --git a/src/vs/workbench/parts/scm/electron-browser/media/icon-dark.svg b/src/vs/workbench/contrib/scm/electron-browser/media/icon-dark.svg similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/icon-dark.svg rename to src/vs/workbench/contrib/scm/electron-browser/media/icon-dark.svg diff --git a/src/vs/workbench/parts/scm/electron-browser/media/icon-light.svg b/src/vs/workbench/contrib/scm/electron-browser/media/icon-light.svg similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/icon-light.svg rename to src/vs/workbench/contrib/scm/electron-browser/media/icon-light.svg diff --git a/src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css b/src/vs/workbench/contrib/scm/electron-browser/media/scmViewlet.css similarity index 100% rename from src/vs/workbench/parts/scm/electron-browser/media/scmViewlet.css rename to src/vs/workbench/contrib/scm/electron-browser/media/scmViewlet.css diff --git a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts b/src/vs/workbench/contrib/scm/electron-browser/scm.contribution.ts similarity index 92% rename from src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts rename to src/vs/workbench/contrib/scm/electron-browser/scm.contribution.ts index aa04236bdca..7807df023e6 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scm.contribution.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/scm.contribution.ts @@ -8,21 +8,22 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { DirtyDiffWorkbenchController } from './dirtydiffDecorator'; import { ViewletRegistry, Extensions as ViewletExtensions, ViewletDescriptor, ShowViewletAction } from 'vs/workbench/browser/viewlet'; -import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; +import { VIEWLET_ID, ISCMRepository, ISCMService } from 'vs/workbench/contrib/scm/common/scm'; import { IWorkbenchActionRegistry, Extensions as WorkbenchActionExtensions } from 'vs/workbench/common/actions'; import { KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { StatusUpdater, StatusBarController } from './scmActivity'; -import { SCMViewlet } from 'vs/workbench/parts/scm/electron-browser/scmViewlet'; +import { SCMViewlet } from 'vs/workbench/contrib/scm/electron-browser/scmViewlet'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions } from 'vs/platform/configuration/common/configurationRegistry'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ContextKeyDefinedExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; -import { ISCMRepository } from 'vs/workbench/services/scm/common/scm'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { IPartService } from 'vs/workbench/services/part/common/partService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { SCMService } from 'vs/workbench/contrib/scm/common/scmService'; class OpenSCMViewletAction extends ShowViewletAction { @@ -129,4 +130,6 @@ KeybindingsRegistry.registerCommandAndKeybindingRule({ const commandService = accessor.get(ICommandService); return commandService.executeCommand(id, ...args); } -}); \ No newline at end of file +}); + +registerSingleton(ISCMService, SCMService); \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts b/src/vs/workbench/contrib/scm/electron-browser/scmActivity.ts similarity index 97% rename from src/vs/workbench/parts/scm/electron-browser/scmActivity.ts rename to src/vs/workbench/contrib/scm/electron-browser/scmActivity.ts index 17784ae69e5..df3d55c4e0e 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmActivity.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/scmActivity.ts @@ -7,8 +7,7 @@ import { localize } from 'vs/nls'; import { basename } from 'vs/base/common/paths'; import { IDisposable, dispose, Disposable, combinedDisposable } from 'vs/base/common/lifecycle'; import { Event } from 'vs/base/common/event'; -import { VIEWLET_ID } from 'vs/workbench/parts/scm/common/scm'; -import { ISCMService, ISCMRepository } from 'vs/workbench/services/scm/common/scm'; +import { VIEWLET_ID, ISCMService, ISCMRepository } from 'vs/workbench/contrib/scm/common/scm'; import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts b/src/vs/workbench/contrib/scm/electron-browser/scmMenus.ts similarity index 99% rename from src/vs/workbench/parts/scm/electron-browser/scmMenus.ts rename to src/vs/workbench/contrib/scm/electron-browser/scmMenus.ts index f9a5634e1df..cac3550b561 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmMenus.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/scmMenus.ts @@ -10,7 +10,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { IMenuService, MenuId, IMenu } from 'vs/platform/actions/common/actions'; import { IAction } from 'vs/base/common/actions'; import { fillInContextMenuActions, fillInActionBarActions } from 'vs/platform/actions/browser/menuItemActionItem'; -import { ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/services/scm/common/scm'; +import { ISCMProvider, ISCMResource, ISCMResourceGroup } from 'vs/workbench/contrib/scm/common/scm'; import { isSCMResource } from './scmUtil'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { equals } from 'vs/base/common/arrays'; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmUtil.ts b/src/vs/workbench/contrib/scm/electron-browser/scmUtil.ts similarity index 85% rename from src/vs/workbench/parts/scm/electron-browser/scmUtil.ts rename to src/vs/workbench/contrib/scm/electron-browser/scmUtil.ts index 053dc68c3ef..0b9307b1213 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmUtil.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/scmUtil.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISCMResourceGroup, ISCMResource } from 'vs/workbench/services/scm/common/scm'; +import { ISCMResourceGroup, ISCMResource } from 'vs/workbench/contrib/scm/common/scm'; export function isSCMResource(element: ISCMResourceGroup | ISCMResource): element is ISCMResource { return !!(element as ISCMResource).sourceUri; diff --git a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts b/src/vs/workbench/contrib/scm/electron-browser/scmViewlet.ts similarity index 99% rename from src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts rename to src/vs/workbench/contrib/scm/electron-browser/scmViewlet.ts index 920cc42b0a6..7517fbc261a 100644 --- a/src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts +++ b/src/vs/workbench/contrib/scm/electron-browser/scmViewlet.ts @@ -14,10 +14,9 @@ import { append, $, addClass, toggleClass, trackFocus, Dimension, addDisposableL import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { List } from 'vs/base/browser/ui/list/listWidget'; import { IListVirtualDelegate, IListRenderer, IListContextMenuEvent, IListEvent, IKeyboardNavigationLabelProvider, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { VIEWLET_ID, VIEW_CONTAINER } from 'vs/workbench/parts/scm/common/scm'; +import { VIEWLET_ID, VIEW_CONTAINER, ISCMService, ISCMRepository, ISCMResourceGroup, ISCMResource, InputValidationType } from 'vs/workbench/contrib/scm/common/scm'; import { ResourceLabels, IResourceLabel, IResourceLabelsContainer } from 'vs/workbench/browser/labels'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; -import { ISCMService, ISCMRepository, ISCMResourceGroup, ISCMResource, InputValidationType } from 'vs/workbench/services/scm/common/scm'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IContextViewService, IContextMenuService } from 'vs/platform/contextview/browser/contextView'; diff --git a/src/vs/workbench/parts/search/browser/media/CollapseAll.svg b/src/vs/workbench/contrib/search/browser/media/CollapseAll.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/CollapseAll.svg rename to src/vs/workbench/contrib/search/browser/media/CollapseAll.svg diff --git a/src/vs/workbench/parts/search/browser/media/CollapseAll_inverse.svg b/src/vs/workbench/contrib/search/browser/media/CollapseAll_inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/CollapseAll_inverse.svg rename to src/vs/workbench/contrib/search/browser/media/CollapseAll_inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/Refresh.svg b/src/vs/workbench/contrib/search/browser/media/Refresh.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/Refresh.svg rename to src/vs/workbench/contrib/search/browser/media/Refresh.svg diff --git a/src/vs/workbench/parts/search/browser/media/Refresh_inverse.svg b/src/vs/workbench/contrib/search/browser/media/Refresh_inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/Refresh_inverse.svg rename to src/vs/workbench/contrib/search/browser/media/Refresh_inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/action-remove-dark.svg b/src/vs/workbench/contrib/search/browser/media/action-remove-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/action-remove-dark.svg rename to src/vs/workbench/contrib/search/browser/media/action-remove-dark.svg diff --git a/src/vs/workbench/parts/search/browser/media/action-remove.svg b/src/vs/workbench/contrib/search/browser/media/action-remove.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/action-remove.svg rename to src/vs/workbench/contrib/search/browser/media/action-remove.svg diff --git a/src/vs/workbench/parts/search/browser/media/clear-search-results-dark.svg b/src/vs/workbench/contrib/search/browser/media/clear-search-results-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/clear-search-results-dark.svg rename to src/vs/workbench/contrib/search/browser/media/clear-search-results-dark.svg diff --git a/src/vs/workbench/parts/search/browser/media/clear-search-results.svg b/src/vs/workbench/contrib/search/browser/media/clear-search-results.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/clear-search-results.svg rename to src/vs/workbench/contrib/search/browser/media/clear-search-results.svg diff --git a/src/vs/workbench/parts/search/browser/media/ellipsis-inverse.svg b/src/vs/workbench/contrib/search/browser/media/ellipsis-inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/ellipsis-inverse.svg rename to src/vs/workbench/contrib/search/browser/media/ellipsis-inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/ellipsis.svg b/src/vs/workbench/contrib/search/browser/media/ellipsis.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/ellipsis.svg rename to src/vs/workbench/contrib/search/browser/media/ellipsis.svg diff --git a/src/vs/workbench/parts/search/browser/media/excludeSettings-dark.svg b/src/vs/workbench/contrib/search/browser/media/excludeSettings-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/excludeSettings-dark.svg rename to src/vs/workbench/contrib/search/browser/media/excludeSettings-dark.svg diff --git a/src/vs/workbench/parts/search/browser/media/excludeSettings.svg b/src/vs/workbench/contrib/search/browser/media/excludeSettings.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/excludeSettings.svg rename to src/vs/workbench/contrib/search/browser/media/excludeSettings.svg diff --git a/src/vs/workbench/parts/search/browser/media/expando-collapsed-dark.svg b/src/vs/workbench/contrib/search/browser/media/expando-collapsed-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/expando-collapsed-dark.svg rename to src/vs/workbench/contrib/search/browser/media/expando-collapsed-dark.svg diff --git a/src/vs/workbench/parts/search/browser/media/expando-collapsed.svg b/src/vs/workbench/contrib/search/browser/media/expando-collapsed.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/expando-collapsed.svg rename to src/vs/workbench/contrib/search/browser/media/expando-collapsed.svg diff --git a/src/vs/workbench/parts/search/browser/media/expando-expanded-dark.svg b/src/vs/workbench/contrib/search/browser/media/expando-expanded-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/expando-expanded-dark.svg rename to src/vs/workbench/contrib/search/browser/media/expando-expanded-dark.svg diff --git a/src/vs/workbench/parts/search/browser/media/expando-expanded.svg b/src/vs/workbench/contrib/search/browser/media/expando-expanded.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/expando-expanded.svg rename to src/vs/workbench/contrib/search/browser/media/expando-expanded.svg diff --git a/src/vs/workbench/parts/search/browser/media/replace-all-inverse.svg b/src/vs/workbench/contrib/search/browser/media/replace-all-inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/replace-all-inverse.svg rename to src/vs/workbench/contrib/search/browser/media/replace-all-inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/replace-all.svg b/src/vs/workbench/contrib/search/browser/media/replace-all.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/replace-all.svg rename to src/vs/workbench/contrib/search/browser/media/replace-all.svg diff --git a/src/vs/workbench/parts/search/browser/media/replace-inverse.svg b/src/vs/workbench/contrib/search/browser/media/replace-inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/replace-inverse.svg rename to src/vs/workbench/contrib/search/browser/media/replace-inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/replace.svg b/src/vs/workbench/contrib/search/browser/media/replace.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/replace.svg rename to src/vs/workbench/contrib/search/browser/media/replace.svg diff --git a/src/vs/workbench/parts/search/browser/media/searchview.css b/src/vs/workbench/contrib/search/browser/media/searchview.css similarity index 100% rename from src/vs/workbench/parts/search/browser/media/searchview.css rename to src/vs/workbench/contrib/search/browser/media/searchview.css diff --git a/src/vs/workbench/parts/search/browser/media/stop-inverse.svg b/src/vs/workbench/contrib/search/browser/media/stop-inverse.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/stop-inverse.svg rename to src/vs/workbench/contrib/search/browser/media/stop-inverse.svg diff --git a/src/vs/workbench/parts/search/browser/media/stop.svg b/src/vs/workbench/contrib/search/browser/media/stop.svg similarity index 100% rename from src/vs/workbench/parts/search/browser/media/stop.svg rename to src/vs/workbench/contrib/search/browser/media/stop.svg diff --git a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts b/src/vs/workbench/contrib/search/browser/openAnythingHandler.ts similarity index 94% rename from src/vs/workbench/parts/search/browser/openAnythingHandler.ts rename to src/vs/workbench/contrib/search/browser/openAnythingHandler.ts index 7ff26d8ff63..765589cf209 100644 --- a/src/vs/workbench/parts/search/browser/openAnythingHandler.ts +++ b/src/vs/workbench/contrib/search/browser/openAnythingHandler.ts @@ -10,11 +10,11 @@ import * as types from 'vs/base/common/types'; import { IAutoFocus } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenModel, QuickOpenItemAccessor } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; -import { FileEntry, OpenFileHandler, FileQuickOpenModel } from 'vs/workbench/parts/search/browser/openFileHandler'; -import * as openSymbolHandler from 'vs/workbench/parts/search/browser/openSymbolHandler'; +import { FileEntry, OpenFileHandler, FileQuickOpenModel } from 'vs/workbench/contrib/search/browser/openFileHandler'; +import * as openSymbolHandler from 'vs/workbench/contrib/search/browser/openSymbolHandler'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkbenchSearchConfiguration } from 'vs/workbench/parts/search/common/search'; +import { IWorkbenchSearchConfiguration } from 'vs/workbench/contrib/search/common/search'; import { IRange } from 'vs/editor/common/core/range'; import { compareItemsByScore, scoreItem, ScorerCache, prepareQuery } from 'vs/base/parts/quickopen/common/quickOpenScorer'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -120,7 +120,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { } // Combine results. - const mergedResults: QuickOpenEntry[] = [].concat(...results.map(r => r.entries)); + const mergedResults: QuickOpenEntry[] = ([] as QuickOpenEntry[]).concat(...results.map(r => r.entries)); // Sort const compare = (elementA: QuickOpenEntry, elementB: QuickOpenEntry) => compareItemsByScore(elementA, elementB, query, true, QuickOpenItemAccessor, this.scorerCache); @@ -132,7 +132,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { entry.setRange(searchWithRange ? searchWithRange.range : null); const itemScore = scoreItem(entry, query, true, QuickOpenItemAccessor, this.scorerCache); - entry.setHighlights(itemScore.labelMatch, itemScore.descriptionMatch); + entry.setHighlights(itemScore.labelMatch || [], itemScore.descriptionMatch); } }); @@ -165,7 +165,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { return this.openFileHandler.hasShortResponseTime() && this.openSymbolHandler.hasShortResponseTime(); } - private extractRange(value: string): ISearchWithRange { + private extractRange(value: string): ISearchWithRange | null { if (!value) { return null; } @@ -211,7 +211,7 @@ export class OpenAnythingHandler extends QuickOpenHandler { } } - if (range) { + if (patternMatch && range) { return { search: value.substr(0, patternMatch.index), // clear range suffix from search value range: range diff --git a/src/vs/workbench/parts/search/browser/openFileHandler.ts b/src/vs/workbench/contrib/search/browser/openFileHandler.ts similarity index 96% rename from src/vs/workbench/parts/search/browser/openFileHandler.ts rename to src/vs/workbench/contrib/search/browser/openFileHandler.ts index ff7a3ec092b..0434fc1c196 100644 --- a/src/vs/workbench/parts/search/browser/openFileHandler.ts +++ b/src/vs/workbench/contrib/search/browser/openFileHandler.ts @@ -18,7 +18,7 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work import { IAutoFocus } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenEntry, QuickOpenModel } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler, EditorQuickOpenEntry } from 'vs/workbench/browser/quickopen'; -import { QueryBuilder, IFileQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; +import { QueryBuilder, IFileQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import { EditorInput, IWorkbenchEditorConfiguration } from 'vs/workbench/common/editor'; import { IResourceInput } from 'vs/platform/editor/common/editor'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -27,7 +27,7 @@ import { ISearchService, IFileSearchStats, IFileQuery, ISearchComplete } from 'v import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IRange } from 'vs/editor/common/core/range'; -import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/contrib/search/common/search'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { prepareQuery, IPreparedQuery } from 'vs/base/parts/quickopen/common/quickOpenScorer'; import { IFileService } from 'vs/platform/files/common/files'; @@ -43,7 +43,7 @@ export class FileQuickOpenModel extends QuickOpenModel { } export class FileEntry extends EditorQuickOpenEntry { - private range: IRange; + private range: IRange | null; constructor( private resource: URI, @@ -85,7 +85,7 @@ export class FileEntry extends EditorQuickOpenEntry { return this.resource; } - setRange(range: IRange): void { + setRange(range: IRange | null): void { this.range = range; } @@ -97,14 +97,11 @@ export class FileEntry extends EditorQuickOpenEntry { const input: IResourceInput = { resource: this.resource, options: { - pinned: !this.configurationService.getValue().workbench.editor.enablePreviewFromQuickOpen + pinned: !this.configurationService.getValue().workbench.editor.enablePreviewFromQuickOpen, + selection: this.range ? this.range : undefined } }; - if (this.range) { - input.options.selection = this.range; - } - return input; } } @@ -178,7 +175,7 @@ export class OpenFileHandler extends QuickOpenHandler { for (const fileMatch of complete.results) { const label = paths.basename(fileMatch.resource.fsPath); - const description = this.labelService.getUriLabel(resources.dirname(fileMatch.resource), { relative: true }); + const description = this.labelService.getUriLabel(resources.dirname(fileMatch.resource)!, { relative: true }); results.push(this.instantiationService.createInstance(FileEntry, fileMatch.resource, label, description, iconClass)); } @@ -188,14 +185,14 @@ export class OpenFileHandler extends QuickOpenHandler { }); } - private getAbsolutePathResult(query: IPreparedQuery): Promise { + private getAbsolutePathResult(query: IPreparedQuery): Promise { if (paths.isAbsolute(query.original)) { const resource = URI.file(query.original); return this.fileService.resolveFile(resource).then(stat => stat.isDirectory ? undefined : resource, error => undefined); } - return Promise.resolve(null); + return Promise.resolve(undefined); } private doResolveQueryOptions(query: IPreparedQuery, cacheKey?: string, maxSortedResults?: number): IFileQueryBuilderOptions { @@ -273,7 +270,7 @@ export class CacheState { private loadingPhase = LoadingPhase.Created; private promise: Promise; - constructor(cacheQuery: (cacheKey: string) => IFileQuery, private doLoad: (query: IFileQuery) => Promise, private doDispose: (cacheKey: string) => Promise, private previous: CacheState) { + constructor(cacheQuery: (cacheKey: string) => IFileQuery, private doLoad: (query: IFileQuery) => Promise, private doDispose: (cacheKey: string) => Promise, private previous: CacheState | null) { this.query = cacheQuery(this._cacheKey); if (this.previous) { const current = objects.assign({}, this.query, { cacheKey: null }); diff --git a/src/vs/workbench/parts/search/browser/openSymbolHandler.ts b/src/vs/workbench/contrib/search/browser/openSymbolHandler.ts similarity index 96% rename from src/vs/workbench/parts/search/browser/openSymbolHandler.ts rename to src/vs/workbench/contrib/search/browser/openSymbolHandler.ts index bcc785e66b8..a5e2a7e7b59 100644 --- a/src/vs/workbench/parts/search/browser/openSymbolHandler.ts +++ b/src/vs/workbench/contrib/search/browser/openSymbolHandler.ts @@ -18,7 +18,7 @@ import { symbolKindToCssClass } from 'vs/editor/common/modes'; import { IResourceInput } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { IWorkspaceSymbolProvider, getWorkspaceSymbols, IWorkspaceSymbol } from 'vs/workbench/parts/search/common/search'; +import { IWorkspaceSymbolProvider, getWorkspaceSymbols, IWorkspaceSymbol } from 'vs/workbench/contrib/search/common/search'; import { basename } from 'vs/base/common/paths'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -27,7 +27,7 @@ import { Schemas } from 'vs/base/common/network'; import { IOpenerService } from 'vs/platform/opener/common/opener'; class SymbolEntry extends EditorQuickOpenEntry { - private bearingResolve: Promise; + private bearingResolve: Promise; constructor( private bearing: IWorkspaceSymbol, @@ -48,7 +48,7 @@ class SymbolEntry extends EditorQuickOpenEntry { return nls.localize('entryAriaLabel', "{0}, symbols picker", this.getLabel()); } - getDescription(): string { + getDescription(): string | null { const containerName = this.bearing.containerName; if (this.bearing.location.uri) { if (containerName) { @@ -58,7 +58,7 @@ class SymbolEntry extends EditorQuickOpenEntry { return this.labelService.getUriLabel(this.bearing.location.uri, { relative: true }); } - return containerName; + return containerName || null; } getIcon(): string { @@ -105,7 +105,7 @@ class SymbolEntry extends EditorQuickOpenEntry { }; if (this.bearing.location.range) { - input.options.selection = Range.collapseToStart(this.bearing.location.range); + input.options!.selection = Range.collapseToStart(this.bearing.location.range); } return input; @@ -206,7 +206,7 @@ export class OpenSymbolHandler extends QuickOpenHandler { } const entry = this.instantiationService.createInstance(SymbolEntry, element, provider); - entry.setHighlights(filters.matchesFuzzy2(searchValue, entry.getLabel())); + entry.setHighlights(filters.matchesFuzzy2(searchValue, entry.getLabel()) || []); bucket.push(entry); } } diff --git a/src/vs/workbench/parts/search/browser/patternInputWidget.ts b/src/vs/workbench/contrib/search/browser/patternInputWidget.ts similarity index 100% rename from src/vs/workbench/parts/search/browser/patternInputWidget.ts rename to src/vs/workbench/contrib/search/browser/patternInputWidget.ts diff --git a/src/vs/workbench/parts/search/browser/replaceContributions.ts b/src/vs/workbench/contrib/search/browser/replaceContributions.ts similarity index 88% rename from src/vs/workbench/parts/search/browser/replaceContributions.ts rename to src/vs/workbench/contrib/search/browser/replaceContributions.ts index 85865f63594..23077d8d20a 100644 --- a/src/vs/workbench/parts/search/browser/replaceContributions.ts +++ b/src/vs/workbench/contrib/search/browser/replaceContributions.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; -import { ReplaceService, ReplacePreviewContentProvider } from 'vs/workbench/parts/search/browser/replaceService'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; +import { ReplaceService, ReplacePreviewContentProvider } from 'vs/workbench/contrib/search/browser/replaceService'; import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; diff --git a/src/vs/workbench/parts/search/browser/replaceService.ts b/src/vs/workbench/contrib/search/browser/replaceService.ts similarity index 98% rename from src/vs/workbench/parts/search/browser/replaceService.ts rename to src/vs/workbench/contrib/search/browser/replaceService.ts index 1d003c86679..763ae2aa453 100644 --- a/src/vs/workbench/parts/search/browser/replaceService.ts +++ b/src/vs/workbench/contrib/search/browser/replaceService.ts @@ -8,11 +8,11 @@ import * as errors from 'vs/base/common/errors'; import { URI } from 'vs/base/common/uri'; import * as network from 'vs/base/common/network'; import { Disposable } from 'vs/base/common/lifecycle'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { IModeService } from 'vs/editor/common/services/modeService'; -import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/workbench/parts/search/common/searchModel'; +import { Match, FileMatch, FileMatchOrMatch, ISearchWorkbenchService } from 'vs/workbench/contrib/search/common/searchModel'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; import { ITextModelService, ITextModelContentProvider } from 'vs/editor/common/services/resolverService'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; diff --git a/src/vs/workbench/parts/search/browser/searchActions.ts b/src/vs/workbench/contrib/search/browser/searchActions.ts similarity index 98% rename from src/vs/workbench/parts/search/browser/searchActions.ts rename to src/vs/workbench/contrib/search/browser/searchActions.ts index 3dde8d15063..6e9c0f5e71e 100644 --- a/src/vs/workbench/parts/search/browser/searchActions.ts +++ b/src/vs/workbench/contrib/search/browser/searchActions.ts @@ -22,12 +22,12 @@ import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { WorkbenchObjectTree } from 'vs/platform/list/browser/listService'; import { ISearchConfiguration, ISearchHistoryService, VIEW_ID } from 'vs/platform/search/common/search'; -import { SearchView } from 'vs/workbench/parts/search/browser/searchView'; -import * as Constants from 'vs/workbench/parts/search/common/constants'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; -import { FileMatch, FileMatchOrMatch, FolderMatch, Match, RenderableMatch, searchMatchComparer, SearchResult } from 'vs/workbench/parts/search/common/searchModel'; +import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; +import * as Constants from 'vs/workbench/contrib/search/common/constants'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; +import { FileMatch, FileMatchOrMatch, FolderMatch, Match, RenderableMatch, searchMatchComparer, SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; diff --git a/src/vs/workbench/parts/search/browser/searchResultsView.ts b/src/vs/workbench/contrib/search/browser/searchResultsView.ts similarity index 87% rename from src/vs/workbench/parts/search/browser/searchResultsView.ts rename to src/vs/workbench/contrib/search/browser/searchResultsView.ts index 18a8d159b78..fb053f632e8 100644 --- a/src/vs/workbench/parts/search/browser/searchResultsView.ts +++ b/src/vs/workbench/contrib/search/browser/searchResultsView.ts @@ -8,7 +8,7 @@ import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { CountBadge } from 'vs/base/browser/ui/countBadge/countBadge'; import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; -import { ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; +import { ITreeNode, ITreeRenderer, ITreeDragAndDrop, ITreeDragOverReaction } from 'vs/base/browser/ui/tree/tree'; import { IAction } from 'vs/base/common/actions'; import { Disposable, IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as paths from 'vs/base/common/paths'; @@ -23,9 +23,13 @@ import { attachBadgeStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IResourceLabel, ResourceLabels } from 'vs/workbench/browser/labels'; -import { RemoveAction, ReplaceAction, ReplaceAllAction, ReplaceAllInFolderAction } from 'vs/workbench/parts/search/browser/searchActions'; -import { SearchView } from 'vs/workbench/parts/search/browser/searchView'; -import { FileMatch, FolderMatch, Match, RenderableMatch, SearchModel, BaseFolderMatch } from 'vs/workbench/parts/search/common/searchModel'; +import { RemoveAction, ReplaceAction, ReplaceAllAction, ReplaceAllInFolderAction } from 'vs/workbench/contrib/search/browser/searchActions'; +import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; +import { FileMatch, FolderMatch, Match, RenderableMatch, SearchModel, BaseFolderMatch } from 'vs/workbench/contrib/search/common/searchModel'; +import { IDragAndDropData } from 'vs/base/browser/dnd'; +import { fillResourceDataTransfers } from 'vs/workbench/browser/dnd'; +import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; +import { URI } from 'vs/base/common/uri'; interface IFolderMatchTemplate { label: IResourceLabel; @@ -333,3 +337,47 @@ export class SearchAccessibilityProvider implements IAccessibilityProvider { + constructor( + @IInstantiationService private instantiationService: IInstantiationService + ) { } + + onDragOver(data: IDragAndDropData, targetElement: RenderableMatch, targetIndex: number, originalEvent: DragEvent): boolean | ITreeDragOverReaction { + return false; + } + + getDragURI(element: RenderableMatch): string | null { + if (element instanceof FileMatch) { + return element.remove.toString(); + } + + return null; + } + + getDragLabel?(elements: RenderableMatch[]): string | undefined { + if (elements.length > 1) { + return String(elements.length); + } + + const element = elements[0]; + return element instanceof FileMatch ? + resources.basename(element.resource()) : + undefined; + } + + onDragStart(data: IDragAndDropData, originalEvent: DragEvent): void { + const elements = (data as ElementsDragAndDropData).elements; + const resources: URI[] = elements + .filter(e => e instanceof FileMatch) + .map((fm: FileMatch) => fm.resource()); + + if (resources.length) { + // Apply some datatransfer types to allow for dragging the element outside of the application + this.instantiationService.invokeFunction(fillResourceDataTransfers, resources, originalEvent); + } + } + + drop(data: IDragAndDropData, targetElement: RenderableMatch, targetIndex: number, originalEvent: DragEvent): void { + } +} diff --git a/src/vs/workbench/parts/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts similarity index 98% rename from src/vs/workbench/parts/search/browser/searchView.ts rename to src/vs/workbench/contrib/search/browser/searchView.ts index 25a2ec1b093..a9ff441ccdf 100644 --- a/src/vs/workbench/parts/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -48,17 +48,17 @@ import { Viewlet } from 'vs/workbench/browser/viewlet'; import { IEditor } from 'vs/workbench/common/editor'; import { IPanel } from 'vs/workbench/common/panel'; import { IViewlet } from 'vs/workbench/common/viewlet'; -import { ExcludePatternInputWidget, PatternInputWidget } from 'vs/workbench/parts/search/browser/patternInputWidget'; -import { CancelSearchAction, ClearSearchResultsAction, CollapseDeepestExpandedLevelAction, getKeyboardEventForEditorOpen, RefreshAction } from 'vs/workbench/parts/search/browser/searchActions'; -import { FileMatchRenderer, FolderMatchRenderer, MatchRenderer, SearchAccessibilityProvider, SearchDelegate } from 'vs/workbench/parts/search/browser/searchResultsView'; -import { ISearchWidgetOptions, SearchWidget } from 'vs/workbench/parts/search/browser/searchWidget'; -import * as Constants from 'vs/workbench/parts/search/common/constants'; -import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/parts/search/common/queryBuilder'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; -import { getOutOfWorkspaceEditorResources } from 'vs/workbench/parts/search/common/search'; -import { FileMatch, FileMatchOrMatch, FolderMatch, IChangeEvent, ISearchWorkbenchService, Match, RenderableMatch, searchMatchComparer, SearchModel, SearchResult } from 'vs/workbench/parts/search/common/searchModel'; +import { ExcludePatternInputWidget, PatternInputWidget } from 'vs/workbench/contrib/search/browser/patternInputWidget'; +import { CancelSearchAction, ClearSearchResultsAction, CollapseDeepestExpandedLevelAction, getKeyboardEventForEditorOpen, RefreshAction } from 'vs/workbench/contrib/search/browser/searchActions'; +import { FileMatchRenderer, FolderMatchRenderer, MatchRenderer, SearchAccessibilityProvider, SearchDelegate, SearchDND } from 'vs/workbench/contrib/search/browser/searchResultsView'; +import { ISearchWidgetOptions, SearchWidget } from 'vs/workbench/contrib/search/browser/searchWidget'; +import * as Constants from 'vs/workbench/contrib/search/common/constants'; +import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; +import { getOutOfWorkspaceEditorResources } from 'vs/workbench/contrib/search/common/search'; +import { FileMatch, FileMatchOrMatch, FolderMatch, IChangeEvent, ISearchWorkbenchService, Match, RenderableMatch, searchMatchComparer, SearchModel, SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; import { ACTIVE_GROUP, IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IPreferencesService, ISettingsEditorOptions } from 'vs/workbench/services/preferences/common/preferences'; import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; @@ -122,7 +122,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { private searchWithoutFolderMessageElement: HTMLElement; - private currentSearchQ = Promise.resolve(); + private currentSearchQ = Promise.resolve(); constructor( @IPartService partService: IPartService, @@ -633,7 +633,8 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { ], { identityProvider, - accessibilityProvider: this.instantiationService.createInstance(SearchAccessibilityProvider, this.viewModel) + accessibilityProvider: this.instantiationService.createInstance(SearchAccessibilityProvider, this.viewModel), + dnd: this.instantiationService.createInstance(SearchDND) })); this._register(this.tree.onContextMenu(e => this.onContextMenu(e))); @@ -1142,20 +1143,6 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { return; } - // Validate regex is OK - if (isRegex) { - let regExp: RegExp; - try { - regExp = new RegExp(contentPattern); - } catch (e) { - return; // malformed regex - } - - if (strings.regExpLeadsToEndlessLoop(regExp)) { - return; // endless regex - } - } - const content: IPatternInfo = { pattern: contentPattern, isRegExp: isRegex, @@ -1241,7 +1228,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel { this.currentSearchQ = this.currentSearchQ .then(() => this.doSearch(query, options, excludePatternText, includePatternText)) - .then(() => { }, () => { }); + .then(() => undefined, () => undefined); } private doSearch(query: ITextQuery, options: ITextQueryBuilderOptions, excludePatternText: string, includePatternText: string): Thenable { diff --git a/src/vs/workbench/parts/search/browser/searchWidget.ts b/src/vs/workbench/contrib/search/browser/searchWidget.ts similarity index 97% rename from src/vs/workbench/parts/search/browser/searchWidget.ts rename to src/vs/workbench/contrib/search/browser/searchWidget.ts index 580a4a0044b..3aee389d753 100644 --- a/src/vs/workbench/parts/search/browser/searchWidget.ts +++ b/src/vs/workbench/contrib/search/browser/searchWidget.ts @@ -29,8 +29,8 @@ import { ISearchConfigurationProperties } from 'vs/platform/search/common/search import { attachFindInputBoxStyler, attachInputBoxStyler } from 'vs/platform/theme/common/styler'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { ContextScopedFindInput, ContextScopedHistoryInputBox } from 'vs/platform/widget/browser/contextScopedHistoryWidget'; -import { appendKeyBindingLabel, isSearchViewFocused } from 'vs/workbench/parts/search/browser/searchActions'; -import * as Constants from 'vs/workbench/parts/search/common/constants'; +import { appendKeyBindingLabel, isSearchViewFocused } from 'vs/workbench/contrib/search/browser/searchActions'; +import * as Constants from 'vs/workbench/contrib/search/common/constants'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; @@ -397,15 +397,12 @@ export class SearchWidget extends Widget { if (!this.searchInput.getRegex()) { return null; } - let regExp: RegExp; try { - regExp = new RegExp(value); + // tslint:disable-next-line: no-unused-expression + new RegExp(value); } catch (e) { return { content: e.message }; } - if (strings.regExpLeadsToEndlessLoop(regExp)) { - return { content: nls.localize('regexp.validationFailure', "Expression matches everything") }; - } if (strings.regExpContainsBackreference(value)) { if (!this.searchConfiguration.usePCRE2) { @@ -443,14 +440,16 @@ export class SearchWidget extends Widget { else if (keyboardEvent.equals(KeyCode.UpArrow)) { const ta = this.searchInput.domNode.querySelector('textarea'); - if (ta && ta.selectionStart > 0) { + const isMultiline = !!this.searchInput.getValue().match(/\n/); + if (ta && isMultiline && ta.selectionStart > 0) { keyboardEvent.stopPropagation(); } } else if (keyboardEvent.equals(KeyCode.DownArrow)) { const ta = this.searchInput.domNode.querySelector('textarea'); - if (ta && ta.selectionEnd < ta.value.length) { + const isMultiline = !!this.searchInput.getValue().match(/\n/); + if (ta && isMultiline && ta.selectionEnd < ta.value.length) { keyboardEvent.stopPropagation(); } } diff --git a/src/vs/workbench/parts/search/common/constants.ts b/src/vs/workbench/contrib/search/common/constants.ts similarity index 100% rename from src/vs/workbench/parts/search/common/constants.ts rename to src/vs/workbench/contrib/search/common/constants.ts diff --git a/src/vs/workbench/parts/search/common/queryBuilder.ts b/src/vs/workbench/contrib/search/common/queryBuilder.ts similarity index 100% rename from src/vs/workbench/parts/search/common/queryBuilder.ts rename to src/vs/workbench/contrib/search/common/queryBuilder.ts diff --git a/src/vs/workbench/parts/search/common/replace.ts b/src/vs/workbench/contrib/search/common/replace.ts similarity index 97% rename from src/vs/workbench/parts/search/common/replace.ts rename to src/vs/workbench/contrib/search/common/replace.ts index 2f42429068b..13db8de0277 100644 --- a/src/vs/workbench/parts/search/common/replace.ts +++ b/src/vs/workbench/contrib/search/common/replace.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Match, FileMatch, FileMatchOrMatch } from 'vs/workbench/parts/search/common/searchModel'; +import { Match, FileMatch, FileMatchOrMatch } from 'vs/workbench/contrib/search/common/searchModel'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IProgressRunner } from 'vs/platform/progress/common/progress'; diff --git a/src/vs/workbench/parts/search/common/search.ts b/src/vs/workbench/contrib/search/common/search.ts similarity index 100% rename from src/vs/workbench/parts/search/common/search.ts rename to src/vs/workbench/contrib/search/common/search.ts diff --git a/src/vs/workbench/parts/search/common/searchModel.ts b/src/vs/workbench/contrib/search/common/searchModel.ts similarity index 99% rename from src/vs/workbench/parts/search/common/searchModel.ts rename to src/vs/workbench/contrib/search/common/searchModel.ts index b700671faa0..1e020ef4531 100644 --- a/src/vs/workbench/parts/search/common/searchModel.ts +++ b/src/vs/workbench/contrib/search/common/searchModel.ts @@ -24,7 +24,7 @@ import { IFileMatch, IPatternInfo, ISearchComplete, ISearchProgressItem, ISearch import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { overviewRulerFindMatchForeground } from 'vs/platform/theme/common/colorRegistry'; import { themeColorFromId } from 'vs/platform/theme/common/themeService'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; import { editorMatchesToTextSearchResults } from 'vs/workbench/services/search/common/searchHelpers'; export class Match { diff --git a/src/vs/workbench/parts/search/electron-browser/media/search-dark.svg b/src/vs/workbench/contrib/search/electron-browser/media/search-dark.svg similarity index 100% rename from src/vs/workbench/parts/search/electron-browser/media/search-dark.svg rename to src/vs/workbench/contrib/search/electron-browser/media/search-dark.svg diff --git a/src/vs/workbench/parts/search/electron-browser/media/search.contribution.css b/src/vs/workbench/contrib/search/electron-browser/media/search.contribution.css similarity index 100% rename from src/vs/workbench/parts/search/electron-browser/media/search.contribution.css rename to src/vs/workbench/contrib/search/electron-browser/media/search.contribution.css diff --git a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts b/src/vs/workbench/contrib/search/electron-browser/search.contribution.ts similarity index 96% rename from src/vs/workbench/parts/search/electron-browser/search.contribution.ts rename to src/vs/workbench/contrib/search/electron-browser/search.contribution.ts index a299f18b82a..8f8d622cb86 100644 --- a/src/vs/workbench/parts/search/electron-browser/search.contribution.ts +++ b/src/vs/workbench/contrib/search/electron-browser/search.contribution.ts @@ -38,22 +38,22 @@ import { Extensions as QuickOpenExtensions, IQuickOpenRegistry, QuickOpenHandler 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 { getMultiSelectedResources } from 'vs/workbench/parts/files/browser/files'; -import { ExplorerFolderContext, ExplorerRootContext, FilesExplorerFocusCondition } from 'vs/workbench/parts/files/common/files'; -import { OpenAnythingHandler } from 'vs/workbench/parts/search/browser/openAnythingHandler'; -import { OpenSymbolHandler } from 'vs/workbench/parts/search/browser/openSymbolHandler'; -import { registerContributions as replaceContributions } from 'vs/workbench/parts/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/parts/search/browser/searchActions'; -import { registerContributions as searchWidgetContributions } from 'vs/workbench/parts/search/browser/searchWidget'; -import * as Constants from 'vs/workbench/parts/search/common/constants'; -import { getWorkspaceSymbols } from 'vs/workbench/parts/search/common/search'; -import { FileMatchOrMatch, ISearchWorkbenchService, RenderableMatch, SearchWorkbenchService } from 'vs/workbench/parts/search/common/searchModel'; +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 { 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 { 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 { 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 { SearchView } from 'vs/workbench/parts/search/browser/searchView'; +import { SearchView } from 'vs/workbench/contrib/search/browser/searchView'; registerSingleton(ISearchWorkbenchService, SearchWorkbenchService, true); replaceContributions(); @@ -618,6 +618,11 @@ configurationRegistry.registerConfiguration({ deprecationMessage: nls.localize('useRipgrepDeprecated', "Deprecated. Consider \"search.usePCRE2\" for advanced regex feature support."), default: true }, + 'search.maintainFileSearchCache': { + type: 'boolean', + description: nls.localize('search.maintainFileSearchCache', "When enabled, the searchService process will be kept alive instead of being shut down after an hour of inactivity. This will keep the file search cache in memory."), + default: false + }, 'search.useIgnoreFiles': { type: 'boolean', markdownDescription: nls.localize('useIgnoreFiles', "Controls whether to use `.gitignore` and `.ignore` files when searching for files."), diff --git a/src/vs/workbench/parts/search/test/browser/mockSearchTree.ts b/src/vs/workbench/contrib/search/test/browser/mockSearchTree.ts similarity index 100% rename from src/vs/workbench/parts/search/test/browser/mockSearchTree.ts rename to src/vs/workbench/contrib/search/test/browser/mockSearchTree.ts diff --git a/src/vs/workbench/parts/search/test/browser/openFileHandler.test.ts b/src/vs/workbench/contrib/search/test/browser/openFileHandler.test.ts similarity index 98% rename from src/vs/workbench/parts/search/test/browser/openFileHandler.test.ts rename to src/vs/workbench/contrib/search/test/browser/openFileHandler.test.ts index e9d82ebec33..97eebd7be8e 100644 --- a/src/vs/workbench/parts/search/test/browser/openFileHandler.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/openFileHandler.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import * as errors from 'vs/base/common/errors'; import * as objects from 'vs/base/common/objects'; -import { CacheState } from 'vs/workbench/parts/search/browser/openFileHandler'; +import { CacheState } from 'vs/workbench/contrib/search/browser/openFileHandler'; import { DeferredPromise } from 'vs/base/test/common/utils'; import { QueryType, IFileQuery } from 'vs/platform/search/common/search'; diff --git a/src/vs/workbench/parts/search/test/browser/searchActions.test.ts b/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts similarity index 96% rename from src/vs/workbench/parts/search/test/browser/searchActions.test.ts rename to src/vs/workbench/contrib/search/test/browser/searchActions.test.ts index 26dbb0d902c..452302f9df3 100644 --- a/src/vs/workbench/parts/search/test/browser/searchActions.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchActions.test.ts @@ -15,9 +15,9 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { USLayoutResolvedKeybinding } from 'vs/platform/keybinding/common/usLayoutResolvedKeybinding'; import { IFileMatch } from 'vs/platform/search/common/search'; -import { ReplaceAction } from 'vs/workbench/parts/search/browser/searchActions'; -import { FileMatch, FileMatchOrMatch, Match } from 'vs/workbench/parts/search/common/searchModel'; -import { MockObjectTree } from 'vs/workbench/parts/search/test/browser/mockSearchTree'; +import { ReplaceAction } from 'vs/workbench/contrib/search/browser/searchActions'; +import { FileMatch, FileMatchOrMatch, Match } from 'vs/workbench/contrib/search/common/searchModel'; +import { MockObjectTree } from 'vs/workbench/contrib/search/test/browser/mockSearchTree'; suite('Search Actions', () => { diff --git a/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts similarity index 98% rename from src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts rename to src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts index 24925478596..7e4e27f20b6 100644 --- a/src/vs/workbench/parts/search/test/browser/searchViewlet.test.ts +++ b/src/vs/workbench/contrib/search/test/browser/searchViewlet.test.ts @@ -12,7 +12,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { IFileMatch, ITextSearchMatch, OneLineRange, QueryType } from 'vs/platform/search/common/search'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; -import { FileMatch, Match, searchMatchComparer, SearchResult } from 'vs/workbench/parts/search/common/searchModel'; +import { FileMatch, Match, searchMatchComparer, SearchResult } from 'vs/workbench/contrib/search/common/searchModel'; import { TestContextService } from 'vs/workbench/test/workbenchTestServices'; suite('Search - Viewlet', () => { diff --git a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts b/src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts similarity index 99% rename from src/vs/workbench/parts/search/test/common/queryBuilder.test.ts rename to src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts index 310e3b4d731..a698314ec1f 100644 --- a/src/vs/workbench/parts/search/test/common/queryBuilder.test.ts +++ b/src/vs/workbench/contrib/search/test/common/queryBuilder.test.ts @@ -12,7 +12,7 @@ import { IEnvironmentService } from 'vs/platform/environment/common/environment' import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IFolderQuery, IPatternInfo, QueryType, ITextQuery, IFileQuery } from 'vs/platform/search/common/search'; import { IWorkspaceContextService, toWorkspaceFolders, Workspace } from 'vs/platform/workspace/common/workspace'; -import { ISearchPathsResult, QueryBuilder } from 'vs/workbench/parts/search/common/queryBuilder'; +import { ISearchPathsResult, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; import { TestContextService, TestEnvironmentService } from 'vs/workbench/test/workbenchTestServices'; const DEFAULT_EDITOR_CONFIG = {}; diff --git a/src/vs/workbench/parts/search/test/common/searchModel.test.ts b/src/vs/workbench/contrib/search/test/common/searchModel.test.ts similarity index 99% rename from src/vs/workbench/parts/search/test/common/searchModel.test.ts rename to src/vs/workbench/contrib/search/test/common/searchModel.test.ts index 3e20387d40a..753daca49ba 100644 --- a/src/vs/workbench/parts/search/test/common/searchModel.test.ts +++ b/src/vs/workbench/contrib/search/test/common/searchModel.test.ts @@ -17,7 +17,7 @@ import { TestInstantiationService } from 'vs/platform/instantiation/test/common/ import { IFileMatch, IFileSearchStats, IFolderQuery, ISearchComplete, ISearchProgressItem, ISearchQuery, ISearchService, ITextSearchMatch, OneLineRange, TextSearchMatch } from 'vs/platform/search/common/search'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtils'; -import { SearchModel } from 'vs/workbench/parts/search/common/searchModel'; +import { SearchModel } from 'vs/workbench/contrib/search/common/searchModel'; const nullEvent = new class { id: number; diff --git a/src/vs/workbench/parts/search/test/common/searchResult.test.ts b/src/vs/workbench/contrib/search/test/common/searchResult.test.ts similarity index 99% rename from src/vs/workbench/parts/search/test/common/searchResult.test.ts rename to src/vs/workbench/contrib/search/test/common/searchResult.test.ts index 61421c17c10..5824e9476b9 100644 --- a/src/vs/workbench/parts/search/test/common/searchResult.test.ts +++ b/src/vs/workbench/contrib/search/test/common/searchResult.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as sinon from 'sinon'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; -import { Match, FileMatch, SearchResult, SearchModel } from 'vs/workbench/parts/search/common/searchModel'; +import { Match, FileMatch, SearchResult, SearchModel } from 'vs/workbench/contrib/search/common/searchModel'; import { URI } from 'vs/base/common/uri'; import { IFileMatch, TextSearchMatch, OneLineRange, ITextSearchMatch } from 'vs/platform/search/common/search'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; @@ -15,7 +15,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { IReplaceService } from 'vs/workbench/parts/search/common/replace'; +import { IReplaceService } from 'vs/workbench/contrib/search/common/replace'; const lineOneRange = new OneLineRange(1, 0, 1); diff --git a/src/vs/workbench/parts/snippets/electron-browser/configureSnippets.ts b/src/vs/workbench/contrib/snippets/electron-browser/configureSnippets.ts similarity index 86% rename from src/vs/workbench/parts/snippets/electron-browser/configureSnippets.ts rename to src/vs/workbench/contrib/snippets/electron-browser/configureSnippets.ts index a545024ae54..5c8d2d0fff1 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/configureSnippets.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/configureSnippets.ts @@ -13,10 +13,10 @@ import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { timeout } from 'vs/base/common/async'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import { URI } from 'vs/base/common/uri'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; import { values } from 'vs/base/common/map'; import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; -import { SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IFileService } from 'vs/platform/files/common/files'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -120,7 +120,7 @@ async function computePicks(snippetService: ISnippetsService, envService: IEnvir return { existing, future }; } -async function createGlobalSnippetFile(defaultPath: URI, windowService: IWindowService, notificationService: INotificationService, fileService: IFileService, opener: IOpenerService) { +async function createSnippetFile(scope: string, defaultPath: URI, windowService: IWindowService, notificationService: INotificationService, fileService: IFileService, opener: IOpenerService) { await fileService.createFolder(defaultPath); await timeout(100); // ensure quick pick closes... @@ -140,7 +140,7 @@ async function createGlobalSnippetFile(defaultPath: URI, windowService: IWindowS await fileService.updateContent(resource, [ '{', - '\t// Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and ', + '\t// Place your ' + scope + ' snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and ', '\t// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope ', '\t// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is ', '\t// used to trigger the snippet and the body will be expanded and inserted. Possible variables are: ', @@ -202,13 +202,17 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise => { const picks = await computePicks(snippetService, envService, modeService); const existing: QuickPickInput[] = picks.existing; - type GlobalSnippetPick = IQuickPickItem & { uri: URI }; - const globalSnippetPicks: GlobalSnippetPick[] = [{ + type SnippetPick = IQuickPickItem & { uri: URI } & { scope: string }; + const globalSnippetPicks: SnippetPick[] = [{ + scope: nls.localize('new.global_scope', 'global'), label: nls.localize('new.global', "New Global Snippets file..."), uri: URI.file(join(envService.appSettingsHome, 'snippets')) }]; + + const workspaceSnippetPicks: SnippetPick[] = []; for (const folder of workspaceService.getWorkspace().folders) { - globalSnippetPicks.push({ + workspaceSnippetPicks.push({ + scope: nls.localize('new.workspace_scope', "{0} workspace", folder.name), label: nls.localize('new.folder', "New Snippets file for '{0}'...", folder.name), uri: folder.toResource('.vscode') }); @@ -221,13 +225,15 @@ CommandsRegistry.registerCommand(id, async (accessor): Promise => { existing.push({ type: 'separator', label: nls.localize('new.global.sep', "New Snippets") }); } - const pick = await quickInputService.pick(([] as QuickPickInput[]).concat(existing, globalSnippetPicks, picks.future), { + const pick = await quickInputService.pick(([] as QuickPickInput[]).concat(existing, globalSnippetPicks, workspaceSnippetPicks, picks.future), { placeHolder: nls.localize('openSnippet.pickLanguage', "Select Snippets File or Create Snippets"), matchOnDescription: true }); - if (globalSnippetPicks.indexOf(pick as GlobalSnippetPick) >= 0) { - return createGlobalSnippetFile((pick as GlobalSnippetPick).uri, windowService, notificationService, fileService, opener); + if (globalSnippetPicks.indexOf(pick as SnippetPick) >= 0) { + return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, windowService, notificationService, fileService, opener); + } else if (workspaceSnippetPicks.indexOf(pick as SnippetPick) >= 0) { + return createSnippetFile((pick as SnippetPick).scope, (pick as SnippetPick).uri, windowService, notificationService, fileService, opener); } else if (ISnippetPick.is(pick)) { if (pick.hint) { await createLanguageSnippetFile(pick, fileService); diff --git a/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts b/src/vs/workbench/contrib/snippets/electron-browser/insertSnippet.ts similarity index 96% rename from src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts rename to src/vs/workbench/contrib/snippets/electron-browser/insertSnippet.ts index 26e465de1fa..c25feb0f293 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/insertSnippet.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/insertSnippet.ts @@ -8,11 +8,11 @@ import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/ import { IModeService } from 'vs/editor/common/services/modeService'; import { LanguageId } from 'vs/editor/common/modes'; import { ICommandService, CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { Snippet, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; import { IQuickPickItem, IQuickInputService, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; interface ISnippetPick extends IQuickPickItem { diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider.ts b/src/vs/workbench/contrib/snippets/electron-browser/snippetCompletionProvider.ts similarity index 89% rename from src/vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider.ts rename to src/vs/workbench/contrib/snippets/electron-browser/snippetCompletionProvider.ts index f2abc6ac957..1804c78c6d4 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/snippetCompletionProvider.ts @@ -8,12 +8,12 @@ import { compare } from 'vs/base/common/strings'; import { Position } from 'vs/editor/common/core/position'; import { IRange, Range } from 'vs/editor/common/core/range'; import { ITextModel } from 'vs/editor/common/model'; -import { CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionList, LanguageId, CompletionItemInsertTextRule } from 'vs/editor/common/modes'; +import { CompletionItem, CompletionItemKind, CompletionItemProvider, CompletionList, LanguageId, CompletionItemInsertTextRule, CompletionContext, CompletionTriggerKind } from 'vs/editor/common/modes'; import { IModeService } from 'vs/editor/common/services/modeService'; import { SnippetParser } from 'vs/editor/contrib/snippet/snippetParser'; import { localize } from 'vs/nls'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; -import { Snippet, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; +import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; export class SnippetCompletion implements CompletionItem { @@ -73,12 +73,17 @@ export class SnippetCompletionProvider implements CompletionItemProvider { // } - provideCompletionItems(model: ITextModel, position: Position): Promise | undefined { + provideCompletionItems(model: ITextModel, position: Position, context: CompletionContext): Promise | undefined { if (position.column >= SnippetCompletionProvider._maxPrefix) { return undefined; } + if (context.triggerKind === CompletionTriggerKind.TriggerCharacter && context.triggerCharacter === ' ') { + // no snippets when suggestions have been triggered by space + return undefined; + } + const languageId = this._getLanguageIdAtPosition(model, position); return this._snippets.getSnippets(languageId).then(snippets => { diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts b/src/vs/workbench/contrib/snippets/electron-browser/snippets.contribution.ts similarity index 97% rename from src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts rename to src/vs/workbench/contrib/snippets/electron-browser/snippets.contribution.ts index 7683f6b1b3a..c8677f3e9f8 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippets.contribution.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/snippets.contribution.ts @@ -9,7 +9,7 @@ import * as JSONContributionRegistry from 'vs/platform/jsonschemas/common/jsonCo import * as nls from 'vs/nls'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { LanguageId } from 'vs/editor/common/modes'; -import { SnippetFile, Snippet } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { SnippetFile, Snippet } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; export const ISnippetsService = createDecorator('snippetService'); diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsFile.ts b/src/vs/workbench/contrib/snippets/electron-browser/snippetsFile.ts similarity index 100% rename from src/vs/workbench/parts/snippets/electron-browser/snippetsFile.ts rename to src/vs/workbench/contrib/snippets/electron-browser/snippetsFile.ts diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts b/src/vs/workbench/contrib/snippets/electron-browser/snippetsService.ts similarity index 98% rename from src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts rename to src/vs/workbench/contrib/snippets/electron-browser/snippetsService.ts index 7a288503970..87a6d143f8d 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsService.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/snippetsService.ts @@ -21,8 +21,8 @@ import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { ILogService } from 'vs/platform/log/common/log'; import { IWorkspace, IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; -import { Snippet, SnippetFile, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; +import { Snippet, SnippetFile, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; import { ExtensionsRegistry, IExtensionPointUser } from 'vs/workbench/services/extensions/common/extensionsRegistry'; import { languagesExtPoint } from 'vs/workbench/services/mode/common/workbenchModeService'; import { SnippetCompletionProvider } from './snippetCompletionProvider'; diff --git a/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts b/src/vs/workbench/contrib/snippets/electron-browser/tabCompletion.ts similarity index 93% rename from src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts rename to src/vs/workbench/contrib/snippets/electron-browser/tabCompletion.ts index 41affd11eb8..28f171af6b2 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/tabCompletion.ts +++ b/src/vs/workbench/contrib/snippets/electron-browser/tabCompletion.ts @@ -6,8 +6,8 @@ import { KeyCode } from 'vs/base/common/keyCodes'; import { RawContextKey, IContextKeyService, ContextKeyExpr, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; -import { getNonWhitespacePrefix } from 'vs/workbench/parts/snippets/electron-browser/snippetsService'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; +import { getNonWhitespacePrefix } from 'vs/workbench/contrib/snippets/electron-browser/snippetsService'; import { endsWith } from 'vs/base/common/strings'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import * as editorCommon from 'vs/editor/common/editorCommon'; @@ -17,8 +17,8 @@ import { SnippetController2 } from 'vs/editor/contrib/snippet/snippetController2 import { showSimpleSuggestions } from 'vs/editor/contrib/suggest/suggest'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ICodeEditor } from 'vs/editor/browser/editorBrowser'; -import { Snippet } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; -import { SnippetCompletion } from 'vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider'; +import { Snippet } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; +import { SnippetCompletion } from 'vs/workbench/contrib/snippets/electron-browser/snippetCompletionProvider'; export class TabCompletionController implements editorCommon.IEditorContribution { diff --git a/src/vs/workbench/parts/snippets/test/electron-browser/snippetFile.test.ts b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetFile.test.ts similarity index 97% rename from src/vs/workbench/parts/snippets/test/electron-browser/snippetFile.test.ts rename to src/vs/workbench/contrib/snippets/test/electron-browser/snippetFile.test.ts index bc798bf3433..2403cdb6634 100644 --- a/src/vs/workbench/parts/snippets/test/electron-browser/snippetFile.test.ts +++ b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetFile.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SnippetFile, Snippet, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { SnippetFile, Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; import { URI } from 'vs/base/common/uri'; suite('Snippets', function () { diff --git a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRegistry.test.ts b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRegistry.test.ts similarity index 97% rename from src/vs/workbench/parts/snippets/test/electron-browser/snippetsRegistry.test.ts rename to src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRegistry.test.ts index 8d2958b8275..ebfe3292282 100644 --- a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRegistry.test.ts +++ b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRegistry.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { getNonWhitespacePrefix } from 'vs/workbench/parts/snippets/electron-browser/snippetsService'; +import { getNonWhitespacePrefix } from 'vs/workbench/contrib/snippets/electron-browser/snippetsService'; import { Position } from 'vs/editor/common/core/position'; suite('getNonWhitespacePrefix', () => { diff --git a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRewrite.test.ts b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRewrite.test.ts similarity index 94% rename from src/vs/workbench/parts/snippets/test/electron-browser/snippetsRewrite.test.ts rename to src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRewrite.test.ts index 0d084d9d89c..9747e16114f 100644 --- a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsRewrite.test.ts +++ b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsRewrite.test.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Snippet, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; suite('SnippetRewrite', function () { diff --git a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsService.test.ts similarity index 92% rename from src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts rename to src/vs/workbench/contrib/snippets/test/electron-browser/snippetsService.test.ts index 873bd9fd020..d71653bfd19 100644 --- a/src/vs/workbench/parts/snippets/test/electron-browser/snippetsService.test.ts +++ b/src/vs/workbench/contrib/snippets/test/electron-browser/snippetsService.test.ts @@ -4,14 +4,15 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { SnippetCompletionProvider } from 'vs/workbench/parts/snippets/electron-browser/snippetCompletionProvider'; +import { SnippetCompletionProvider } from 'vs/workbench/contrib/snippets/electron-browser/snippetCompletionProvider'; import { Position } from 'vs/editor/common/core/position'; import { ModesRegistry } from 'vs/editor/common/modes/modesRegistry'; import { ModeServiceImpl } from 'vs/editor/common/services/modeServiceImpl'; import { TextModel } from 'vs/editor/common/model/textModel'; -import { ISnippetsService } from 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; -import { Snippet, SnippetSource } from 'vs/workbench/parts/snippets/electron-browser/snippetsFile'; +import { ISnippetsService } from 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; +import { Snippet, SnippetSource } from 'vs/workbench/contrib/snippets/electron-browser/snippetsFile'; import { LanguageConfigurationRegistry } from 'vs/editor/common/modes/languageConfigurationRegistry'; +import { CompletionContext, CompletionTriggerKind } from 'vs/editor/common/modes'; class SimpleSnippetService implements ISnippetsService { _serviceBrand: any; @@ -39,6 +40,7 @@ suite('SnippetsService', function () { let modeService: ModeServiceImpl; let snippetService: ISnippetsService; + let context: CompletionContext = { triggerKind: CompletionTriggerKind.Invoke }; setup(function () { modeService = new ModeServiceImpl(); @@ -67,7 +69,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); const model = TextModel.createFromString('', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1))!.then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), context)!.then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 2); }); @@ -78,7 +80,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); const model = TextModel.createFromString('bar', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 4))!.then(result => { + return provider.provideCompletionItems(model, new Position(1, 4), context)!.then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].label, 'bar'); @@ -110,7 +112,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); const model = TextModel.createFromString('bar-bar', undefined, modeService.getLanguageIdentifier('fooLang')); - await provider.provideCompletionItems(model, new Position(1, 3))!.then(result => { + await provider.provideCompletionItems(model, new Position(1, 3), context)!.then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 2); assert.equal(result.suggestions[0].label, 'bar'); @@ -121,7 +123,7 @@ suite('SnippetsService', function () { assert.equal(result.suggestions[1].range.startColumn, 1); }); - await provider.provideCompletionItems(model, new Position(1, 5))!.then(result => { + await provider.provideCompletionItems(model, new Position(1, 5), context)!.then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].label, 'bar-bar'); @@ -129,7 +131,7 @@ suite('SnippetsService', function () { assert.equal(result.suggestions[0].range.startColumn, 1); }); - await provider.provideCompletionItems(model, new Position(1, 6))!.then(result => { + await provider.provideCompletionItems(model, new Position(1, 6), context)!.then(result => { assert.equal(result.incomplete, undefined); assert.equal(result.suggestions.length, 2); assert.equal(result.suggestions[0].label, 'bar'); @@ -155,19 +157,19 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('\t { + return provider.provideCompletionItems(model, new Position(1, 7), context)!.then(result => { assert.equal(result.suggestions.length, 1); model.dispose(); model = TextModel.createFromString('\t { assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].range.startColumn, 2); model.dispose(); model = TextModel.createFromString('a { assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].range.startColumn, 2); @@ -190,9 +192,9 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('\n\t\n>/head>', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1))!.then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), context)!.then(result => { assert.equal(result.suggestions.length, 1); - return provider.provideCompletionItems(model, new Position(2, 2))!; + return provider.provideCompletionItems(model, new Position(2, 2), context)!; }).then(result => { assert.equal(result.suggestions.length, 1); }); @@ -220,7 +222,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('', undefined, modeService.getLanguageIdentifier('fooLang')); - return provider.provideCompletionItems(model, new Position(1, 1))!.then(result => { + return provider.provideCompletionItems(model, new Position(1, 1), context)!.then(result => { assert.equal(result.suggestions.length, 2); let [first, second] = result.suggestions; assert.equal(first.label, 'first'); @@ -242,13 +244,13 @@ suite('SnippetsService', function () { let model = TextModel.createFromString('p-', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 2))!; + let result = await provider.provideCompletionItems(model, new Position(1, 2), context)!; assert.equal(result.suggestions.length, 1); - result = await provider.provideCompletionItems(model, new Position(1, 3))!; + result = await provider.provideCompletionItems(model, new Position(1, 3), context)!; assert.equal(result.suggestions.length, 1); - result = await provider.provideCompletionItems(model, new Position(1, 3))!; + result = await provider.provideCompletionItems(model, new Position(1, 3), context)!; assert.equal(result.suggestions.length, 1); }); @@ -266,7 +268,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea b', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 158))!; + let result = await provider.provideCompletionItems(model, new Position(1, 158), context)!; assert.equal(result.suggestions.length, 1); }); @@ -285,7 +287,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString(':', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 2))!; + let result = await provider.provideCompletionItems(model, new Position(1, 2), context)!; assert.equal(result.suggestions.length, 0); }); @@ -304,7 +306,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('template', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 9))!; + let result = await provider.provideCompletionItems(model, new Position(1, 9), context)!; assert.equal(result.suggestions.length, 1); assert.equal(result.suggestions[0].label, 'mytemplate'); @@ -324,7 +326,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea Thisisaverylonglinegoingwithmore100bcharactersandthismakesintellisensebecomea b text_after_b', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 158))!; + let result = await provider.provideCompletionItems(model, new Position(1, 158), context)!; assert.equal(result.suggestions.length, 1); }); @@ -346,7 +348,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('.🐷-a-b', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 8))!; + let result = await provider.provideCompletionItems(model, new Position(1, 8), context)!; assert.equal(result.suggestions.length, 1); @@ -367,7 +369,7 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString('a ', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 3))!; + let result = await provider.provideCompletionItems(model, new Position(1, 3), context)!; assert.equal(result.suggestions.length, 1); }); @@ -394,14 +396,14 @@ suite('SnippetsService', function () { const provider = new SnippetCompletionProvider(modeService, snippetService); let model = TextModel.createFromString(' <', undefined, modeService.getLanguageIdentifier('fooLang')); - let result = await provider.provideCompletionItems(model, new Position(1, 3))!; + let result = await provider.provideCompletionItems(model, new Position(1, 3), context)!; assert.equal(result.suggestions.length, 1); let [first] = result.suggestions; assert.equal(first.range.startColumn, 2); model = TextModel.createFromString('1', undefined, modeService.getLanguageIdentifier('fooLang')); - result = await provider.provideCompletionItems(model, new Position(1, 2))!; + result = await provider.provideCompletionItems(model, new Position(1, 2), context)!; assert.equal(result.suggestions.length, 1); [first] = result.suggestions; diff --git a/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts similarity index 98% rename from src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts rename to src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts index 101253b23b1..018ac5b635d 100644 --- a/src/vs/workbench/parts/splash/electron-browser/partsSplash.contribution.ts +++ b/src/vs/workbench/contrib/splash/electron-browser/partsSplash.contribution.ts @@ -62,10 +62,10 @@ class PartsSplash { const layoutInfo = !this._shouldSaveLayoutInfo() ? undefined : { sideBarSide: this._partService.getSideBarPosition() === Position.RIGHT ? 'right' : 'left', editorPartMinWidth: DEFAULT_EDITOR_MIN_DIMENSIONS.width, - titleBarHeight: getTotalHeight(this._partService.getContainer(Parts.TITLEBAR_PART)), - activityBarWidth: getTotalWidth(this._partService.getContainer(Parts.ACTIVITYBAR_PART)), - sideBarWidth: getTotalWidth(this._partService.getContainer(Parts.SIDEBAR_PART)), - statusBarHeight: getTotalHeight(this._partService.getContainer(Parts.STATUSBAR_PART)), + titleBarHeight: getTotalHeight(this._partService.getContainer(Parts.TITLEBAR_PART)!), + activityBarWidth: getTotalWidth(this._partService.getContainer(Parts.ACTIVITYBAR_PART)!), + sideBarWidth: getTotalWidth(this._partService.getContainer(Parts.SIDEBAR_PART)!), + statusBarHeight: getTotalHeight(this._partService.getContainer(Parts.STATUSBAR_PART)!), }; this._storageService.store('parts-splash-data', JSON.stringify({ id: PartsSplash._splashElementId, diff --git a/src/vs/workbench/parts/stats/node/stats.contribution.ts b/src/vs/workbench/contrib/stats/node/stats.contribution.ts similarity index 90% rename from src/vs/workbench/parts/stats/node/stats.contribution.ts rename to src/vs/workbench/contrib/stats/node/stats.contribution.ts index 89ae2b9c1d5..ee3b9b175d5 100644 --- a/src/vs/workbench/parts/stats/node/stats.contribution.ts +++ b/src/vs/workbench/contrib/stats/node/stats.contribution.ts @@ -5,7 +5,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; -import { WorkspaceStats } from 'vs/workbench/parts/stats/node/workspaceStats'; +import { WorkspaceStats } from 'vs/workbench/contrib/stats/node/workspaceStats'; import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; // Register Workspace Stats Contribution diff --git a/src/vs/workbench/parts/stats/node/workspaceStats.ts b/src/vs/workbench/contrib/stats/node/workspaceStats.ts similarity index 93% rename from src/vs/workbench/parts/stats/node/workspaceStats.ts rename to src/vs/workbench/contrib/stats/node/workspaceStats.ts index bed2040b456..1243fcdf4f2 100644 --- a/src/vs/workbench/parts/stats/node/workspaceStats.ts +++ b/src/vs/workbench/contrib/stats/node/workspaceStats.ts @@ -16,10 +16,12 @@ import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { endsWith } from 'vs/base/common/strings'; import { Schemas } from 'vs/base/common/network'; import { INotificationService, Severity, IPromptChoice } from 'vs/platform/notification/common/notification'; -import { extname, join } from 'path'; import { WORKSPACE_EXTENSION } from 'vs/platform/workspaces/common/workspaces'; import { IQuickInputService, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; +import { joinPath } from 'vs/base/common/resources'; +import { extname } from 'vs/base/common/paths'; +import { collectWorkspaceStats, WorkspaceStats as WorkspaceStatsType } from 'vs/base/node/stats'; const SshProtocolMatcher = /^([^@:]+@)?([^:]+):/; const SshUrlMatcher = /^([^@:]+@)?([^:]+):(.+)$/; @@ -225,10 +227,15 @@ export class WorkspaceStats implements IWorkbenchContribution { private report(): void { - // Workspace Stats + // Workspace Tags this.resolveWorkspaceTags(this.windowService.getConfiguration(), rootFiles => this.handleWorkspaceFiles(rootFiles)) .then(tags => this.reportWorkspaceTags(tags), error => onUnexpectedError(error)); + // Workspace file types, config files, and launch configs + this.getWorkspaceMetadata().then(stats => { + this.reportWorkspaceMetadata(stats); + }); + // Cloud Stats this.reportCloudStats(); @@ -327,17 +334,21 @@ export class WorkspaceStats implements IWorkbenchContribution { const state = this.contextService.getWorkbenchState(); const workspace = this.contextService.getWorkspace(); + function createHash(uri: URI): string { + return crypto.createHash('sha1').update(uri.scheme === Schemas.file ? uri.fsPath : uri.toString()).digest('hex'); + } + let workspaceId: string | undefined; switch (state) { case WorkbenchState.EMPTY: workspaceId = undefined; break; case WorkbenchState.FOLDER: - workspaceId = crypto.createHash('sha1').update(workspace.folders[0].uri.scheme === Schemas.file ? workspace.folders[0].uri.fsPath : workspace.folders[0].uri.toString()).digest('hex'); + workspaceId = createHash(workspace.folders[0].uri); break; case WorkbenchState.WORKSPACE: if (workspace.configuration) { - workspaceId = crypto.createHash('sha1').update(workspace.configuration.fsPath).digest('hex'); + workspaceId = createHash(workspace.configuration); } } @@ -547,7 +558,7 @@ export class WorkspaceStats implements IWorkbenchContribution { this.notificationService.prompt(Severity.Info, localize('workspaceFound', "This folder contains a workspace file '{0}'. Do you want to open it? [Learn more]({1}) about workspace files.", workspaceFile, 'https://go.microsoft.com/fwlink/?linkid=2025315'), [{ label: localize('openWorkspace', "Open Workspace"), - run: () => this.windowService.openWindow([URI.file(join(folder.fsPath, workspaceFile))]) + run: () => this.windowService.openWindow([{ uri: joinPath(folder, workspaceFile), typeHint: 'file' }]) }, doNotShowAgain]); } @@ -560,7 +571,7 @@ export class WorkspaceStats implements IWorkbenchContribution { workspaces.map(workspace => ({ label: workspace } as IQuickPickItem)), { placeHolder: localize('selectToOpen', "Select a workspace to open") }).then(pick => { if (pick) { - this.windowService.openWindow([URI.file(join(folder.fsPath, pick.label))]); + this.windowService.openWindow([{ uri: joinPath(folder, pick.label), typeHint: 'file' }]); } }); } @@ -731,4 +742,39 @@ export class WorkspaceStats implements IWorkbenchContribution { this.telemetryService.publicLog('resolveProxy.stats', { type }); }).then(undefined, onUnexpectedError); } + + /* __GDPR__ + "workspace.metadata" : { + "fileTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "configTypes" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true }, + "launchConfigs" : { "classification": "SystemMetaData", "purpose": "FeatureInsight", "isMeasurement": true } + } + */ + private reportWorkspaceMetadata(stats: WorkspaceStatsType[]): void { + for (let stat of stats) { // one event for each root folder in the workspace + this.telemetryService.publicLog('workspace.metadata', { + 'fileTypes': stat.fileTypes, + 'configTypes': stat.configFiles, + 'launchConfigs': stat.launchConfigFiles + }); + } + } + + private getWorkspaceMetadata(): Promise { + const workspaceStatPromises: Promise[] = []; + const workspace = this.contextService.getWorkspace(); + workspace.folders.forEach(folder => { + const folderUri = URI.revive(folder.uri); + if (folderUri.scheme === 'file') { + const folder = folderUri.fsPath; + workspaceStatPromises.push(collectWorkspaceStats(folder, ['node_modules', '.git']).then(async stats => { + return stats; + })); + } + }); + + return Promise.all(workspaceStatPromises).then((stats) => { + return stats; + }); + } } diff --git a/src/vs/workbench/parts/stats/test/workspaceStats.test.ts b/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts similarity index 99% rename from src/vs/workbench/parts/stats/test/workspaceStats.test.ts rename to src/vs/workbench/contrib/stats/test/workspaceStats.test.ts index f85b99dfb05..3543931c185 100644 --- a/src/vs/workbench/parts/stats/test/workspaceStats.test.ts +++ b/src/vs/workbench/contrib/stats/test/workspaceStats.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as crypto from 'crypto'; -import { getDomainsOfRemotes, getRemotes, getHashedRemotesFromConfig } from 'vs/workbench/parts/stats/node/workspaceStats'; +import { getDomainsOfRemotes, getRemotes, getHashedRemotesFromConfig } from 'vs/workbench/contrib/stats/node/workspaceStats'; function hash(value: string): string { return crypto.createHash('sha1').update(value.toString()).digest('hex'); diff --git a/src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts b/src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts similarity index 100% rename from src/vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution.ts rename to src/vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution.ts diff --git a/src/vs/workbench/parts/surveys/electron-browser/nps.contribution.ts b/src/vs/workbench/contrib/surveys/electron-browser/nps.contribution.ts similarity index 100% rename from src/vs/workbench/parts/surveys/electron-browser/nps.contribution.ts rename to src/vs/workbench/contrib/surveys/electron-browser/nps.contribution.ts diff --git a/src/vs/workbench/parts/tasks/browser/quickOpen.ts b/src/vs/workbench/contrib/tasks/browser/quickOpen.ts similarity index 92% rename from src/vs/workbench/parts/tasks/browser/quickOpen.ts rename to src/vs/workbench/contrib/tasks/browser/quickOpen.ts index fb5f8c33e84..8d7b2e358de 100644 --- a/src/vs/workbench/parts/tasks/browser/quickOpen.ts +++ b/src/vs/workbench/contrib/tasks/browser/quickOpen.ts @@ -13,8 +13,8 @@ import * as QuickOpen from 'vs/base/parts/quickopen/common/quickOpen'; import * as Model from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { CustomTask, ContributedTask } from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskService, ProblemMatcherRunOptions } from 'vs/workbench/parts/tasks/common/taskService'; +import { CustomTask, ContributedTask } from 'vs/workbench/contrib/tasks/common/tasks'; +import { ITaskService, ProblemMatcherRunOptions } from 'vs/workbench/contrib/tasks/common/taskService'; import { ActionBarContributor, ContributableActionProvider } from 'vs/workbench/browser/actions'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -28,7 +28,7 @@ export class TaskEntry extends Model.QuickOpenEntry { return this.task._label; } - public getDescription(): string { + public getDescription(): string | null { if (!this.taskService.needsFolderQualification()) { return null; } @@ -51,7 +51,7 @@ export class TaskEntry extends Model.QuickOpenEntry { this.taskService.run(task, options).then(undefined, reason => { // eat the error, it has already been surfaced to the user and we don't care about it here }); - if (!task.command || task.command.presentation.focus) { + if (!task.command || (task.command.presentation && task.command.presentation.focus)) { this.quickOpenService.close(); return false; } @@ -67,7 +67,7 @@ export class TaskGroupEntry extends Model.QuickOpenEntryGroup { export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { - private tasks: Promise>; + private tasks?: Promise>; constructor( protected quickOpenService: IQuickOpenService, @@ -87,7 +87,10 @@ export abstract class QuickOpenHandler extends Quickopen.QuickOpenHandler { this.tasks = undefined; } - public getResults(input: string, token: CancellationToken): Promise { + public getResults(input: string, token: CancellationToken): Promise { + if (!this.tasks) { + return Promise.resolve(null); + } return this.tasks.then((tasks) => { let entries: Model.QuickOpenEntry[] = []; if (tasks.length === 0 || token.isCancellationRequested) { @@ -186,7 +189,7 @@ class CustomizeTaskAction extends Action { } } - private getTask(element: any): CustomTask | ContributedTask { + private getTask(element: any): CustomTask | ContributedTask | undefined { if (element instanceof TaskEntry) { return element.task; } else if (element instanceof TaskGroupEntry) { @@ -220,7 +223,7 @@ export class QuickOpenActionContributor extends ActionBarContributor { return actions; } - private getTask(context: any): CustomTask | ContributedTask { + private getTask(context: any): CustomTask | ContributedTask | undefined { if (!context) { return undefined; } diff --git a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts b/src/vs/workbench/contrib/tasks/browser/taskQuickOpen.ts similarity index 90% rename from src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts rename to src/vs/workbench/contrib/tasks/browser/taskQuickOpen.ts index 16ea1b58b0c..c7cbb227b24 100644 --- a/src/vs/workbench/parts/tasks/browser/taskQuickOpen.ts +++ b/src/vs/workbench/contrib/tasks/browser/taskQuickOpen.ts @@ -8,8 +8,8 @@ import * as QuickOpen from 'vs/base/parts/quickopen/common/quickOpen'; import * as Model from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; -import { CustomTask, ContributedTask } from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskService } from 'vs/workbench/parts/tasks/common/taskService'; +import { CustomTask, ContributedTask } from 'vs/workbench/contrib/tasks/common/tasks'; +import { ITaskService } from 'vs/workbench/contrib/tasks/common/taskService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import * as base from './quickOpen'; @@ -19,7 +19,7 @@ class TaskEntry extends base.TaskEntry { super(quickOpenService, taskService, task, highlights); } - public run(mode: QuickOpen.Mode, context: Model.IContext): boolean { + public run(mode: QuickOpen.Mode, context: QuickOpen.IEntryRunContext): boolean { if (mode === QuickOpen.Mode.PREVIEW) { return false; } diff --git a/src/vs/workbench/parts/tasks/common/problemCollectors.ts b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts similarity index 99% rename from src/vs/workbench/parts/tasks/common/problemCollectors.ts rename to src/vs/workbench/contrib/tasks/common/problemCollectors.ts index 39bdf7cc041..1e576997a74 100644 --- a/src/vs/workbench/parts/tasks/common/problemCollectors.ts +++ b/src/vs/workbench/contrib/tasks/common/problemCollectors.ts @@ -10,7 +10,7 @@ import { IDisposable } from 'vs/base/common/lifecycle'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { ILineMatcher, createLineMatcher, ProblemMatcher, ProblemMatch, ApplyToKind, WatchingPattern, getResource } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ILineMatcher, createLineMatcher, ProblemMatcher, ProblemMatch, ApplyToKind, WatchingPattern, getResource } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IMarkerService, IMarkerData, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { generateUuid } from 'vs/base/common/uuid'; diff --git a/src/vs/workbench/parts/tasks/common/problemMatcher.ts b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts similarity index 99% rename from src/vs/workbench/parts/tasks/common/problemMatcher.ts rename to src/vs/workbench/contrib/tasks/common/problemMatcher.ts index a9889946c2e..17f50ff18ed 100644 --- a/src/vs/workbench/parts/tasks/common/problemMatcher.ts +++ b/src/vs/workbench/contrib/tasks/common/problemMatcher.ts @@ -1689,7 +1689,7 @@ class ProblemMatcherRegistryImpl implements IProblemMatcherRegistry { private matchers: IStringDictionary; private readyPromise: Promise; - private _onMatchersChanged: Emitter = new Emitter(); + private readonly _onMatchersChanged: Emitter = new Emitter(); public get onMatcherChanged(): Event { return this._onMatchersChanged.event; } diff --git a/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts b/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry.ts similarity index 98% rename from src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts rename to src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry.ts index ab8a3a4231e..99aa431e562 100644 --- a/src/vs/workbench/parts/tasks/common/taskDefinitionRegistry.ts +++ b/src/vs/workbench/contrib/tasks/common/taskDefinitionRegistry.ts @@ -11,7 +11,7 @@ import * as Objects from 'vs/base/common/objects'; import { ExtensionsRegistry, ExtensionMessageCollector } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import * as Tasks from 'vs/workbench/parts/tasks/common/tasks'; +import * as Tasks from 'vs/workbench/contrib/tasks/common/tasks'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/tasks/common/taskService.ts b/src/vs/workbench/contrib/tasks/common/taskService.ts similarity index 95% rename from src/vs/workbench/parts/tasks/common/taskService.ts rename to src/vs/workbench/contrib/tasks/common/taskService.ts index a8f1bb09a04..8bd875adae7 100644 --- a/src/vs/workbench/parts/tasks/common/taskService.ts +++ b/src/vs/workbench/contrib/tasks/common/taskService.ts @@ -10,8 +10,8 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { IDisposable } from 'vs/base/common/lifecycle'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { Task, ContributedTask, CustomTask, TaskSet, TaskSorter, TaskEvent, TaskIdentifier, ConfiguringTask, TaskRunSource } from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskSummary, TaskTerminateResponse, TaskSystemInfo } from 'vs/workbench/parts/tasks/common/taskSystem'; +import { Task, ContributedTask, CustomTask, TaskSet, TaskSorter, TaskEvent, TaskIdentifier, ConfiguringTask, TaskRunSource } from 'vs/workbench/contrib/tasks/common/tasks'; +import { ITaskSummary, TaskTerminateResponse, TaskSystemInfo } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { IStringDictionary } from 'vs/base/common/collections'; export { ITaskSummary, Task, TaskTerminateResponse }; @@ -69,7 +69,7 @@ export interface ITaskService { /** * @param alias The task's name, label or defined identifier. */ - getTask(workspaceFolder: IWorkspaceFolder | string, alias: string | TaskIdentifier, compareId?: boolean): Promise; + getTask(workspaceFolder: IWorkspaceFolder | string, alias: string | TaskIdentifier, compareId?: boolean): Promise; getTasksForGroup(group: string): Promise; getRecentlyUsedTasks(): LinkedMap; createSorter(): TaskSorter; diff --git a/src/vs/workbench/parts/tasks/common/taskSystem.ts b/src/vs/workbench/contrib/tasks/common/taskSystem.ts similarity index 100% rename from src/vs/workbench/parts/tasks/common/taskSystem.ts rename to src/vs/workbench/contrib/tasks/common/taskSystem.ts diff --git a/src/vs/workbench/parts/tasks/common/taskTemplates.ts b/src/vs/workbench/contrib/tasks/common/taskTemplates.ts similarity index 100% rename from src/vs/workbench/parts/tasks/common/taskTemplates.ts rename to src/vs/workbench/contrib/tasks/common/taskTemplates.ts diff --git a/src/vs/workbench/parts/tasks/common/tasks.ts b/src/vs/workbench/contrib/tasks/common/tasks.ts similarity index 99% rename from src/vs/workbench/parts/tasks/common/tasks.ts rename to src/vs/workbench/contrib/tasks/common/tasks.ts index 712309947a5..19d1deee3d2 100644 --- a/src/vs/workbench/parts/tasks/common/tasks.ts +++ b/src/vs/workbench/contrib/tasks/common/tasks.ts @@ -9,7 +9,7 @@ import * as Objects from 'vs/base/common/objects'; import { UriComponents } from 'vs/base/common/uri'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import { ProblemMatcher } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { RawContextKey } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts similarity index 99% rename from src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts rename to src/vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts index 7854bcdd093..89f5ef65397 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchemaCommon.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchemaCommon.ts @@ -6,7 +6,7 @@ import * as nls from 'vs/nls'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { Schemas } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { Schemas } from 'vs/workbench/contrib/tasks/common/problemMatcher'; const schema: IJSONSchema = { definitions: { diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.ts b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts similarity index 97% rename from src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.ts rename to src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts index 2c4b0fbc2d6..e747be3976a 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v1.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v1.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import * as Objects from 'vs/base/common/objects'; import { IJSONSchema } from 'vs/base/common/jsonSchema'; -import { ProblemMatcherRegistry } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcherRegistry } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import commonSchema from './jsonSchemaCommon'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts similarity index 99% rename from src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts rename to src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts index 1f39e52033a..1543a793850 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/jsonSchema_v2.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/jsonSchema_v2.ts @@ -9,7 +9,7 @@ import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; import commonSchema from './jsonSchemaCommon'; -import { ProblemMatcherRegistry } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcherRegistry } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { TaskDefinitionRegistry } from '../common/taskDefinitionRegistry'; import * as ConfigurationResolverUtils from 'vs/workbench/services/configurationResolver/common/configurationResolverUtils'; import { inputsSchema } from 'vs/workbench/services/configurationResolver/common/configurationResolverSchema'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/configure-inverse.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/configure-inverse.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/configure-inverse.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/configure.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/configure.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/configure.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/configure.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/status-error.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/status-error.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/status-error.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/status-error.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/status-info.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/status-info.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/status-info.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/status-info.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/status-warning.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/status-warning.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/status-warning.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/status-warning.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css b/src/vs/workbench/contrib/tasks/electron-browser/media/task.contribution.css similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/task.contribution.css rename to src/vs/workbench/contrib/tasks/electron-browser/media/task.contribution.css diff --git a/src/vs/workbench/parts/tasks/electron-browser/media/task.svg b/src/vs/workbench/contrib/tasks/electron-browser/media/task.svg similarity index 100% rename from src/vs/workbench/parts/tasks/electron-browser/media/task.svg rename to src/vs/workbench/contrib/tasks/electron-browser/media/task.svg diff --git a/src/vs/workbench/parts/tasks/electron-browser/runAutomaticTasks.ts b/src/vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts similarity index 98% rename from src/vs/workbench/parts/tasks/electron-browser/runAutomaticTasks.ts rename to src/vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts index d4443610bd4..b3bccaf94e0 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/runAutomaticTasks.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks.ts @@ -6,9 +6,9 @@ import * as nls from 'vs/nls'; import { Disposable } from 'vs/base/common/lifecycle'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { ITaskService, WorkspaceFolderTaskResult } from 'vs/workbench/parts/tasks/common/taskService'; +import { ITaskService, WorkspaceFolderTaskResult } from 'vs/workbench/contrib/tasks/common/taskService'; import { forEach } from 'vs/base/common/collections'; -import { RunOnOptions, Task, TaskRunSource } from 'vs/workbench/parts/tasks/common/tasks'; +import { RunOnOptions, Task, TaskRunSource } from 'vs/workbench/contrib/tasks/common/tasks'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { Action } from 'vs/base/common/actions'; diff --git a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts similarity index 98% rename from src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts rename to src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts index 2f9570d8b9a..b8810b3ce3f 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/task.contribution.ts @@ -8,7 +8,7 @@ import 'vs/css!./media/task.contribution'; import * as nls from 'vs/nls'; import * as semver from 'semver'; -import { QuickOpenHandler } from 'vs/workbench/parts/tasks/browser/taskQuickOpen'; +import { QuickOpenHandler } from 'vs/workbench/contrib/tasks/browser/taskQuickOpen'; import Severity from 'vs/base/common/severity'; import * as Objects from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; @@ -38,7 +38,7 @@ import { IFileService, IFileStat } from 'vs/platform/files/common/files'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { ProblemMatcherRegistry, NamedProblemMatcher } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcherRegistry, NamedProblemMatcher } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IProgressService2, IProgressOptions, ProgressLocation } from 'vs/platform/progress/common/progress'; @@ -57,44 +57,44 @@ import { StatusbarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; -import Constants from 'vs/workbench/parts/markers/electron-browser/constants'; +import Constants from 'vs/workbench/contrib/markers/electron-browser/constants'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/parts/output/common/output'; +import { IOutputService, IOutputChannelRegistry, Extensions as OutputExt, IOutputChannel } from 'vs/workbench/contrib/output/common/output'; import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; -import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; -import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, TaskErrors, TaskTerminateResponse, TaskSystemInfo, ITaskExecuteResult } from 'vs/workbench/parts/tasks/common/taskSystem'; +import { ITaskSystem, ITaskResolver, ITaskSummary, TaskExecuteKind, TaskError, TaskErrors, TaskTerminateResponse, TaskSystemInfo, ITaskExecuteResult } from 'vs/workbench/contrib/tasks/common/taskSystem'; import { Task, CustomTask, ConfiguringTask, ContributedTask, InMemoryTask, TaskEvent, TaskEventKind, TaskSet, TaskGroup, GroupType, ExecutionEngine, JsonSchemaVersion, TaskSourceKind, TaskSorter, TaskIdentifier, KeyedTaskIdentifier, TASK_RUNNING_STATE, TaskRunSource -} from 'vs/workbench/parts/tasks/common/tasks'; -import { ITaskService, ITaskProvider, ProblemMatcherRunOptions, CustomizationProperties, TaskFilter, WorkspaceFolderTaskResult } from 'vs/workbench/parts/tasks/common/taskService'; -import { getTemplates as getTaskTemplates } from 'vs/workbench/parts/tasks/common/taskTemplates'; +} from 'vs/workbench/contrib/tasks/common/tasks'; +import { ITaskService, ITaskProvider, ProblemMatcherRunOptions, CustomizationProperties, TaskFilter, WorkspaceFolderTaskResult } from 'vs/workbench/contrib/tasks/common/taskService'; +import { getTemplates as getTaskTemplates } from 'vs/workbench/contrib/tasks/common/taskTemplates'; -import { KeyedTaskIdentifier as NKeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/parts/tasks/node/tasks'; +import { KeyedTaskIdentifier as NKeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; import * as TaskConfig from '../node/taskConfiguration'; -import { ProcessTaskSystem } from 'vs/workbench/parts/tasks/node/processTaskSystem'; +import { ProcessTaskSystem } from 'vs/workbench/contrib/tasks/node/processTaskSystem'; import { TerminalTaskSystem } from './terminalTaskSystem'; -import { ProcessRunnerDetector } from 'vs/workbench/parts/tasks/node/processRunnerDetector'; +import { ProcessRunnerDetector } from 'vs/workbench/contrib/tasks/node/processRunnerDetector'; import { QuickOpenActionContributor } from '../browser/quickOpen'; import { Themable, STATUS_BAR_FOREGROUND, STATUS_BAR_NO_FOLDER_FOREGROUND } from 'vs/workbench/common/theme'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IQuickInputService, IQuickPickItem, QuickPickInput } from 'vs/platform/quickinput/common/quickInput'; -import { TaskDefinitionRegistry } from 'vs/workbench/parts/tasks/common/taskDefinitionRegistry'; +import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; import { IContextKey, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; -import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/parts/tasks/electron-browser/runAutomaticTasks'; +import { RunAutomaticTasks, AllowAutomaticTaskRunning, DisallowAutomaticTaskRunning } from 'vs/workbench/contrib/tasks/electron-browser/runAutomaticTasks'; let tasksCategory = nls.localize('tasksCategory', "Tasks"); @@ -401,7 +401,7 @@ class TaskMap { } public get(workspaceFolder: IWorkspaceFolder | string): Task[] { - let result: Task[] = Types.isString(workspaceFolder) ? this._store.get(workspaceFolder) : this._store.get(workspaceFolder.uri.toString()); + let result: Task[] | undefined = Types.isString(workspaceFolder) ? this._store.get(workspaceFolder) : this._store.get(workspaceFolder.uri.toString()); if (!result) { result = []; Types.isString(workspaceFolder) ? this._store.set(workspaceFolder, result) : this._store.set(workspaceFolder.uri.toString(), result); @@ -426,7 +426,7 @@ class TaskMap { } interface TaskQuickPickEntry extends IQuickPickItem { - task: Task; + task: Task | null; } class TaskService extends Disposable implements ITaskService { @@ -449,14 +449,14 @@ class TaskService extends Disposable implements ITaskService { private _executionEngine: ExecutionEngine; private _workspaceFolders: IWorkspaceFolder[]; private _ignoredWorkspaceFolders: IWorkspaceFolder[]; - private _showIgnoreMessage: boolean; + private _showIgnoreMessage?: boolean; private _providers: Map; private _taskSystemInfos: Map; - private _workspaceTasksPromise: Promise>; + private _workspaceTasksPromise?: Promise>; - private _taskSystem: ITaskSystem; - private _taskSystemListener: IDisposable; + private _taskSystem?: ITaskSystem; + private _taskSystemListener?: IDisposable; private _recentlyUsedTasks: LinkedMap; private _taskRunningState: IContextKey; @@ -713,26 +713,24 @@ class TaskService extends Disposable implements ITaskService { return this._taskSystem.extensionCallbackTaskComplete(task); } - public getTask(folder: IWorkspaceFolder | string, identifier: string | TaskIdentifier, compareId: boolean = false): Promise { - let name = Types.isString(folder) ? folder : folder.name; + public getTask(folder: IWorkspaceFolder | string, identifier: string | TaskIdentifier, compareId: boolean = false): Promise { + const name = Types.isString(folder) ? folder : folder.name; if (this.ignoredWorkspaceFolders.some(ignored => ignored.name === name)) { return Promise.reject(new Error(nls.localize('TaskServer.folderIgnored', 'The folder {0} is ignored since it uses task version 0.1.0', name))); } - let key: string | KeyedTaskIdentifier; - if (!Types.isString(identifier)) { - key = TaskDefinition.createTaskIdentifier(identifier, console); - } else { - key = identifier; - } + const key: string | KeyedTaskIdentifier | undefined = !Types.isString(identifier) + ? TaskDefinition.createTaskIdentifier(identifier, console) + : identifier; + if (key === undefined) { return Promise.resolve(undefined); } return this.getGroupedTasks().then((map) => { - let values = map.get(folder); + const values = map.get(folder); if (!values) { return undefined; } - for (let task of values) { + for (const task of values) { if (task.matches(key, compareId)) { return task; } @@ -1831,6 +1829,7 @@ class TaskService extends Disposable implements ITaskService { } else if (err instanceof Error) { let error = err; this.notificationService.error(error.message); + showOutput = false; } else if (Types.isString(err)) { this.notificationService.error(err); } else { @@ -2469,7 +2468,7 @@ class TaskService extends Disposable implements ITaskService { this.runConfigureTasks(); return; } - let selectedTask: Task; + let selectedTask: Task | undefined; let selectedEntry: TaskQuickPickEntry; for (let task of tasks) { @@ -2670,7 +2669,7 @@ schema.definitions = { ...schemaVersion1.definitions, ...schemaVersion2.definitions, }; -schema.oneOf = [...schemaVersion2.oneOf, ...schemaVersion1.oneOf]; +schema.oneOf = [...(schemaVersion2.oneOf || []), ...(schemaVersion1.oneOf || [])]; let jsonRegistry = Registry.as(jsonContributionRegistry.Extensions.JSONContribution); jsonRegistry.registerSchema(schemaId, schema); diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts similarity index 98% rename from src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts rename to src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts index 54d58632d77..ad3d26739ec 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/electron-browser/terminalTaskSystem.ts @@ -22,22 +22,22 @@ import { win32 } from 'vs/base/node/processes'; import { IMarkerService, MarkerSeverity } from 'vs/platform/markers/common/markers'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { ProblemMatcher, ProblemMatcherRegistry /*, ProblemPattern, getResource */ } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcher, ProblemMatcherRegistry /*, ProblemPattern, getResource */ } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; -import { IOutputService, IOutputChannel } from 'vs/workbench/parts/output/common/output'; -import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind } from 'vs/workbench/parts/tasks/common/problemCollectors'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output'; +import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind } from 'vs/workbench/contrib/tasks/common/problemCollectors'; import { Task, CustomTask, ContributedTask, RevealKind, CommandOptions, ShellConfiguration, RuntimeType, PanelKind, TaskEvent, TaskEventKind, ShellQuotingOptions, ShellQuoting, CommandString, CommandConfiguration, ExtensionTaskSource, TaskScope -} from 'vs/workbench/parts/tasks/common/tasks'; +} from 'vs/workbench/contrib/tasks/common/tasks'; import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, ITaskResolver, TelemetryEvent, Triggers, TaskTerminateResponse, TaskSystemInfoResovler, TaskSystemInfo, ResolveSet, ResolvedVariables -} from 'vs/workbench/parts/tasks/common/taskSystem'; +} from 'vs/workbench/contrib/tasks/common/taskSystem'; interface TerminalData { terminal: ITerminalInstance; @@ -59,7 +59,7 @@ class VariableResolver { return value.replace(/\$\{(.*?)\}/g, (match: string, variable: string) => { // Strip out the ${} because the map contains them variables without those characters. let result = this._values.get(match.substring(2, match.length - 1)); - if (result) { + if ((result !== undefined) && (result !== null)) { return result; } if (this._service) { @@ -945,7 +945,7 @@ export class TerminalTaskSystem implements ITaskSystem { // (or, if the task has no group, a terminal used by a task without group). for (const taskId of this.idleTaskTerminals.keys()) { const idleTerminalId = this.idleTaskTerminals.get(taskId)!; - if (this.terminals[idleTerminalId].group === group) { + if (idleTerminalId && this.terminals[idleTerminalId].group === group) { terminalId = this.idleTaskTerminals.remove(taskId); break; } @@ -965,6 +965,7 @@ export class TerminalTaskSystem implements ITaskSystem { if (task.command.presentation && task.command.presentation.clear) { terminalToReuse.terminal.clear(); } + this.terminals[terminalToReuse.terminal.id.toString()].lastTask = taskKey; return [terminalToReuse.terminal, commandExecutable, undefined]; } diff --git a/src/vs/workbench/parts/tasks/node/processRunnerDetector.ts b/src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts similarity index 100% rename from src/vs/workbench/parts/tasks/node/processRunnerDetector.ts rename to src/vs/workbench/contrib/tasks/node/processRunnerDetector.ts diff --git a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts b/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts similarity index 98% rename from src/vs/workbench/parts/tasks/node/processTaskSystem.ts rename to src/vs/workbench/contrib/tasks/node/processTaskSystem.ts index 61e388b01d4..532c3adeed1 100644 --- a/src/vs/workbench/parts/tasks/node/processTaskSystem.ts +++ b/src/vs/workbench/contrib/tasks/node/processTaskSystem.ts @@ -15,23 +15,23 @@ import { Event, Emitter } from 'vs/base/common/event'; import { SuccessData, ErrorData } from 'vs/base/common/processes'; import { LineProcess, LineData } from 'vs/base/node/processes'; -import { IOutputService, IOutputChannel } from 'vs/workbench/parts/output/common/output'; +import { IOutputService, IOutputChannel } from 'vs/workbench/contrib/output/common/output'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IMarkerService } from 'vs/platform/markers/common/markers'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { ProblemMatcher, ProblemMatcherRegistry } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcher, ProblemMatcherRegistry } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind } from 'vs/workbench/parts/tasks/common/problemCollectors'; +import { StartStopProblemCollector, WatchingProblemCollector, ProblemCollectorEventKind } from 'vs/workbench/contrib/tasks/common/problemCollectors'; import { ITaskSystem, ITaskSummary, ITaskExecuteResult, TaskExecuteKind, TaskError, TaskErrors, TelemetryEvent, Triggers, TaskTerminateResponse -} from 'vs/workbench/parts/tasks/common/taskSystem'; +} from 'vs/workbench/contrib/tasks/common/taskSystem'; import { Task, CustomTask, CommandOptions, RevealKind, CommandConfiguration, RuntimeType, TaskEvent, TaskEventKind -} from 'vs/workbench/parts/tasks/common/tasks'; +} from 'vs/workbench/contrib/tasks/common/tasks'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/parts/tasks/node/taskConfiguration.ts b/src/vs/workbench/contrib/tasks/node/taskConfiguration.ts similarity index 99% rename from src/vs/workbench/parts/tasks/node/taskConfiguration.ts rename to src/vs/workbench/contrib/tasks/node/taskConfiguration.ts index afb7a097daf..5ca07aafbc8 100644 --- a/src/vs/workbench/parts/tasks/node/taskConfiguration.ts +++ b/src/vs/workbench/contrib/tasks/node/taskConfiguration.ts @@ -15,14 +15,14 @@ import { ValidationStatus, IProblemReporter as IProblemReporterBase } from 'vs/b import { NamedProblemMatcher, ProblemMatcher, ProblemMatcherParser, Config as ProblemMatcherConfig, isNamedProblemMatcher, ProblemMatcherRegistry -} from 'vs/workbench/parts/tasks/common/problemMatcher'; +} from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import * as Tasks from '../common/tasks'; import { TaskDefinitionRegistry } from '../common/taskDefinitionRegistry'; -import { TaskDefinition } from 'vs/workbench/parts/tasks/node/tasks'; +import { TaskDefinition } from 'vs/workbench/contrib/tasks/node/tasks'; import { ConfiguredInput } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; export const enum ShellQuoting { diff --git a/src/vs/workbench/parts/tasks/node/tasks.ts b/src/vs/workbench/contrib/tasks/node/tasks.ts similarity index 94% rename from src/vs/workbench/parts/tasks/node/tasks.ts rename to src/vs/workbench/contrib/tasks/node/tasks.ts index 4a794eed8d8..f22fd29b0d7 100644 --- a/src/vs/workbench/parts/tasks/node/tasks.ts +++ b/src/vs/workbench/contrib/tasks/node/tasks.ts @@ -9,8 +9,8 @@ import * as crypto from 'crypto'; import * as Objects from 'vs/base/common/objects'; -import { TaskIdentifier, KeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/parts/tasks/common/tasks'; -import { TaskDefinitionRegistry } from 'vs/workbench/parts/tasks/common/taskDefinitionRegistry'; +import { TaskIdentifier, KeyedTaskIdentifier, TaskDefinition } from 'vs/workbench/contrib/tasks/common/tasks'; +import { TaskDefinitionRegistry } from 'vs/workbench/contrib/tasks/common/taskDefinitionRegistry'; namespace KeyedTaskIdentifier { export function create(value: TaskIdentifier): KeyedTaskIdentifier { diff --git a/src/vs/workbench/parts/tasks/test/common/problemMatcher.test.ts b/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts similarity index 99% rename from src/vs/workbench/parts/tasks/test/common/problemMatcher.test.ts rename to src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts index 264f564a245..c88c97c5bb9 100644 --- a/src/vs/workbench/parts/tasks/test/common/problemMatcher.test.ts +++ b/src/vs/workbench/contrib/tasks/test/common/problemMatcher.test.ts @@ -2,7 +2,7 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import * as matchers from 'vs/workbench/parts/tasks/common/problemMatcher'; +import * as matchers from 'vs/workbench/contrib/tasks/common/problemMatcher'; import * as assert from 'assert'; import { ValidationState, IProblemReporter, ValidationStatus } from 'vs/base/common/parsers'; diff --git a/src/vs/workbench/parts/tasks/test/electron-browser/configuration.test.ts b/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts similarity index 99% rename from src/vs/workbench/parts/tasks/test/electron-browser/configuration.test.ts rename to src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts index 30591e7eef1..181f65485d3 100644 --- a/src/vs/workbench/parts/tasks/test/electron-browser/configuration.test.ts +++ b/src/vs/workbench/contrib/tasks/test/electron-browser/configuration.test.ts @@ -9,11 +9,11 @@ import * as UUID from 'vs/base/common/uuid'; import * as Platform from 'vs/base/common/platform'; import { ValidationStatus } from 'vs/base/common/parsers'; -import { ProblemMatcher, FileLocationKind, ProblemPattern, ApplyToKind } from 'vs/workbench/parts/tasks/common/problemMatcher'; +import { ProblemMatcher, FileLocationKind, ProblemPattern, ApplyToKind } from 'vs/workbench/contrib/tasks/common/problemMatcher'; import { IWorkspaceFolder, WorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import * as Tasks from 'vs/workbench/parts/tasks/common/tasks'; -import { parse, ParseResult, IProblemReporter, ExternalTaskRunnerConfiguration, CustomTask } from 'vs/workbench/parts/tasks/node/taskConfiguration'; +import * as Tasks from 'vs/workbench/contrib/tasks/common/tasks'; +import { parse, ParseResult, IProblemReporter, ExternalTaskRunnerConfiguration, CustomTask } from 'vs/workbench/contrib/tasks/node/taskConfiguration'; const workspaceFolder: IWorkspaceFolder = new WorkspaceFolder({ uri: URI.file('/workspace/folderOne'), diff --git a/src/vs/workbench/parts/terminal/browser/terminalFindWidget.css b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.css similarity index 100% rename from src/vs/workbench/parts/terminal/browser/terminalFindWidget.css rename to src/vs/workbench/contrib/terminal/browser/terminalFindWidget.css diff --git a/src/vs/workbench/parts/terminal/browser/terminalFindWidget.ts b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts similarity index 98% rename from src/vs/workbench/parts/terminal/browser/terminalFindWidget.ts rename to src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts index 37fab124afc..e5a54d0ba74 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalFindWidget.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalFindWidget.ts @@ -6,7 +6,7 @@ import 'vs/css!./terminalFindWidget'; import { SimpleFindWidget } from 'vs/editor/contrib/find/simpleFindWidget'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; -import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_INPUT_FOCUSED, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; diff --git a/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts b/src/vs/workbench/contrib/terminal/browser/terminalQuickOpen.ts similarity index 97% rename from src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts rename to src/vs/workbench/contrib/terminal/browser/terminalQuickOpen.ts index 1b8f9848510..5a86378ef50 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalQuickOpen.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalQuickOpen.ts @@ -7,7 +7,7 @@ import * as nls from 'vs/nls'; import { Mode, IEntryRunContext, IAutoFocus, IQuickNavigateConfiguration, IModel } from 'vs/base/parts/quickopen/common/quickOpen'; import { QuickOpenModel, QuickOpenEntry } from 'vs/base/parts/quickopen/browser/quickOpenModel'; import { QuickOpenHandler } from 'vs/workbench/browser/quickopen'; -import { ITerminalService, ITerminalInstance } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance } from 'vs/workbench/contrib/terminal/common/terminal'; import { ContributableActionProvider } from 'vs/workbench/browser/actions'; import { stripWildcards } from 'vs/base/common/strings'; import { matchesFuzzy } from 'vs/base/common/filters'; @@ -95,7 +95,11 @@ export class TerminalPickerHandler extends QuickOpenHandler { return true; } - const highlights = matchesFuzzy(normalizedSearchValueLowercase, e.getLabel(), true); + const label = e.getLabel(); + if (!label) { + return false; + } + const highlights = matchesFuzzy(normalizedSearchValueLowercase, label, true); if (!highlights) { return false; } diff --git a/src/vs/workbench/parts/terminal/browser/terminalTab.ts b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts similarity index 99% rename from src/vs/workbench/parts/terminal/browser/terminalTab.ts rename to src/vs/workbench/contrib/terminal/browser/terminalTab.ts index 0a57c99c16d..af2e15641c1 100644 --- a/src/vs/workbench/parts/terminal/browser/terminalTab.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTab.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as aria from 'vs/base/browser/ui/aria/aria'; import * as nls from 'vs/nls'; -import { ITerminalInstance, IShellLaunchConfig, ITerminalTab, Direction, ITerminalService, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalInstance, IShellLaunchConfig, ITerminalTab, Direction, ITerminalService, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; import { IContextKey } from 'vs/platform/contextkey/common/contextkey'; import { Event, Emitter } from 'vs/base/common/event'; import { IDisposable, Disposable } from 'vs/base/common/lifecycle'; diff --git a/src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalWidgetManager.ts similarity index 100% rename from src/vs/workbench/parts/terminal/browser/terminalWidgetManager.ts rename to src/vs/workbench/contrib/terminal/browser/terminalWidgetManager.ts diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts similarity index 99% rename from src/vs/workbench/parts/terminal/common/terminal.ts rename to src/vs/workbench/contrib/terminal/common/terminal.ts index ac884f34d06..6dd06a68ffa 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -114,6 +114,7 @@ export interface ITerminalConfigHelper { mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, platformOverride?: platform.Platform): void; /** Sets whether a workspace shell configuration is allowed or not */ setWorkspaceShellAllowed(isAllowed: boolean): void; + checkWorkspaceShellPermissions(platformOverride?: platform.Platform): boolean; } export interface ITerminalFont { diff --git a/src/vs/workbench/parts/terminal/common/terminalColorRegistry.ts b/src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts similarity index 100% rename from src/vs/workbench/parts/terminal/common/terminalColorRegistry.ts rename to src/vs/workbench/contrib/terminal/common/terminalColorRegistry.ts diff --git a/src/vs/workbench/parts/terminal/common/terminalCommands.ts b/src/vs/workbench/contrib/terminal/common/terminalCommands.ts similarity index 98% rename from src/vs/workbench/parts/terminal/common/terminalCommands.ts rename to src/vs/workbench/contrib/terminal/common/terminalCommands.ts index c9d27764e85..92580041923 100644 --- a/src/vs/workbench/parts/terminal/common/terminalCommands.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalCommands.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; -import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; export const enum TERMINAL_COMMAND_ID { FIND_NEXT = 'workbench.action.terminal.findNext', diff --git a/src/vs/workbench/parts/terminal/common/terminalMenu.ts b/src/vs/workbench/contrib/terminal/common/terminalMenu.ts similarity index 95% rename from src/vs/workbench/parts/terminal/common/terminalMenu.ts rename to src/vs/workbench/contrib/terminal/common/terminalMenu.ts index 873c8c688a5..7493d800d2d 100644 --- a/src/vs/workbench/parts/terminal/common/terminalMenu.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalMenu.ts @@ -5,7 +5,7 @@ import * as nls from 'vs/nls'; import { MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/parts/terminal/common/terminalCommands'; +import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; export function setupTerminalMenu() { diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/contrib/terminal/common/terminalService.ts similarity index 99% rename from src/vs/workbench/parts/terminal/common/terminalService.ts rename to src/vs/workbench/contrib/terminal/common/terminalService.ts index 9728d8318fa..2af5a375481 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/common/terminalService.ts @@ -8,7 +8,7 @@ import { IContextKeyService, IContextKey } from 'vs/platform/contextkey/common/c import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; -import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalInstance, IShellLaunchConfig, ITerminalConfigHelper, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TERMINAL_PANEL_ID, ITerminalTab, ITerminalProcessExtHostProxy, ITerminalProcessExtHostRequest, KEYBINDING_CONTEXT_TERMINAL_IS_OPEN } from 'vs/workbench/contrib/terminal/common/terminal'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { URI } from 'vs/base/common/uri'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/configure-inverse.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/configure-inverse.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/configure-inverse.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/configure-inverse.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/configure.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/configure.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/configure.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/configure.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/kill-inverse.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/kill-inverse.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/kill-inverse.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/kill-inverse.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/kill.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/kill.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/kill.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/kill.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/new-inverse.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/new-inverse.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/new-inverse.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/new-inverse.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/new.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/new.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/new.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/new.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css b/src/vs/workbench/contrib/terminal/electron-browser/media/scrollbar.css similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/scrollbar.css rename to src/vs/workbench/contrib/terminal/electron-browser/media/scrollbar.css diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal-inverse.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/split-horizontal-inverse.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal-inverse.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/split-horizontal-inverse.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/split-horizontal.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/split-horizontal.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/split-horizontal.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/split-inverse.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/split-inverse.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/split-inverse.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/split-inverse.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/split.svg b/src/vs/workbench/contrib/terminal/electron-browser/media/split.svg similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/split.svg rename to src/vs/workbench/contrib/terminal/electron-browser/media/split.svg diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/terminal.css b/src/vs/workbench/contrib/terminal/electron-browser/media/terminal.css similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/terminal.css rename to src/vs/workbench/contrib/terminal/electron-browser/media/terminal.css diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/widgets.css b/src/vs/workbench/contrib/terminal/electron-browser/media/widgets.css similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/widgets.css rename to src/vs/workbench/contrib/terminal/electron-browser/media/widgets.css diff --git a/src/vs/workbench/parts/terminal/electron-browser/media/xterm.css b/src/vs/workbench/contrib/terminal/electron-browser/media/xterm.css similarity index 100% rename from src/vs/workbench/parts/terminal/electron-browser/media/xterm.css rename to src/vs/workbench/contrib/terminal/electron-browser/media/xterm.css diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts similarity index 97% rename from src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts index fb600958c8b..1f3cf1d3b57 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.contribution.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminal.contribution.ts @@ -11,28 +11,28 @@ import * as nls from 'vs/nls'; import * as panel from 'vs/workbench/browser/panel'; import * as platform from 'vs/base/common/platform'; import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'; -import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, DEFAULT_LINE_HEIGHT, DEFAULT_LETTER_SPACING, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED } from 'vs/workbench/parts/terminal/common/terminal'; -import { getDefaultShell } from 'vs/workbench/parts/terminal/node/terminal'; +import { ITerminalService, KEYBINDING_CONTEXT_TERMINAL_FOCUS, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, TERMINAL_PANEL_ID, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_VISIBLE, TerminalCursorStyle, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_NOT_VISIBLE, DEFAULT_LINE_HEIGHT, DEFAULT_LETTER_SPACING, KEYBINDING_CONTEXT_TERMINAL_FIND_WIDGET_FOCUSED } from 'vs/workbench/contrib/terminal/common/terminal'; +import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { KillTerminalAction, ClearSelectionTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, CreateNewInActiveWorkspaceTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX, MoveToLineStartTerminalAction, MoveToLineEndTerminalAction, SplitTerminalAction, SplitInActiveWorkspaceTerminalAction, FocusPreviousPaneTerminalAction, FocusNextPaneTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, ResizePaneDownTerminalAction, ScrollToPreviousCommandAction, ScrollToNextCommandAction, SelectToPreviousCommandAction, SelectToNextCommandAction, SelectToPreviousLineAction, SelectToNextLineAction, ToggleEscapeSequenceLoggingAction, SendSequenceTerminalCommand, ToggleRegexCommand, ToggleWholeWordCommand, ToggleCaseSensitiveCommand, FindNext, FindPrevious, DeleteToLineStartTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KillTerminalAction, ClearSelectionTerminalAction, CopyTerminalSelectionAction, CreateNewTerminalAction, CreateNewInActiveWorkspaceTerminalAction, FocusActiveTerminalAction, FocusNextTerminalAction, FocusPreviousTerminalAction, SelectDefaultShellWindowsTerminalAction, RunSelectedTextInTerminalAction, RunActiveFileInTerminalAction, ScrollDownTerminalAction, ScrollDownPageTerminalAction, ScrollToBottomTerminalAction, ScrollUpTerminalAction, ScrollUpPageTerminalAction, ScrollToTopTerminalAction, TerminalPasteAction, ToggleTerminalAction, ClearTerminalAction, AllowWorkspaceShellTerminalCommand, DisallowWorkspaceShellTerminalCommand, RenameTerminalAction, SelectAllTerminalAction, FocusTerminalFindWidgetAction, HideTerminalFindWidgetAction, DeleteWordLeftTerminalAction, DeleteWordRightTerminalAction, QuickOpenActionTermContributor, QuickOpenTermAction, TERMINAL_PICKER_PREFIX, MoveToLineStartTerminalAction, MoveToLineEndTerminalAction, SplitTerminalAction, SplitInActiveWorkspaceTerminalAction, FocusPreviousPaneTerminalAction, FocusNextPaneTerminalAction, ResizePaneLeftTerminalAction, ResizePaneRightTerminalAction, ResizePaneUpTerminalAction, ResizePaneDownTerminalAction, ScrollToPreviousCommandAction, ScrollToNextCommandAction, SelectToPreviousCommandAction, SelectToNextCommandAction, SelectToPreviousLineAction, SelectToNextLineAction, ToggleEscapeSequenceLoggingAction, SendSequenceTerminalCommand, ToggleRegexCommand, ToggleWholeWordCommand, ToggleCaseSensitiveCommand, FindNext, FindPrevious, DeleteToLineStartTerminalAction } from 'vs/workbench/contrib/terminal/electron-browser/terminalActions'; import { Registry } from 'vs/platform/registry/common/platform'; import { SyncActionDescriptor } from 'vs/platform/actions/common/actions'; -import { TerminalService } from 'vs/workbench/parts/terminal/electron-browser/terminalService'; +import { TerminalService } from 'vs/workbench/contrib/terminal/electron-browser/terminalService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { registerColors } from 'vs/workbench/parts/terminal/common/terminalColorRegistry'; +import { registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { getQuickNavigateHandler } from 'vs/workbench/browser/parts/quickopen/quickopen'; import { IQuickOpenRegistry, Extensions as QuickOpenExtensions, QuickOpenHandlerDescriptor } from 'vs/workbench/browser/quickopen'; import { Scope, IActionBarRegistry, Extensions as ActionBarExtensions } from 'vs/workbench/browser/actions'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; -import { TerminalPanel } from 'vs/workbench/parts/terminal/electron-browser/terminalPanel'; -import { TerminalPickerHandler } from 'vs/workbench/parts/terminal/browser/terminalQuickOpen'; -import { setupTerminalCommands, TERMINAL_COMMAND_ID } from 'vs/workbench/parts/terminal/common/terminalCommands'; -import { setupTerminalMenu } from 'vs/workbench/parts/terminal/common/terminalMenu'; -import { DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; +import { TerminalPanel } from 'vs/workbench/contrib/terminal/electron-browser/terminalPanel'; +import { TerminalPickerHandler } from 'vs/workbench/contrib/terminal/browser/terminalQuickOpen'; +import { setupTerminalCommands, TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; +import { setupTerminalMenu } from 'vs/workbench/contrib/terminal/common/terminalMenu'; +import { DEFAULT_COMMANDS_TO_SKIP_SHELL } from 'vs/workbench/contrib/terminal/electron-browser/terminalInstance'; const quickOpenRegistry = (Registry.as(QuickOpenExtensions.Quickopen)); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalActions.ts similarity index 99% rename from src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalActions.ts index 4252f8fa3df..67965756849 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalActions.ts @@ -8,7 +8,7 @@ import * as os from 'os'; import { Action, IAction } from 'vs/base/common/actions'; import { EndOfLinePreference } from 'vs/editor/common/model'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; -import { ITerminalService, TERMINAL_PANEL_ID, ITerminalInstance, Direction, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, TERMINAL_PANEL_ID, ITerminalInstance, Direction, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; import { SelectActionItem } from 'vs/base/browser/ui/actionbar/actionbar'; import { TogglePanelAction } from 'vs/workbench/browser/panel'; import { IPartService } from 'vs/workbench/services/part/common/partService'; @@ -18,14 +18,14 @@ import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IQuickOpenService } from 'vs/platform/quickOpen/common/quickOpen'; import { IQuickInputService, IPickOptions, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { ActionBarContributor } from 'vs/workbench/browser/actions'; -import { TerminalEntry } from 'vs/workbench/parts/terminal/browser/terminalQuickOpen'; +import { TerminalEntry } from 'vs/workbench/contrib/terminal/browser/terminalQuickOpen'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IContextViewService } from 'vs/platform/contextview/browser/contextView'; import { ICommandService } from 'vs/platform/commands/common/commands'; import { IWorkspaceContextService, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; import { PICK_WORKSPACE_FOLDER_COMMAND_ID } from 'vs/workbench/browser/actions/workspaceCommands'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/parts/terminal/common/terminalCommands'; +import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; import { Command } from 'vs/editor/browser/editorExtensions'; import { timeout } from 'vs/base/common/async'; import { FindReplaceState } from 'vs/editor/contrib/find/findState'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper.ts similarity index 79% rename from src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper.ts index 3321227befc..a6d3638f943 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalConfigHelper.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper.ts @@ -10,9 +10,9 @@ import { EDITOR_FONT_DEFAULTS, IEditorOptions } from 'vs/editor/common/config/ed import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { ITerminalConfiguration, ITerminalConfigHelper, ITerminalFont, IShellLaunchConfig, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalConfiguration, ITerminalConfigHelper, ITerminalFont, IShellLaunchConfig, IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, TERMINAL_CONFIG_SECTION, DEFAULT_LETTER_SPACING, DEFAULT_LINE_HEIGHT, MINIMUM_LETTER_SPACING } from 'vs/workbench/contrib/terminal/common/terminal'; import Severity from 'vs/base/common/severity'; -import { isFedora, isUbuntu } from 'vs/workbench/parts/terminal/node/terminal'; +import { isFedora, isUbuntu } from 'vs/workbench/contrib/terminal/node/terminal'; import { Terminal as XTermTerminal } from 'vscode-xterm'; import { INotificationService } from 'vs/platform/notification/common/notification'; @@ -163,20 +163,26 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, isAllowed, StorageScope.WORKSPACE); } - public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, platformOverride: platform.Platform = platform.platform): void { + public isWorkspaceShellAllowed(defaultValue: boolean | undefined = undefined): boolean | undefined { + return this._storageService.getBoolean(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, StorageScope.WORKSPACE, defaultValue); + } + + public checkWorkspaceShellPermissions(platformOverride: platform.Platform = platform.platform): boolean { // Check whether there is a workspace setting const platformKey = platformOverride === platform.Platform.Windows ? 'windows' : platformOverride === platform.Platform.Mac ? 'osx' : 'linux'; const shellConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shell.${platformKey}`); const shellArgsConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shellArgs.${platformKey}`); + const envConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.env.${platformKey}`); // Check if workspace setting exists and whether it's whitelisted let isWorkspaceShellAllowed: boolean | undefined = false; - if (shellConfigValue.workspace !== undefined || shellArgsConfigValue.workspace !== undefined) { - isWorkspaceShellAllowed = this._storageService.getBoolean(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, StorageScope.WORKSPACE, undefined); + if (shellConfigValue.workspace !== undefined || shellArgsConfigValue.workspace !== undefined || envConfigValue.workspace !== undefined) { + isWorkspaceShellAllowed = this.isWorkspaceShellAllowed(undefined); } // Always allow [] args as it would lead to an odd error message and should not be dangerous - if (shellConfigValue.workspace === undefined && shellArgsConfigValue.workspace && shellArgsConfigValue.workspace.length === 0) { + if (shellConfigValue.workspace === undefined && envConfigValue.workspace === undefined && + shellArgsConfigValue.workspace && shellArgsConfigValue.workspace.length === 0) { isWorkspaceShellAllowed = true; } @@ -185,34 +191,47 @@ export class TerminalConfigHelper implements ITerminalConfigHelper { if (isWorkspaceShellAllowed === undefined) { let shellString: string | undefined; if (shellConfigValue.workspace) { - shellString = `"${shellConfigValue.workspace}"`; + shellString = `shell: "${shellConfigValue.workspace}"`; } let argsString: string | undefined; if (shellArgsConfigValue.workspace) { - argsString = `[${shellArgsConfigValue.workspace.map(v => '"' + v + '"').join(', ')}]`; + argsString = `shellArgs: [${shellArgsConfigValue.workspace.map(v => '"' + v + '"').join(', ')}]`; + } + let envString: string | undefined; + if (envConfigValue.workspace) { + envString = `env: {${Object.keys(envConfigValue.workspace).map(k => `${k}:${envConfigValue.workspace![k]}`).join(', ')}}`; } // Should not be localized as it's json-like syntax referencing settings keys - let changeString: string; + const workspaceConfigStrings: string[] = []; if (shellString) { - if (argsString) { - changeString = `shell: ${shellString}, shellArgs: ${argsString}`; - } else { - changeString = `shell: ${shellString}`; - } - } else { // if (shellArgsConfigValue.workspace !== undefined) - changeString = `shellArgs: ${argsString}`; + workspaceConfigStrings.push(shellString); } - this._notificationService.prompt(Severity.Info, nls.localize('terminal.integrated.allowWorkspaceShell', "Do you allow {0} (defined as a workspace setting) to be launched in the terminal?", changeString), + if (argsString) { + workspaceConfigStrings.push(argsString); + } + if (envString) { + workspaceConfigStrings.push(envString); + } + const workspaceConfigString = workspaceConfigStrings.join(', '); + this._notificationService.prompt(Severity.Info, nls.localize('terminal.integrated.allowWorkspaceShell', "Do you allow this workspace to modify your terminal shell? {0}", workspaceConfigString), [{ label: nls.localize('allow', "Allow"), - run: () => this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, true, StorageScope.WORKSPACE) + run: () => this.setWorkspaceShellAllowed(true) }, { label: nls.localize('disallow', "Disallow"), - run: () => this._storageService.store(IS_WORKSPACE_SHELL_ALLOWED_STORAGE_KEY, false, StorageScope.WORKSPACE) + run: () => this.setWorkspaceShellAllowed(false) }] ); } + return !!isWorkspaceShellAllowed; + } + + public mergeDefaultShellPathAndArgs(shell: IShellLaunchConfig, platformOverride: platform.Platform = platform.platform): void { + const isWorkspaceShellAllowed = this.checkWorkspaceShellPermissions(platformOverride); + const platformKey = platformOverride === platform.Platform.Windows ? 'windows' : platformOverride === platform.Platform.Mac ? 'osx' : 'linux'; + const shellConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shell.${platformKey}`); + const shellArgsConfigValue = this._workspaceConfigurationService.inspect(`terminal.integrated.shellArgs.${platformKey}`); shell.executable = (isWorkspaceShellAllowed ? shellConfigValue.value : shellConfigValue.user) || shellConfigValue.default; shell.args = (isWorkspaceShellAllowed ? shellArgsConfigValue.value : shellArgsConfigValue.user) || shellArgsConfigValue.default; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstance.ts similarity index 97% rename from src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalInstance.ts index 5f5f0eaa87a..5bb3e9e0d09 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalInstance.ts @@ -28,15 +28,15 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { activeContrastBorder, scrollbarSliderActiveBackground, scrollbarSliderBackground, scrollbarSliderHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { ICssStyleCollector, ITheme, IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { PANEL_BACKGROUND } from 'vs/workbench/common/theme'; -import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; -import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; -import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/parts/terminal/common/terminalColorRegistry'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/parts/terminal/common/terminalCommands'; -import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; -import { TerminalLinkHandler } from 'vs/workbench/parts/terminal/electron-browser/terminalLinkHandler'; -import { TerminalProcessManager } from 'vs/workbench/parts/terminal/electron-browser/terminalProcessManager'; -import { TerminalCommandTracker } from 'vs/workbench/parts/terminal/node/terminalCommandTracker'; -import { WindowsShellHelper } from 'vs/workbench/parts/terminal/node/windowsShellHelper'; +import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/terminalWidgetManager'; +import { IShellLaunchConfig, ITerminalDimensions, ITerminalInstance, ITerminalProcessManager, KEYBINDING_CONTEXT_TERMINAL_TEXT_SELECTED, NEVER_MEASURE_RENDER_TIME_STORAGE_KEY, ProcessState, TERMINAL_PANEL_ID } from 'vs/workbench/contrib/terminal/common/terminal'; +import { ansiColorIdentifiers, TERMINAL_BACKGROUND_COLOR, TERMINAL_CURSOR_BACKGROUND_COLOR, TERMINAL_CURSOR_FOREGROUND_COLOR, TERMINAL_FOREGROUND_COLOR, TERMINAL_SELECTION_BACKGROUND_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; +import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; +import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper'; +import { TerminalLinkHandler } from 'vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler'; +import { TerminalProcessManager } from 'vs/workbench/contrib/terminal/electron-browser/terminalProcessManager'; +import { TerminalCommandTracker } from 'vs/workbench/contrib/terminal/node/terminalCommandTracker'; +import { WindowsShellHelper } from 'vs/workbench/contrib/terminal/node/windowsShellHelper'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { ISearchOptions, Terminal as XTermTerminal } from 'vscode-xterm'; @@ -190,8 +190,18 @@ export class TerminalInstance implements ITerminalInstance { public disableLayout: boolean; public get id(): number { return this._id; } - public get cols(): number { return this._cols; } - public get rows(): number { return this._rows; } + public get cols(): number { + if (this._dimensionsOverride && this._dimensionsOverride.cols) { + return Math.min(Math.max(this._dimensionsOverride.cols, 2), this._cols); + } + return this._cols; + } + public get rows(): number { + if (this._dimensionsOverride && this._dimensionsOverride.rows) { + return Math.min(Math.max(this._dimensionsOverride.rows, 2), this._rows); + } + return this._rows; + } // TODO: Ideally processId would be merged into processReady public get processId(): number | undefined { return this._processManager ? this._processManager.shellProcessId : undefined; } // TODO: How does this work with detached processes? @@ -1214,6 +1224,7 @@ export class TerminalInstance implements ITerminalInstance { return; } + const terminalWidth = this._evaluateColsAndRows(dimension.width, dimension.height); if (!terminalWidth) { return; @@ -1228,12 +1239,8 @@ export class TerminalInstance implements ITerminalInstance { @debounce(50) private _resize(): void { - let cols = this._cols; - let rows = this._rows; - if (this._dimensionsOverride && this._dimensionsOverride.cols && this._dimensionsOverride.rows) { - cols = Math.min(Math.max(this._dimensionsOverride.cols, 2), cols); - rows = Math.min(Math.max(this._dimensionsOverride.rows, 2), rows); - } + let cols = this.cols; + let rows = this.rows; if (this._xterm) { // Only apply these settings when the terminal is visible so that diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler.ts similarity index 98% rename from src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler.ts index 993b6e548fa..e0d59d335ac 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalLinkHandler.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler.ts @@ -10,9 +10,9 @@ import * as pfs from 'vs/base/node/pfs'; import { URI as Uri } from 'vs/base/common/uri'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { TerminalWidgetManager } from 'vs/workbench/parts/terminal/browser/terminalWidgetManager'; +import { TerminalWidgetManager } from 'vs/workbench/contrib/terminal/browser/terminalWidgetManager'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; -import { ITerminalService } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService } from 'vs/workbench/contrib/terminal/common/terminal'; import { ITextEditorSelection } from 'vs/platform/editor/common/editor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ILinkMatcherOptions } from 'vscode-xterm'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalPanel.ts similarity index 96% rename from src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalPanel.ts index 6395712ee95..efdff455b8c 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalPanel.ts @@ -6,25 +6,25 @@ import * as dom from 'vs/base/browser/dom'; import * as nls from 'vs/nls'; import * as platform from 'vs/base/common/platform'; -import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; +import * as terminalEnvironment from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { Action, IAction } from 'vs/base/common/actions'; import { IActionItem, Separator } from 'vs/base/browser/ui/actionbar/actionbar'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { ITerminalService, TERMINAL_PANEL_ID } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, TERMINAL_PANEL_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { IThemeService, ITheme, registerThemingParticipant, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; -import { TerminalFindWidget } from 'vs/workbench/parts/terminal/browser/terminalFindWidget'; +import { TerminalFindWidget } from 'vs/workbench/contrib/terminal/browser/terminalFindWidget'; import { editorHoverBackground, editorHoverBorder, editorForeground } from 'vs/platform/theme/common/colorRegistry'; -import { KillTerminalAction, SwitchTerminalAction, SwitchTerminalActionItem, CopyTerminalSelectionAction, TerminalPasteAction, ClearTerminalAction, SelectAllTerminalAction, CreateNewTerminalAction, SplitTerminalAction } from 'vs/workbench/parts/terminal/electron-browser/terminalActions'; +import { KillTerminalAction, SwitchTerminalAction, SwitchTerminalActionItem, CopyTerminalSelectionAction, TerminalPasteAction, ClearTerminalAction, SelectAllTerminalAction, CreateNewTerminalAction, SplitTerminalAction } from 'vs/workbench/contrib/terminal/electron-browser/terminalActions'; import { Panel } from 'vs/workbench/browser/panel'; import { StandardMouseEvent } from 'vs/base/browser/mouseEvent'; import { URI } from 'vs/base/common/uri'; -import { TERMINAL_BACKGROUND_COLOR, TERMINAL_BORDER_COLOR } from 'vs/workbench/parts/terminal/common/terminalColorRegistry'; +import { TERMINAL_BACKGROUND_COLOR, TERMINAL_BORDER_COLOR } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { DataTransfers } from 'vs/base/browser/dnd'; import { INotificationService, IPromptChoice, Severity } from 'vs/platform/notification/common/notification'; -import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; +import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper'; import { IStorageService } from 'vs/platform/storage/common/storage'; const FIND_FOCUS_CLASS = 'find-focused'; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalProcessManager.ts similarity index 89% rename from src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalProcessManager.ts index a49259ddcd4..5e4413adf68 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalProcessManager.ts @@ -4,22 +4,23 @@ *--------------------------------------------------------------------------------------------*/ import * as platform from 'vs/base/common/platform'; -import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; +import * as terminalEnvironment from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper } from 'vs/workbench/parts/terminal/common/terminal'; +import { ProcessState, ITerminalProcessManager, IShellLaunchConfig, ITerminalConfigHelper } from 'vs/workbench/contrib/terminal/common/terminal'; import { ILogService } from 'vs/platform/log/common/log'; import { Emitter, Event } from 'vs/base/common/event'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; -import { ITerminalChildProcess } from 'vs/workbench/parts/terminal/node/terminal'; -import { TerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/node/terminalProcessExtHostProxy'; +import { ITerminalChildProcess } from 'vs/workbench/contrib/terminal/node/terminal'; +import { TerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/node/terminalProcessExtHostProxy'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { TerminalProcess } from 'vs/workbench/parts/terminal/node/terminalProcess'; +import { TerminalProcess } from 'vs/workbench/contrib/terminal/node/terminalProcess'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { Schemas } from 'vs/base/common/network'; import { REMOTE_HOST_SCHEME, getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; import { sanitizeProcessEnvironment } from 'vs/base/node/processes'; +import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; /** The amount of time to consider terminal errors to be related to the launch */ const LAUNCHING_DURATION = 500; @@ -58,7 +59,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { @ILogService private readonly _logService: ILogService, @IWorkspaceContextService private readonly _workspaceContextService: IWorkspaceContextService, @IConfigurationResolverService private readonly _configurationResolverService: IConfigurationResolverService, - @IWindowService private readonly _windowService: IWindowService + @IWindowService private readonly _windowService: IWindowService, + @IWorkspaceConfigurationService private readonly _workspaceConfigurationService: IWorkspaceConfigurationService, ) { this.ptyProcessReady = new Promise(c => { this.onProcessReady(() => { @@ -125,7 +127,10 @@ export class TerminalProcessManager implements ITerminalProcessManager { // Resolve env vars from config and shell const lastActiveWorkspaceRoot = activeWorkspaceRootUri ? this._workspaceContextService.getWorkspaceFolder(activeWorkspaceRootUri) : null; const platformKey = platform.isWindows ? 'windows' : (platform.isMacintosh ? 'osx' : 'linux'); - const envFromConfig = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...this._configHelper.config.env[platformKey] }, lastActiveWorkspaceRoot); + const isWorkspaceShellAllowed = this._configHelper.checkWorkspaceShellPermissions(); + const envFromConfigValue = this._workspaceConfigurationService.inspect<{ [key: string]: string }>(`terminal.integrated.env.${platformKey}`); + const allowedEnvFromConfig = (isWorkspaceShellAllowed ? envFromConfigValue.value : envFromConfigValue.user); + const envFromConfig = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...allowedEnvFromConfig }, lastActiveWorkspaceRoot); const envFromShell = terminalEnvironment.resolveConfigurationVariables(this._configurationResolverService, { ...shellLaunchConfig.env }, lastActiveWorkspaceRoot); shellLaunchConfig.env = envFromShell; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts similarity index 95% rename from src/vs/workbench/parts/terminal/electron-browser/terminalService.ts rename to src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts index 53a7eaecb0a..fbace8ec6fb 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/electron-browser/terminalService.ts @@ -12,19 +12,19 @@ import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { IPanelService } from 'vs/workbench/services/panel/common/panelService'; import { IPartService } from 'vs/workbench/services/part/common/partService'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; -import { ITerminalInstance, ITerminalService, IShellLaunchConfig, ITerminalConfigHelper, NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY, TERMINAL_PANEL_ID, ITerminalProcessExtHostProxy } from 'vs/workbench/parts/terminal/common/terminal'; -import { TerminalService as AbstractTerminalService } from 'vs/workbench/parts/terminal/common/terminalService'; -import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; +import { ITerminalInstance, ITerminalService, IShellLaunchConfig, ITerminalConfigHelper, NEVER_SUGGEST_SELECT_WINDOWS_SHELL_STORAGE_KEY, TERMINAL_PANEL_ID, ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal'; +import { TerminalService as AbstractTerminalService } from 'vs/workbench/contrib/terminal/common/terminalService'; +import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper'; import Severity from 'vs/base/common/severity'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { getDefaultShell } from 'vs/workbench/parts/terminal/node/terminal'; -import { TerminalPanel } from 'vs/workbench/parts/terminal/electron-browser/terminalPanel'; -import { TerminalTab } from 'vs/workbench/parts/terminal/browser/terminalTab'; +import { getDefaultShell } from 'vs/workbench/contrib/terminal/node/terminal'; +import { TerminalPanel } from 'vs/workbench/contrib/terminal/electron-browser/terminalPanel'; +import { TerminalTab } from 'vs/workbench/contrib/terminal/browser/terminalTab'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { ipcRenderer as ipc } from 'electron'; import { IOpenFileRequest, IWindowService } from 'vs/platform/windows/common/windows'; -import { TerminalInstance } from 'vs/workbench/parts/terminal/electron-browser/terminalInstance'; +import { TerminalInstance } from 'vs/workbench/contrib/terminal/electron-browser/terminalInstance'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { IQuickInputService, IQuickPickItem, IPickOptions } from 'vs/platform/quickinput/common/quickInput'; diff --git a/src/vs/workbench/parts/terminal/node/terminal.ts b/src/vs/workbench/contrib/terminal/node/terminal.ts similarity index 100% rename from src/vs/workbench/parts/terminal/node/terminal.ts rename to src/vs/workbench/contrib/terminal/node/terminal.ts diff --git a/src/vs/workbench/parts/terminal/node/terminalCommandTracker.ts b/src/vs/workbench/contrib/terminal/node/terminalCommandTracker.ts similarity index 98% rename from src/vs/workbench/parts/terminal/node/terminalCommandTracker.ts rename to src/vs/workbench/contrib/terminal/node/terminalCommandTracker.ts index 7074ca39d1e..c7857624a7d 100644 --- a/src/vs/workbench/parts/terminal/node/terminalCommandTracker.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalCommandTracker.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Terminal, IMarker } from 'vscode-xterm'; -import { ITerminalCommandTracker } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalCommandTracker } from 'vs/workbench/contrib/terminal/common/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; /** diff --git a/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts similarity index 99% rename from src/vs/workbench/parts/terminal/node/terminalEnvironment.ts rename to src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts index 7942c4c8700..bd134149555 100644 --- a/src/vs/workbench/parts/terminal/node/terminalEnvironment.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalEnvironment.ts @@ -9,7 +9,7 @@ import * as platform from 'vs/base/common/platform'; import pkg from 'vs/platform/node/package'; import { URI as Uri } from 'vs/base/common/uri'; import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/parts/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalEnvironment } from 'vs/workbench/contrib/terminal/common/terminal'; import { IConfigurationResolverService } from 'vs/workbench/services/configurationResolver/common/configurationResolver'; /** diff --git a/src/vs/workbench/parts/terminal/node/terminalProcess.ts b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts similarity index 97% rename from src/vs/workbench/parts/terminal/node/terminalProcess.ts rename to src/vs/workbench/contrib/terminal/node/terminalProcess.ts index 16dfd0580b4..e1bd577ca28 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcess.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcess.ts @@ -8,9 +8,9 @@ import * as path from 'path'; import * as platform from 'vs/base/common/platform'; import * as pty from 'node-pty'; import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalChildProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { ITerminalChildProcess } from 'vs/workbench/contrib/terminal/node/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; +import { IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; import { exec } from 'child_process'; export class TerminalProcess implements ITerminalChildProcess, IDisposable { diff --git a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/node/terminalProcessExtHostProxy.ts similarity index 96% rename from src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts rename to src/vs/workbench/contrib/terminal/node/terminalProcessExtHostProxy.ts index dbf10b10214..5eb61629e48 100644 --- a/src/vs/workbench/parts/terminal/node/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/node/terminalProcessExtHostProxy.ts @@ -3,9 +3,9 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ITerminalChildProcess } from 'vs/workbench/parts/terminal/node/terminal'; +import { ITerminalChildProcess } from 'vs/workbench/contrib/terminal/node/terminal'; import { Event, Emitter } from 'vs/base/common/event'; -import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalService, ITerminalProcessExtHostProxy, IShellLaunchConfig } from 'vs/workbench/contrib/terminal/common/terminal'; import { IDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts b/src/vs/workbench/contrib/terminal/node/windowsShellHelper.ts similarity index 97% rename from src/vs/workbench/parts/terminal/node/windowsShellHelper.ts rename to src/vs/workbench/contrib/terminal/node/windowsShellHelper.ts index 3365163c107..80233f87d4d 100644 --- a/src/vs/workbench/parts/terminal/node/windowsShellHelper.ts +++ b/src/vs/workbench/contrib/terminal/node/windowsShellHelper.ts @@ -5,7 +5,7 @@ import * as platform from 'vs/base/common/platform'; import { Emitter, Event } from 'vs/base/common/event'; -import { ITerminalInstance } from 'vs/workbench/parts/terminal/common/terminal'; +import { ITerminalInstance } from 'vs/workbench/contrib/terminal/common/terminal'; import { Terminal as XTermTerminal } from 'vscode-xterm'; import WindowsProcessTreeType = require('windows-process-tree'); diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalColorRegistry.test.ts similarity index 98% rename from src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts rename to src/vs/workbench/contrib/terminal/test/electron-browser/terminalColorRegistry.test.ts index 6da31f8e1b9..d38607acc5d 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalColorRegistry.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalColorRegistry.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { Extensions as ThemeingExtensions, IColorRegistry, ColorIdentifier } from 'vs/platform/theme/common/colorRegistry'; import { Registry } from 'vs/platform/registry/common/platform'; -import { ansiColorIdentifiers, registerColors } from 'vs/workbench/parts/terminal/common/terminalColorRegistry'; +import { ansiColorIdentifiers, registerColors } from 'vs/workbench/contrib/terminal/common/terminalColorRegistry'; import { ITheme, ThemeType } from 'vs/platform/theme/common/themeService'; import { Color } from 'vs/base/common/color'; diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts similarity index 97% rename from src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts rename to src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts index ae957e55949..4ee63fee360 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalConfigHelper.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalConfigHelper.test.ts @@ -4,9 +4,9 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { TerminalConfigHelper } from 'vs/workbench/parts/terminal/electron-browser/terminalConfigHelper'; +import { TerminalConfigHelper } from 'vs/workbench/contrib/terminal/electron-browser/terminalConfigHelper'; import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; -import { isFedora, isUbuntu } from 'vs/workbench/parts/terminal/node/terminal'; +import { isFedora, isUbuntu } from 'vs/workbench/contrib/terminal/node/terminal'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; suite('Workbench - TerminalConfigHelper', () => { diff --git a/src/vs/workbench/parts/terminal/test/electron-browser/terminalLinkHandler.test.ts b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts similarity index 99% rename from src/vs/workbench/parts/terminal/test/electron-browser/terminalLinkHandler.test.ts rename to src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts index a15fe4cf18d..ea0d7c93361 100644 --- a/src/vs/workbench/parts/terminal/test/electron-browser/terminalLinkHandler.test.ts +++ b/src/vs/workbench/contrib/terminal/test/electron-browser/terminalLinkHandler.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { Platform } from 'vs/base/common/platform'; -import { TerminalLinkHandler, LineColumnInfo } from 'vs/workbench/parts/terminal/electron-browser/terminalLinkHandler'; +import { TerminalLinkHandler, LineColumnInfo } from 'vs/workbench/contrib/terminal/electron-browser/terminalLinkHandler'; import * as strings from 'vs/base/common/strings'; import * as path from 'path'; import * as sinon from 'sinon'; diff --git a/src/vs/workbench/parts/terminal/test/node/terminalCommandTracker.test.ts b/src/vs/workbench/contrib/terminal/test/node/terminalCommandTracker.test.ts similarity index 98% rename from src/vs/workbench/parts/terminal/test/node/terminalCommandTracker.test.ts rename to src/vs/workbench/contrib/terminal/test/node/terminalCommandTracker.test.ts index 495ffc45da2..324781f164c 100644 --- a/src/vs/workbench/parts/terminal/test/node/terminalCommandTracker.test.ts +++ b/src/vs/workbench/contrib/terminal/test/node/terminalCommandTracker.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { Terminal, TerminalCore } from 'vscode-xterm'; -import { TerminalCommandTracker } from 'vs/workbench/parts/terminal/node/terminalCommandTracker'; +import { TerminalCommandTracker } from 'vs/workbench/contrib/terminal/node/terminalCommandTracker'; import { isWindows } from 'vs/base/common/platform'; interface TestTerminalCore extends TerminalCore { diff --git a/src/vs/workbench/parts/terminal/test/node/terminalEnvironment.test.ts b/src/vs/workbench/contrib/terminal/test/node/terminalEnvironment.test.ts similarity index 98% rename from src/vs/workbench/parts/terminal/test/node/terminalEnvironment.test.ts rename to src/vs/workbench/contrib/terminal/test/node/terminalEnvironment.test.ts index db8533967d8..0f9ecc1299a 100644 --- a/src/vs/workbench/parts/terminal/test/node/terminalEnvironment.test.ts +++ b/src/vs/workbench/contrib/terminal/test/node/terminalEnvironment.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import * as os from 'os'; import * as platform from 'vs/base/common/platform'; -import * as terminalEnvironment from 'vs/workbench/parts/terminal/node/terminalEnvironment'; +import * as terminalEnvironment from 'vs/workbench/contrib/terminal/node/terminalEnvironment'; import { URI as Uri } from 'vs/base/common/uri'; import { IStringDictionary } from 'vs/base/common/collections'; diff --git a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts b/src/vs/workbench/contrib/themes/electron-browser/themes.contribution.ts similarity index 99% rename from src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts rename to src/vs/workbench/contrib/themes/electron-browser/themes.contribution.ts index 7a9c717f891..47a9776b807 100644 --- a/src/vs/workbench/parts/themes/electron-browser/themes.contribution.ts +++ b/src/vs/workbench/contrib/themes/electron-browser/themes.contribution.ts @@ -11,7 +11,7 @@ import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/ import { Registry } from 'vs/platform/registry/common/platform'; import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/actions'; import { IWorkbenchThemeService, COLOR_THEME_SETTING, ICON_THEME_SETTING, IColorTheme, IFileIconTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/parts/extensions/common/extensions'; +import { VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/contrib/extensions/common/extensions'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Delayer } from 'vs/base/common/async'; diff --git a/src/vs/workbench/parts/themes/test/electron-browser/fixtures/foo.js b/src/vs/workbench/contrib/themes/test/electron-browser/fixtures/foo.js similarity index 100% rename from src/vs/workbench/parts/themes/test/electron-browser/fixtures/foo.js rename to src/vs/workbench/contrib/themes/test/electron-browser/fixtures/foo.js diff --git a/src/vs/workbench/parts/themes/test/electron-browser/themes.test.contribution.ts b/src/vs/workbench/contrib/themes/test/electron-browser/themes.test.contribution.ts similarity index 100% rename from src/vs/workbench/parts/themes/test/electron-browser/themes.test.contribution.ts rename to src/vs/workbench/contrib/themes/test/electron-browser/themes.test.contribution.ts diff --git a/src/vs/workbench/parts/update/electron-browser/media/code-icon.svg b/src/vs/workbench/contrib/update/electron-browser/media/code-icon.svg similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/media/code-icon.svg rename to src/vs/workbench/contrib/update/electron-browser/media/code-icon.svg diff --git a/src/vs/workbench/parts/update/electron-browser/media/markdown.css b/src/vs/workbench/contrib/update/electron-browser/media/markdown.css similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/media/markdown.css rename to src/vs/workbench/contrib/update/electron-browser/media/markdown.css diff --git a/src/vs/workbench/parts/update/electron-browser/media/update.contribution.css b/src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/media/update.contribution.css rename to src/vs/workbench/contrib/update/electron-browser/media/update.contribution.css diff --git a/src/vs/workbench/parts/update/electron-browser/media/update.svg b/src/vs/workbench/contrib/update/electron-browser/media/update.svg similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/media/update.svg rename to src/vs/workbench/contrib/update/electron-browser/media/update.svg diff --git a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts b/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts similarity index 97% rename from src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts rename to src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts index 94afb719e64..5ebb5c8a1f4 100644 --- a/src/vs/workbench/parts/update/electron-browser/releaseNotesEditor.ts +++ b/src/vs/workbench/contrib/update/electron-browser/releaseNotesEditor.ts @@ -20,9 +20,9 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { IRequestService } from 'vs/platform/request/node/request'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { addGAParameters } from 'vs/platform/telemetry/node/telemetryNodeUtils'; -import { IWebviewEditorService } from 'vs/workbench/parts/webview/electron-browser/webviewEditorService'; +import { IWebviewEditorService } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorService'; import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; +import { WebviewEditorInput } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorInput'; import { KeybindingParser } from 'vs/base/common/keybindingParser'; import { CancellationToken } from 'vs/base/common/cancellation'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/parts/update/electron-browser/update.contribution.ts b/src/vs/workbench/contrib/update/electron-browser/update.contribution.ts similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/update.contribution.ts rename to src/vs/workbench/contrib/update/electron-browser/update.contribution.ts diff --git a/src/vs/workbench/parts/update/electron-browser/update.ts b/src/vs/workbench/contrib/update/electron-browser/update.ts similarity index 100% rename from src/vs/workbench/parts/update/electron-browser/update.ts rename to src/vs/workbench/contrib/update/electron-browser/update.ts diff --git a/src/vs/workbench/parts/url/electron-browser/url.contribution.ts b/src/vs/workbench/contrib/url/electron-browser/url.contribution.ts similarity index 100% rename from src/vs/workbench/parts/url/electron-browser/url.contribution.ts rename to src/vs/workbench/contrib/url/electron-browser/url.contribution.ts diff --git a/src/vs/workbench/parts/watermark/electron-browser/watermark.css b/src/vs/workbench/contrib/watermark/electron-browser/watermark.css similarity index 100% rename from src/vs/workbench/parts/watermark/electron-browser/watermark.css rename to src/vs/workbench/contrib/watermark/electron-browser/watermark.css diff --git a/src/vs/workbench/parts/watermark/electron-browser/watermark.ts b/src/vs/workbench/contrib/watermark/electron-browser/watermark.ts similarity index 94% rename from src/vs/workbench/parts/watermark/electron-browser/watermark.ts rename to src/vs/workbench/contrib/watermark/electron-browser/watermark.ts index 07b562b3156..4a0f500840e 100644 --- a/src/vs/workbench/parts/watermark/electron-browser/watermark.ts +++ b/src/vs/workbench/contrib/watermark/electron-browser/watermark.ts @@ -16,14 +16,14 @@ import { IWorkbenchContribution, IWorkbenchContributionsRegistry, Extensions as import { ILifecycleService, LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { OpenRecentAction } from 'vs/workbench/electron-browser/actions/windowActions'; -import { GlobalNewUntitledFileAction } from 'vs/workbench/parts/files/electron-browser/fileActions'; +import { GlobalNewUntitledFileAction } from 'vs/workbench/contrib/files/electron-browser/fileActions'; import { OpenFolderAction, OpenFileFolderAction, OpenFileAction } from 'vs/workbench/browser/actions/workspaceActions'; -import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; +import { ShowAllCommandsAction } from 'vs/workbench/contrib/quickopen/browser/commandsHandler'; import { Parts, IPartService, IDimension } from 'vs/workbench/services/part/common/partService'; -import { StartAction } from 'vs/workbench/parts/debug/browser/debugActions'; -import { FindInFilesActionId } from 'vs/workbench/parts/search/common/constants'; +import { StartAction } from 'vs/workbench/contrib/debug/browser/debugActions'; +import { FindInFilesActionId } from 'vs/workbench/contrib/search/common/constants'; import { QUICKOPEN_ACTION_ID } from 'vs/workbench/browser/parts/quickopen/quickopen'; -import { TERMINAL_COMMAND_ID } from 'vs/workbench/parts/terminal/common/terminalCommands'; +import { TERMINAL_COMMAND_ID } from 'vs/workbench/contrib/terminal/common/terminalCommands'; import * as dom from 'vs/base/browser/dom'; import { KeybindingLabel } from 'vs/base/browser/ui/keybindingLabel/keybindingLabel'; diff --git a/src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts b/src/vs/workbench/contrib/webview/electron-browser/baseWebviewEditor.ts similarity index 100% rename from src/vs/workbench/parts/webview/electron-browser/baseWebviewEditor.ts rename to src/vs/workbench/contrib/webview/electron-browser/baseWebviewEditor.ts diff --git a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js similarity index 97% rename from src/vs/workbench/parts/webview/electron-browser/webview-pre.js rename to src/vs/workbench/contrib/webview/electron-browser/webview-pre.js index ebf0555f42f..5fb945732cc 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview-pre.js +++ b/src/vs/workbench/contrib/webview/electron-browser/webview-pre.js @@ -57,7 +57,6 @@ let firstLoad = true; let loadTimeout; let pendingMessages = []; - let enableWrappedPostMessage = false; let isInDevelopmentMode = false; const initData = { @@ -190,11 +189,8 @@ // update iframe-contents ipcRenderer.on('content', (_event, data) => { const options = data.options; - enableWrappedPostMessage = options && options.enableWrappedPostMessage; - if (enableWrappedPostMessage) { - registerVscodeResourceScheme(); - } + registerVscodeResourceScheme(); const text = data.contents; const newDocument = new DOMParser().parseFromString(text, 'text/html'); @@ -213,7 +209,7 @@ } // apply default script - if (enableWrappedPostMessage && options.allowScripts) { + if (options.allowScripts) { const defaultScript = newDocument.createElement('script'); defaultScript.textContent = ` const acquireVsCodeApi = (function() { @@ -405,7 +401,7 @@ */ function getDefaultCss(styles) { const vars = Object.keys(styles || {}).map(variable => { - return `--${variable}: ${styles[variable].replace(/[^\#\"\'\,\. a-z0-9\-\(\)]/gi, '')};`; + return `--${variable}: ${styles[variable].replace(/[^#"',. a-z0-9\-()]/gi, '')};`; }); return ` :root { ${vars.join('\n')} } diff --git a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts similarity index 98% rename from src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts rename to src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts index 033bd98d007..c186624c3d3 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webview.contribution.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webview.contribution.ts @@ -14,7 +14,7 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { EditorDescriptor, Extensions as EditorExtensions, IEditorRegistry } from 'vs/workbench/browser/editor'; import { Extensions as ActionExtensions, IWorkbenchActionRegistry } from 'vs/workbench/common/actions'; import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; -import { WebviewEditorInputFactory } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory'; +import { WebviewEditorInputFactory } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorInputFactory'; import { KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; import { HideWebViewEditorFindCommand, OpenWebviewDeveloperToolsAction, ReloadWebviewAction, ShowWebViewEditorFindWidgetCommand, SelectAllWebviewEditorCommand, CopyWebviewEditorCommand, PasteWebviewEditorCommand, CutWebviewEditorCommand, UndoWebviewEditorCommand, RedoWebviewEditorCommand } from './webviewCommands'; import { WebviewEditor } from './webviewEditor'; diff --git a/src/vs/workbench/parts/webview/electron-browser/webview.html b/src/vs/workbench/contrib/webview/electron-browser/webview.html similarity index 100% rename from src/vs/workbench/parts/webview/electron-browser/webview.html rename to src/vs/workbench/contrib/webview/electron-browser/webview.html diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts similarity index 100% rename from src/vs/workbench/parts/webview/electron-browser/webviewCommands.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewCommands.ts diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewEditor.ts similarity index 92% rename from src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewEditor.ts index 40896f71e7f..ed4bcbec2e4 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditor.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewEditor.ts @@ -14,9 +14,9 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EditorOptions } from 'vs/workbench/common/editor'; -import { WebviewEditorInput } from 'vs/workbench/parts/webview/electron-browser/webviewEditorInput'; +import { WebviewEditorInput } from 'vs/workbench/contrib/webview/electron-browser/webviewEditorInput'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IPartService, Parts } from 'vs/workbench/services/part/common/partService'; import { BaseWebviewEditor, KEYBINDING_CONTEXT_WEBVIEW_FIND_WIDGET_VISIBLE } from './baseWebviewEditor'; import { WebviewElement } from './webviewElement'; @@ -28,7 +28,7 @@ export class WebviewEditor extends BaseWebviewEditor { public static readonly ID = 'WebviewEditor'; private _editorFrame: HTMLElement; - private _content: HTMLElement; + private _content?: HTMLElement; private _webviewContent: HTMLElement | undefined; private _webviewFocusTrackerDisposables: IDisposable[] = []; @@ -171,8 +171,9 @@ export class WebviewEditor extends BaseWebviewEditor { if (token.isCancellationRequested) { return; } - - input.updateGroup(this.group.id); + if (this.group) { + input.updateGroup(this.group.id); + } this.updateWebview(input); }); } @@ -183,11 +184,10 @@ export class WebviewEditor extends BaseWebviewEditor { webview.update(input.html, { allowScripts: input.options.enableScripts, allowSvgs: true, - enableWrappedPostMessage: true, useSameOriginForRoot: false, localResourceRoots: input.options.localResourceRoots || this.getDefaultLocalResourceRoots(), extensionLocation: input.extensionLocation - }, input.options.retainContextWhenHidden); + }, !!input.options.retainContextWhenHidden); if (this._webviewContent) { this._webviewContent.style.visibility = 'visible'; @@ -198,8 +198,9 @@ export class WebviewEditor extends BaseWebviewEditor { private getDefaultLocalResourceRoots(): URI[] { const rootPaths = this._contextService.getWorkspace().folders.map(x => x.uri); - if ((this.input as WebviewEditorInput).extensionLocation) { - rootPaths.push((this.input as WebviewEditorInput).extensionLocation); + const extensionLocation = (this.input as WebviewEditorInput).extensionLocation; + if (extensionLocation) { + rootPaths.push(extensionLocation); } return rootPaths; } @@ -222,7 +223,6 @@ export class WebviewEditor extends BaseWebviewEditor { this._webview = this._instantiationService.createInstance(WebviewElement, this._partService.getContainer(Parts.EDITOR_PART), { - enableWrappedPostMessage: true, useSameOriginForRoot: false, extensionLocation: input.extensionLocation }); @@ -235,7 +235,7 @@ export class WebviewEditor extends BaseWebviewEditor { this._webview.state = input.webviewState; - this._content.setAttribute('aria-flowto', this._webviewContent.id); + this._content!.setAttribute('aria-flowto', this._webviewContent.id); this.doUpdateContainer(); } @@ -254,11 +254,11 @@ export class WebviewEditor extends BaseWebviewEditor { this._webviewFocusTrackerDisposables = dispose(this._webviewFocusTrackerDisposables); // Track focus in webview content - const webviewContentFocusTracker = DOM.trackFocus(this._webviewContent); + const webviewContentFocusTracker = DOM.trackFocus(this._webviewContent!); this._webviewFocusTrackerDisposables.push(webviewContentFocusTracker); this._webviewFocusTrackerDisposables.push(webviewContentFocusTracker.onDidFocus(() => this._onDidFocusWebview.fire())); // Track focus in webview element - this._webviewFocusTrackerDisposables.push(this._webview.onDidFocus(() => this._onDidFocusWebview.fire())); + this._webviewFocusTrackerDisposables.push(this._webview!.onDidFocus(() => this._onDidFocusWebview.fire())); } } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewEditorInput.ts similarity index 98% rename from src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewEditorInput.ts index 4da45eee721..d07c498efd5 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInput.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewEditorInput.ts @@ -56,7 +56,7 @@ export class WebviewEditorInput extends EditorInput { private _html: string = ''; private _currentWebviewHtml: string = ''; public _events: WebviewEvents | undefined; - private _container: HTMLElement; + private _container?: HTMLElement; private _webview: WebviewElement | undefined; private _webviewOwner: any; private _webviewDisposables: IDisposable[] = []; @@ -139,7 +139,7 @@ export class WebviewEditorInput extends EditorInput { return this.getName(); } - public getDescription(): string { + public getDescription() { return null; } @@ -208,7 +208,6 @@ export class WebviewEditorInput extends EditorInput { this._webview.options = { allowScripts: this._options.enableScripts, allowSvgs: true, - enableWrappedPostMessage: true, useSameOriginForRoot: false, localResourceRoots: this._options.localResourceRoots }; @@ -240,10 +239,13 @@ export class WebviewEditorInput extends EditorInput { return this._webview; } - public set webview(value: WebviewElement) { + public set webview(value: WebviewElement | undefined) { this._webviewDisposables = dispose(this._webviewDisposables); this._webview = value; + if (!this._webview) { + return; + } this._webview.onDidClickLink(link => { if (this._events && this._events.onDidClickLink) { diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewEditorInputFactory.ts similarity index 100% rename from src/vs/workbench/parts/webview/electron-browser/webviewEditorInputFactory.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewEditorInputFactory.ts diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewEditorService.ts similarity index 99% rename from src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewEditorService.ts index bf099faef94..10dbe724d17 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewEditorService.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewEditorService.ts @@ -7,7 +7,7 @@ import { IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { URI } from 'vs/base/common/uri'; import { IInstantiationService, createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IEditorService, ACTIVE_GROUP_TYPE, SIDE_GROUP_TYPE } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import * as vscode from 'vscode'; import { WebviewEditorInput } from './webviewEditorInput'; import { GroupIdentifier } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts similarity index 98% rename from src/vs/workbench/parts/webview/electron-browser/webviewElement.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts index d65d118c5bb..89ae486f958 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewElement.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewElement.ts @@ -12,7 +12,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import * as colorRegistry from 'vs/platform/theme/common/colorRegistry'; import { DARK, ITheme, IThemeService, LIGHT } from 'vs/platform/theme/common/themeService'; -import { registerFileProtocol, WebviewProtocol } from 'vs/workbench/parts/webview/electron-browser/webviewProtocols'; +import { registerFileProtocol, WebviewProtocol } from 'vs/workbench/contrib/webview/electron-browser/webviewProtocols'; import { areWebviewInputOptionsEqual } from './webviewEditorService'; import { WebviewFindWidget } from './webviewFindWidget'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; @@ -24,7 +24,6 @@ export interface WebviewOptions { readonly allowScripts?: boolean; readonly allowSvgs?: boolean; readonly svgWhiteList?: string[]; - readonly enableWrappedPostMessage?: boolean; readonly useSameOriginForRoot?: boolean; readonly localResourceRoots?: ReadonlyArray; readonly extensionLocation?: URI; @@ -44,7 +43,7 @@ interface IKeydownEvent { class WebviewProtocolProvider extends Disposable { constructor( webview: Electron.WebviewTag, - private readonly _extensionLocation: URI, + private readonly _extensionLocation: URI | undefined, private readonly _getLocalResourceRoots: () => ReadonlyArray, private readonly _environmentService: IEnvironmentService, private readonly _fileService: IFileService, @@ -304,7 +303,7 @@ export class WebviewElement extends Disposable { this._register(addDisposableListener(this._webview, 'ipc-message', (event) => { switch (event.channel) { case 'onmessage': - if (this._options.enableWrappedPostMessage && event.args && event.args.length) { + if (event.args && event.args.length) { this._onMessage.fire(event.args[0]); } return; @@ -356,7 +355,7 @@ export class WebviewElement extends Disposable { } public mountTo(parent: HTMLElement) { - parent.appendChild(this._webviewFindWidget.getDomNode()); + parent.appendChild(this._webviewFindWidget.getDomNode()!); parent.appendChild(this._webview); } diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewFindWidget.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewFindWidget.ts similarity index 87% rename from src/vs/workbench/parts/webview/electron-browser/webviewFindWidget.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewFindWidget.ts index 3c881b1ba09..deffccbdfa6 100644 --- a/src/vs/workbench/parts/webview/electron-browser/webviewFindWidget.ts +++ b/src/vs/workbench/contrib/webview/electron-browser/webviewFindWidget.ts @@ -11,7 +11,7 @@ import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; export class WebviewFindWidget extends SimpleFindWidget { constructor( - private _webview: WebviewElement, + private _webview: WebviewElement | undefined, @IContextViewService contextViewService: IContextViewService, @IContextKeyService contextKeyService: IContextKeyService ) { @@ -24,6 +24,9 @@ export class WebviewFindWidget extends SimpleFindWidget { } public find(previous: boolean) { + if (!this._webview) { + return; + } const val = this.inputValue; if (val) { this._webview.find(val, { findNext: true, forward: !previous }); @@ -32,11 +35,16 @@ export class WebviewFindWidget extends SimpleFindWidget { public hide() { super.hide(); - this._webview.stopFind(true); - this._webview.focus(); + if (this._webview) { + this._webview.stopFind(true); + this._webview.focus(); + } } public onInputChanged() { + if (!this._webview) { + return; + } const val = this.inputValue; if (val) { this._webview.startFind(val); diff --git a/src/vs/workbench/parts/webview/electron-browser/webviewProtocols.ts b/src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts similarity index 100% rename from src/vs/workbench/parts/webview/electron-browser/webviewProtocols.ts rename to src/vs/workbench/contrib/webview/electron-browser/webviewProtocols.ts diff --git a/src/vs/workbench/parts/welcome/code-icon.svg b/src/vs/workbench/contrib/welcome/code-icon.svg similarity index 100% rename from src/vs/workbench/parts/welcome/code-icon.svg rename to src/vs/workbench/contrib/welcome/code-icon.svg diff --git a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts similarity index 100% rename from src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts rename to src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStarted.contribution.ts diff --git a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStarted.ts similarity index 100% rename from src/vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.ts rename to src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStarted.ts diff --git a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts similarity index 97% rename from src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.ts rename to src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts index 38add0516f9..6d876b4faa6 100644 --- a/src/vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut.ts @@ -13,7 +13,7 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; -import { IExperimentService, ExperimentState } from 'vs/workbench/parts/experiments/node/experimentService'; +import { IExperimentService, ExperimentState } from 'vs/workbench/contrib/experiments/node/experimentService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { language, locale } from 'vs/base/common/platform'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -95,7 +95,7 @@ export class TelemetryOptOut implements IWorkbenchContribution { return this.galleryService.getCoreTranslation(extensionToFetchTranslationsFrom, locale!) .then(translation => { - const translationsFromPack = translation && translation.contents ? translation.contents['vs/workbench/parts/welcome/gettingStarted/electron-browser/telemetryOptOut'] : {}; + const translationsFromPack = translation && translation.contents ? translation.contents['vs/workbench/contrib/welcome/gettingStarted/electron-browser/telemetryOptOut'] : {}; if (!!translationsFromPack[promptMessageKey] && !!translationsFromPack[yesLabelKey] && !!translationsFromPack[noLabelKey]) { promptMessage = translationsFromPack[promptMessageKey].replace('{0}', this.privacyUrl) + ' (Please help Microsoft improve Visual Studio Code by allowing the collection of usage data.)'; yesLabel = translationsFromPack[yesLabelKey] + ' (Yes)'; diff --git a/src/vs/workbench/parts/welcome/gettingStarted/test/common/gettingStarted.test.ts b/src/vs/workbench/contrib/welcome/gettingStarted/test/common/gettingStarted.test.ts similarity index 100% rename from src/vs/workbench/parts/welcome/gettingStarted/test/common/gettingStarted.test.ts rename to src/vs/workbench/contrib/welcome/gettingStarted/test/common/gettingStarted.test.ts diff --git a/src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette-dark.svg b/src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette-dark.svg similarity index 100% rename from src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette-dark.svg rename to src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette-dark.svg diff --git a/src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette.svg b/src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette.svg similarity index 100% rename from src/vs/workbench/parts/welcome/overlay/browser/media/commandpalette.svg rename to src/vs/workbench/contrib/welcome/overlay/browser/media/commandpalette.svg diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css b/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.css similarity index 100% rename from src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.css rename to src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.css diff --git a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts b/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts similarity index 98% rename from src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts rename to src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts index e44c0f8d11f..531629e54dd 100644 --- a/src/vs/workbench/parts/welcome/overlay/browser/welcomeOverlay.ts +++ b/src/vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay.ts @@ -7,7 +7,7 @@ import 'vs/css!./welcomeOverlay'; import * as dom from 'vs/base/browser/dom'; import { Registry } from 'vs/platform/registry/common/platform'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; -import { ShowAllCommandsAction } from 'vs/workbench/parts/quickopen/browser/commandsHandler'; +import { ShowAllCommandsAction } from 'vs/workbench/contrib/quickopen/browser/commandsHandler'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Parts, IPartService } from 'vs/workbench/services/part/common/partService'; import { localize } from 'vs/nls'; @@ -168,10 +168,10 @@ class WelcomeOverlay { } private create(): void { - const container = this.partService.getContainer(Parts.EDITOR_PART); + const container = this.partService.getContainer(Parts.EDITOR_PART)!; const offset = this.partService.getTitleBarOffset(); - this._overlay = dom.append(container.parentElement, $('.welcomeOverlay')); + this._overlay = dom.append(container.parentElement!, $('.welcomeOverlay')); this._overlay.style.top = `${offset}px`; this._overlay.style.height = `calc(100% - ${offset}px)`; this._overlay.style.display = 'none'; diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts b/src/vs/workbench/contrib/welcome/page/electron-browser/vs_code_welcome_page.ts similarity index 100% rename from src/vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page.ts rename to src/vs/workbench/contrib/welcome/page/electron-browser/vs_code_welcome_page.ts diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.ts b/src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.contribution.ts similarity index 97% rename from src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.ts rename to src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.contribution.ts index a6f7737259c..3346ebedbe3 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution.ts +++ b/src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.contribution.ts @@ -6,7 +6,7 @@ import { localize } from 'vs/nls'; import { IWorkbenchContributionsRegistry, Extensions as WorkbenchExtensions } from 'vs/workbench/common/contributions'; import { Registry } from 'vs/platform/registry/common/platform'; -import { WelcomePageContribution, WelcomePageAction, WelcomeInputFactory } from 'vs/workbench/parts/welcome/page/electron-browser/welcomePage'; +import { WelcomePageContribution, WelcomePageAction, WelcomeInputFactory } from 'vs/workbench/contrib/welcome/page/electron-browser/welcomePage'; import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/workbench/common/actions'; import { SyncActionDescriptor, MenuRegistry, MenuId } from 'vs/platform/actions/common/actions'; import { IConfigurationRegistry, Extensions as ConfigurationExtensions, ConfigurationScope } from 'vs/platform/configuration/common/configurationRegistry'; diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css b/src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.css similarity index 100% rename from src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.css rename to src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.css diff --git a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.ts similarity index 96% rename from src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts rename to src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.ts index 9a60c85c0e6..9c36ff502fd 100644 --- a/src/vs/workbench/parts/welcome/page/electron-browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/electron-browser/welcomePage.ts @@ -9,12 +9,12 @@ import * as strings from 'vs/base/common/strings'; import * as path from 'path'; import { ICommandService } from 'vs/platform/commands/common/commands'; import * as arrays from 'vs/base/common/arrays'; -import { WalkThroughInput } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughInput'; +import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { onUnexpectedError, isPromiseCanceledError } from 'vs/base/common/errors'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IWindowService, URIType } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; import { localize } from 'vs/nls'; @@ -23,16 +23,16 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { Schemas } from 'vs/base/common/network'; import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; -import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/parts/extensions/electron-browser/extensionsUtils'; +import { getInstalledExtensions, IExtensionStatus, onExtensionChanged, isKeymapExtension } from 'vs/workbench/contrib/extensions/electron-browser/extensionsUtils'; import { IExtensionEnablementService, IExtensionManagementService, IExtensionGalleryService, IExtensionTipsService, EnablementState, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; -import { used } from 'vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page'; +import { used } from 'vs/workbench/contrib/welcome/page/electron-browser/vs_code_welcome_page'; import { ILifecycleService, StartupKind } from 'vs/platform/lifecycle/common/lifecycle'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { tildify, getBaseLabel } from 'vs/base/common/labels'; import { registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, focusBorder, textLinkForeground, textLinkActiveForeground, foreground, descriptionForeground, contrastBorder, activeContrastBorder } from 'vs/platform/theme/common/colorRegistry'; -import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; -import { IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; +import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughUtils'; +import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IEditorInputFactory, EditorInput } from 'vs/workbench/common/editor'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; @@ -275,7 +275,7 @@ class WelcomePage { const resource = URI.parse(require.toUrl('./vs_code_welcome_page')) .with({ scheme: Schemas.walkThrough, - query: JSON.stringify({ moduleId: 'vs/workbench/parts/welcome/page/electron-browser/vs_code_welcome_page' }) + query: JSON.stringify({ moduleId: 'vs/workbench/contrib/welcome/page/electron-browser/vs_code_welcome_page' }) }); this.editorInput = this.instantiationService.createInstance(WalkThroughInput, { typeId: welcomeInputTypeId, @@ -344,15 +344,19 @@ class WelcomePage { return workspaces.map(workspace => { let label: string; let resource: URI; + let typeHint: URIType | undefined; if (isSingleFolderWorkspaceIdentifier(workspace)) { resource = workspace; label = this.labelService.getWorkspaceLabel(workspace); + typeHint = 'folder'; } else if (isWorkspaceIdentifier(workspace)) { label = this.labelService.getWorkspaceLabel(workspace); - resource = URI.file(workspace.configPath); + resource = workspace.configPath; + typeHint = 'file'; } else { label = getBaseLabel(workspace); resource = URI.file(workspace); + typeHint = 'file'; } const li = document.createElement('li'); @@ -389,7 +393,7 @@ class WelcomePage { id: 'openRecentFolder', from: telemetryFrom }); - this.windowService.openWindow([resource], { forceNewWindow: e.ctrlKey || e.metaKey }); + this.windowService.openWindow([{ uri: resource, typeHint }], { forceNewWindow: e.ctrlKey || e.metaKey }); e.preventDefault(); e.stopPropagation(); }); diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts similarity index 97% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts index e32d38a80fd..3d69628cdbe 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/editorWalkThrough.ts @@ -8,7 +8,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic import { Action } from 'vs/base/common/actions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { URI } from 'vs/base/common/uri'; -import { WalkThroughInput, WalkThroughInputOptions } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughInput'; +import { WalkThroughInput, WalkThroughInputOptions } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput'; import { Schemas } from 'vs/base/common/network'; import { IEditorInputFactory, EditorInput } from 'vs/workbench/common/editor'; diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md similarity index 100% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/vs_code_editor_walkthrough.md diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.ts b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThrough.contribution.ts similarity index 85% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.ts rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThrough.contribution.ts index 1cfec792a9f..8d508626bdb 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThrough.contribution.ts @@ -4,11 +4,11 @@ *--------------------------------------------------------------------------------------------*/ import { localize } from 'vs/nls'; -import { WalkThroughInput } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughInput'; -import { WalkThroughPart } from 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart'; -import { WalkThroughArrowUp, WalkThroughArrowDown, WalkThroughPageUp, WalkThroughPageDown } from 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions'; -import { WalkThroughContentProvider, WalkThroughSnippetContentProvider } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughContentProvider'; -import { EditorWalkThroughAction, EditorWalkThroughInputFactory } from 'vs/workbench/parts/welcome/walkThrough/electron-browser/editor/editorWalkThrough'; +import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput'; +import { WalkThroughPart } from 'vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart'; +import { WalkThroughArrowUp, WalkThroughArrowDown, WalkThroughPageUp, WalkThroughPageDown } from 'vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughActions'; +import { WalkThroughContentProvider, WalkThroughSnippetContentProvider } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughContentProvider'; +import { EditorWalkThroughAction, EditorWalkThroughInputFactory } from 'vs/workbench/contrib/welcome/walkThrough/electron-browser/editor/editorWalkThrough'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as EditorInputExtensions, IEditorInputFactoryRegistry } from 'vs/workbench/common/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.ts b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughActions.ts similarity index 97% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.ts rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughActions.ts index c6ba185e6da..95ba85eb935 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughActions.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughActions.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { WalkThroughPart, WALK_THROUGH_FOCUS } from 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart'; +import { WalkThroughPart, WALK_THROUGH_FOCUS } from 'vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart'; import { ICommandAndKeybindingRule, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; import { EditorContextKeys } from 'vs/editor/common/editorContextKeys'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart.css similarity index 100% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.css rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart.css diff --git a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart.ts similarity index 98% rename from src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts rename to src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart.ts index ed99e06ee17..4840870a992 100644 --- a/src/vs/workbench/parts/welcome/walkThrough/electron-browser/walkThroughPart.ts +++ b/src/vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThroughPart.ts @@ -12,7 +12,7 @@ import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { EditorOptions, IEditorMemento } from 'vs/workbench/common/editor'; import { BaseEditor } from 'vs/workbench/browser/parts/editor/baseEditor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; -import { WalkThroughInput } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughInput'; +import { WalkThroughInput } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput'; import { IOpenerService } from 'vs/platform/opener/common/opener'; import * as marked from 'vs/base/common/marked/marked'; import { IModelService } from 'vs/editor/common/services/modelService'; @@ -29,13 +29,13 @@ import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IEditorOptions } from 'vs/editor/common/config/editorOptions'; import { IThemeService, registerThemingParticipant } from 'vs/platform/theme/common/themeService'; import { registerColor, focusBorder, textLinkForeground, textLinkActiveForeground, textPreformatForeground, contrastBorder, textBlockQuoteBackground, textBlockQuoteBorder } from 'vs/platform/theme/common/colorRegistry'; -import { getExtraColor } from 'vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils'; +import { getExtraColor } from 'vs/workbench/contrib/welcome/walkThrough/node/walkThroughUtils'; import { UILabelProvider } from 'vs/base/common/keybindingLabels'; import { OS, OperatingSystem } from 'vs/base/common/platform'; import { deepClone } from 'vs/base/common/objects'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { Dimension, size } from 'vs/base/browser/dom'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { CancellationToken } from 'vs/base/common/cancellation'; export const WALK_THROUGH_FOCUS = new RawContextKey('interactivePlaygroundFocus', false); diff --git a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughContentProvider.ts b/src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughContentProvider.ts similarity index 100% rename from src/vs/workbench/parts/welcome/walkThrough/node/walkThroughContentProvider.ts rename to src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughContentProvider.ts diff --git a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts b/src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput.ts similarity index 100% rename from src/vs/workbench/parts/welcome/walkThrough/node/walkThroughInput.ts rename to src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughInput.ts diff --git a/src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts b/src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughUtils.ts similarity index 100% rename from src/vs/workbench/parts/welcome/walkThrough/node/walkThroughUtils.ts rename to src/vs/workbench/contrib/welcome/walkThrough/node/walkThroughUtils.ts diff --git a/src/vs/workbench/electron-browser/actions/helpActions.ts b/src/vs/workbench/electron-browser/actions/helpActions.ts index 85d39d64d7b..009ef59e1b0 100644 --- a/src/vs/workbench/electron-browser/actions/helpActions.ts +++ b/src/vs/workbench/electron-browser/actions/helpActions.ts @@ -161,7 +161,7 @@ export class OpenTwitterUrlAction extends Action { super(id, label); } - run(): Promise { + run(): Promise { if (product.twitterUrl) { window.open(product.twitterUrl); } @@ -182,7 +182,7 @@ export class OpenRequestFeatureUrlAction extends Action { super(id, label); } - run(): Promise { + run(): Promise { if (product.requestFeatureUrl) { window.open(product.requestFeatureUrl); } @@ -203,7 +203,7 @@ export class OpenLicenseUrlAction extends Action { super(id, label); } - run(): Promise { + run(): Promise { if (product.licenseUrl) { if (language) { const queryArgChar = product.licenseUrl.indexOf('?') > 0 ? '&' : '?'; @@ -229,7 +229,7 @@ export class OpenPrivacyStatementUrlAction extends Action { super(id, label); } - run(): Promise { + run(): Promise { if (product.privacyStatementUrl) { if (language) { const queryArgChar = product.privacyStatementUrl.indexOf('?') > 0 ? '&' : '?'; diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 0cf3ec66110..1c67d1881cd 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -226,7 +226,7 @@ export abstract class BaseSwitchWindow extends Action { return this.windowsService.getWindows().then(windows => { const placeHolder = nls.localize('switchWindowPlaceHolder', "Select a window to switch to"); const picks = windows.map(win => { - const resource = win.filename ? URI.file(win.filename) : win.folderUri ? win.folderUri : win.workspace ? URI.file(win.workspace.configPath) : undefined; + const resource = win.filename ? URI.file(win.filename) : win.folderUri ? win.folderUri : win.workspace ? win.workspace.configPath : undefined; const fileKind = win.filename ? FileKind.FILE : win.workspace ? FileKind.ROOT_FOLDER : win.folderUri ? FileKind.FOLDER : FileKind.FILE; return { payload: win.id, @@ -346,7 +346,7 @@ export abstract class BaseOpenRecentAction extends Action { label = labelService.getWorkspaceLabel(workspace); description = labelService.getUriLabel(dirname(resource)!); } else if (isWorkspaceIdentifier(workspace)) { - resource = URI.file(workspace.configPath); + resource = workspace.configPath; label = labelService.getWorkspaceLabel(workspace); description = labelService.getUriLabel(dirname(resource)!); } else { @@ -366,9 +366,9 @@ export abstract class BaseOpenRecentAction extends Action { }; }; - const runPick = (resource: URI, isFile: boolean, keyMods: IKeyMods) => { + const runPick = (uri: URI, isFile: boolean, keyMods: IKeyMods) => { const forceNewWindow = keyMods.ctrlCmd; - return this.windowService.openWindow([resource], { forceNewWindow, forceOpenWorkspaceAsFile: isFile }); + return this.windowService.openWindow([{ uri, typeHint: isFile ? 'file' : 'folder' }], { forceNewWindow, forceOpenWorkspaceAsFile: isFile }); }; const workspacePicks = recentWorkspaces.map(workspace => toPick(workspace, isSingleFolderWorkspaceIdentifier(workspace) ? FileKind.FOLDER : FileKind.ROOT_FOLDER, this.labelService, !this.isQuickNavigate() ? [this.removeFromRecentlyOpened] : undefined)); diff --git a/src/vs/workbench/electron-browser/main.ts b/src/vs/workbench/electron-browser/main.ts index 1e6333c7314..e5d78340abc 100644 --- a/src/vs/workbench/electron-browser/main.ts +++ b/src/vs/workbench/electron-browser/main.ts @@ -29,7 +29,7 @@ import { IUpdateService } from 'vs/platform/update/common/update'; import { URLHandlerChannel, URLServiceChannelClient } from 'vs/platform/url/node/urlIpc'; import { IURLService } from 'vs/platform/url/common/url'; import { WorkspacesChannelClient } from 'vs/platform/workspaces/node/workspacesIpc'; -import { IWorkspacesService, ISingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, IMultiFolderWorkspaceInitializationPayload, IEmptyWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; +import { IWorkspacesService, ISingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, IMultiFolderWorkspaceInitializationPayload, IEmptyWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { createSpdLogService } from 'vs/platform/log/node/spdlogService'; import * as fs from 'fs'; import { ConsoleLogService, MultiplexLogService, ILogService } from 'vs/platform/log/common/log'; @@ -87,6 +87,9 @@ function revive(workbench: IWindowConfiguration) { if (workbench.folderUri) { workbench.folderUri = uri.revive(workbench.folderUri); } + if (workbench.workspace) { + workbench.workspace = reviveWorkspaceIdentifier(workbench.workspace); + } const filesToWaitPaths = workbench.filesToWait && workbench.filesToWait.paths; [filesToWaitPaths, workbench.filesToOpen, workbench.filesToCreate, workbench.filesToDiff].forEach(paths => { @@ -164,7 +167,7 @@ function createWorkspaceInitializationPayload(configuration: IWindowConfiguratio } // Single-folder workspace - let workspaceInitializationPayload: Promise = Promise.resolve(); + let workspaceInitializationPayload: Promise = Promise.resolve(undefined); if (configuration.folderUri) { workspaceInitializationPayload = resolveSingleFolderWorkspaceInitializationPayload(configuration.folderUri); } @@ -179,7 +182,7 @@ function createWorkspaceInitializationPayload(configuration: IWindowConfiguratio } else if (environmentService.isExtensionDevelopment) { id = 'ext-dev'; // extension development window never stores backups and is a singleton } else { - return Promise.reject(new Error('Unexpected window configuration without backupPath')); + return Promise.reject(new Error('Unexpected window configuration without backupPath')); } payload = { id } as IEmptyWorkspaceInitializationPayload; @@ -189,7 +192,7 @@ function createWorkspaceInitializationPayload(configuration: IWindowConfiguratio }); } -function resolveSingleFolderWorkspaceInitializationPayload(folderUri: ISingleFolderWorkspaceIdentifier): Promise { +function resolveSingleFolderWorkspaceInitializationPayload(folderUri: ISingleFolderWorkspaceIdentifier): Promise { // Return early the folder is not local if (folderUri.scheme !== Schemas.file) { @@ -197,7 +200,7 @@ function resolveSingleFolderWorkspaceInitializationPayload(folderUri: ISingleFol } function computeLocalDiskFolderId(folder: uri, stat: fs.Stats): string { - let ctime: number; + let ctime: number | undefined; if (platform.isLinux) { ctime = stat.ino; // Linux: birthtime is ctime, so we cannot use it! We use the ino instead! } else if (platform.isMacintosh) { diff --git a/src/vs/workbench/electron-browser/media/shell.css b/src/vs/workbench/electron-browser/media/shell.css index e3e3172eafe..1162363e9f8 100644 --- a/src/vs/workbench/electron-browser/media/shell.css +++ b/src/vs/workbench/electron-browser/media/shell.css @@ -16,38 +16,23 @@ /* Font Families (with CJK support) */ /* mac */ -.monaco-shell.mac, -.monaco-shell.mac .monaco-menu-container .monaco-menu { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } -.monaco-shell.mac:lang(zh-Hans), -.monaco-shell.mac:lang(zh-Hans) .monaco-menu-container .monaco-menu { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } -.monaco-shell.mac:lang(zh-Hant), -.monaco-shell.mac:lang(zh-Hant) .monaco-menu-container .monaco-menu { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } -.monaco-shell.mac:lang(ja), -.monaco-shell.mac:lang(ja) .monaco-menu-container .monaco-menu { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } -.monaco-shell.mac:lang(ko), -.monaco-shell.mac:lang(ko) .monaco-menu-container .monaco-menu { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } +.monaco-shell.mac { font-family: -apple-system, BlinkMacSystemFont, sans-serif; } +.monaco-shell.mac:lang(zh-Hans) { font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", sans-serif; } +.monaco-shell.mac:lang(zh-Hant) { font-family: -apple-system, BlinkMacSystemFont, "PingFang TC", sans-serif; } +.monaco-shell.mac:lang(ja) { font-family: -apple-system, BlinkMacSystemFont, "Hiragino Kaku Gothic Pro", sans-serif; } +.monaco-shell.mac:lang(ko) { font-family: -apple-system, BlinkMacSystemFont, "Nanum Gothic", "Apple SD Gothic Neo", "AppleGothic", sans-serif; } /* windows */ -.monaco-shell.windows, -.monaco-shell.windows .monaco-menu-container .monaco-menu { font-family: "Segoe WPC", "Segoe UI", sans-serif; } -.monaco-shell.windows:lang(zh-Hans), -.monaco-shell.windows:lang(zh-Hans) .monaco-menu-container .monaco-menu { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } -.monaco-shell.windows:lang(zh-Hant), -.monaco-shell.windows:lang(zh-Hant) .monaco-menu-container .monaco-menu { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } -.monaco-shell.windows:lang(ja), -.monaco-shell.windows:lang(ja) .monaco-menu-container .monaco-menu { font-family: "Segoe WPC", "Segoe UI", "Meiryo", sans-serif; } -.monaco-shell.windows:lang(ko), -.monaco-shell.windows:lang(ko) .monaco-menu-container .monaco-menu { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } +.monaco-shell.windows { font-family: "Segoe WPC", "Segoe UI", sans-serif; } +.monaco-shell.windows:lang(zh-Hans) { font-family: "Segoe WPC", "Segoe UI", "Microsoft YaHei", sans-serif; } +.monaco-shell.windows:lang(zh-Hant) { font-family: "Segoe WPC", "Segoe UI", "Microsoft Jhenghei", sans-serif; } +.monaco-shell.windows:lang(ja) { font-family: "Segoe WPC", "Segoe UI", "Meiryo", sans-serif; } +.monaco-shell.windows:lang(ko) { font-family: "Segoe WPC", "Segoe UI", "Malgun Gothic", "Dotom", sans-serif; } /* linux */ -.monaco-shell.linux, -.monaco-shell.linux .monaco-menu-container .monaco-menu { font-family: "Ubuntu", "Droid Sans", sans-serif; } -.monaco-shell.linux:lang(zh-Hans), -.monaco-shell.linux:lang(zh-Hans) .monaco-menu-container .monaco-menu { font-family: "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } -.monaco-shell.linux:lang(zh-Hant), -.monaco-shell.linux:lang(zh-Hant) .monaco-menu-container .monaco-menu { font-family: "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } -.monaco-shell.linux:lang(ja), -.monaco-shell.linux:lang(ja) .monaco-menu-container .monaco-menu { font-family: "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } -.monaco-shell.linux:lang(ko), -.monaco-shell.linux:lang(ko) .monaco-menu-container .monaco-menu { font-family: "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } +.monaco-shell.linux { font-family: "Ubuntu", "Droid Sans", sans-serif; } +.monaco-shell.linux:lang(zh-Hans) { font-family: "Ubuntu", "Droid Sans", "Source Han Sans SC", "Source Han Sans CN", "Source Han Sans", sans-serif; } +.monaco-shell.linux:lang(zh-Hant) { font-family: "Ubuntu", "Droid Sans", "Source Han Sans TC", "Source Han Sans TW", "Source Han Sans", sans-serif; } +.monaco-shell.linux:lang(ja) { font-family: "Ubuntu", "Droid Sans", "Source Han Sans J", "Source Han Sans JP", "Source Han Sans", sans-serif; } +.monaco-shell.linux:lang(ko) { font-family: "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index ddd6d5862c7..b86a7047898 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -32,7 +32,7 @@ import { LifecycleService } from 'vs/platform/lifecycle/electron-browser/lifecyc import { MarkerService } from 'vs/platform/markers/common/markerService'; import { IModelService } from 'vs/editor/common/services/modelService'; import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; -import { CodeEditorService } from 'vs/workbench/services/codeEditor/browser/codeEditorService'; +import { CodeEditorService } from 'vs/workbench/services/editor/browser/codeEditorService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { IntegrityServiceImpl } from 'vs/platform/integrity/node/integrityServiceImpl'; import { IIntegrityService } from 'vs/platform/integrity/common/integrity'; @@ -369,7 +369,6 @@ export class Shell extends Disposable { serviceCollection.set(IMarkerService, new SyncDescriptor(MarkerService, undefined, true)); - serviceCollection.set(IModeService, new SyncDescriptor(WorkbenchModeServiceImpl)); serviceCollection.set(ITextResourceConfigurationService, new SyncDescriptor(TextResourceConfigurationService)); diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index d82db96296d..f2977e8dc95 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -63,8 +63,6 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { TextFileService } from 'vs/workbench/services/textfile/electron-browser/textFileService'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; -import { ISCMService } from 'vs/workbench/services/scm/common/scm'; -import { SCMService } from 'vs/workbench/services/scm/common/scmService'; import { IProgressService2 } from 'vs/platform/progress/common/progress'; import { ProgressService2 } from 'vs/workbench/services/progress/browser/progressService2'; import { TextModelResolverService } from 'vs/workbench/services/textmodelResolver/common/textModelResolverService'; @@ -104,7 +102,7 @@ import { registerWindowDriver } from 'vs/platform/driver/electron-browser/driver import { IPreferencesService } from 'vs/workbench/services/preferences/common/preferences'; import { PreferencesService } from 'vs/workbench/services/preferences/browser/preferencesService'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService, GroupDirection, preferredSideBySideGroupDirection } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, GroupDirection, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorService } from 'vs/workbench/services/editor/browser/editorService'; import { IExtensionUrlHandler, ExtensionUrlHandler } from 'vs/workbench/services/extensions/electron-browser/inactiveExtensionUrlHandler'; import { ContextViewService } from 'vs/platform/contextview/browser/contextViewService'; @@ -443,9 +441,6 @@ export class Workbench extends Disposable implements IPartService { // File Decorations serviceCollection.set(IDecorationsService, new SyncDescriptor(FileDecorationsService)); - // SCM Service - serviceCollection.set(ISCMService, new SyncDescriptor(SCMService)); - // Inactive extension URL handler serviceCollection.set(IExtensionUrlHandler, new SyncDescriptor(ExtensionUrlHandler)); @@ -743,7 +738,7 @@ export class Workbench extends Disposable implements IPartService { return editorService.openEditors(editors); } - return Promise.resolve(); + return Promise.resolve(undefined); } const editorsToOpen = this.resolveEditorsToOpen(); @@ -1210,7 +1205,7 @@ export class Workbench extends Disposable implements IPartService { //#region IPartService - private _onTitleBarVisibilityChange: Emitter = this._register(new Emitter()); + private readonly _onTitleBarVisibilityChange: Emitter = this._register(new Emitter()); get onTitleBarVisibilityChange(): Event { return this._onTitleBarVisibilityChange.event; } get onEditorLayout(): Event { return this.editorPart.onDidLayout; } @@ -1229,30 +1224,23 @@ export class Workbench extends Disposable implements IPartService { return DOM.isAncestor(activeElement, container); } - getContainer(part: Parts): HTMLElement { - let container: HTMLElement | null = null; + getContainer(part: Parts): HTMLElement | null { switch (part) { case Parts.TITLEBAR_PART: - container = this.titlebarPart.getContainer(); - break; + return this.titlebarPart.getContainer(); case Parts.ACTIVITYBAR_PART: - container = this.activitybarPart.getContainer(); - break; + return this.activitybarPart.getContainer(); case Parts.SIDEBAR_PART: - container = this.sidebarPart.getContainer(); - break; + return this.sidebarPart.getContainer(); case Parts.PANEL_PART: - container = this.panelPart.getContainer(); - break; + return this.panelPart.getContainer(); case Parts.EDITOR_PART: - container = this.editorPart.getContainer(); - break; + return this.editorPart.getContainer(); case Parts.STATUSBAR_PART: - container = this.statusbarPart.getContainer(); - break; + return this.statusbarPart.getContainer(); } - return container; + return null; } isVisible(part: Parts): boolean { @@ -1814,4 +1802,4 @@ export class Workbench extends Disposable implements IPartService { this.workbenchGrid.layout(); } } -} \ No newline at end of file +} diff --git a/src/vs/workbench/parts/markers/electron-browser/markers.ts b/src/vs/workbench/parts/markers/electron-browser/markers.ts deleted file mode 100644 index 2ae1c928903..00000000000 --- a/src/vs/workbench/parts/markers/electron-browser/markers.ts +++ /dev/null @@ -1,195 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { createDecorator, IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { MarkersModel, compareMarkersByUri, Marker } from './markersModel'; -import { Disposable } from 'vs/base/common/lifecycle'; -import { IMarkerService, MarkerSeverity, IMarker, IMarkerData } from 'vs/platform/markers/common/markers'; -import { IActivityService, NumberBadge } from 'vs/workbench/services/activity/common/activity'; -import { localize } from 'vs/nls'; -import Constants from './constants'; -import { URI } from 'vs/base/common/uri'; -import { groupBy } from 'vs/base/common/arrays'; -import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; -import { IAction, Action } from 'vs/base/common/actions'; -import { applyCodeAction } from 'vs/editor/contrib/codeAction/codeActionCommands'; -import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService'; -import { ICommandService } from 'vs/platform/commands/common/commands'; -import { IEditorService, ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; -import { IModelService } from 'vs/editor/common/services/modelService'; -import { CodeAction } from 'vs/editor/common/modes'; -import { Range } from 'vs/editor/common/core/range'; -import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; -import { CodeActionKind } from 'vs/editor/contrib/codeAction/codeActionTrigger'; -import { timeout, CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; - -export const IMarkersWorkbenchService = createDecorator('markersWorkbenchService'); - -export interface IFilter { - filterText: string; - useFilesExclude: boolean; -} - -export interface IMarkersWorkbenchService { - _serviceBrand: any; - readonly markersModel: MarkersModel; - hasQuickFixes(marker: Marker): Promise; - getQuickFixActions(marker: Marker): Promise; -} - -export class MarkersWorkbenchService extends Disposable implements IMarkersWorkbenchService { - _serviceBrand: any; - - readonly markersModel: MarkersModel; - - private readonly allFixesCache: Map> = new Map>(); - private readonly codeActionsPromises: Map>> = new Map>>(); - private readonly codeActions: Map> = new Map>(); - - constructor( - @IMarkerService private readonly markerService: IMarkerService, - @IInstantiationService instantiationService: IInstantiationService, - @IBulkEditService private readonly bulkEditService: IBulkEditService, - @ICommandService private readonly commandService: ICommandService, - @IEditorService private readonly editorService: IEditorService, - @IModelService private readonly modelService: IModelService - ) { - super(); - this.markersModel = this._register(instantiationService.createInstance(MarkersModel, this.readMarkers())); - - for (const group of groupBy(this.readMarkers(), compareMarkersByUri)) { - this.markersModel.setResourceMarkers(group[0].resource, group); - } - - this._register(markerService.onMarkerChanged(resources => this.onMarkerChanged(resources))); - } - - private onMarkerChanged(resources: URI[]): void { - for (const resource of resources) { - const allFixes = this.allFixesCache.get(resource.toString()); - if (allFixes) { - allFixes.cancel(); - this.allFixesCache.delete(resource.toString()); - } - const codeActions = this.codeActionsPromises.get(resource.toString()); - if (codeActions) { - codeActions.forEach(promise => promise.cancel()); - this.codeActionsPromises.delete(resource.toString()); - } - this.codeActions.delete(resource.toString()); - this.markersModel.setResourceMarkers(resource, this.readMarkers(resource)); - } - } - - private readMarkers(resource?: URI): IMarker[] { - return this.markerService.read({ resource, severities: MarkerSeverity.Error | MarkerSeverity.Warning | MarkerSeverity.Info }); - } - - getQuickFixActions(marker: Marker): Promise { - const markerKey = IMarkerData.makeKey(marker.marker); - let codeActionsPerMarker = this.codeActions.get(marker.resource.toString()); - if (!codeActionsPerMarker) { - codeActionsPerMarker = new Map(); - this.codeActions.set(marker.resource.toString(), codeActionsPerMarker); - } - const codeActions = codeActionsPerMarker.get(markerKey); - if (codeActions) { - return Promise.resolve(this.toActions(codeActions, marker)); - } else { - let codeActionsPromisesPerMarker = this.codeActionsPromises.get(marker.resource.toString()); - if (!codeActionsPromisesPerMarker) { - codeActionsPromisesPerMarker = new Map>(); - this.codeActionsPromises.set(marker.resource.toString(), codeActionsPromisesPerMarker); - } - if (!codeActionsPromisesPerMarker.has(markerKey)) { - const codeActionsPromise = this.getFixes(marker); - codeActionsPromisesPerMarker.set(markerKey, codeActionsPromise); - codeActionsPromise.then(codeActions => codeActionsPerMarker!.set(markerKey, codeActions)); - } - // Wait for 100ms for code actions fetching. - return timeout(100).then(() => this.toActions(codeActionsPerMarker!.get(markerKey) || [], marker)); - } - } - - private toActions(codeActions: CodeAction[], marker: Marker): IAction[] { - return codeActions.map(codeAction => new Action( - codeAction.command ? codeAction.command.id : codeAction.title, - codeAction.title, - undefined, - true, - () => { - return this.openFileAtMarker(marker) - .then(() => applyCodeAction(codeAction, this.bulkEditService, this.commandService)); - })); - } - - async hasQuickFixes(marker: Marker): Promise { - if (!this.modelService.getModel(marker.resource)) { - // Return early, If the model is not yet created - return false; - } - let allFixesPromise = this.allFixesCache.get(marker.resource.toString()); - if (!allFixesPromise) { - allFixesPromise = this._getFixes(marker.resource); - this.allFixesCache.set(marker.resource.toString(), allFixesPromise); - } - const allFixes = await allFixesPromise; - if (allFixes.length) { - const markerKey = IMarkerData.makeKey(marker.marker); - for (const fix of allFixes) { - if (fix.diagnostics && fix.diagnostics.some(d => IMarkerData.makeKey(d) === markerKey)) { - return true; - } - } - } - return false; - } - - private openFileAtMarker(element: Marker): Promise { - const { resource, selection } = { resource: element.resource, selection: element.range }; - return this.editorService.openEditor({ - resource, - options: { - selection, - preserveFocus: true, - pinned: false, - revealIfVisible: true - }, - }, ACTIVE_GROUP).then(() => undefined); - } - - private getFixes(marker: Marker): CancelablePromise { - return this._getFixes(marker.resource, new Range(marker.range.startLineNumber, marker.range.startColumn, marker.range.endLineNumber, marker.range.endColumn)); - } - - private _getFixes(uri: URI, range?: Range): CancelablePromise { - return createCancelablePromise(cancellationToken => { - const model = this.modelService.getModel(uri); - if (model) { - return getCodeActions(model, range ? range : model.getFullModelRange(), { type: 'manual', filter: { kind: CodeActionKind.QuickFix } }, cancellationToken); - } - return Promise.resolve([]); - }); - } - -} - -export class ActivityUpdater extends Disposable implements IWorkbenchContribution { - - constructor( - @IActivityService private readonly activityService: IActivityService, - @IMarkersWorkbenchService private readonly markersWorkbenchService: IMarkersWorkbenchService - ) { - super(); - this._register(this.markersWorkbenchService.markersModel.onDidChange(() => this.updateBadge())); - this.updateBadge(); - } - - private updateBadge(): void { - const total = this.markersWorkbenchService.markersModel.resourceMarkers.reduce((r, rm) => r + rm.markers.length, 0); - const message = localize('totalProblems', 'Total {0} Problems', total); - this.activityService.showActivity(Constants.MARKERS_PANEL_ID, new NumberBadge(total, () => message)); - } -} \ No newline at end of file diff --git a/src/vs/workbench/parts/scm/common/scm.ts b/src/vs/workbench/parts/scm/common/scm.ts deleted file mode 100644 index f2c08d44b69..00000000000 --- a/src/vs/workbench/parts/scm/common/scm.ts +++ /dev/null @@ -1,10 +0,0 @@ -/*--------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All rights reserved. - * Licensed under the MIT License. See License.txt in the project root for license information. - *--------------------------------------------------------------------------------------------*/ - -import { Registry } from 'vs/platform/registry/common/platform'; -import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; - -export const VIEWLET_ID = 'workbench.view.scm'; -export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); \ No newline at end of file diff --git a/src/vs/workbench/services/backup/node/backupFileService.ts b/src/vs/workbench/services/backup/node/backupFileService.ts index f0e28bc0975..ae72e145857 100644 --- a/src/vs/workbench/services/backup/node/backupFileService.ts +++ b/src/vs/workbench/services/backup/node/backupFileService.ts @@ -14,6 +14,7 @@ import { readToMatchingString } from 'vs/base/node/stream'; import { ITextBufferFactory } from 'vs/editor/common/model'; import { createTextBufferFactoryFromStream, createTextBufferFactoryFromSnapshot } from 'vs/editor/common/model/textModel'; import { keys } from 'vs/base/common/map'; +import { Schemas } from 'vs/base/common/network'; export interface IBackupFilesModel { resolve(backupRoot: string): Promise; @@ -233,11 +234,7 @@ export class BackupFileService implements IBackupFileService { } toBackupResource(resource: Uri): Uri { - return Uri.file(path.join(this.backupWorkspacePath, resource.scheme, this.hashPath(resource))); - } - - private hashPath(resource: Uri): string { - return crypto.createHash('md5').update(resource.fsPath).digest('hex'); + return Uri.file(path.join(this.backupWorkspacePath, resource.scheme, hashPath(resource))); } } @@ -257,7 +254,7 @@ export class InMemoryBackupFileService implements IBackupFileService { return Promise.resolve(backupResource); } - return Promise.resolve(); + return Promise.resolve(undefined); } backupResource(resource: Uri, content: ITextSnapshot, versionId?: number): Promise { @@ -273,7 +270,7 @@ export class InMemoryBackupFileService implements IBackupFileService { return Promise.resolve(createTextBufferFactoryFromSnapshot(snapshot)); } - return Promise.resolve(); + return Promise.resolve(undefined); } getWorkspaceFileBackups(): Promise { @@ -293,10 +290,15 @@ export class InMemoryBackupFileService implements IBackupFileService { } toBackupResource(resource: Uri): Uri { - return Uri.file(path.join(resource.scheme, this.hashPath(resource))); + return Uri.file(path.join(resource.scheme, hashPath(resource))); } - private hashPath(resource: Uri): string { - return crypto.createHash('md5').update(resource.fsPath).digest('hex'); - } -} \ No newline at end of file +} + +/* + * Exported only for testing + */ +export function hashPath(resource: Uri): string { + const str = resource.scheme === Schemas.file ? resource.fsPath : resource.toString(); + return crypto.createHash('md5').update(str).digest('hex'); +} diff --git a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts index 2e0085dbe06..ca6f648b3cd 100644 --- a/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts +++ b/src/vs/workbench/services/backup/test/electron-browser/backupFileService.test.ts @@ -5,13 +5,12 @@ import * as assert from 'assert'; import * as platform from 'vs/base/common/platform'; -import * as crypto from 'crypto'; import * as os from 'os'; import * as fs from 'fs'; import * as path from 'path'; import * as pfs from 'vs/base/node/pfs'; import { URI as Uri } from 'vs/base/common/uri'; -import { BackupFileService, BackupFilesModel } from 'vs/workbench/services/backup/node/backupFileService'; +import { BackupFileService, BackupFilesModel, hashPath } from 'vs/workbench/services/backup/node/backupFileService'; import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; import { TextModel, createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { TestContextService, TestTextResourceConfigurationService, getRandomTestPath, TestLifecycleService, TestEnvironmentService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; @@ -27,13 +26,13 @@ const backupHome = path.join(parentDir, 'Backups'); const workspacesJsonPath = path.join(backupHome, 'workspaces.json'); const workspaceResource = Uri.file(platform.isWindows ? 'c:\\workspace' : '/workspace'); -const workspaceBackupPath = path.join(backupHome, crypto.createHash('md5').update(workspaceResource.fsPath).digest('hex')); +const workspaceBackupPath = path.join(backupHome, hashPath(workspaceResource)); const fooFile = Uri.file(platform.isWindows ? 'c:\\Foo' : '/Foo'); const barFile = Uri.file(platform.isWindows ? 'c:\\Bar' : '/Bar'); const untitledFile = Uri.from({ scheme: Schemas.untitled, path: 'Untitled-1' }); -const fooBackupPath = path.join(workspaceBackupPath, 'file', crypto.createHash('md5').update(fooFile.fsPath).digest('hex')); -const barBackupPath = path.join(workspaceBackupPath, 'file', crypto.createHash('md5').update(barFile.fsPath).digest('hex')); -const untitledBackupPath = path.join(workspaceBackupPath, 'untitled', crypto.createHash('md5').update(untitledFile.fsPath).digest('hex')); +const fooBackupPath = path.join(workspaceBackupPath, 'file', hashPath(fooFile)); +const barBackupPath = path.join(workspaceBackupPath, 'file', hashPath(barFile)); +const untitledBackupPath = path.join(workspaceBackupPath, 'untitled', hashPath(untitledFile)); class TestBackupFileService extends BackupFileService { constructor(workspace: Uri, backupHome: string, workspacesJsonPath: string) { @@ -69,8 +68,8 @@ suite('BackupFileService', () => { test('should get the correct backup path for text files', () => { // Format should be: /// const backupResource = fooFile; - const workspaceHash = crypto.createHash('md5').update(workspaceResource.fsPath).digest('hex'); - const filePathHash = crypto.createHash('md5').update(backupResource.fsPath).digest('hex'); + const workspaceHash = hashPath(workspaceResource); + const filePathHash = hashPath(backupResource); const expectedPath = Uri.file(path.join(backupHome, workspaceHash, 'file', filePathHash)).fsPath; assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); }); @@ -78,8 +77,8 @@ suite('BackupFileService', () => { test('should get the correct backup path for untitled files', () => { // Format should be: /// const backupResource = Uri.from({ scheme: Schemas.untitled, path: 'Untitled-1' }); - const workspaceHash = crypto.createHash('md5').update(workspaceResource.fsPath).digest('hex'); - const filePathHash = crypto.createHash('md5').update(backupResource.fsPath).digest('hex'); + const workspaceHash = hashPath(workspaceResource); + const filePathHash = hashPath(backupResource); const expectedPath = Uri.file(path.join(backupHome, workspaceHash, 'untitled', filePathHash)).fsPath; assert.equal(service.toBackupResource(backupResource).fsPath, expectedPath); }); diff --git a/src/vs/workbench/services/commands/test/common/commandService.test.ts b/src/vs/workbench/services/commands/test/common/commandService.test.ts index b686e562f1b..4eef877efd0 100644 --- a/src/vs/workbench/services/commands/test/common/commandService.test.ts +++ b/src/vs/workbench/services/commands/test/common/commandService.test.ts @@ -6,59 +6,10 @@ import * as assert from 'assert'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { CommandsRegistry } from 'vs/platform/commands/common/commands'; import { CommandService } from 'vs/workbench/services/commands/common/commandService'; -import { IExtensionService, ExtensionPointContribution, IExtensionDescription, ProfileSession } from 'vs/workbench/services/extensions/common/extensions'; +import { NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { InstantiationService } from 'vs/platform/instantiation/common/instantiationService'; -import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -import { Event, Emitter } from 'vs/base/common/event'; import { NullLogService } from 'vs/platform/log/common/log'; -class SimpleExtensionService implements IExtensionService { - _serviceBrand: any; - private _onDidRegisterExtensions = new Emitter(); - get onDidRegisterExtensions(): Event { - return this._onDidRegisterExtensions.event; - } - onDidChangeExtensionsStatus = null!; - onDidChangeExtensions = null!; - onWillActivateByEvent = null!; - onDidChangeResponsiveChange = null!; - activateByEvent(activationEvent: string): Promise { - return this.whenInstalledExtensionsRegistered().then(() => { }); - } - whenInstalledExtensionsRegistered(): Promise { - return Promise.resolve(true); - } - readExtensionPointContributions(extPoint: IExtensionPoint): Promise[]> { - return Promise.resolve([]); - } - getExtensionsStatus() { - return undefined!; - } - getExtensions(): Promise { - return Promise.resolve([]); - } - getExtension() { - return Promise.resolve(undefined); - } - canProfileExtensionHost() { - return false; - } - startExtensionHostProfile(): Promise { - throw new Error('Not implemented'); - } - getInspectPort(): number { - return 0; - } - restartExtensionHost(): void { - } - startExtensionHost(): void { - } - stopExtensionHost(): void { - } - canAddExtension(): boolean { return false; } - canRemoveExtension(): boolean { return false; } -} - suite('CommandService', function () { let commandRegistration: IDisposable; @@ -75,7 +26,7 @@ suite('CommandService', function () { let lastEvent: string; - let service = new CommandService(new InstantiationService(), new class extends SimpleExtensionService { + let service = new CommandService(new InstantiationService(), new class extends NullExtensionService { activateByEvent(activationEvent: string): Promise { lastEvent = activationEvent; return super.activateByEvent(activationEvent); @@ -94,7 +45,7 @@ suite('CommandService', function () { test('fwd activation error', async function () { - const extensionService = new class extends SimpleExtensionService { + const extensionService = new class extends NullExtensionService { activateByEvent(activationEvent: string): Promise { return Promise.reject(new Error('bad_activate')); } @@ -114,7 +65,7 @@ suite('CommandService', function () { let callCounter = 0; let reg = CommandsRegistry.registerCommand('bar', () => callCounter += 1); - let service = new CommandService(new InstantiationService(), new class extends SimpleExtensionService { + let service = new CommandService(new InstantiationService(), new class extends NullExtensionService { whenInstalledExtensionsRegistered() { return new Promise(_resolve => { /*ignore*/ }); } @@ -131,7 +82,7 @@ suite('CommandService', function () { let resolveFunc: Function; const whenInstalledExtensionsRegistered = new Promise(_resolve => { resolveFunc = _resolve; }); - let service = new CommandService(new InstantiationService(), new class extends SimpleExtensionService { + let service = new CommandService(new InstantiationService(), new class extends NullExtensionService { whenInstalledExtensionsRegistered() { return whenInstalledExtensionsRegistered; } @@ -154,7 +105,7 @@ suite('CommandService', function () { let callCounter = 0; let dispoables: IDisposable[] = []; let events: string[] = []; - let service = new CommandService(new InstantiationService(), new class extends SimpleExtensionService { + let service = new CommandService(new InstantiationService(), new class extends NullExtensionService { activateByEvent(event: string): Promise { events.push(event); diff --git a/src/vs/workbench/services/configuration/node/configurationService.ts b/src/vs/workbench/services/configuration/node/configurationService.ts index 4a8acfeda40..82885fa7b0c 100644 --- a/src/vs/workbench/services/configuration/node/configurationService.ts +++ b/src/vs/workbench/services/configuration/node/configurationService.ts @@ -346,9 +346,9 @@ export class WorkspaceService extends Disposable implements IWorkspaceConfigurat } private createMultiFolderWorkspace(workspaceIdentifier: IWorkspaceIdentifier): Promise { - return this.workspaceConfiguration.load({ id: workspaceIdentifier.id, configPath: URI.file(workspaceIdentifier.configPath) }) + return this.workspaceConfiguration.load({ id: workspaceIdentifier.id, configPath: workspaceIdentifier.configPath }) .then(() => { - const workspaceConfigPath = URI.file(workspaceIdentifier.configPath); + const workspaceConfigPath = workspaceIdentifier.configPath; const workspaceFolders = toWorkspaceFolders(this.workspaceConfiguration.getFolders(), dirname(workspaceConfigPath)); const workspaceId = workspaceIdentifier.id; return new Workspace(workspaceId, workspaceFolders, workspaceConfigPath); diff --git a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts index 8d56534cfa1..d6e5d442fcf 100644 --- a/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts +++ b/src/vs/workbench/services/configuration/test/electron-browser/configurationService.test.ts @@ -35,6 +35,10 @@ import { IWorkspaceConfigurationService } from 'vs/workbench/services/configurat import { Uri } from 'vscode'; import { createHash } from 'crypto'; import { Emitter, Event } from 'vs/base/common/event'; +import { Schemas } from 'vs/base/common/network'; +import { fsPath } from 'vs/base/common/resources'; +import { isLinux } from 'vs/base/common/platform'; +import { IWorkspaceIdentifier } from 'vs/workbench/services/configuration/node/configuration'; class SettingsTestEnvironmentService extends EnvironmentService { @@ -64,7 +68,7 @@ function convertToWorkspacePayload(folder: Uri): ISingleFolderWorkspaceInitializ } as ISingleFolderWorkspaceInitializationPayload; } -function setUpWorkspace(folders: string[]): Promise<{ parentDir: string, configPath: string }> { +function setUpWorkspace(folders: string[]): Promise<{ parentDir: string, configPath: URI }> { const id = uuid.generateUuid(); const parentDir = path.join(os.tmpdir(), 'vsctests', id); @@ -76,7 +80,7 @@ function setUpWorkspace(folders: string[]): Promise<{ parentDir: string, configP fs.writeFileSync(configPath, JSON.stringify(workspace, null, '\t')); return Promise.all(folders.map(folder => setUpFolder(folder, parentDir))) - .then(() => ({ parentDir, configPath })); + .then(() => ({ parentDir, configPath: URI.file(configPath) })); })); } @@ -157,7 +161,7 @@ suite('WorkspaceContextService - Workspace', () => { instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); - return workspaceService.initialize({ id: configPath, configPath }).then(() => { + return workspaceService.initialize(getWorkspaceIdentifier(configPath)).then(() => { const fileService = new (class TestFileService extends FileService { get onFileChanges(): Event { return fileChangeEvent.event; } @@ -391,7 +395,7 @@ suite('WorkspaceContextService - Workspace', () => { suite('WorkspaceService - Initialization', () => { - let parentResource: string, workspaceConfigPath: string, testObject: WorkspaceService, globalSettingsFile: string; + let parentResource: string, workspaceConfigPath: URI, testObject: WorkspaceService, globalSettingsFile: string; const configurationRegistry = Registry.as(ConfigurationExtensions.Configuration); suiteSetup(() => { @@ -519,7 +523,7 @@ suite('WorkspaceService - Initialization', () => { testObject.onDidChangeWorkspaceFolders(target); testObject.onDidChangeConfiguration(target); - return testObject.initialize({ id: workspaceConfigPath, configPath: workspaceConfigPath }) + return testObject.initialize(getWorkspaceIdentifier(workspaceConfigPath)) .then(() => { assert.equal(target.callCount, 3); assert.deepEqual(target.args[0], [WorkbenchState.WORKSPACE]); @@ -548,7 +552,7 @@ suite('WorkspaceService - Initialization', () => { fs.writeFileSync(path.join(parentResource, '1', '.vscode', 'settings.json'), '{ "initialization.testSetting1": "workspaceValue1" }'); fs.writeFileSync(path.join(parentResource, '2', '.vscode', 'settings.json'), '{ "initialization.testSetting2": "workspaceValue2" }'); - return testObject.initialize({ id: workspaceConfigPath, configPath: workspaceConfigPath }) + return testObject.initialize(getWorkspaceIdentifier(workspaceConfigPath)) .then(() => { assert.equal(target.callCount, 4); assert.deepEqual((target.args[0][0]).affectedKeys, ['initialization.testSetting1', 'initialization.testSetting2']); @@ -629,7 +633,7 @@ suite('WorkspaceService - Initialization', () => { testObject.onDidChangeConfiguration(target); fs.writeFileSync(path.join(parentResource, '1', '.vscode', 'settings.json'), '{ "initialization.testSetting1": "workspaceValue2" }'); - return testObject.initialize({ id: workspaceConfigPath, configPath: workspaceConfigPath }) + return testObject.initialize(getWorkspaceIdentifier(workspaceConfigPath)) .then(() => { assert.equal(target.callCount, 4); assert.deepEqual((target.args[0][0]).affectedKeys, ['initialization.testSetting1']); @@ -960,7 +964,7 @@ suite('WorkspaceConfigurationService-Multiroot', () => { instantiationService.stub(IConfigurationService, workspaceService); instantiationService.stub(IEnvironmentService, environmentService); - return workspaceService.initialize({ id: configPath, configPath }).then(() => { + return workspaceService.initialize(getWorkspaceIdentifier(configPath)).then(() => { const fileService = new FileService(workspaceService, TestEnvironmentService, new TestTextResourceConfigurationService(), workspaceService, new TestLifecycleService(), new TestStorageService(), new TestNotificationService(), { disableWatcher: true }); instantiationService.stub(IFileService, fileService); @@ -1240,3 +1244,19 @@ suite('WorkspaceConfigurationService-Multiroot', () => { }); }); }); + +function getWorkspaceId(configPath: URI): string { + let workspaceConfigPath = configPath.scheme === Schemas.file ? fsPath(configPath) : configPath.toString(); + if (!isLinux) { + workspaceConfigPath = workspaceConfigPath.toLowerCase(); // sanitize for platform file system + } + + return createHash('md5').update(workspaceConfigPath).digest('hex'); +} + +export function getWorkspaceIdentifier(configPath: URI): IWorkspaceIdentifier { + return { + configPath, + id: getWorkspaceId(configPath) + }; +} \ No newline at end of file diff --git a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts index d1004cf5a04..d6993e1b41b 100644 --- a/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts +++ b/src/vs/workbench/services/configurationResolver/common/configurationResolver.ts @@ -12,9 +12,9 @@ export const IConfigurationResolverService = createDecorator): IStringDictionary; + resolve(folder: IWorkspaceFolder | undefined, value: string): string; + resolve(folder: IWorkspaceFolder | undefined, value: string[]): string[]; + resolve(folder: IWorkspaceFolder | undefined, value: IStringDictionary): IStringDictionary; /** * Recursively resolves all variables in the given config and returns a copy of it with substituted values. diff --git a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts index af4d991f3d3..7e86f0e4185 100644 --- a/src/vs/workbench/services/configurationResolver/node/variableResolver.ts +++ b/src/vs/workbench/services/configurationResolver/node/variableResolver.ts @@ -43,10 +43,10 @@ export class AbstractVariableResolverService implements IConfigurationResolverSe } } - public resolve(root: IWorkspaceFolder, value: string): string; - public resolve(root: IWorkspaceFolder, value: string[]): string[]; - public resolve(root: IWorkspaceFolder, value: IStringDictionary): IStringDictionary; - public resolve(root: IWorkspaceFolder, value: any): any { + public resolve(root: IWorkspaceFolder | undefined, value: string): string; + public resolve(root: IWorkspaceFolder | undefined, value: string[]): string[]; + public resolve(root: IWorkspaceFolder | undefined, value: IStringDictionary): IStringDictionary; + public resolve(root: IWorkspaceFolder | undefined, value: any): any { return this.recursiveResolve(root ? root.uri : undefined, value); } diff --git a/src/vs/workbench/services/codeEditor/browser/codeEditorService.ts b/src/vs/workbench/services/editor/browser/codeEditorService.ts similarity index 100% rename from src/vs/workbench/services/codeEditor/browser/codeEditorService.ts rename to src/vs/workbench/services/editor/browser/codeEditorService.ts diff --git a/src/vs/workbench/services/editor/browser/editorService.ts b/src/vs/workbench/services/editor/browser/editorService.ts index e33128bf7f3..693779a1efa 100644 --- a/src/vs/workbench/services/editor/browser/editorService.ts +++ b/src/vs/workbench/services/editor/browser/editorService.ts @@ -18,7 +18,7 @@ import { URI } from 'vs/base/common/uri'; import { basename } from 'vs/base/common/paths'; import { DiffEditorInput } from 'vs/workbench/common/editor/diffEditorInput'; import { localize } from 'vs/nls'; -import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder, IEditorReplacement, GroupChangeKind, preferredSideBySideGroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IResourceEditor, ACTIVE_GROUP_TYPE, SIDE_GROUP_TYPE, SIDE_GROUP, IResourceEditorReplacement, IOpenEditorOverrideHandler } from 'vs/workbench/services/editor/common/editorService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { Disposable, IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; @@ -37,16 +37,16 @@ export class EditorService extends Disposable implements EditorServiceImpl { //#region events - private _onDidActiveEditorChange: Emitter = this._register(new Emitter()); + private readonly _onDidActiveEditorChange: Emitter = this._register(new Emitter()); get onDidActiveEditorChange(): Event { return this._onDidActiveEditorChange.event; } - private _onDidVisibleEditorsChange: Emitter = this._register(new Emitter()); + private readonly _onDidVisibleEditorsChange: Emitter = this._register(new Emitter()); get onDidVisibleEditorsChange(): Event { return this._onDidVisibleEditorsChange.event; } - private _onDidCloseEditor: Emitter = this._register(new Emitter()); + private readonly _onDidCloseEditor: Emitter = this._register(new Emitter()); get onDidCloseEditor(): Event { return this._onDidCloseEditor.event; } - private _onDidOpenEditorFail: Emitter = this._register(new Emitter()); + private readonly _onDidOpenEditorFail: Emitter = this._register(new Emitter()); get onDidOpenEditorFail(): Event { return this._onDidOpenEditorFail.event; } //#endregion diff --git a/src/vs/workbench/services/group/common/editorGroupsService.ts b/src/vs/workbench/services/editor/common/editorGroupsService.ts similarity index 100% rename from src/vs/workbench/services/group/common/editorGroupsService.ts rename to src/vs/workbench/services/editor/common/editorGroupsService.ts diff --git a/src/vs/workbench/services/editor/common/editorService.ts b/src/vs/workbench/services/editor/common/editorService.ts index cccd6dd730e..462dd7f33a0 100644 --- a/src/vs/workbench/services/editor/common/editorService.ts +++ b/src/vs/workbench/services/editor/common/editorService.ts @@ -8,7 +8,7 @@ import { IResourceInput, IEditorOptions, ITextEditorOptions } from 'vs/platform/ import { IEditorInput, IEditor, GroupIdentifier, IEditorInputWithOptions, IUntitledResourceInput, IResourceDiffInput, IResourceSideBySideInput, ITextEditor, ITextDiffEditor, ITextSideBySideEditor } from 'vs/workbench/common/editor'; import { Event } from 'vs/base/common/event'; import { IEditor as ICodeEditor } from 'vs/editor/common/editorCommon'; -import { IEditorGroup, IEditorReplacement } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, IEditorReplacement } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IDisposable } from 'vs/base/common/lifecycle'; export const IEditorService = createDecorator('editorService'); diff --git a/src/vs/workbench/services/group/test/browser/editorGroupsService.test.ts b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts similarity index 99% rename from src/vs/workbench/services/group/test/browser/editorGroupsService.test.ts rename to src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts index 806b62a5e55..ef4e6423cb7 100644 --- a/src/vs/workbench/services/group/test/browser/editorGroupsService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorGroupsService.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/test/workbenchTestServices'; -import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupChangeKind, EditorsOrder, GroupLocation } from 'vs/workbench/services/group/common/editorGroupsService'; +import { GroupDirection, GroupsOrder, MergeGroupMode, GroupOrientation, GroupChangeKind, EditorsOrder, GroupLocation } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IEditorPartOptions } from 'vs/workbench/browser/parts/editor/editor'; import { EditorInput, IFileEditorInput, IEditorInputFactory, IEditorInputFactoryRegistry, Extensions as EditorExtensions, EditorOptions, CloseDirection } from 'vs/workbench/common/editor'; @@ -41,7 +41,7 @@ export class TestEditorInput extends EditorInput implements IFileEditorInput { constructor(private resource: URI) { super(); } getTypeId() { return 'testEditorInputForEditorGroupService'; } - resolve(): Promise { return Promise.resolve(); } + resolve(): Promise { return Promise.resolve(undefined); } matches(other: TestEditorInput): boolean { return other && this.resource.toString() === other.resource.toString() && other instanceof TestEditorInput; } setEncoding(encoding: string) { } getEncoding(): string { return null!; } @@ -751,4 +751,4 @@ suite('Editor groups service', () => { part.dispose(); }); -}); \ No newline at end of file +}); diff --git a/src/vs/workbench/services/editor/test/browser/editorService.test.ts b/src/vs/workbench/services/editor/test/browser/editorService.test.ts index 45cbfeb9953..7f2c1932568 100644 --- a/src/vs/workbench/services/editor/test/browser/editorService.test.ts +++ b/src/vs/workbench/services/editor/test/browser/editorService.test.ts @@ -13,7 +13,7 @@ import { workbenchInstantiationService, TestStorageService } from 'vs/workbench/ import { ResourceEditorInput } from 'vs/workbench/common/editor/resourceEditorInput'; import { TestThemeService } from 'vs/platform/theme/test/common/testThemeService'; import { EditorService, DelegatingEditorService } from 'vs/workbench/services/editor/browser/editorService'; -import { IEditorGroup, IEditorGroupsService, GroupDirection } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup, IEditorGroupsService, GroupDirection } from 'vs/workbench/services/editor/common/editorGroupsService'; import { EditorPart } from 'vs/workbench/browser/parts/editor/editorPart'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { IEditorService, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; @@ -22,7 +22,7 @@ import { NullTelemetryService } from 'vs/platform/telemetry/common/telemetryUtil import { IEditorRegistry, EditorDescriptor, Extensions } from 'vs/workbench/browser/editor'; import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; import { Registry } from 'vs/platform/registry/common/platform'; -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { UntitledEditorInput } from 'vs/workbench/common/editor/untitledEditorInput'; import { EditorServiceImpl } from 'vs/workbench/browser/parts/editor/editor'; import { CancellationToken } from 'vs/base/common/cancellation'; diff --git a/src/vs/workbench/common/extensionHostProtocol.ts b/src/vs/workbench/services/extensions/common/extensionHostProtocol.ts similarity index 100% rename from src/vs/workbench/common/extensionHostProtocol.ts rename to src/vs/workbench/services/extensions/common/extensionHostProtocol.ts diff --git a/src/vs/workbench/services/extensions/common/extensions.ts b/src/vs/workbench/services/extensions/common/extensions.ts index 4a7f1019f4a..fabecb6b379 100644 --- a/src/vs/workbench/services/extensions/common/extensions.ts +++ b/src/vs/workbench/services/extensions/common/extensions.ts @@ -259,3 +259,27 @@ export function toExtension(extensionDescription: IExtensionDescription): IExten location: extensionDescription.extensionLocation, }; } + + +export class NullExtensionService implements IExtensionService { + _serviceBrand: any; + onDidRegisterExtensions: Event = Event.None; + onDidChangeExtensionsStatus: Event = Event.None; + onDidChangeExtensions: Event = Event.None; + onWillActivateByEvent: Event = Event.None; + onDidChangeResponsiveChange: Event = Event.None; + activateByEvent(_activationEvent: string): Promise { return Promise.resolve(undefined); } + whenInstalledExtensionsRegistered(): Promise { return Promise.resolve(true); } + getExtensions(): Promise { return Promise.resolve([]); } + getExtension() { return Promise.resolve(undefined); } + readExtensionPointContributions(_extPoint: IExtensionPoint): Promise[]> { return Promise.resolve(Object.create(null)); } + getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); } + canProfileExtensionHost(): boolean { return false; } + getInspectPort(): number { return 0; } + startExtensionHostProfile(): Promise { return Promise.resolve(Object.create(null)); } + restartExtensionHost(): void { } + startExtensionHost(): void { } + stopExtensionHost(): void { } + canAddExtension(): boolean { return false; } + canRemoveExtension(): boolean { return false; } +} \ No newline at end of file diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 1749a27e1a6..a898b22b164 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -33,7 +33,7 @@ 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 { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/common/extensionHostProtocol'; +import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { ICrashReporterService } from 'vs/workbench/services/crashReporter/electron-browser/crashReporterService'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; diff --git a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts index 40f22930a7e..fb3190e3c74 100644 --- a/src/vs/workbench/services/extensions/node/extensionHostProcess.ts +++ b/src/vs/workbench/services/extensions/node/extensionHostProcess.ts @@ -11,7 +11,7 @@ import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; import { Protocol } from 'vs/base/parts/ipc/node/ipc.net'; import product from 'vs/platform/node/product'; import { IInitData } from 'vs/workbench/api/node/extHost.protocol'; -import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/common/extensionHostProtocol'; +import { MessageType, createMessageOfType, isMessageOfType } from 'vs/workbench/services/extensions/common/extensionHostProtocol'; import { exit, ExtensionHostMain } from 'vs/workbench/services/extensions/node/extensionHostMain'; // With Electron 2.x and node.js 8.x the "natives" module diff --git a/src/vs/workbench/services/files/electron-browser/fileService.ts b/src/vs/workbench/services/files/electron-browser/fileService.ts index f6419c6094f..1a66c56808e 100644 --- a/src/vs/workbench/services/files/electron-browser/fileService.ts +++ b/src/vs/workbench/services/files/electron-browser/fileService.ts @@ -555,7 +555,7 @@ export class FileService extends Disposable implements IFileService { // 1.) check file for writing return this.checkFileBeforeWriting(absolutePath, options).then(exists => { - let createParentsPromise: Promise; + let createParentsPromise: Promise; if (exists) { createParentsPromise = Promise.resolve(); } else { diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 80078b6cade..784c2f3880e 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -221,27 +221,20 @@ export class RemoteFileService extends FileService { if (!match) { return undefined; } - let res: FileOperationResult; switch (match[1]) { case 'EntryNotFound': - res = FileOperationResult.FILE_NOT_FOUND; - break; + return FileOperationResult.FILE_NOT_FOUND; case 'EntryIsADirectory': - res = FileOperationResult.FILE_IS_DIRECTORY; - break; + return FileOperationResult.FILE_IS_DIRECTORY; case 'NoPermissions': - res = FileOperationResult.FILE_PERMISSION_DENIED; - break; + return FileOperationResult.FILE_PERMISSION_DENIED; case 'EntryExists': - res = FileOperationResult.FILE_MOVE_CONFLICT; - break; + return FileOperationResult.FILE_MOVE_CONFLICT; case 'EntryNotADirectory': default: // todo - res = undefined; - break; + return undefined; } - return res; } // --- stat @@ -386,7 +379,7 @@ export class RemoteFileService extends FileService { return toDecodeStream(readable, decodeStreamOpts).then(data => { if (options.acceptTextOnly && data.detected.seemsBinary) { - return Promise.reject(new FileOperationError( + return Promise.reject(new FileOperationError( localize('fileBinaryError', "File seems to be binary and cannot be opened as text"), FileOperationResult.FILE_IS_BINARY, options diff --git a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts index ba4ada4cd68..4ea2032f5a6 100644 --- a/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/workbench/services/files/node/watcher/unix/chokidarWatcherService.ts @@ -242,7 +242,7 @@ export class ChokidarWatcherService implements IWatcherService { }); } - return Promise.resolve(); + return Promise.resolve(undefined); }); } }); diff --git a/src/vs/workbench/services/history/electron-browser/history.ts b/src/vs/workbench/services/history/electron-browser/history.ts index e1cae269b8b..c9fdaa454ad 100644 --- a/src/vs/workbench/services/history/electron-browser/history.ts +++ b/src/vs/workbench/services/history/electron-browser/history.ts @@ -18,7 +18,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { Registry } from 'vs/platform/registry/common/platform'; import { Event } from 'vs/base/common/event'; import { IConfigurationService, IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'; -import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { getCodeEditor, ICodeEditor } from 'vs/editor/browser/editorBrowser'; import { getExcludes, ISearchConfiguration } from 'vs/platform/search/common/search'; diff --git a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts index 354a3b44f43..e832b4a11b0 100644 --- a/src/vs/workbench/services/keybinding/common/keybindingEditing.ts +++ b/src/vs/workbench/services/keybinding/common/keybindingEditing.ts @@ -220,11 +220,11 @@ export class KeybindingsEditingService extends Disposable implements IKeybinding if (model.getValue()) { const parsed = this.parse(model); if (parsed.parseErrors.length) { - return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); + return Promise.reject(new Error(localize('parseErrors', "Unable to write to the keybindings configuration file. Please open it to correct errors/warnings in the file and try again."))); } if (parsed.result) { if (!isArray(parsed.result)) { - return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); + return Promise.reject(new Error(localize('errorInvalidConfiguration', "Unable to write to the keybindings configuration file. It has an object which is not of type Array. Please open the file to clean up and try again."))); } } else { const content = EOL + '[]'; diff --git a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts index b586ba0c870..3240a4cb1fb 100644 --- a/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts +++ b/src/vs/workbench/services/keybinding/test/electron-browser/keybindingEditing.test.ts @@ -39,7 +39,7 @@ import { IWorkspaceContextService, Workspace, toWorkspaceFolders } from 'vs/plat import { IBackupFileService } from 'vs/workbench/services/backup/common/backup'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { FileService } from 'vs/workbench/services/files/electron-browser/fileService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IHashService } from 'vs/workbench/services/hash/common/hashService'; import { KeybindingsEditingService } from 'vs/workbench/services/keybinding/common/keybindingEditing'; import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; diff --git a/src/vs/workbench/services/label/common/labelService.ts b/src/vs/workbench/services/label/common/labelService.ts index c4cb59dede6..d92d21679ac 100644 --- a/src/vs/workbench/services/label/common/labelService.ts +++ b/src/vs/workbench/services/label/common/labelService.ts @@ -11,13 +11,11 @@ import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry, IWo import { Registry } from 'vs/platform/registry/common/platform'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IWorkspaceContextService, IWorkspace } from 'vs/platform/workspace/common/workspace'; -import { isEqual, basenameOrAuthority, basename as resourceBasename } from 'vs/base/common/resources'; +import { isEqual, basenameOrAuthority, isEqualOrParent, basename, joinPath, dirname } from 'vs/base/common/resources'; import { isLinux, isWindows } from 'vs/base/common/platform'; import { tildify, getPathLabel } from 'vs/base/common/labels'; import { ltrim } from 'vs/base/common/strings'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, isSingleFolderWorkspaceIdentifier, WORKSPACE_EXTENSION, toWorkspaceIdentifier, isWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; -import { isParent } from 'vs/platform/files/common/files'; -import { basename, dirname, join } from 'vs/base/common/paths'; import { Schemas } from 'vs/base/common/network'; import { IWindowService } from 'vs/platform/windows/common/windows'; import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts'; @@ -175,7 +173,7 @@ export class LabelService implements ILabelService { // Workspace: Single Folder if (isSingleFolderWorkspaceIdentifier(workspace)) { // Folder on disk - const label = options && options.verbose ? this.getUriLabel(workspace) : resourceBasename(workspace) || '/'; + const label = options && options.verbose ? this.getUriLabel(workspace) : basename(workspace) || '/'; if (workspace.scheme === Schemas.file) { return label; } @@ -186,7 +184,7 @@ export class LabelService implements ILabelService { } // Workspace: Untitled - if (isParent(workspace.configPath, this.environmentService.workspacesHome, !isLinux /* ignore case */)) { + if (isEqualOrParent(workspace.configPath, URI.file(this.environmentService.workspacesHome))) { return localize('untitledWorkspace', "Untitled (Workspace)"); } @@ -194,7 +192,7 @@ export class LabelService implements ILabelService { const filename = basename(workspace.configPath); const workspaceName = filename.substr(0, filename.length - WORKSPACE_EXTENSION.length - 1); if (options && options.verbose) { - return localize('workspaceNameVerbose', "{0} (Workspace)", this.getUriLabel(URI.file(join(dirname(workspace.configPath), workspaceName)))); + return localize('workspaceNameVerbose', "{0} (Workspace)", this.getUriLabel(joinPath(dirname(workspace.configPath)!, workspaceName))); } return localize('workspaceName', "{0} (Workspace)", workspaceName); diff --git a/src/vs/workbench/services/part/common/partService.ts b/src/vs/workbench/services/part/common/partService.ts index 6c63edf6559..ad8908763f7 100644 --- a/src/vs/workbench/services/part/common/partService.ts +++ b/src/vs/workbench/services/part/common/partService.ts @@ -69,7 +69,7 @@ export interface IPartService { /** * Returns the parts HTML element, if there is one. */ - getContainer(part: Parts): HTMLElement; + getContainer(part: Parts): HTMLElement | null; /** * Returns if the part is visible. diff --git a/src/vs/workbench/services/preferences/browser/preferencesService.ts b/src/vs/workbench/services/preferences/browser/preferencesService.ts index 5c92d098acb..56177073387 100644 --- a/src/vs/workbench/services/preferences/browser/preferencesService.ts +++ b/src/vs/workbench/services/preferences/browser/preferencesService.ts @@ -32,7 +32,7 @@ import { EditorInput, IEditor } from 'vs/workbench/common/editor'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { IJSONEditingService } from 'vs/workbench/services/configuration/common/jsonEditing'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { GroupDirection, IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { GroupDirection, IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { DEFAULT_SETTINGS_EDITOR_SETTING, FOLDER_SETTINGS_PATH, getSettingsTargetName, IPreferencesEditorModel, IPreferencesService, ISetting, ISettingsEditorOptions, SettingsEditorOptions, USE_SPLIT_JSON_SETTING } from 'vs/workbench/services/preferences/common/preferences'; import { DefaultPreferencesEditorInput, KeybindingsEditorInput, PreferencesEditorInput, SettingsEditor2Input } from 'vs/workbench/services/preferences/common/preferencesEditorInput'; import { defaultKeybindingsContents, DefaultKeybindingsEditorModel, DefaultSettings, DefaultSettingsEditorModel, Settings2EditorModel, SettingsEditorModel, WorkspaceConfigurationEditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; diff --git a/src/vs/workbench/services/preferences/common/preferences.ts b/src/vs/workbench/services/preferences/common/preferences.ts index 21ff535121d..f155b15b94d 100644 --- a/src/vs/workbench/services/preferences/common/preferences.ts +++ b/src/vs/workbench/services/preferences/common/preferences.ts @@ -17,7 +17,7 @@ import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensio import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { EditorOptions, IEditor } from 'vs/workbench/common/editor'; -import { IEditorGroup } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroup } from 'vs/workbench/services/editor/common/editorGroupsService'; import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; export enum SettingValueType { diff --git a/src/vs/workbench/services/progress/test/progressService.test.ts b/src/vs/workbench/services/progress/test/progressService.test.ts index 5a1073e1c0e..eb7a11a02ce 100644 --- a/src/vs/workbench/services/progress/test/progressService.test.ts +++ b/src/vs/workbench/services/progress/test/progressService.test.ts @@ -52,8 +52,8 @@ class TestViewletService implements IViewletService { return 'workbench.view.explorer'; } - public getViewlet(id: string): ViewletDescriptor { - return null!; + public getViewlet(id: string): ViewletDescriptor | undefined { + return undefined; } public getProgressIndicator(id: string) { diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index 8d45afec201..08bb261385c 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -11,18 +11,16 @@ import { Event } from 'vs/base/common/event'; import { Disposable, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; import { keys, ResourceMap, values } from 'vs/base/common/map'; import { Schemas } from 'vs/base/common/network'; -import * as objects from 'vs/base/common/objects'; import { StopWatch } from 'vs/base/common/stopwatch'; import { URI as uri } from 'vs/base/common/uri'; import * as pfs from 'vs/base/node/pfs'; import { getNextTickChannel } from 'vs/base/parts/ipc/node/ipc'; import { Client, IIPCOptions } from 'vs/base/parts/ipc/node/ipc.cp'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IDebugParams, IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; -import { deserializeSearchError, FileMatch, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgress, ISearchComplete, ISearchConfiguration, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, ITextQuery, pathIncludedInQuery, QueryType, SearchError, SearchErrorCode, SearchProviderType } from 'vs/platform/search/common/search'; +import { deserializeSearchError, FileMatch, ICachedSearchStats, IFileMatch, IFileQuery, IFileSearchStats, IFolderQuery, IProgress, ISearchComplete, ISearchEngineStats, ISearchProgressItem, ISearchQuery, ISearchResultProvider, ISearchService, ITextQuery, pathIncludedInQuery, QueryType, SearchError, SearchErrorCode, SearchProviderType, ISearchConfiguration } from 'vs/platform/search/common/search'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; @@ -30,6 +28,7 @@ import { addContextToEditorMatches, editorMatchesToTextSearchResults } from 'vs/ import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { IRawSearchService, ISerializedFileMatch, ISerializedSearchComplete, ISerializedSearchProgressItem, isSerializedSearchComplete, isSerializedSearchSuccess } from './search'; import { SearchChannelClient } from './searchIpc'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; export class SearchService extends Disposable implements ISearchService { _serviceBrand: any; @@ -46,12 +45,11 @@ export class SearchService extends Disposable implements ISearchService { @IEditorService private readonly editorService: IEditorService, @IEnvironmentService environmentService: IEnvironmentService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IConfigurationService private readonly configurationService: IConfigurationService, @ILogService private readonly logService: ILogService, @IExtensionService private readonly extensionService: IExtensionService ) { super(); - this.diskSearch = this.instantiationService.createInstance(DiskSearch, !environmentService.isBuilt || environmentService.verbose, /*timeout=*/undefined, environmentService.debugSearch); + this.diskSearch = this.instantiationService.createInstance(DiskSearch, !environmentService.isBuilt || environmentService.verbose, environmentService.debugSearch); } registerSearchResultProvider(scheme: string, type: SearchProviderType, provider: ISearchResultProvider): IDisposable { @@ -71,22 +69,6 @@ export class SearchService extends Disposable implements ISearchService { }); } - extendQuery(query: IFileQuery): void { - const configuration = this.configurationService.getValue(); - - // Configuration: File Excludes - if (!query.disregardExcludeSettings) { - const fileExcludes = objects.deepClone(configuration && configuration.files && configuration.files.exclude); - if (fileExcludes) { - if (!query.excludePattern) { - query.excludePattern = fileExcludes; - } else { - objects.mixin(query.excludePattern, fileExcludes, false /* no overwrite */); - } - } - } - } - textSearch(query: ITextQuery, token?: CancellationToken, onProgress?: (item: ISearchProgressItem) => void): Promise { // Get local results from dirty/untitled const localResults = this.getLocalResults(query); @@ -446,19 +428,21 @@ export class SearchService extends Disposable implements ISearchService { } export class DiskSearch implements ISearchResultProvider { - _serviceBrand: any; - private raw: IRawSearchService; constructor( verboseLogging: boolean, - timeout: number = 60 * 60 * 1000, searchDebug: IDebugParams | undefined, - @ILogService private readonly logService: ILogService + @ILogService private readonly logService: ILogService, + @IConfigurationService private readonly configService: IConfigurationService, ) { + const timeout = this.configService.getValue().search.maintainFileSearchCache ? + Number.MAX_VALUE : + 60 * 60 * 1000; + const opts: IIPCOptions = { serverName: 'Search', - timeout: timeout, + timeout, args: ['--type=searchService'], // See https://github.com/Microsoft/vscode/issues/27665 // Pass in fresh execArgv to the forked process such that it doesn't inherit them from `process.execArgv`. diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index 9537d48d1f2..248ba255f0e 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -215,7 +215,7 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil // Unset flags const undo = this.setDirty(false); - let loadPromise: Promise; + let loadPromise: Promise; if (soft) { loadPromise = Promise.resolve(); } else { diff --git a/src/vs/workbench/services/textfile/common/textFileService.ts b/src/vs/workbench/services/textfile/common/textFileService.ts index 8babc6bcb54..1b8e23675a7 100644 --- a/src/vs/workbench/services/textfile/common/textFileService.ts +++ b/src/vs/workbench/services/textfile/common/textFileService.ts @@ -57,7 +57,7 @@ export abstract class TextFileService extends Disposable implements ITextFileSer private _models: TextFileEditorModelManager; private currentFilesAssociationConfig: { [key: string]: string; }; - private configuredAutoSaveDelay: number; + private configuredAutoSaveDelay?: number; private configuredAutoSaveOnFocusChange: boolean; private configuredAutoSaveOnWindowChange: boolean; private configuredHotExit: string; diff --git a/src/vs/workbench/services/textfile/test/textFileService.test.ts b/src/vs/workbench/services/textfile/test/textFileService.test.ts index 7c75c57e3ea..3eb2f5092bb 100644 --- a/src/vs/workbench/services/textfile/test/textFileService.test.ts +++ b/src/vs/workbench/services/textfile/test/textFileService.test.ts @@ -58,7 +58,9 @@ suite('Files - TextFileService', () => { }); teardown(() => { - model.dispose(); + if (model) { + model.dispose(); + } (accessor.textFileService.models).clear(); (accessor.textFileService.models).dispose(); accessor.untitledEditorService.revertAll(); diff --git a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts index e274fce62fa..3b011295c08 100644 --- a/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts +++ b/src/vs/workbench/services/textmodelResolver/common/textModelResolverService.ts @@ -107,7 +107,7 @@ class ResourceModelCollection extends ReferenceCollection { if (!model) { - return Promise.reject(new Error('resource is not available')); + return Promise.reject(new Error('resource is not available')); } return model; diff --git a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts index 1af44a2d51d..3ff37d4ac5a 100644 --- a/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/colorThemeData.ts @@ -57,8 +57,8 @@ export class ColorThemeData implements IColorTheme { private colorMap: IColorMap = {}; private customColorMap: IColorMap = {}; - public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | null { - let color: Color | null = this.customColorMap[colorId]; + public getColor(colorId: ColorIdentifier, useDefault?: boolean): Color | undefined { + let color: Color | undefined = this.customColorMap[colorId]; if (color) { return color; } @@ -69,7 +69,7 @@ export class ColorThemeData implements IColorTheme { return color; } - public getDefault(colorId: ColorIdentifier): Color | null { + public getDefault(colorId: ColorIdentifier): Color | undefined { return colorRegistry.resolveDefaultColor(colorId, this); } diff --git a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts index 12655d450e1..7694bf4c616 100644 --- a/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts +++ b/src/vs/workbench/services/themes/electron-browser/fileIconThemeData.ts @@ -29,15 +29,15 @@ export class FileIconThemeData implements IFileIconTheme { private constructor() { } - public ensureLoaded(fileService: IFileService): Promise { + public ensureLoaded(fileService: IFileService): Promise { return !this.isLoaded ? this.load(fileService) : Promise.resolve(this.styleSheetContent); } - public reload(fileService: IFileService): Promise { + public reload(fileService: IFileService): Promise { return this.load(fileService); } - private load(fileService: IFileService): Promise { + private load(fileService: IFileService): Promise { if (!this.location) { return Promise.resolve(this.styleSheetContent); } diff --git a/src/vs/workbench/services/timer/electron-browser/timerService.ts b/src/vs/workbench/services/timer/electron-browser/timerService.ts index 1a4c78ecfa8..c8a35127665 100644 --- a/src/vs/workbench/services/timer/electron-browser/timerService.ts +++ b/src/vs/workbench/services/timer/electron-browser/timerService.ts @@ -377,6 +377,7 @@ class TimerService implements ITimerService { // ignore, be on the safe side with these hardware method calls } + const activeViewlet = this._viewletService.getActiveViewlet(); return { version: 2, ellapsed: perf.getDuration(startMark, 'didStartWorkbench'), @@ -386,7 +387,7 @@ class TimerService implements ITimerService { didUseCachedData: didUseCachedData(), windowKind: this._lifecycleService.startupKind, windowCount: await this._windowsService.getWindowCount(), - viewletId: this._viewletService.getActiveViewlet() ? this._viewletService.getActiveViewlet().getId() : undefined, + viewletId: activeViewlet ? activeViewlet.getId() : undefined, editorIds: this._editorService.visibleEditors.map(input => input.getTypeId()), panelId: this._panelService.getActivePanel() ? this._panelService.getActivePanel().getId() : undefined, diff --git a/src/vs/workbench/services/untitled/common/untitledEditorService.ts b/src/vs/workbench/services/untitled/common/untitledEditorService.ts index 6c4c8b44f9d..79d22e193a6 100644 --- a/src/vs/workbench/services/untitled/common/untitledEditorService.ts +++ b/src/vs/workbench/services/untitled/common/untitledEditorService.ts @@ -95,12 +95,12 @@ export interface IUntitledEditorService { /** * Suggests a filename for the given untitled resource if it is known. */ - suggestFileName(resource: URI): string; + suggestFileName(resource: URI): string | undefined; /** * Get the configured encoding for the given untitled resource if any. */ - getEncoding(resource: URI): string; + getEncoding(resource: URI): string | undefined; } export class UntitledEditorService extends Disposable implements IUntitledEditorService { @@ -129,7 +129,7 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor super(); } - protected get(resource: URI): UntitledEditorInput { + protected get(resource: URI): UntitledEditorInput | undefined { return this.mapResourceToInput.get(resource); } @@ -164,7 +164,7 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor isDirty(resource: URI): boolean { const input = this.get(resource); - return input && input.isDirty(); + return input ? input.isDirty() : false; } getDirty(resources?: URI[]): URI[] { @@ -200,7 +200,7 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor // Return existing instance if asked for it if (resource && this.mapResourceToInput.has(resource)) { - return this.mapResourceToInput.get(resource); + return this.mapResourceToInput.get(resource)!; } // Create new otherwise @@ -229,19 +229,19 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor const input = this.instantiationService.createInstance(UntitledEditorInput, resource, hasAssociatedFilePath, modeId, initialValue, encoding); const contentListener = input.onDidModelChangeContent(() => { - this._onDidChangeContent.fire(resource); + this._onDidChangeContent.fire(resource!); }); const dirtyListener = input.onDidChangeDirty(() => { - this._onDidChangeDirty.fire(resource); + this._onDidChangeDirty.fire(resource!); }); const encodingListener = input.onDidModelChangeEncoding(() => { - this._onDidChangeEncoding.fire(resource); + this._onDidChangeEncoding.fire(resource!); }); const disposeListener = input.onDispose(() => { - this._onDidDisposeModel.fire(resource); + this._onDidDisposeModel.fire(resource!); }); // Remove from cache on dispose @@ -265,13 +265,13 @@ export class UntitledEditorService extends Disposable implements IUntitledEditor return this.mapResourceToAssociatedFilePath.has(resource); } - suggestFileName(resource: URI): string { + suggestFileName(resource: URI): string | undefined { const input = this.get(resource); return input ? input.suggestFileName() : undefined; } - getEncoding(resource: URI): string { + getEncoding(resource: URI): string | undefined { const input = this.get(resource); return input ? input.getEncoding() : undefined; diff --git a/src/vs/workbench/services/viewlet/browser/viewlet.ts b/src/vs/workbench/services/viewlet/browser/viewlet.ts index c3345bae93c..b87357e7630 100644 --- a/src/vs/workbench/services/viewlet/browser/viewlet.ts +++ b/src/vs/workbench/services/viewlet/browser/viewlet.ts @@ -27,7 +27,7 @@ export interface IViewletService { /** * Returns the current active viewlet or null if none. */ - getActiveViewlet(): IViewlet; + getActiveViewlet(): IViewlet | null; /** * Returns the id of the default viewlet. @@ -37,7 +37,7 @@ export interface IViewletService { /** * Returns the viewlet by id. */ - getViewlet(id: string): ViewletDescriptor; + getViewlet(id: string): ViewletDescriptor | undefined; /** * Returns all enabled viewlets diff --git a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts index 6172c7e23fb..6e4f073e0c0 100644 --- a/src/vs/workbench/services/workspace/node/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/node/workspaceEditingService.ts @@ -154,7 +154,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { if (path) { await this.saveWorkspaceAs(untitledWorkspace, path); } else { - path = URI.file(untitledWorkspace.configPath); + path = untitledWorkspace.configPath; } return this.enterWorkspace(path); } @@ -177,7 +177,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { const windows = await this.windowsService.getWindows(); // Prevent overwriting a workspace that is currently opened in another window - if (windows.some(window => window.workspace && isEqual(URI.file(window.workspace.configPath), path))) { + if (windows.some(window => window.workspace && isEqual(window.workspace.configPath, path))) { const options: MessageBoxOptions = { type: 'info', buttons: [nls.localize('ok', "OK")], @@ -192,7 +192,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { } private async saveWorkspaceAs(workspace: IWorkspaceIdentifier, targetConfigPathURI: URI): Promise { - const configPathURI = URI.file(workspace.configPath); + const configPathURI = workspace.configPath; // Return early if target is same as source if (isEqual(configPathURI, targetConfigPathURI)) { @@ -317,6 +317,6 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { } } - return this.jsonEditingService.write(URI.file(toWorkspace.configPath), { key: 'settings', value: targetWorkspaceConfiguration }, true); + return this.jsonEditingService.write(toWorkspace.configPath, { key: 'settings', value: targetWorkspaceConfiguration }, true); } } diff --git a/src/vs/workbench/test/common/editor/editor.test.ts b/src/vs/workbench/test/common/editor/editor.test.ts index 1e88e3763c0..35cf8cc38b9 100644 --- a/src/vs/workbench/test/common/editor/editor.test.ts +++ b/src/vs/workbench/test/common/editor/editor.test.ts @@ -32,7 +32,7 @@ class FileEditorInput extends EditorInput { return this.resource; } - resolve(): Promise { + resolve(): Promise { return Promise.resolve(null); } } @@ -55,22 +55,22 @@ suite('Workbench editor', () => { test('toResource', () => { const service = accessor.untitledEditorService; - assert.ok(!toResource(null)); + assert.ok(!toResource(null!)); const untitled = service.createOrGet(); - assert.equal(toResource(untitled).toString(), untitled.getResource().toString()); - assert.equal(toResource(untitled, { supportSideBySide: true }).toString(), untitled.getResource().toString()); - assert.equal(toResource(untitled, { filter: Schemas.untitled }).toString(), untitled.getResource().toString()); - assert.equal(toResource(untitled, { filter: [Schemas.file, Schemas.untitled] }).toString(), untitled.getResource().toString()); + assert.equal(toResource(untitled)!.toString(), untitled.getResource().toString()); + assert.equal(toResource(untitled, { supportSideBySide: true })!.toString(), untitled.getResource().toString()); + assert.equal(toResource(untitled, { filter: Schemas.untitled })!.toString(), untitled.getResource().toString()); + assert.equal(toResource(untitled, { filter: [Schemas.file, Schemas.untitled] })!.toString(), untitled.getResource().toString()); assert.ok(!toResource(untitled, { filter: Schemas.file })); const file = new FileEditorInput(URI.file('/some/path.txt')); - assert.equal(toResource(file).toString(), file.getResource().toString()); - assert.equal(toResource(file, { supportSideBySide: true }).toString(), file.getResource().toString()); - assert.equal(toResource(file, { filter: Schemas.file }).toString(), file.getResource().toString()); - assert.equal(toResource(file, { filter: [Schemas.file, Schemas.untitled] }).toString(), file.getResource().toString()); + assert.equal(toResource(file)!.toString(), file.getResource().toString()); + assert.equal(toResource(file, { supportSideBySide: true })!.toString(), file.getResource().toString()); + assert.equal(toResource(file, { filter: Schemas.file })!.toString(), file.getResource().toString()); + assert.equal(toResource(file, { filter: [Schemas.file, Schemas.untitled] })!.toString(), file.getResource().toString()); assert.ok(!toResource(file, { filter: Schemas.untitled })); const diffEditorInput = new DiffEditorInput('name', 'description', untitled, file); @@ -79,8 +79,8 @@ suite('Workbench editor', () => { assert.ok(!toResource(diffEditorInput, { filter: Schemas.file })); assert.ok(!toResource(diffEditorInput, { supportSideBySide: false })); - assert.equal(toResource(file, { supportSideBySide: true }).toString(), file.getResource().toString()); - assert.equal(toResource(file, { supportSideBySide: true, filter: Schemas.file }).toString(), file.getResource().toString()); - assert.equal(toResource(file, { supportSideBySide: true, filter: [Schemas.file, Schemas.untitled] }).toString(), file.getResource().toString()); + assert.equal(toResource(file, { supportSideBySide: true })!.toString(), file.getResource().toString()); + assert.equal(toResource(file, { supportSideBySide: true, filter: Schemas.file })!.toString(), file.getResource().toString()); + assert.equal(toResource(file, { supportSideBySide: true, filter: [Schemas.file, Schemas.untitled] })!.toString(), file.getResource().toString()); }); }); \ No newline at end of file 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 83cbe12ea65..418690b7e06 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostApiCommands.test.ts @@ -27,7 +27,7 @@ import { MainContext, ExtHostContext } from 'vs/workbench/api/node/extHost.proto import { ExtHostDiagnostics } from 'vs/workbench/api/node/extHostDiagnostics'; import * as vscode from 'vscode'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import 'vs/workbench/parts/search/electron-browser/search.contribution'; +import 'vs/workbench/contrib/search/electron-browser/search.contribution'; import { NullLogService } from 'vs/platform/log/common/log'; import { ITextModel } from 'vs/editor/common/model'; import { nullExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; @@ -68,9 +68,8 @@ suite('ExtHostLanguageFeatureCommands', function () { rpcProtocol = new TestRPCProtocol(); instantiationService.stub(IHeapService, { _serviceBrand: undefined, - trackRecursive(args: any) { + trackObject(_obj: any) { // nothing - return args; } }); instantiationService.stub(ICommandService, { @@ -423,32 +422,32 @@ suite('ExtHostLanguageFeatureCommands', function () { assert.equal(values.length, 4); let [first, second, third, fourth] = values; assert.equal(first.label, 'item1'); - assert.equal(first.textEdit.newText, 'item1'); - assert.equal(first.textEdit.range.start.line, 0); - assert.equal(first.textEdit.range.start.character, 0); - assert.equal(first.textEdit.range.end.line, 0); - assert.equal(first.textEdit.range.end.character, 4); + assert.equal(first.textEdit!.newText, 'item1'); + assert.equal(first.textEdit!.range.start.line, 0); + assert.equal(first.textEdit!.range.start.character, 0); + assert.equal(first.textEdit!.range.end.line, 0); + assert.equal(first.textEdit!.range.end.character, 4); assert.equal(second.label, 'item2'); - assert.equal(second.textEdit.newText, 'foo'); - assert.equal(second.textEdit.range.start.line, 0); - assert.equal(second.textEdit.range.start.character, 4); - assert.equal(second.textEdit.range.end.line, 0); - assert.equal(second.textEdit.range.end.character, 8); + assert.equal(second.textEdit!.newText, 'foo'); + assert.equal(second.textEdit!.range.start.line, 0); + assert.equal(second.textEdit!.range.start.character, 4); + assert.equal(second.textEdit!.range.end.line, 0); + assert.equal(second.textEdit!.range.end.character, 8); assert.equal(third.label, 'item3'); - assert.equal(third.textEdit.newText, 'foobar'); - assert.equal(third.textEdit.range.start.line, 0); - assert.equal(third.textEdit.range.start.character, 1); - assert.equal(third.textEdit.range.end.line, 0); - assert.equal(third.textEdit.range.end.character, 6); + assert.equal(third.textEdit!.newText, 'foobar'); + assert.equal(third.textEdit!.range.start.line, 0); + assert.equal(third.textEdit!.range.start.character, 1); + assert.equal(third.textEdit!.range.end.line, 0); + assert.equal(third.textEdit!.range.end.character, 6); assert.equal(fourth.label, 'item4'); assert.equal(fourth.textEdit, undefined); - assert.equal(fourth.range.start.line, 0); - assert.equal(fourth.range.start.character, 1); - assert.equal(fourth.range.end.line, 0); - assert.equal(fourth.range.end.character, 4); + assert.equal(fourth.range!.start.line, 0); + assert.equal(fourth.range!.start.character, 1); + assert.equal(fourth.range!.end.line, 0); + assert.equal(fourth.range!.end.character, 4); assert.ok(fourth.insertText instanceof types.SnippetString); assert.equal((fourth.insertText).value, 'foo$0bar'); }); @@ -631,11 +630,11 @@ suite('ExtHostLanguageFeatureCommands', function () { return rpcProtocol.sync().then(() => { return commands.executeCommand('vscode.executeCodeActionProvider', model.uri, new types.Range(0, 0, 1, 1)).then(value => { assert.equal(value.length, 1); - let [first] = value; + const [first] = value; assert.ok(first.command); - assert.equal(first.command.command, 'command'); - assert.equal(first.command.title, 'command_title'); - assert.equal(first.kind.value, 'foo'); + assert.equal(first.command!.command, 'command'); + assert.equal(first.command!.title, 'command_title'); + assert.equal(first.kind!.value, 'foo'); assert.equal(first.title, 'title'); }); @@ -661,13 +660,13 @@ suite('ExtHostLanguageFeatureCommands', function () { return rpcProtocol.sync().then(() => { return commands.executeCommand('vscode.executeCodeLensProvider', model.uri).then(value => { assert.equal(value.length, 1); - let [first] = value; + const [first] = value; - assert.equal(first.command.title, 'Title'); - assert.equal(first.command.command, 'cmd'); - assert.equal(first.command.arguments[0], 1); - assert.equal(first.command.arguments[1], true); - assert.equal(first.command.arguments[2], complexArg); + assert.equal(first.command!.title, 'Title'); + assert.equal(first.command!.command, 'cmd'); + assert.equal(first.command!.arguments[0], 1); + assert.equal(first.command!.arguments[1], true); + assert.equal(first.command!.arguments[2], complexArg); }); }); }); @@ -719,7 +718,7 @@ suite('ExtHostLanguageFeatureCommands', function () { assert.equal(value.length, 1); let [first] = value; - assert.equal(first.target.toString(), 'foo:bar'); + assert.equal(first.target + '', 'foo:bar'); assert.equal(first.range.start.line, 0); assert.equal(first.range.start.character, 0); assert.equal(first.range.end.line, 0); @@ -765,16 +764,16 @@ suite('ExtHostLanguageFeatureCommands', function () { let [first] = value; assert.equal(first.label, '#ABC'); - assert.equal(first.textEdit.newText, '#ABC'); - assert.equal(first.textEdit.range.start.line, 1); - assert.equal(first.textEdit.range.start.character, 0); - assert.equal(first.textEdit.range.end.line, 1); - assert.equal(first.textEdit.range.end.character, 20); - assert.equal(first.additionalTextEdits.length, 1); - assert.equal(first.additionalTextEdits[0].range.start.line, 2); - assert.equal(first.additionalTextEdits[0].range.start.character, 20); - assert.equal(first.additionalTextEdits[0].range.end.line, 2); - assert.equal(first.additionalTextEdits[0].range.end.character, 20); + assert.equal(first.textEdit!.newText, '#ABC'); + assert.equal(first.textEdit!.range.start.line, 1); + assert.equal(first.textEdit!.range.start.character, 0); + assert.equal(first.textEdit!.range.end.line, 1); + assert.equal(first.textEdit!.range.end.character, 20); + assert.equal(first.additionalTextEdits!.length, 1); + assert.equal(first.additionalTextEdits![0].range.start.line, 2); + assert.equal(first.additionalTextEdits![0].range.start.character, 20); + assert.equal(first.additionalTextEdits![0].range.end.line, 2); + assert.equal(first.additionalTextEdits![0].range.end.character, 20); }); }); }); 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 995f762f4b4..75ebe01221d 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostConfiguration.test.ts @@ -111,38 +111,38 @@ suite('ExtHostConfiguration', function () { }); let testObject = all.getConfiguration(); - let actual = testObject.get('farboo'); + let actual = testObject.get('farboo')!; actual['nested']['config1'] = 41; assert.equal(41, actual['nested']['config1']); actual['farboo1'] = 'newValue'; assert.equal('newValue', actual['farboo1']); testObject = all.getConfiguration(); - actual = testObject.get('farboo'); + actual = testObject.get('farboo')!; assert.equal(actual['nested']['config1'], 42); assert.equal(actual['farboo1'], undefined); testObject = all.getConfiguration(); - actual = testObject.get('farboo'); + actual = testObject.get('farboo')!; assert.equal(actual['config0'], true); actual['config0'] = false; assert.equal(actual['config0'], false); testObject = all.getConfiguration(); - actual = testObject.get('farboo'); + actual = testObject.get('farboo')!; assert.equal(actual['config0'], true); testObject = all.getConfiguration(); - actual = testObject.inspect('farboo'); + actual = testObject.inspect('farboo')!; actual['value'] = 'effectiveValue'; assert.equal('effectiveValue', actual['value']); testObject = all.getConfiguration('workbench'); - actual = testObject.get('colorCustomizations'); + actual = testObject.get('colorCustomizations')!; delete actual['statusBar.foreground']; assert.equal(actual['statusBar.foreground'], undefined); testObject = all.getConfiguration('workbench'); - actual = testObject.get('colorCustomizations'); + actual = testObject.get('colorCustomizations')!; assert.equal(actual['statusBar.foreground'], 'somevalue'); }); @@ -166,7 +166,7 @@ suite('ExtHostConfiguration', function () { } }); - let testObject = all.getConfiguration(); + const testObject = all.getConfiguration(); let actual = testObject.get('farboo'); assert.deepEqual(JSON.stringify({ 'config0': true, @@ -179,7 +179,7 @@ suite('ExtHostConfiguration', function () { assert.deepEqual(undefined, JSON.stringify(testObject.get('unknownkey'))); - actual = testObject.get('farboo'); + actual = testObject.get('farboo')!; actual['config0'] = false; assert.deepEqual(JSON.stringify({ 'config0': false, @@ -190,7 +190,7 @@ suite('ExtHostConfiguration', function () { 'config4': '' }), JSON.stringify(actual)); - actual = testObject.get('workbench')['colorCustomizations']; + actual = testObject.get('workbench')['colorCustomizations']!; actual['statusBar.background'] = 'anothervalue'; assert.deepEqual(JSON.stringify({ 'statusBar.foreground': 'somevalue', @@ -284,13 +284,13 @@ suite('ExtHostConfiguration', function () { } ); - let actual = testObject.getConfiguration().inspect('editor.wordWrap'); + let actual = testObject.getConfiguration().inspect('editor.wordWrap')!; assert.equal(actual.defaultValue, 'off'); assert.equal(actual.globalValue, 'on'); assert.equal(actual.workspaceValue, undefined); assert.equal(actual.workspaceFolderValue, undefined); - actual = testObject.getConfiguration('editor').inspect('wordWrap'); + actual = testObject.getConfiguration('editor').inspect('wordWrap')!; assert.equal(actual.defaultValue, 'off'); assert.equal(actual.globalValue, 'on'); assert.equal(actual.workspaceValue, undefined); @@ -331,25 +331,25 @@ suite('ExtHostConfiguration', function () { } ); - let actual1 = testObject.getConfiguration().inspect('editor.wordWrap'); + let actual1 = testObject.getConfiguration().inspect('editor.wordWrap')!; assert.equal(actual1.defaultValue, 'off'); assert.equal(actual1.globalValue, 'on'); assert.equal(actual1.workspaceValue, 'bounded'); assert.equal(actual1.workspaceFolderValue, undefined); - actual1 = testObject.getConfiguration('editor').inspect('wordWrap'); + actual1 = testObject.getConfiguration('editor').inspect('wordWrap')!; assert.equal(actual1.defaultValue, 'off'); assert.equal(actual1.globalValue, 'on'); assert.equal(actual1.workspaceValue, 'bounded'); assert.equal(actual1.workspaceFolderValue, undefined); - let actual2 = testObject.getConfiguration(null, workspaceUri).inspect('editor.wordWrap'); + let actual2 = testObject.getConfiguration(undefined, workspaceUri).inspect('editor.wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.equal(actual2.workspaceFolderValue, 'bounded'); - actual2 = testObject.getConfiguration('editor', workspaceUri).inspect('wordWrap'); + actual2 = testObject.getConfiguration('editor', workspaceUri).inspect('wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); @@ -406,62 +406,62 @@ suite('ExtHostConfiguration', function () { } ); - let actual1 = testObject.getConfiguration().inspect('editor.wordWrap'); + let actual1 = testObject.getConfiguration().inspect('editor.wordWrap')!; assert.equal(actual1.defaultValue, 'off'); assert.equal(actual1.globalValue, 'on'); assert.equal(actual1.workspaceValue, 'bounded'); assert.equal(actual1.workspaceFolderValue, undefined); - actual1 = testObject.getConfiguration('editor').inspect('wordWrap'); + actual1 = testObject.getConfiguration('editor').inspect('wordWrap')!; assert.equal(actual1.defaultValue, 'off'); assert.equal(actual1.globalValue, 'on'); assert.equal(actual1.workspaceValue, 'bounded'); assert.equal(actual1.workspaceFolderValue, undefined); - actual1 = testObject.getConfiguration('editor').inspect('lineNumbers'); + actual1 = testObject.getConfiguration('editor').inspect('lineNumbers')!; assert.equal(actual1.defaultValue, 'on'); assert.equal(actual1.globalValue, undefined); assert.equal(actual1.workspaceValue, undefined); assert.equal(actual1.workspaceFolderValue, undefined); - let actual2 = testObject.getConfiguration(null, firstRoot).inspect('editor.wordWrap'); + let actual2 = testObject.getConfiguration(undefined, firstRoot).inspect('editor.wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.equal(actual2.workspaceFolderValue, 'off'); - actual2 = testObject.getConfiguration('editor', firstRoot).inspect('wordWrap'); + actual2 = testObject.getConfiguration('editor', firstRoot).inspect('wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.equal(actual2.workspaceFolderValue, 'off'); - actual2 = testObject.getConfiguration('editor', firstRoot).inspect('lineNumbers'); + actual2 = testObject.getConfiguration('editor', firstRoot).inspect('lineNumbers')!; assert.equal(actual2.defaultValue, 'on'); assert.equal(actual2.globalValue, undefined); assert.equal(actual2.workspaceValue, undefined); assert.equal(actual2.workspaceFolderValue, 'relative'); - actual2 = testObject.getConfiguration(null, secondRoot).inspect('editor.wordWrap'); + actual2 = testObject.getConfiguration(undefined, secondRoot).inspect('editor.wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.equal(actual2.workspaceFolderValue, 'on'); - actual2 = testObject.getConfiguration('editor', secondRoot).inspect('wordWrap'); + actual2 = testObject.getConfiguration('editor', secondRoot).inspect('wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.equal(actual2.workspaceFolderValue, 'on'); - actual2 = testObject.getConfiguration(null, thirdRoot).inspect('editor.wordWrap'); + actual2 = testObject.getConfiguration(undefined, thirdRoot).inspect('editor.wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); assert.ok(Object.keys(actual2).indexOf('workspaceFolderValue') !== -1); assert.equal(actual2.workspaceFolderValue, undefined); - actual2 = testObject.getConfiguration('editor', thirdRoot).inspect('wordWrap'); + actual2 = testObject.getConfiguration('editor', thirdRoot).inspect('wordWrap')!; assert.equal(actual2.defaultValue, 'off'); assert.equal(actual2.globalValue, 'on'); assert.equal(actual2.workspaceValue, 'bounded'); 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 18053e12bf7..c2fc1dc68eb 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostLanguageFeatures.test.ts @@ -29,7 +29,7 @@ import { getHover } from 'vs/editor/contrib/hover/getHover'; import { getOccurrencesAtPosition } from 'vs/editor/contrib/wordHighlighter/wordHighlighter'; import { provideReferences } from 'vs/editor/contrib/referenceSearch/referenceSearch'; import { getCodeActions } from 'vs/editor/contrib/codeAction/codeAction'; -import { getWorkspaceSymbols } from 'vs/workbench/parts/search/common/search'; +import { getWorkspaceSymbols } from 'vs/workbench/contrib/search/common/search'; import { rename } from 'vs/editor/contrib/rename/rename'; import { provideSignatureHelp } from 'vs/editor/contrib/parameterHints/provideSignatureHelp'; import { provideSuggestionItems } from 'vs/editor/contrib/suggest/suggest'; @@ -77,9 +77,8 @@ suite('ExtHostLanguageFeatures', function () { instantiationService.stub(IMarkerService, MarkerService); instantiationService.stub(IHeapService, { _serviceBrand: undefined, - trackRecursive(args: any) { + trackObject(_obj: any) { // nothing - return args; } }); inst = instantiationService; @@ -499,9 +498,9 @@ suite('ExtHostLanguageFeatures', function () { })); await rpcProtocol.sync(); - let value = await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None); + const value = (await getOccurrencesAtPosition(model, new EditorPosition(1, 2), CancellationToken.None))!; assert.equal(value.length, 1); - let [entry] = value; + const [entry] = value; assert.deepEqual(entry.range, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 3 }); assert.equal(entry.kind, modes.DocumentHighlightKind.Text); }); diff --git a/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts b/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts index 4bd240bee45..9e5f7c57d9e 100644 --- a/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts +++ b/src/vs/workbench/test/electron-browser/api/testRPCProtocol.ts @@ -10,23 +10,23 @@ import { isThenable } from 'vs/base/common/async'; export function SingleProxyRPCProtocol(thing: any): IExtHostContext { return { - remoteAuthority: null, + remoteAuthority: null!, getProxy(): T { return thing; }, set(identifier: ProxyIdentifier, value: R): R { return value; }, - assertRegistered: undefined + assertRegistered: undefined! }; } export class TestRPCProtocol implements IExtHostContext { - public remoteAuthority = null; + public remoteAuthority = null!; private _callCountValue: number = 0; - private _idle: Promise; + private _idle?: Promise; private _completeIdle: Function; private readonly _locals: { [id: string]: any; }; diff --git a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts index 2102637ea09..11a15cc0c13 100644 --- a/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/quickopen.perf.integrationTest.ts @@ -23,9 +23,9 @@ import { ITelemetryInfo, ITelemetryService } from 'vs/platform/telemetry/common/ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { Extensions, IQuickOpenRegistry } from 'vs/workbench/browser/quickopen'; -import 'vs/workbench/parts/search/electron-browser/search.contribution'; // load contributions +import 'vs/workbench/contrib/search/electron-browser/search.contribution'; // load contributions import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { SearchService } from 'vs/workbench/services/search/node/searchService'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; import { TestContextService, TestEditorGroupsService, TestEditorService, TestEnvironmentService, TestTextResourcePropertiesService } from 'vs/workbench/test/workbenchTestServices'; diff --git a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts index 31cc900cda4..ba26107a57f 100644 --- a/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts +++ b/src/vs/workbench/test/electron-browser/textsearch.perf.integrationTest.ts @@ -3,12 +3,12 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/workbench/parts/search/electron-browser/search.contribution'; // load contributions +import 'vs/workbench/contrib/search/electron-browser/search.contribution'; // load contributions import * as assert from 'assert'; import * as fs from 'fs'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { createSyncDescriptor } from 'vs/platform/instantiation/common/descriptors'; -import { IEditorGroupsService } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { ISearchService } from 'vs/platform/search/common/search'; import { ITelemetryService, ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { IUntitledEditorService, UntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService'; @@ -26,8 +26,8 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ModelServiceImpl } from 'vs/editor/common/services/modelServiceImpl'; import { IModelService } from 'vs/editor/common/services/modelService'; -import { SearchModel } from 'vs/workbench/parts/search/common/searchModel'; -import { QueryBuilder, ITextQueryBuilderOptions } from 'vs/workbench/parts/search/common/queryBuilder'; +import { SearchModel } from 'vs/workbench/contrib/search/common/searchModel'; +import { QueryBuilder, ITextQueryBuilderOptions } from 'vs/workbench/contrib/search/common/queryBuilder'; import { Event, Emitter } from 'vs/base/common/event'; import { testWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index f902c08b46c..8e51ba0bc7f 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import 'vs/workbench/parts/files/electron-browser/files.contribution'; // load our contribution into the test -import { FileEditorInput } from 'vs/workbench/parts/files/common/editors/fileEditorInput'; +import 'vs/workbench/contrib/files/electron-browser/files.contribution'; // load our contribution into the test +import { FileEditorInput } from 'vs/workbench/contrib/files/common/editors/fileEditorInput'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import * as paths from 'vs/base/common/paths'; import * as resources from 'vs/base/common/resources'; @@ -37,7 +37,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor, ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, MenuBarVisibility } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IWindowConfiguration, MenuBarVisibility, IURIToOpen } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { createTextBufferFactory } from 'vs/editor/common/model/textModel'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -57,12 +57,11 @@ import { Range } from 'vs/editor/common/core/range'; import { IConfirmation, IConfirmationResult, IDialogService, IDialogOptions, IPickAndOpenOptions, ISaveDialogOptions, IOpenDialogOptions, IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { TestNotificationService } from 'vs/platform/notification/test/common/testNotificationService'; -import { IExtensionService, ProfileSession, IExtensionsStatus, ExtensionPointContribution, IExtensionDescription, IWillActivateEvent, IResponsiveStateChangeEvent } from '../services/extensions/common/extensions'; -import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { IExtensionService, NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding'; import { IDecorationsService, IResourceDecorationChangeEvent, IDecoration, IDecorationData, IDecorationsProvider } from 'vs/workbench/services/decorations/browser/decorations'; import { IDisposable, toDisposable, Disposable } from 'vs/base/common/lifecycle'; -import { IEditorGroupsService, IEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement, IGroupChangeEvent, EditorsOrder, IFindGroupScope, EditorGroupLayout } from 'vs/workbench/services/group/common/editorGroupsService'; +import { IEditorGroupsService, IEditorGroup, GroupsOrder, GroupsArrangement, GroupDirection, IAddGroupOptions, IMergeGroupOptions, IMoveEditorOptions, ICopyEditorOptions, IEditorReplacement, IGroupChangeEvent, EditorsOrder, IFindGroupScope, EditorGroupLayout } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IEditorService, IOpenEditorOverrideHandler } from 'vs/workbench/services/editor/common/editorService'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser'; @@ -78,7 +77,6 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { IProgressService } from 'vs/platform/progress/common/progress'; import { IStorageService, InMemoryStorageService } from 'vs/platform/storage/common/storage'; import { isLinux, isMacintosh } from 'vs/base/common/platform'; -import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { LabelService } from 'vs/workbench/services/label/common/labelService'; export function createFileInput(instantiationService: IInstantiationService, resource: URI): FileEditorInput { @@ -140,7 +138,7 @@ export class TestContextService implements IWorkspaceContextService { return this.workspace; } - public getWorkspaceFolder(resource: URI): IWorkspaceFolder { + public getWorkspaceFolder(resource: URI): IWorkspaceFolder | null { return this.workspace.getFolder(resource); } @@ -178,7 +176,7 @@ export class TestTextFileService extends TextFileService { private promptPath: URI; private confirmResult: ConfirmResult; - private resolveTextContentError: FileOperationError; + private resolveTextContentError: FileOperationError | null; constructor( @ILifecycleService lifecycleService: ILifecycleService, @@ -307,31 +305,10 @@ export class TestDecorationsService implements IDecorationsService { _serviceBrand: any; onDidChangeDecorations: Event = Event.None; registerDecorationsProvider(_provider: IDecorationsProvider): IDisposable { return Disposable.None; } - getDecoration(_uri: URI, _includeChildren: boolean, _overwrite?: IDecorationData): IDecoration { return undefined; } + getDecoration(_uri: URI, _includeChildren: boolean, _overwrite?: IDecorationData): IDecoration | undefined { return undefined; } } -export class TestExtensionService implements IExtensionService { - _serviceBrand: any; - onDidRegisterExtensions: Event = Event.None; - onDidChangeExtensionsStatus: Event = Event.None; - onDidChangeExtensions: Event = Event.None; - onWillActivateByEvent: Event = Event.None; - onDidChangeResponsiveChange: Event = Event.None; - activateByEvent(_activationEvent: string): Promise { return Promise.resolve(undefined); } - whenInstalledExtensionsRegistered(): Promise { return Promise.resolve(true); } - getExtensions(): Promise { return Promise.resolve([]); } - getExtension() { return Promise.resolve(undefined); } - readExtensionPointContributions(_extPoint: IExtensionPoint): Promise[]> { return Promise.resolve(Object.create(null)); } - getExtensionsStatus(): { [id: string]: IExtensionsStatus; } { return Object.create(null); } - canProfileExtensionHost(): boolean { return false; } - getInspectPort(): number { return 0; } - startExtensionHostProfile(): Promise { return Promise.resolve(Object.create(null)); } - restartExtensionHost(): void { } - startExtensionHost(): void { } - stopExtensionHost(): void { } - canAddExtension(): boolean { return false; } - canRemoveExtension(): boolean { return false; } -} +export class TestExtensionService extends NullExtensionService { } export class TestMenuService implements IMenuService { @@ -378,11 +355,11 @@ export class TestHistoryService implements IHistoryService { return []; } - public getLastActiveWorkspaceRoot(_schemeFilter: string): URI { + public getLastActiveWorkspaceRoot(_schemeFilter: string): URI | undefined { return this.root; } - public getLastActiveFile(_schemeFilter: string): URI { + public getLastActiveFile(_schemeFilter: string): URI | undefined { return undefined; } @@ -407,13 +384,13 @@ export class TestFileDialogService implements IFileDialogService { public _serviceBrand: any; - public defaultFilePath(_schemeFilter: string): URI { + public defaultFilePath(_schemeFilter: string): URI | undefined { return undefined; } - public defaultFolderPath(_schemeFilter: string): URI { + public defaultFolderPath(_schemeFilter: string): URI | undefined { return undefined; } - public defaultWorkspacePath(_schemeFilter: string): URI { + public defaultWorkspacePath(_schemeFilter: string): URI | undefined { return undefined; } public pickFileFolderAndOpen(_options: IPickAndOpenOptions): Promise { @@ -428,11 +405,11 @@ export class TestFileDialogService implements IFileDialogService { public pickWorkspaceAndOpen(_options: IPickAndOpenOptions): Promise { return Promise.resolve(0); } - public showSaveDialog(_options: ISaveDialogOptions): Promise { - return Promise.resolve(); + public showSaveDialog(_options: ISaveDialogOptions): Promise { + return Promise.resolve(undefined); } - public showOpenDialog(_options: IOpenDialogOptions): Promise { - return Promise.resolve(); + public showOpenDialog(_options: IOpenDialogOptions): Promise { + return Promise.resolve(undefined); } } @@ -468,7 +445,7 @@ export class TestPartService implements IPartService { return true; } - public getContainer(_part: Parts): HTMLElement { + public getContainer(_part: Parts): HTMLElement | null { return null; } @@ -494,15 +471,15 @@ export class TestPartService implements IPartService { return false; } - public setEditorHidden(_hidden: boolean): Promise { return Promise.resolve(null); } + public setEditorHidden(_hidden: boolean): Promise { return Promise.resolve(); } - public setSideBarHidden(_hidden: boolean): Promise { return Promise.resolve(null); } + public setSideBarHidden(_hidden: boolean): Promise { return Promise.resolve(); } public isPanelHidden(): boolean { return false; } - public setPanelHidden(_hidden: boolean): Promise { return Promise.resolve(null); } + public setPanelHidden(_hidden: boolean): Promise { return Promise.resolve(); } public toggleMaximizedPanel(): void { } @@ -511,7 +488,7 @@ export class TestPartService implements IPartService { } public getMenubarVisibility(): MenuBarVisibility { - return null; + throw new Error('not implemented'); } public getSideBarPosition() { @@ -523,12 +500,12 @@ export class TestPartService implements IPartService { } public setPanelPosition(_position: PartPosition): Promise { - return Promise.resolve(null); + return Promise.resolve(); } public addClass(_clazz: string): void { } public removeClass(_clazz: string): void { } - public getWorkbenchElement(): HTMLElement { return undefined; } + public getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); } public toggleZenMode(): void { } @@ -573,7 +550,7 @@ export class TestEditorGroupsService implements EditorGroupsServiceImpl { } } - return undefined; + return undefined!; } getLabel(_identifier: number): string { @@ -581,11 +558,11 @@ export class TestEditorGroupsService implements EditorGroupsServiceImpl { } findGroup(_scope: IFindGroupScope, _source?: number | IEditorGroup, _wrap?: boolean): IEditorGroup { - return null; + throw new Error('not implemented'); } activateGroup(_group: number | IEditorGroup): IEditorGroup { - return null; + throw new Error('not implemented'); } getSize(_group: number | IEditorGroup): number { @@ -601,21 +578,21 @@ export class TestEditorGroupsService implements EditorGroupsServiceImpl { setGroupOrientation(_orientation: any): void { } addGroup(_location: number | IEditorGroup, _direction: GroupDirection, _options?: IAddGroupOptions): IEditorGroup { - return null; + throw new Error('not implemented'); } removeGroup(_group: number | IEditorGroup): void { } moveGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup { - return null; + throw new Error('not implemented'); } mergeGroup(_group: number | IEditorGroup, _target: number | IEditorGroup, _options?: IMergeGroupOptions): IEditorGroup { - return null; + throw new Error('not implemented'); } copyGroup(_group: number | IEditorGroup, _location: number | IEditorGroup, _direction: GroupDirection): IEditorGroup { - return null; + throw new Error('not implemented'); } } @@ -623,7 +600,7 @@ export class TestEditorGroup implements IEditorGroupView { constructor(public id: number) { } - group: EditorGroup = undefined; + get group(): EditorGroup { throw new Error('not implemented'); } activeControl: IEditor; activeEditor: IEditorInput; previewEditor: IEditorInput; @@ -652,7 +629,7 @@ export class TestEditorGroup implements IEditorGroupView { } getEditor(_index: number): IEditorInput { - return null; + throw new Error('not implemented'); } getIndexOfEditor(_editor: IEditorInput): number { @@ -660,11 +637,11 @@ export class TestEditorGroup implements IEditorGroupView { } openEditor(_editor: IEditorInput, _options?: IEditorOptions): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } openEditors(_editors: IEditorInputWithOptions[]): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } isOpened(_editor: IEditorInput): boolean { @@ -704,7 +681,7 @@ export class TestEditorGroup implements IEditorGroupView { focus(): void { } invokeWithinContext(fn: (accessor: ServicesAccessor) => T): T { - return fn(null); + throw new Error('not implemented'); } isEmpty(): boolean { return true; } @@ -737,12 +714,12 @@ export class TestEditorService implements EditorServiceImpl { return toDisposable(() => undefined); } - openEditor(_editor: any, _options?: any, _group?: any) { - return Promise.resolve(null); + openEditor(_editor: any, _options?: any, _group?: any): Promise { + throw new Error('not implemented'); } - openEditors(_editors: any, _group?: any) { - return Promise.resolve(null); + openEditors(_editors: any, _group?: any): Promise { + throw new Error('not implemented'); } isOpen(_editor: IEditorInput | IResourceInput | IUntitledResourceInput): boolean { @@ -750,7 +727,7 @@ export class TestEditorService implements EditorServiceImpl { } getOpened(_editor: IEditorInput | IResourceInput | IUntitledResourceInput): IEditorInput { - return undefined; + throw new Error('not implemented'); } replaceEditors(_editors: any, _group: any) { @@ -758,11 +735,11 @@ export class TestEditorService implements EditorServiceImpl { } invokeWithinEditorContext(fn: (accessor: ServicesAccessor) => T): T { - return fn(null); + throw new Error('not implemented'); } createInput(_input: IResourceInput | IUntitledResourceInput | IResourceDiffInput | IResourceSideBySideInput): IEditorInput { - return null; + throw new Error('not implemented'); } } @@ -822,7 +799,7 @@ export class TestFileService implements IFileService { } existsFile(_resource: URI): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } resolveContent(resource: URI, _options?: IResolveContentOptions): Promise { @@ -868,15 +845,15 @@ export class TestFileService implements IFileService { } moveFile(_source: URI, _target: URI, _overwrite?: boolean): Promise { - return Promise.resolve(null); + return Promise.resolve(null!); } copyFile(_source: URI, _target: URI, _overwrite?: boolean): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } createFile(_resource: URI, _content?: string, _options?: ICreateFileOptions): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } readFolder(_resource: URI) { @@ -884,7 +861,7 @@ export class TestFileService implements IFileService { } createFolder(_resource: URI): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } onDidChangeFileSystemProviderRegistrations = Event.None; @@ -893,8 +870,8 @@ export class TestFileService implements IFileService { return { dispose() { } }; } - activateProvider(_scheme: string) { - return Promise.resolve(null); + activateProvider(_scheme: string): Promise { + throw new Error('not implemented'); } canHandleResource(resource: URI): boolean { @@ -902,7 +879,7 @@ export class TestFileService implements IFileService { } del(_resource: URI, _options?: { useTrash?: boolean, recursive?: boolean }): Promise { - return Promise.resolve(null); + return Promise.resolve(); } watchFileChanges(_resource: URI): void { @@ -930,7 +907,7 @@ export class TestBackupFileService implements IBackupFileService { return Promise.resolve(false); } - public loadBackupResource(resource: URI): Promise { + public loadBackupResource(resource: URI): Promise { return this.hasBackup(resource).then(hasBackup => { if (hasBackup) { return this.toBackupResource(resource); @@ -949,7 +926,7 @@ export class TestBackupFileService implements IBackupFileService { } public toBackupResource(_resource: URI): URI { - return null; + throw new Error('not implemented'); } public backupResource(_resource: URI, _content: ITextSnapshot): Promise { @@ -968,7 +945,7 @@ export class TestBackupFileService implements IBackupFileService { } public resolveBackupContent(_backup: URI): Promise { - return Promise.resolve(null); + throw new Error('not implemented'); } public discardResourceBackup(_resource: URI): Promise { @@ -995,14 +972,14 @@ export class TestCodeEditorService implements ICodeEditorService { addDiffEditor(_editor: IDiffEditor): void { } removeDiffEditor(_editor: IDiffEditor): void { } listDiffEditors(): IDiffEditor[] { return []; } - getFocusedCodeEditor(): ICodeEditor { return null; } + getFocusedCodeEditor(): ICodeEditor | null { return null; } registerDecorationType(_key: string, _options: IDecorationRenderOptions, _parentTypeKey?: string): void { } removeDecorationType(_key: string): void { } resolveDecorationOptions(_typeKey: string, _writable: boolean): IModelDecorationOptions { return Object.create(null); } setTransientModelProperty(_model: ITextModel, _key: string, _value: any): void { } getTransientModelProperty(_model: ITextModel, _key: string) { } - getActiveCodeEditor(): ICodeEditor { return null; } - openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise { return Promise.resolve(); } + getActiveCodeEditor(): ICodeEditor | null { return null; } + openCodeEditor(_input: IResourceInput, _source: ICodeEditor, _sideBySide?: boolean): Promise { return Promise.resolve(null); } } export class TestWindowService implements IWindowService { @@ -1062,8 +1039,8 @@ export class TestWindowService implements IWindowService { return Promise.resolve(); } - enterWorkspace(_path: URI): Promise { - return Promise.resolve(); + enterWorkspace(_path: URI): Promise { + return Promise.resolve(undefined); } toggleFullScreen(): Promise { @@ -1075,7 +1052,10 @@ export class TestWindowService implements IWindowService { } getRecentlyOpened(): Promise { - return Promise.resolve(); + return Promise.resolve({ + workspaces: [], + files: [] + }); } focusWindow(): Promise { @@ -1094,7 +1074,7 @@ export class TestWindowService implements IWindowService { return Promise.resolve(); } - openWindow(_paths: URI[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { return Promise.resolve(); } @@ -1119,11 +1099,11 @@ export class TestWindowService implements IWindowService { } showSaveDialog(_options: Electron.SaveDialogOptions): Promise { - return Promise.resolve(undefined); + throw new Error('not implemented'); } showOpenDialog(_options: Electron.OpenDialogOptions): Promise { - return Promise.resolve(undefined); + throw new Error('not implemented'); } updateTouchBar(_items: ISerializableCommandAction[][]): Promise { @@ -1223,8 +1203,8 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } - enterWorkspace(_windowId: number, _path: URI): Promise { - return Promise.resolve(); + enterWorkspace(_windowId: number, _path: URI): Promise { + return Promise.resolve(undefined); } toggleFullScreen(_windowId: number): Promise { @@ -1248,7 +1228,10 @@ export class TestWindowsService implements IWindowsService { } getRecentlyOpened(_windowId: number): Promise { - return Promise.resolve(); + return Promise.resolve({ + workspaces: [], + files: [] + }); } focusWindow(_windowId: number): Promise { @@ -1260,7 +1243,7 @@ export class TestWindowsService implements IWindowsService { } isMaximized(_windowId: number): Promise { - return Promise.resolve(); + return Promise.resolve(false); } maximizeWindow(_windowId: number): Promise { @@ -1300,7 +1283,7 @@ export class TestWindowsService implements IWindowsService { } // Global methods - openWindow(_windowId: number, _paths: URI[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { + openWindow(_windowId: number, _uris: IURIToOpen[], _options?: { forceNewWindow?: boolean, forceReuseWindow?: boolean, forceOpenWorkspaceAsFile?: boolean }): Promise { return Promise.resolve(); } @@ -1313,7 +1296,7 @@ export class TestWindowsService implements IWindowsService { } getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { - return Promise.resolve(); + throw new Error('not implemented'); } getWindowCount(): Promise { @@ -1372,15 +1355,15 @@ export class TestWindowsService implements IWindowsService { } showMessageBox(_windowId: number, _options: Electron.MessageBoxOptions): Promise { - return Promise.resolve(); + throw new Error('not implemented'); } showSaveDialog(_windowId: number, _options: Electron.SaveDialogOptions): Promise { - return Promise.resolve(); + throw new Error('not implemented'); } showOpenDialog(_windowId: number, _options: Electron.OpenDialogOptions): Promise { - return Promise.resolve(); + throw new Error('not implemented'); } openAboutDialog(): Promise { @@ -1404,8 +1387,8 @@ export class TestTextResourceConfigurationService implements ITextResourceConfig } getValue(resource: URI, arg2?: any, arg3?: any): T { - const position: IPosition = EditorPosition.isIPosition(arg2) ? arg2 : null; - const section: string = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined); + const position: IPosition | null = EditorPosition.isIPosition(arg2) ? arg2 : null; + const section: string | undefined = position ? (typeof arg3 === 'string' ? arg3 : undefined) : (typeof arg2 === 'string' ? arg2 : undefined); return this.configurationService.getValue(section, { resource }); } } @@ -1448,19 +1431,19 @@ export class TestViewletService implements IViewletService { onDidViewletOpen: Event = new Emitter().event; onDidViewletClose: Event = new Emitter().event; - openViewlet(_id: string, _focus?: boolean): Promise { return null; } + openViewlet(_id: string, _focus?: boolean): Promise { return Promise.resolve(null); } - getActiveViewlet(): IViewlet { return null; } + getActiveViewlet(): IViewlet | null { return null; } - getDefaultViewletId(): string { return null; } + getDefaultViewletId(): string { return ''; } - getViewlet(_id: string): ViewletDescriptor { return null; } + getViewlet(_id: string): ViewletDescriptor | undefined { return undefined; } - getAllViewlets(): ViewletDescriptor[] { return null; } + getAllViewlets(): ViewletDescriptor[] { return []; } - getViewlets(): ViewletDescriptor[] { return null; } + getViewlets(): ViewletDescriptor[] { return []; } - getProgressIndicator(_id: string): IProgressService { return null; } + getProgressIndicator(_id: string): IProgressService | null { return null; } } diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index 1ad274696dc..307396fcf64 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -44,135 +44,135 @@ import 'vs/workbench/services/bulkEdit/electron-browser/bulkEditService'; //#endregion -//#region --- workbench parts +//#region --- workbench contributions // Localizations -import 'vs/workbench/parts/localizations/electron-browser/localizations.contribution'; +import 'vs/workbench/contrib/localizations/electron-browser/localizations.contribution'; // Preferences -import 'vs/workbench/parts/preferences/electron-browser/preferences.contribution'; -import 'vs/workbench/parts/preferences/browser/keybindingsEditorContribution'; +import 'vs/workbench/contrib/preferences/electron-browser/preferences.contribution'; +import 'vs/workbench/contrib/preferences/browser/keybindingsEditorContribution'; // Logs -import 'vs/workbench/parts/logs/electron-browser/logs.contribution'; +import 'vs/workbench/contrib/logs/electron-browser/logs.contribution'; // Quick Open Handlers -import 'vs/workbench/parts/quickopen/browser/quickopen.contribution'; +import 'vs/workbench/contrib/quickopen/browser/quickopen.contribution'; // Explorer -import 'vs/workbench/parts/files/electron-browser/explorerViewlet'; -import 'vs/workbench/parts/files/electron-browser/fileActions.contribution'; -import 'vs/workbench/parts/files/electron-browser/files.contribution'; +import 'vs/workbench/contrib/files/electron-browser/explorerViewlet'; +import 'vs/workbench/contrib/files/electron-browser/fileActions.contribution'; +import 'vs/workbench/contrib/files/electron-browser/files.contribution'; // Backup -import 'vs/workbench/parts/backup/common/backup.contribution'; +import 'vs/workbench/contrib/backup/common/backup.contribution'; // Stats -import 'vs/workbench/parts/stats/node/stats.contribution'; +import 'vs/workbench/contrib/stats/node/stats.contribution'; // Rapid Render Splash -import 'vs/workbench/parts/splash/electron-browser/partsSplash.contribution'; +import 'vs/workbench/contrib/splash/electron-browser/partsSplash.contribution'; // Search -import 'vs/workbench/parts/search/electron-browser/search.contribution'; -import 'vs/workbench/parts/search/browser/searchView'; -import 'vs/workbench/parts/search/browser/openAnythingHandler'; +import 'vs/workbench/contrib/search/electron-browser/search.contribution'; +import 'vs/workbench/contrib/search/browser/searchView'; +import 'vs/workbench/contrib/search/browser/openAnythingHandler'; // SCM -import 'vs/workbench/parts/scm/electron-browser/scm.contribution'; -import 'vs/workbench/parts/scm/electron-browser/scmViewlet'; +import 'vs/workbench/contrib/scm/electron-browser/scm.contribution'; +import 'vs/workbench/contrib/scm/electron-browser/scmViewlet'; // Debug -import 'vs/workbench/parts/debug/electron-browser/debug.contribution'; -import 'vs/workbench/parts/debug/browser/debugQuickOpen'; -import 'vs/workbench/parts/debug/electron-browser/repl'; -import 'vs/workbench/parts/debug/browser/debugViewlet'; +import 'vs/workbench/contrib/debug/electron-browser/debug.contribution'; +import 'vs/workbench/contrib/debug/browser/debugQuickOpen'; +import 'vs/workbench/contrib/debug/electron-browser/repl'; +import 'vs/workbench/contrib/debug/browser/debugViewlet'; // Markers -import 'vs/workbench/parts/markers/electron-browser/markers.contribution'; +import 'vs/workbench/contrib/markers/electron-browser/markers.contribution'; // Comments -import 'vs/workbench/parts/comments/electron-browser/comments.contribution'; +import 'vs/workbench/contrib/comments/electron-browser/comments.contribution'; // HTML Preview -import 'vs/workbench/parts/html/electron-browser/html.contribution'; +import 'vs/workbench/contrib/html/electron-browser/html.contribution'; // URL Support -import 'vs/workbench/parts/url/electron-browser/url.contribution'; +import 'vs/workbench/contrib/url/electron-browser/url.contribution'; // Webview -import 'vs/workbench/parts/webview/electron-browser/webview.contribution'; +import 'vs/workbench/contrib/webview/electron-browser/webview.contribution'; // Extensions Management -import 'vs/workbench/parts/extensions/electron-browser/extensions.contribution'; -import 'vs/workbench/parts/extensions/browser/extensionsQuickOpen'; -import 'vs/workbench/parts/extensions/electron-browser/extensionsViewlet'; +import 'vs/workbench/contrib/extensions/electron-browser/extensions.contribution'; +import 'vs/workbench/contrib/extensions/browser/extensionsQuickOpen'; +import 'vs/workbench/contrib/extensions/electron-browser/extensionsViewlet'; // Output Panel -import 'vs/workbench/parts/output/electron-browser/output.contribution'; -import 'vs/workbench/parts/output/browser/outputPanel'; +import 'vs/workbench/contrib/output/electron-browser/output.contribution'; +import 'vs/workbench/contrib/output/browser/outputPanel'; // Terminal -import 'vs/workbench/parts/terminal/electron-browser/terminal.contribution'; -import 'vs/workbench/parts/terminal/browser/terminalQuickOpen'; -import 'vs/workbench/parts/terminal/electron-browser/terminalPanel'; +import 'vs/workbench/contrib/terminal/electron-browser/terminal.contribution'; +import 'vs/workbench/contrib/terminal/browser/terminalQuickOpen'; +import 'vs/workbench/contrib/terminal/electron-browser/terminalPanel'; // Relauncher -import 'vs/workbench/parts/relauncher/electron-browser/relauncher.contribution'; +import 'vs/workbench/contrib/relauncher/electron-browser/relauncher.contribution'; // Tasks -import 'vs/workbench/parts/tasks/electron-browser/task.contribution'; +import 'vs/workbench/contrib/tasks/electron-browser/task.contribution'; // Emmet -import 'vs/workbench/parts/emmet/browser/emmet.browser.contribution'; -import 'vs/workbench/parts/emmet/electron-browser/emmet.contribution'; +import 'vs/workbench/contrib/emmet/browser/emmet.browser.contribution'; +import 'vs/workbench/contrib/emmet/electron-browser/emmet.contribution'; // CodeEditor Contributions -import 'vs/workbench/parts/codeEditor/electron-browser/codeEditor.contribution'; +import 'vs/workbench/contrib/codeEditor/electron-browser/codeEditor.contribution'; // Execution -import 'vs/workbench/parts/execution/electron-browser/execution.contribution'; +import 'vs/workbench/contrib/execution/electron-browser/execution.contribution'; // Snippets -import 'vs/workbench/parts/snippets/electron-browser/snippets.contribution'; -import 'vs/workbench/parts/snippets/electron-browser/snippetsService'; -import 'vs/workbench/parts/snippets/electron-browser/insertSnippet'; -import 'vs/workbench/parts/snippets/electron-browser/configureSnippets'; -import 'vs/workbench/parts/snippets/electron-browser/tabCompletion'; +import 'vs/workbench/contrib/snippets/electron-browser/snippets.contribution'; +import 'vs/workbench/contrib/snippets/electron-browser/snippetsService'; +import 'vs/workbench/contrib/snippets/electron-browser/insertSnippet'; +import 'vs/workbench/contrib/snippets/electron-browser/configureSnippets'; +import 'vs/workbench/contrib/snippets/electron-browser/tabCompletion'; // Send a Smile -import 'vs/workbench/parts/feedback/electron-browser/feedback.contribution'; +import 'vs/workbench/contrib/feedback/electron-browser/feedback.contribution'; // Update -import 'vs/workbench/parts/update/electron-browser/update.contribution'; +import 'vs/workbench/contrib/update/electron-browser/update.contribution'; // Surveys -import 'vs/workbench/parts/surveys/electron-browser/nps.contribution'; -import 'vs/workbench/parts/surveys/electron-browser/languageSurveys.contribution'; +import 'vs/workbench/contrib/surveys/electron-browser/nps.contribution'; +import 'vs/workbench/contrib/surveys/electron-browser/languageSurveys.contribution'; // Performance -import 'vs/workbench/parts/performance/electron-browser/performance.contribution'; +import 'vs/workbench/contrib/performance/electron-browser/performance.contribution'; // CLI -import 'vs/workbench/parts/cli/electron-browser/cli.contribution'; +import 'vs/workbench/contrib/cli/electron-browser/cli.contribution'; // Themes Support -import 'vs/workbench/parts/themes/electron-browser/themes.contribution'; -import 'vs/workbench/parts/themes/test/electron-browser/themes.test.contribution'; +import 'vs/workbench/contrib/themes/electron-browser/themes.contribution'; +import 'vs/workbench/contrib/themes/test/electron-browser/themes.test.contribution'; // Watermark -import 'vs/workbench/parts/watermark/electron-browser/watermark'; +import 'vs/workbench/contrib/watermark/electron-browser/watermark'; // Welcome -import 'vs/workbench/parts/welcome/walkThrough/electron-browser/walkThrough.contribution'; -import 'vs/workbench/parts/welcome/gettingStarted/electron-browser/gettingStarted.contribution'; -import 'vs/workbench/parts/welcome/overlay/browser/welcomeOverlay'; -import 'vs/workbench/parts/welcome/page/electron-browser/welcomePage.contribution'; +import 'vs/workbench/contrib/welcome/walkThrough/electron-browser/walkThrough.contribution'; +import 'vs/workbench/contrib/welcome/gettingStarted/electron-browser/gettingStarted.contribution'; +import 'vs/workbench/contrib/welcome/overlay/browser/welcomeOverlay'; +import 'vs/workbench/contrib/welcome/page/electron-browser/welcomePage.contribution'; // Outline -import 'vs/workbench/parts/outline/electron-browser/outline.contribution'; +import 'vs/workbench/contrib/outline/electron-browser/outline.contribution'; // Experiments -import 'vs/workbench/parts/experiments/electron-browser/experiments.contribution'; +import 'vs/workbench/contrib/experiments/electron-browser/experiments.contribution'; //#endregion \ No newline at end of file diff --git a/test/smoke/package.json b/test/smoke/package.json index fe5adc19357..80351281340 100644 --- a/test/smoke/package.json +++ b/test/smoke/package.json @@ -22,7 +22,7 @@ "@types/webdriverio": "4.6.1", "concurrently": "^3.5.1", "cpx": "^1.5.0", - "electron": "3.1.2", + "electron": "3.1.3", "htmlparser2": "^3.9.2", "mkdirp": "^0.5.1", "mocha": "^5.2.0", diff --git a/test/smoke/yarn.lock b/test/smoke/yarn.lock index 6ca02b80baf..d1e614c487a 100644 --- a/test/smoke/yarn.lock +++ b/test/smoke/yarn.lock @@ -596,10 +596,10 @@ electron-download@^4.1.0: semver "^5.4.1" sumchecker "^2.0.2" -electron@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/electron/-/electron-3.1.2.tgz#e410b976c56fc2f783c3b0fb6d757e02eaeab902" - integrity sha512-B/mXRCN8jGBBx8dvtIgLyW+nE8i9y7K9G6wijU+cLoneqF5al9BgZA1l5xgZEiUrwTtt0cgXIWNwhStt7EDoQQ== +electron@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/electron/-/electron-3.1.3.tgz#848fa0fc62d131978cde15ec04ce195a08dc4155" + integrity sha512-Y1TbV5py2O0br0JVYh+ew1cW4cIOOgRNRMzwTwWuZNMZ9fK/XLlqsbZr1GpYHdiN2yIU1koO+g4Cw8VuW86NXQ== dependencies: "@types/node" "^8.0.24" electron-download "^4.1.0" diff --git a/tslint.json b/tslint.json index 3d7876e972d..fb3b2dc5a97 100644 --- a/tslint.json +++ b/tslint.json @@ -402,7 +402,7 @@ "**/vs/platform/**", "**/vs/editor/**", "**/vs/workbench/{common,browser,node,electron-browser}/**", - "vs/workbench/parts/files/common/editors/fileEditorInput", + "vs/workbench/contrib/files/common/editors/fileEditorInput", "**/vs/workbench/services/**", "**/vs/workbench/test/**", "*" // node modules @@ -458,7 +458,7 @@ ] }, { - "target": "**/vs/workbench/parts/files/common/**", + "target": "**/vs/workbench/contrib/files/common/**", "restrictions": [ "vs/nls", "**/vs/base/common/**", @@ -468,12 +468,12 @@ "**/vs/editor/contrib/*/common/**", "**/vs/workbench/common/**", "**/vs/workbench/services/*/common/**", - "**/vs/workbench/parts/files/common/**", + "**/vs/workbench/contrib/files/common/**", "assert" ] }, { - "target": "**/vs/workbench/parts/files/browser/**", + "target": "**/vs/workbench/contrib/files/browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", @@ -484,12 +484,12 @@ "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention "**/vs/workbench/{common,browser}/**", "**/vs/workbench/services/*/{common,browser}/**", - "**/vs/workbench/parts/files/{common,browser}/**", + "**/vs/workbench/contrib/files/{common,browser}/**", "assert" ] }, { - "target": "**/vs/workbench/parts/files/electron-browser/**", + "target": "**/vs/workbench/contrib/files/electron-browser/**", "restrictions": [ "vs/nls", "vs/css!./**/*", @@ -501,7 +501,7 @@ "**/vs/editor/contrib/**", // editor/contrib is equivalent to /browser/ by convention "**/vs/workbench/{common,browser,node,electron-browser,api}/**", "**/vs/workbench/services/*/{common,browser,node,electron-browser}/**", - "**/vs/workbench/parts/files/{common,browser,node,electron-browser}/**", + "**/vs/workbench/contrib/files/{common,browser,node,electron-browser}/**", "*" // node modules ] }, diff --git a/yarn.lock b/yarn.lock index bfb1e38ac88..4a5b178d8c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,22 @@ resolved "https://registry.yarnpkg.com/7zip/-/7zip-0.0.6.tgz#9cafb171af82329490353b4816f03347aa150a30" integrity sha1-nK+xca+CMpSQNTtIFvAzR6oVCjA= +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + "@types/commander@^2.11.0": version "2.12.2" resolved "https://registry.yarnpkg.com/@types/commander/-/commander-2.12.2.tgz#183041a23842d4281478fa5d23c5ca78e6fd08ae" @@ -14,6 +30,11 @@ dependencies: commander "*" +"@types/fancy-log@1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.0.tgz#a61ab476e5e628cd07a846330df53b85e05c8ce0" + integrity sha512-mQjDxyOM1Cpocd+vm1kZBP7smwKZ4TNokFeds9LV7OZibmPJFEzY3+xZMrKfUdNT71lv8GoCPD6upKwHxubClw== + "@types/keytar@^4.0.1": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/keytar/-/keytar-4.0.1.tgz#e2cf6405dc33861424e59b67516c66d2cf7bc21b" @@ -34,6 +55,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-4.2.22.tgz#cf488a0f6b4a9c245d09927f4f757ca278b9c8ce" integrity sha512-LXRap3bb4AjtLZ5NOFc4ssVZrQPTgdPcNm++0SEJuJZaOA+xHkojJNYqy33A5q/94BmG5tA6yaMeD4VdCv5aSA== +"@types/node@^10.11.7": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== + "@types/node@^10.12.12": version "10.12.12" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" @@ -262,6 +288,11 @@ acorn-jsx@^3.0.0: dependencies: acorn "^3.0.4" +acorn-jsx@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" + integrity sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg== + acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" @@ -277,6 +308,11 @@ acorn@^5.2.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.2.1.tgz#317ac7821826c22c702d66189ab8359675f135d7" integrity sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w== +acorn@^6.0.2: + version "6.0.7" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.7.tgz#490180ce18337270232d9488a44be83d9afb7fd3" + integrity sha512-HNJNgE60C9eOTgn974Tlp3dpLZdUr+SoxxDwPaY9J/kDNOLQTkaDgwBUXAF4SSsrAwD9RpdxuHK/EbuF+W9Ahw== + agent-base@4, agent-base@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" @@ -339,6 +375,16 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.1" +ajv@^6.5.3, ajv@^6.6.1: + version "6.8.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.8.1.tgz#0890b93742985ebf8973cd365c5b23920ce3cb20" + integrity sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ== + 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" @@ -353,11 +399,6 @@ alphanum-sort@^1.0.1, alphanum-sort@^1.0.2: resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= -amdefine@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.0.tgz#fd17474700cb5cc9c2b709f0be9d23ce3c198c33" - integrity sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM= - amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -370,6 +411,11 @@ ansi-colors@^1.0.1: dependencies: ansi-wrap "^0.1.0" +ansi-colors@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + ansi-cyan@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873" @@ -387,6 +433,11 @@ ansi-escapes@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-gray@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" @@ -401,11 +452,6 @@ ansi-red@^0.1.1: dependencies: ansi-wrap "0.1.0" -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" - integrity sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk= - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -416,10 +462,10 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - integrity sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94= +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== ansi-styles@^2.2.1: version "2.2.1" @@ -433,7 +479,7 @@ ansi-styles@^3.1.0: dependencies: color-convert "^1.9.0" -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -514,6 +560,13 @@ arr-diff@^4.0.0: resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= +arr-filter@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/arr-filter/-/arr-filter-1.1.2.tgz#43fdddd091e8ef11aa4c45d9cdc18e2dff1711ee" + integrity sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4= + dependencies: + make-iterator "^1.0.0" + arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" @@ -524,6 +577,13 @@ arr-flatten@^1.1.0: resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== +arr-map@^2.0.0, arr-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/arr-map/-/arr-map-2.0.2.tgz#3a77345ffc1cf35e2a91825601f9e58f2e24cac4" + integrity sha1-Onc0X/wc814qkYJWAfnljy4kysQ= + dependencies: + make-iterator "^1.0.0" + arr-union@^2.0.1: version "2.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-2.1.0.tgz#20f9eab5ec70f5c7d215b1077b1c39161d292c7d" @@ -539,7 +599,7 @@ array-differ@^1.0.0: resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" integrity sha1-7/UuN1gknTO+QCuLuOVkuytdQDE= -array-each@^1.0.1: +array-each@^1.0.0, array-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= @@ -554,6 +614,21 @@ array-flatten@1.1.1: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-initial@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-initial/-/array-initial-1.1.0.tgz#2fa74b26739371c3947bd7a7adc73be334b3d795" + integrity sha1-L6dLJnOTccOUe9enrcc74zSz15U= + dependencies: + array-slice "^1.0.0" + is-number "^4.0.0" + +array-last@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array-last/-/array-last-1.3.0.tgz#7aa77073fec565ddab2493f5f88185f404a9d336" + integrity sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg== + dependencies: + is-number "^4.0.0" + array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -564,6 +639,15 @@ array-slice@^1.0.0: resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" integrity sha1-5zA08A3MH0CHYAj9IP6ud71LfC8= +array-sort@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a" + integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg== + dependencies: + default-compare "^1.0.0" + get-value "^2.0.6" + kind-of "^5.0.2" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -571,7 +655,7 @@ array-union@^1.0.1: dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.1, array-uniq@^1.0.2: +array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= @@ -641,7 +725,22 @@ assign-symbols@^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.0: +astral-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== + +async-done@^1.2.0, async-done@^1.2.2: + version "1.3.1" + resolved "https://registry.yarnpkg.com/async-done/-/async-done-1.3.1.tgz#14b7b73667b864c8f02b5b253fc9c6eddb777f3e" + integrity sha512-R1BaUeJ4PMoLNJuk+0tLJgjmEqVsdN118+Z8O+alhnQDQgy0kmD5Mqi0DNEmMx2LM0Ed5yekKu+ZXYvIHceicg== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.2" + process-nextick-args "^1.0.7" + stream-exhaust "^1.0.1" + +async-each@^1.0.0, async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= @@ -651,17 +750,24 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== -async@1.x, async@^1.4.0, async@^1.5.0: +async-settle@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-settle/-/async-settle-1.0.0.tgz#1d0a914bb02575bec8a8f3a74e5080f72b2c0c6b" + integrity sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs= + dependencies: + async-done "^1.2.2" + +async@1.x, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= -async@^2.0.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - integrity sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw== +async@^2.1.5: + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== dependencies: - lodash "^4.14.0" + lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" @@ -705,21 +811,22 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -azure-storage@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-1.4.0.tgz#fb52fa68b3efa6980c33fd7c5cd489b7adc46ed1" - integrity sha1-+1L6aLPvppgMM/18XNSJt63EbtE= +azure-storage@^2.10.2: + version "2.10.2" + resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.10.2.tgz#3bcabdbf10e72fd0990db81116e49023c4a675b6" + integrity sha512-pOyGPya9+NDpAfm5YcFfklo57HfjDbYLXxs4lomPwvRxmb0Di/A+a+RkUmEFzaQ8S13CqxK40bRRB0sjj2ZQxA== dependencies: browserify-mime "~1.2.9" - extend "~1.2.1" + extend "^3.0.2" json-edm-parser "0.1.2" - node-uuid "~1.4.0" + md5.js "1.3.4" readable-stream "~2.0.0" - request "~2.74.0" - underscore "~1.4.4" - validator "~3.22.2" - xml2js "0.2.7" - xmlbuilder "0.4.3" + request "^2.86.0" + underscore "~1.8.3" + uuid "^3.0.0" + validator "~9.4.1" + xml2js "0.2.8" + xmlbuilder "^9.0.7" babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: version "6.26.0" @@ -730,6 +837,21 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.2" +bach@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bach/-/bach-1.2.0.tgz#4b3ce96bf27134f79a1b414a51c14e34c3bd9880" + integrity sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA= + dependencies: + arr-filter "^1.1.1" + arr-flatten "^1.0.1" + arr-map "^2.0.0" + array-each "^1.0.0" + array-initial "^1.0.0" + array-last "^1.1.1" + async-done "^1.2.2" + async-settle "^1.0.0" + now-and-later "^2.0.0" + balanced-match@^0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" @@ -765,11 +887,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - integrity sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak= - big-integer@^1.6.25: version "1.6.25" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.25.tgz#1de45a9f57542ac20121c682f8d642220a34e823" @@ -816,13 +933,6 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" - integrity sha1-/cqHGplxOqANGeO7ukHER4emU5g= - dependencies: - readable-stream "~2.0.5" - bluebird@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -892,7 +1002,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, 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== @@ -1042,13 +1152,6 @@ buffers@~0.1.1: resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= -bufferstreams@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/bufferstreams/-/bufferstreams-1.1.1.tgz#0161373060ac5988eff99058731114f6e195d51e" - integrity sha1-AWE3MGCsWYjv+ZBYcxEU9uGV1R4= - dependencies: - readable-stream "^2.0.2" - builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1110,6 +1213,11 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= +callsites@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" + integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== + camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -1128,6 +1236,11 @@ camelcase@^2.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -1173,16 +1286,14 @@ chainsaw@~0.1.0: dependencies: traverse ">=0.3.0 <0.4" -chalk@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - integrity sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ= +chalk@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + integrity sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g== dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" @@ -1204,6 +1315,15 @@ chalk@^2.0.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" @@ -1218,6 +1338,11 @@ chardet@^0.5.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" integrity sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g== +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" @@ -1235,6 +1360,25 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" +chokidar@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.0.tgz#5fcb70d0b28ebe0867eb0f09d5f6a08f29a1efa0" + integrity sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ== + 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" + chokidar@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1351,6 +1495,15 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" @@ -1365,7 +1518,7 @@ clone-buffer@^1.0.0: resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= -clone-stats@^0.0.1, clone-stats@~0.0.1: +clone-stats@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" integrity sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE= @@ -1375,11 +1528,6 @@ clone-stats@^1.0.0: resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - integrity sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8= - clone@^1.0.0, clone@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" @@ -1421,6 +1569,15 @@ coffee-script@^1.10.0: resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" integrity sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw== +collection-map@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-map/-/collection-map-1.0.0.tgz#aea0f06f8d26c780c2b75494385544b2255af18c" + integrity sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw= + dependencies: + arr-map "^2.0.2" + for-own "^1.0.0" + make-iterator "^1.0.0" + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -1534,6 +1691,11 @@ commander@^2.12.1, commander@~2.13.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== + commandpost@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/commandpost/-/commandpost-1.2.1.tgz#2e9c4c7508b9dc704afefaa91cab92ee6054cc68" @@ -1563,7 +1725,7 @@ concat-stream@1.6.0, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@^1.5.0: +concat-stream@^1.5.0, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -1580,10 +1742,10 @@ concat-with-sourcemaps@^1.0.0: dependencies: source-map "^0.5.1" -config-chain@~1.1.5: - version "1.1.11" - resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" - integrity sha1-q6CXR9++TD5w52am5BWG4YWfxvI= +config-chain@^1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" + integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== dependencies: ini "^1.3.4" proto-list "~1.2.1" @@ -1654,6 +1816,14 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +copy-props@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/copy-props/-/copy-props-2.0.4.tgz#93bb1cadfafd31da5bb8a9d4b41f471ec3a72dfe" + integrity sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A== + dependencies: + each-props "^1.3.0" + is-plain-object "^2.0.1" + copy-webpack-plugin@^4.5.2: version "4.5.2" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.2.tgz#d53444a8fea2912d806e78937390ddd7e632ee5c" @@ -1892,19 +2062,6 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -dateformat@^1.0.11, dateformat@^1.0.7-1.2.3: - version "1.0.12" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" - integrity sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk= - dependencies: - get-stdin "^4.0.1" - meow "^3.3.0" - -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - integrity sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI= - debounce@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.1.0.tgz#6a1a4ee2a9dc4b7c24bb012558dbcdb05b37f408" @@ -1931,6 +2088,13 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" +debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1983,17 +2147,22 @@ deep-is@~0.1.2, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@~0.2.7: - version "0.2.10" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-0.2.10.tgz#8906bf9e525a4fbf1b203b2afcb4640249821219" - integrity sha1-iQa/nlJaT78bIDsq/LRkAkmCEhk= +deepmerge@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.1.0.tgz#a612626ce4803da410d77554bfd80361599c034d" + integrity sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg== -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= +default-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f" + integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ== dependencies: - clone "^1.0.2" + kind-of "^5.0.2" + +default-resolution@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/default-resolution/-/default-resolution-2.0.0.tgz#bcb82baa72ad79b426a76732f1a81ad6df26d684" + integrity sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ= define-properties@^1.1.2: version "1.1.3" @@ -2067,11 +2236,6 @@ depd@1.1.1, depd@~1.1.1: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" integrity sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k= -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - integrity sha1-+cmvVGSvoeepcUWKi97yqpTVuxk= - des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -2085,21 +2249,15 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" - integrity sha1-STXe39lIhkjgBrASlWbpOGcR6mM= - dependencies: - fs-exists-sync "^0.1.0" +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= -detect-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-2.0.0.tgz#720ff51e4d97b76884f6bf57292348b13dfde939" - integrity sha1-cg/1Hk2Xt2iE9r9XKSNIsT396Tk= - dependencies: - get-stdin "^3.0.0" - minimist "^1.1.0" - repeating "^1.1.0" +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" @@ -2153,6 +2311,13 @@ doctrine@^2.0.0: esutils "^2.0.2" isarray "^1.0.0" +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + documentdb@^1.5.1: version "1.14.1" resolved "https://registry.yarnpkg.com/documentdb/-/documentdb-1.14.1.tgz#1a4716c0b38a40daf375dc9a4b2a2beb4e26294a" @@ -2211,13 +2376,6 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - integrity sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds= - dependencies: - readable-stream "~1.1.9" - duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -2243,6 +2401,14 @@ duplexify@^3.4.2, duplexify@^3.6.0: 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" + integrity sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA== + dependencies: + is-plain-object "^2.0.1" + object.defaults "^1.1.0" + eachr@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/eachr/-/eachr-3.2.0.tgz#2c35e43ea086516f7997cf80b7aa64d55a4a4484" @@ -2275,6 +2441,18 @@ editorconfig@^0.15.0: semver "^5.4.1" sigmund "^1.0.1" +editorconfig@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.2.tgz#047be983abb9ab3c2eefe5199cb2b7c5689f0702" + integrity sha512-GWjSI19PVJAM9IZRGOS+YKI8LN+/sjkSjNyvxL5ucqP9/IqtYNXBaQ/6c/hkPNYQHyOHra2KoXZI/JVpuqwmcQ== + dependencies: + "@types/node" "^10.11.7" + "@types/semver" "^5.5.0" + commander "^2.19.0" + lru-cache "^4.1.3" + semver "^5.6.0" + sigmund "^1.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -2338,13 +2516,6 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - integrity sha1-jhdyBsPICDfYVjLouTWd/osvbq8= - dependencies: - once "~1.3.0" - enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" @@ -2458,7 +2629,7 @@ escape-string-regexp@1.0.2: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" integrity sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE= -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.3, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= @@ -2505,7 +2676,17 @@ eslint-scope@^4.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^3.0.0, eslint@^3.4.0: +eslint-utils@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" + integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== + +eslint@^3.4.0: version "3.19.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" integrity sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw= @@ -2546,6 +2727,48 @@ eslint@^3.0.0, eslint@^3.4.0: text-table "~0.2.0" user-home "^2.0.0" +eslint@^5.0.1: + version "5.13.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.13.0.tgz#ce71cc529c450eed9504530939aa97527861ede9" + integrity sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.5.3" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^2.1.0" + eslint-scope "^4.0.0" + eslint-utils "^1.3.1" + eslint-visitor-keys "^1.0.0" + espree "^5.0.0" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.1.0" + js-yaml "^3.12.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.5" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^5.5.1" + strip-ansi "^4.0.0" + strip-json-comments "^2.0.1" + table "^5.0.2" + text-table "^0.2.0" + espree@^3.4.0: version "3.5.2" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.2.tgz#756ada8b979e9dcfcdb30aad8d1a9304a905e1ca" @@ -2554,6 +2777,15 @@ espree@^3.4.0: acorn "^5.2.1" acorn-jsx "^3.0.0" +espree@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" + integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== + dependencies: + acorn "^6.0.2" + acorn-jsx "^5.0.0" + eslint-visitor-keys "^1.0.0" + esprima@2.5.x: version "2.5.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.5.0.tgz#f387a46fd344c1b1a39baf8c20bfb43b6d0058cc" @@ -2581,6 +2813,13 @@ esquery@^1.0.0: dependencies: estraverse "^4.0.0" +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + esrecurse@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" @@ -2693,14 +2932,7 @@ expand-template@^1.0.2: resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" integrity sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg== -expand-tilde@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" - integrity sha1-C4HrqJflo9MdHD0QL48BRB5VlEk= - dependencies: - os-homedir "^1.0.1" - -expand-tilde@^2.0.2: +expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= @@ -2770,12 +3002,7 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" integrity sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ= -extend@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-1.2.1.tgz#a0f5fd6cfc83a5fe49ef698d60ec8a624dd4576c" - integrity sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w= - -extend@~3.0.2: +extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -2789,6 +3016,15 @@ external-editor@^3.0.0: iconv-lite "^0.4.22" tmp "^0.0.33" +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" @@ -2834,15 +3070,7 @@ extsprintf@1.3.0, extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - integrity sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg= - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fancy-log@^1.3.2: +fancy-log@1.3.2, fancy-log@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" integrity sha1-9BEl49hPLn2JpD0G2VjI94vha+E= @@ -2851,6 +3079,16 @@ fancy-log@^1.3.2: color-support "^1.1.3" time-stamp "^1.0.0" +fancy-log@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7" + integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw== + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + parse-node-version "^1.0.0" + time-stamp "^1.0.0" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2967,11 +3205,6 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - integrity sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ= - find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" @@ -2999,15 +3232,15 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -findup-sync@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" - integrity sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI= +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" fined@^1.0.1: version "1.1.0" @@ -3025,10 +3258,10 @@ first-chunk-stream@^1.0.0: resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" integrity sha1-Wb+1DNkF9g18OUzT2ayqtOatk04= -flagged-respawn@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" - integrity sha1-/xke3c1wiKZ1smEP/8l2vpuAdLU= +flagged-respawn@^1.0.0: + 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" @@ -3082,15 +3315,6 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~1.0.0-rc4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" - integrity sha1-rjFduaSQf6BlUCMEpm13M0de43w= - dependencies: - async "^2.0.1" - combined-stream "^1.0.5" - mime-types "^2.1.11" - form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -3160,11 +3384,6 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-exists-sync@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" - integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0= - fs-extra@0.26.7: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" @@ -3231,11 +3450,24 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +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" + function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3250,13 +3482,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - integrity sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8= - dependencies: - globule "~0.1.0" - gc-signals@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/gc-signals/-/gc-signals-0.0.1.tgz#91e3b7904168b58aa3dc78b619b7b4495b4038ab" @@ -3279,11 +3504,6 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= -get-stdin@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-3.0.2.tgz#c1ced24b9039b38ded85bdf161e57713b6dd4abe" - integrity sha1-wc7SS5A5s43thb3xYeV3E7bdSr4= - get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -3352,18 +3572,6 @@ glob-parent@^3.0.0, glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - integrity sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs= - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - glob-stream@^5.3.2: version "5.3.5" resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" @@ -3394,19 +3602,17 @@ glob-stream@^6.1.0: to-absolute-glob "^2.0.0" unique-stream "^2.0.2" -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - integrity sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs= +glob-watcher@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-5.0.3.tgz#88a8abf1c4d131eb93928994bc4a593c2e5dd626" + integrity sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg== dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - integrity sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY= - dependencies: - find-index "^0.1.1" + anymatch "^2.0.0" + async-done "^1.2.0" + chokidar "^2.0.0" + is-negated-glob "^1.0.0" + just-debounce "^1.0.0" + object.defaults "^1.1.0" glob@3.2.11: version "3.2.11" @@ -3416,7 +3622,7 @@ glob@3.2.11: inherits "2" minimatch "0.3" -glob@5.x, glob@^5.0.13, glob@^5.0.3: +glob@5.x, glob@^5.0.13, glob@^5.0.15, glob@^5.0.3: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= @@ -3427,16 +3633,6 @@ glob@5.x, glob@^5.0.13, glob@^5.0.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - integrity sha1-xstz0yJsHv7wTePFbQEvAzd+4V8= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -3460,37 +3656,47 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - integrity sha1-0p4KBV3qUTj00H7UDomC6DwgZs0= +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" global-modules-path@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== -global-modules@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" - integrity sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0= +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - global-prefix "^0.1.4" - is-windows "^0.2.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -global-prefix@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" - integrity sha1-jTvGuNo8qBEqFg2NSW/wRiv+948= +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - homedir-polyfill "^1.0.0" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" ini "^1.3.4" - is-windows "^0.2.0" - which "^1.2.12" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.7.0: + version "11.10.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.10.0.tgz#1e09776dffda5e01816b3bb4077c8b59c24eaa50" + integrity sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ== globals@^9.14.0: version "9.18.0" @@ -3521,15 +3727,6 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - integrity sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU= - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - glogg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" @@ -3542,18 +3739,6 @@ graceful-fs@4.1.11, graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= -graceful-fs@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - integrity sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg= - dependencies: - natives "^1.1.0" - -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" - integrity sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q= - "graceful-readlink@>= 1.0.0": version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" @@ -3564,14 +3749,14 @@ growl@1.9.2: resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= -gulp-atom-electron@^1.19.2: - version "1.19.2" - resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.19.2.tgz#e61e0278b77d3bbc78603e3564cebfce0a224d79" - integrity sha512-fARwXJmKRAjtYlBw3u4GltNAtnvAp+Mj9d/jWJFEw/kbRzAZuwd7N359tz2HA99NA7Z8cVW2kTW0IutQDoifWA== +gulp-atom-electron@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/gulp-atom-electron/-/gulp-atom-electron-1.20.0.tgz#10b01f6a4c0257a8468c4da4ec9c67ecb28a32ed" + integrity sha512-gs7xvZvq8Mq60+DmbfCeXZnhqhOaJa/wrctix0RP/lCfSgusJnBTBssC6er1JIiqdHmQ8zFiYaYZh41mdG36kQ== dependencies: event-stream "3.3.4" github-releases-ms "^0.5.0" - gulp-filter "^4.0.0" + gulp-filter "^5.1.0" gulp-rename "1.2.2" gulp-symdest "^1.1.1" gulp-vinyl-zip "^2.1.2" @@ -3586,12 +3771,12 @@ gulp-atom-electron@^1.19.2: vinyl "^2.2.0" vinyl-fs "^3.0.3" -gulp-azure-storage@^0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/gulp-azure-storage/-/gulp-azure-storage-0.8.2.tgz#2dba8946f141f746c2c0b83c032530d79905b40e" - integrity sha512-oiVt+DL3e/cgGrr7dlI5aTbpjVYMcosDdYmkBf4s1rfTsdNFUH8cQu+/IoT4MWm1cmgN/TX1I48NnN69JSRTJA== +gulp-azure-storage@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/gulp-azure-storage/-/gulp-azure-storage-0.10.0.tgz#7c3669b62c0e84002fd7539b231fba76bd8c1cf1" + integrity sha512-rrAUz3gpjgpiKanz+ahFIjVWoKTcjFQFqSHosI+RLkZUCh6WBS68g7Uj0hU92mk26xV1e7zC6ZcePpNUlShT3w== dependencies: - azure-storage "^1.3.1" + azure-storage "^2.10.2" delayed-stream "0.0.6" event-stream "3.3.4" mime "^1.3.4" @@ -3599,8 +3784,8 @@ gulp-azure-storage@^0.8.2: progress "^1.1.8" queue "^3.0.10" streamifier "^0.1.1" - vinyl "^0.4.5" - vinyl-fs "^0.3.13" + vinyl "^2.2.0" + vinyl-fs "^3.0.3" gulp-buffer@0.0.2: version "0.0.2" @@ -3609,7 +3794,31 @@ gulp-buffer@0.0.2: dependencies: through2 "~0.4.0" -gulp-concat@^2.6.0: +gulp-cli@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/gulp-cli/-/gulp-cli-2.0.1.tgz#7847e220cb3662f2be8a6d572bf14e17be5a994b" + integrity sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ== + dependencies: + ansi-colors "^1.0.1" + archy "^1.0.0" + array-sort "^1.0.0" + color-support "^1.1.3" + concat-stream "^1.6.0" + copy-props "^2.0.1" + fancy-log "^1.3.2" + gulplog "^1.0.0" + interpret "^1.1.0" + isobject "^3.0.1" + liftoff "^2.5.0" + matchdep "^2.0.0" + mute-stdout "^1.0.0" + pretty-hrtime "^1.0.0" + replace-homedir "^1.0.0" + semver-greatest-satisfied-range "^1.1.0" + v8flags "^3.0.1" + yargs "^7.1.0" + +gulp-concat@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/gulp-concat/-/gulp-concat-2.6.1.tgz#633d16c95d88504628ad02665663cee5a4793353" integrity sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M= @@ -3618,73 +3827,53 @@ gulp-concat@^2.6.0: through2 "^2.0.0" vinyl "^2.0.0" -gulp-cssnano@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.2.tgz#e08a09771ec5454a549f1a005bdd256cb8e5e0a3" - integrity sha1-4IoJdx7FRUpUnxoAW90lbLjl4KM= +gulp-cssnano@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/gulp-cssnano/-/gulp-cssnano-2.1.3.tgz#02007e2817af09b3688482b430ad7db807aebf72" + integrity sha512-r8qdX5pTXsBb/IRm9loE8Ijz8UiPW/URMC/bKJe4FPNHRaz4aEx8Bev03L0FYHd/7BSGu/ebmfumAkpGuTdenA== dependencies: + buffer-from "^1.0.0" cssnano "^3.0.0" - gulp-util "^3.0.6" object-assign "^4.0.1" + plugin-error "^1.0.1" vinyl-sourcemaps-apply "^0.2.1" -gulp-eslint@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-3.0.1.tgz#04e57e3e18c6974267c12cf6855dc717d4a313bd" - integrity sha1-BOV+PhjGl0JnwSz2hV3HF9SjE70= +gulp-eslint@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/gulp-eslint/-/gulp-eslint-5.0.0.tgz#2a2684095f774b2cf79310262078c56cc7a12b52" + integrity sha512-9GUqCqh85C7rP9120cpxXuZz2ayq3BZc85pCTuPJS03VQYxne0aWPIXWx6LSvsGPa3uRqtSO537vaugOh+5cXg== dependencies: - bufferstreams "^1.1.1" - eslint "^3.0.0" - gulp-util "^3.0.6" + eslint "^5.0.1" + fancy-log "^1.3.2" + plugin-error "^1.0.1" -gulp-filter@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-3.0.1.tgz#7c6ffce5b563e89de7a90dfceff16ec8a8cb1562" - integrity sha1-fG/85bVj6J3nqQ387/FuyKjLFWI= +gulp-filter@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.1.0.tgz#a05e11affb07cf7dcf41a7de1cb7b63ac3783e73" + integrity sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM= dependencies: - gulp-util "^3.0.6" multimatch "^2.0.0" + plugin-error "^0.1.2" streamfilter "^1.0.5" -gulp-filter@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb" - integrity sha1-OV9YolbFWc254NFX8cqvUkijjcs= +gulp-flatmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gulp-flatmap/-/gulp-flatmap-1.0.2.tgz#b515ae6081d66af99daf56c612e2d92502720133" + integrity sha512-xm+Ax2vPL/xiMBqLFI++wUyPtncm3b55ztGHewmRcoG/sYb0OUTatjSacOud3fee77rnk+jOgnDEHhwBtMHgFA== dependencies: - gulp-util "^3.0.6" - multimatch "^2.0.0" - streamfilter "^1.0.5" + plugin-error "0.1.2" + through2 "2.0.3" -gulp-flatmap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulp-flatmap/-/gulp-flatmap-1.0.0.tgz#e634e03cffb263aebacfdc22dd8ce2f3d76ffe97" - integrity sha1-5jTgPP+yY666z9wi3Yzi89dv/pc= +gulp-json-editor@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/gulp-json-editor/-/gulp-json-editor-2.5.0.tgz#23aaa7d30f8425cf60cf1aefae098c257da11ada" + integrity sha512-HyrBSaE+Di6oQbKsfNM6X7dPFowOuTTuVYjxratU8QAiW7LR7Rydm+/fSS3OehdnuP++A/07q/nksihuD5FZSA== dependencies: - gulp-util "~2.2.14" - through2 "~0.6.3" - -gulp-json-editor@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/gulp-json-editor/-/gulp-json-editor-2.2.1.tgz#7c4dd7477e8d06dc5dc49c0b81e745cdb04f97bb" - integrity sha1-fE3XR36NBtxdxJwLgedFzbBPl7s= - dependencies: - deepmerge "~0.2.7" - detect-indent "^2.0.0" - gulp-util "~3.0.0" - js-beautify "~1.5.4" - through2 "~0.5.0" - -gulp-mocha@^2.1.3: - version "2.2.0" - resolved "https://registry.yarnpkg.com/gulp-mocha/-/gulp-mocha-2.2.0.tgz#1ce5eba4b94b40c7436afec3c4982c8eea894192" - integrity sha1-HOXrpLlLQMdDav7DxJgsjuqJQZI= - dependencies: - gulp-util "^3.0.0" - mocha "^2.0.1" - plur "^2.1.0" - resolve-from "^1.0.0" - temp "^0.8.3" - through "^2.3.4" + deepmerge "^3.0.0" + detect-indent "^5.0.0" + js-beautify "^1.8.9" + plugin-error "^1.0.1" + through2 "^3.0.0" gulp-plumber@^1.2.0: version "1.2.0" @@ -3721,15 +3910,18 @@ gulp-replace@^0.5.4: readable-stream "^2.0.1" replacestream "^4.0.0" -gulp-shell@^0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.5.2.tgz#a4959ca0651ad1c7bbfe70b2d0adbbb4e1aea98d" - integrity sha1-pJWcoGUa0ce7/nCy0K27tOGuqY0= +gulp-shell@^0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/gulp-shell/-/gulp-shell-0.6.5.tgz#f07b204ad8ad1c2659f7a1b6d76efa16d416a759" + integrity sha512-f3m1WcS0o2B72/PGj1Jbv9zYR9rynBh/EQJv64n01xQUo7j7anols0eww9GG/WtDTzGVQLrupVDYkifRFnj5Zg== dependencies: - async "^1.5.0" - gulp-util "^3.0.7" - lodash "^4.0.0" - through2 "^2.0.0" + async "^2.1.5" + chalk "^2.3.0" + fancy-log "^1.3.2" + lodash "^4.17.4" + lodash.template "^4.4.0" + plugin-error "^0.1.2" + through2 "^2.0.3" gulp-sourcemaps@1.6.0: version "1.6.0" @@ -3752,22 +3944,26 @@ gulp-symdest@^1.1.1: queue "^3.1.0" vinyl-fs "^2.4.3" -gulp-tsb@2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/gulp-tsb/-/gulp-tsb-2.0.5.tgz#7f7791f7f54ce41c406382360a21f5d8f1198d04" - integrity sha1-f3eR9/VM5BxAY4I2CiH12PEZjQQ= +gulp-tsb@2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/gulp-tsb/-/gulp-tsb-2.0.6.tgz#2f8fbee9a81cf0da088744d6da2bca457f2893d1" + integrity sha512-tSIAPfU9rhbtwMgRWopipWFx3NZg943bCLPcP3LxQJ4KUkSdPVc2ZivCibMojw/7HwJUMjLWQ2NCN0yStTQP0g== dependencies: - gulp-util "^3.0.1" + ansi-colors "^1.0.1" + fancy-log "^1.3.2" through "^2.3.6" - vinyl "^0.4.3" + vinyl "^2.1.0" -gulp-tslint@^8.1.2: - version "8.1.2" - resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.2.tgz#e0f43194b473d7e76bb45a58fe8c60e7dfe3beb2" - integrity sha512-0RNGqbp2TKPdbG+sWU3mNMXEMuF/noY1KS4+jd5lOStkvuFINkFL29dHX3IT1u+vVFD4Glwf+lkcdR2QMVNMzA== +gulp-tslint@^8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/gulp-tslint/-/gulp-tslint-8.1.3.tgz#a89ed144038ae861ee7bfea9528272d126a93da1" + integrity sha512-KEP350N5B9Jg6o6jnyCyKVBPemJePYpMsGfIQq0G0ErvY7tw4Lrfb/y3L4WRf7ek0OsaE8nnj86w+lcLXW8ovw== dependencies: - gulp-util "~3.0.8" + "@types/fancy-log" "1.3.0" + chalk "2.3.1" + fancy-log "1.3.2" map-stream "~0.0.7" + plugin-error "1.0.1" through "~2.3.8" gulp-uglify@^3.0.0: @@ -3783,68 +3979,6 @@ gulp-uglify@^3.0.0: uglify-js "^3.0.5" vinyl-sourcemaps-apply "^0.2.0" -gulp-util@3.0.7: - version "3.0.7" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.7.tgz#78925c4b8f8b49005ac01a011c557e6218941cbb" - integrity sha1-eJJcS4+LSQBawBoBHFV+YhiUHLs= - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^1.0.11" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@^3.0.0, gulp-util@^3.0.1, gulp-util@^3.0.6, gulp-util@^3.0.7, gulp-util@^3.0.8, gulp-util@~3.0.0, gulp-util@~3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - integrity sha1-AFTh50RQLifATBh8PsxQXdVLu08= - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-util@~2.2.14: - version "2.2.20" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" - integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw= - dependencies: - chalk "^0.5.0" - dateformat "^1.0.7-1.2.3" - lodash._reinterpolate "^2.4.1" - lodash.template "^2.4.1" - minimist "^0.2.0" - multipipe "^0.1.0" - through2 "^0.5.0" - vinyl "^0.2.1" - gulp-vinyl-zip@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz#b79cc1a0e2c3b158ffee294590ade1e9caaf5e7b" @@ -3858,24 +3992,15 @@ gulp-vinyl-zip@^2.1.2: yauzl "^2.2.1" yazl "^2.2.1" -gulp@^3.8.9: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - integrity sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ= +gulp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-4.0.0.tgz#95766c601dade4a77ed3e7b2b6dc03881b596366" + integrity sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y= dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" + glob-watcher "^5.0.0" + gulp-cli "^2.0.0" + undertaker "^1.0.0" + vinyl-fs "^3.0.0" gulplog@^1.0.0: version "1.0.0" @@ -3926,13 +4051,6 @@ har-validator@~5.1.0: ajv "^5.3.0" har-schema "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - integrity sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4= - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -4065,7 +4183,7 @@ hoek@4.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" integrity sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ== -homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: +homedir-polyfill@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= @@ -4165,6 +4283,13 @@ iconv-lite@0.4.23, iconv-lite@^0.4.22, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + ieee754@^1.1.11, ieee754@^1.1.4: version "1.1.12" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" @@ -4192,6 +4317,19 @@ ignore@^3.3.5: resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" + integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -4230,11 +4368,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - integrity sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js= - inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -4293,6 +4426,25 @@ inquirer@^6.0.0: strip-ansi "^4.0.0" through "^2.3.6" +inquirer@^6.1.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + int64-buffer@^0.1.9: version "0.1.9" resolved "https://registry.yarnpkg.com/int64-buffer/-/int64-buffer-0.1.9.tgz#9e039da043b24f78b196b283e04653ef5e990f61" @@ -4323,11 +4475,6 @@ ipaddr.js@1.5.2: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" integrity sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A= -irregular-plurals@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" - integrity sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y= - is-absolute-url@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" @@ -4534,6 +4681,11 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-number@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + 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" @@ -4699,16 +4851,16 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.3.tgz#5b714ee0ae493ac5ef204b99f3872bceef73d53a" - integrity sha1-W3FO4K5JOsXvIEuZ84crzu9z1To= +istanbul@0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" escodegen "1.8.x" esprima "2.7.x" - fileset "0.2.x" + glob "^5.0.15" handlebars "^4.0.1" js-yaml "3.x" mkdirp "0.5.x" @@ -4760,20 +4912,27 @@ js-base64@^2.1.9: resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" integrity sha512-Y2/+DnfJJXT1/FCwUebUhLWb3QihxiSC42+ctHLGogmW2jPY6LCapMdFZXRvVP2z6qyKW7s6qncE/9gSqZiArw== -js-beautify@~1.5.4: - version "1.5.10" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.5.10.tgz#4d95371702699344a516ca26bf59f0a27bb75719" - integrity sha1-TZU3FwJpk0SlFsomv1nwonu3Vxk= +js-beautify@^1.8.9: + version "1.8.9" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.8.9.tgz#08e3c05ead3ecfbd4f512c3895b1cda76c87d523" + integrity sha512-MwPmLywK9RSX0SPsUJjN7i+RQY9w/yC17Lbrq9ViEefpLRgqAR2BgrMN2AbifkUuhDV8tRauLhLda/9+bE0YQA== dependencies: - config-chain "~1.1.5" + config-chain "^1.1.12" + editorconfig "^0.15.2" + glob "^7.1.3" mkdirp "~0.5.0" - nopt "~3.0.1" + nopt "~4.0.1" js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + js-yaml@3.6.1: version "3.6.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" @@ -4790,6 +4949,14 @@ js-yaml@3.x, js-yaml@^3.5.1, js-yaml@^3.7.0: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.12.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + integrity sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@~3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -4850,6 +5017,11 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" @@ -4906,6 +5078,11 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +just-debounce@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/just-debounce/-/just-debounce-1.0.0.tgz#87fccfaeffc0b68cd19d55f6722943f929ea35ea" + integrity sha1-h/zPrv/AtozRnVX2cilD+SnqNeo= + keytar@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/keytar/-/keytar-4.2.1.tgz#8a06a6577fdf6373e0aa6b112277e63dec77fd12" @@ -4940,7 +5117,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== @@ -4957,6 +5134,14 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +last-run@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/last-run/-/last-run-1.1.1.tgz#45b96942c17b1c79c772198259ba943bebf8ca5b" + integrity sha1-RblpQsF7HHnHchmCWbqUO+v4yls= + dependencies: + default-resolution "^2.0.0" + es6-weak-map "^2.0.1" + lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" @@ -5009,18 +5194,17 @@ levn@~0.2.5: prelude-ls "~1.1.0" type-check "~0.3.1" -liftoff@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" - integrity sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U= +liftoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + integrity sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew= dependencies: extend "^3.0.0" - findup-sync "^0.4.2" + findup-sync "^2.0.0" fined "^1.0.1" - flagged-respawn "^0.3.2" - lodash.isplainobject "^4.0.4" - lodash.isstring "^4.0.1" - lodash.mapvalues "^4.4.0" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" rechoir "^0.6.2" resolve "^1.1.7" @@ -5072,98 +5256,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - integrity sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U= - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - integrity sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc= - -lodash._escapehtmlchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" - integrity sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0= - dependencies: - lodash._htmlescapes "~2.4.1" - -lodash._escapestringchar@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" - integrity sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I= - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - -lodash._htmlescapes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" - integrity sha1-MtFL8IRLbeb4tioFG09nwii2JMs= - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= - -lodash._isnative@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" - integrity sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw= - -lodash._objecttypes@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" - integrity sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE= - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - integrity sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo= - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - integrity sha1-WLx0xAZklTrgsSTYBpltrKQx4u0= - -lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" - integrity sha1-TxInqlqHEfxjL1sHofRgequLMiI= - -lodash._reinterpolate@^3.0.0: +lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash._reunescapedhtml@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" - integrity sha1-dHxPxAED6zu4oJduVx96JlnpO6c= - dependencies: - lodash._htmlescapes "~2.4.1" - lodash.keys "~2.4.1" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - integrity sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI= - -lodash._shimkeys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" - integrity sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM= - dependencies: - lodash._objecttypes "~2.4.1" - lodash.clone@^4.3.2: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -5174,40 +5271,6 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" - integrity sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ= - dependencies: - lodash._objecttypes "~2.4.1" - lodash.keys "~2.4.1" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - integrity sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg= - dependencies: - lodash._root "^3.0.0" - -lodash.escape@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" - integrity sha1-LOEsXghNsKV92l5dHu659dF1o7Q= - dependencies: - lodash._escapehtmlchar "~2.4.1" - lodash._reunescapedhtml "~2.4.1" - lodash.keys "~2.4.1" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= - lodash.isequal@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" @@ -5218,123 +5281,42 @@ lodash.isinteger@^4.0.4: resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= -lodash.isobject@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" - integrity sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU= - dependencies: - lodash._objecttypes "~2.4.1" - -lodash.isplainobject@^4.0.4: - version "4.0.6" - resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" - integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= - -lodash.isstring@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" - integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= - lodash.isundefined@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz#23ef3d9535565203a66cefd5b830f848911afb48" integrity sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g= -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.keys@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" - integrity sha1-SN6kbfj/djKxDXBrissmWR4rNyc= - dependencies: - lodash._isnative "~2.4.1" - lodash._shimkeys "~2.4.1" - lodash.isobject "~2.4.1" - -lodash.mapvalues@^4.4.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" - integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= - lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.some@^4.2.2: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= -lodash.template@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" - integrity sha1-nmEQB+32KRKal0qzxIuBez4c8g0= +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= dependencies: - lodash._escapestringchar "~2.4.1" - lodash._reinterpolate "~2.4.1" - lodash.defaults "~2.4.1" - lodash.escape "~2.4.1" - lodash.keys "~2.4.1" - lodash.templatesettings "~2.4.1" - lodash.values "~2.4.1" + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - integrity sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8= +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - integrity sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU= - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash.templatesettings@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" - integrity sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk= - dependencies: - lodash._reinterpolate "~2.4.1" - lodash.escape "~2.4.1" + lodash._reinterpolate "~3.0.0" lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash.values@~2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" - integrity sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ= - dependencies: - lodash.keys "~2.4.1" - -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" integrity sha1-eCA6TRwyiuHYbcpkYONptX9AVa4= @@ -5344,10 +5326,10 @@ lodash@^4.17.10: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - integrity sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE= +lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log-driver@1.2.5: version "1.2.5" @@ -5403,6 +5385,14 @@ lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^4.1.3: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" @@ -5427,6 +5417,13 @@ make-error@^1.2.0: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" integrity sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y= +make-iterator@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" + integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== + dependencies: + kind-of "^6.0.2" + mamacro@^0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" @@ -5470,12 +5467,22 @@ markdown-it@^8.3.1: mdurl "^1.0.1" uc.micro "^1.0.3" +matchdep@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" + integrity sha1-xvNINKDY28OzfCfui7yyfHd1WC4= + dependencies: + findup-sync "^2.0.0" + micromatch "^3.0.4" + resolve "^1.4.0" + stack-trace "0.0.10" + math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" integrity sha1-3oGf282E3M2PrlnGrreWFbnSZqw= -md5.js@^1.3.4: +md5.js@1.3.4, md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= @@ -5517,7 +5524,7 @@ memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.1.0, meow@^3.3.0: +meow@^3.1.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= @@ -5576,7 +5583,7 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5613,7 +5620,7 @@ mime-db@~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.11, 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: +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" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" integrity sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo= @@ -5672,21 +5679,13 @@ minimatch@0.3: dependencies: brace-expansion "^1.1.7" -minimatch@2.x, minimatch@^2.0.1: +minimatch@2.x: version "2.0.10" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" integrity sha1-jQh8OcazjAAbl/ynzm0OHoCvusc= dependencies: brace-expansion "^1.0.0" -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - integrity sha1-x054BXT2PG+aCQ6Q775u9TpqdWo= - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -5697,11 +5696,6 @@ minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= -minimist@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" - integrity sha1-Tf/lJdriuGTGbC4jxicdev3s784= - minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -5790,7 +5784,7 @@ mocha-junit-reporter@^1.17.0: strip-ansi "^4.0.0" xml "^1.0.0" -mocha@^2.0.1, mocha@^2.2.5: +mocha@^2.2.5: version "2.5.3" resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" integrity sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg= @@ -5828,6 +5822,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + multimatch@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -5838,12 +5837,10 @@ multimatch@^2.0.0: arrify "^1.0.0" minimatch "^3.0.0" -multipipe@^0.1.0, multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - integrity sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s= - dependencies: - duplexer2 "0.0.2" +mute-stdout@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" + integrity sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg== mute-stream@0.0.5: version "0.0.5" @@ -5907,11 +5904,6 @@ native-watchdog@1.0.0: resolved "https://registry.yarnpkg.com/native-watchdog/-/native-watchdog-1.0.0.tgz#97344e83cd6815a8c8e6c44a52e7be05832e65ca" integrity sha512-HKQATz5KLUMPyQQ/QaalzgTXaGz2plYPBxjyalaR4ECIu/UznXY8YJD+a9SLkkcvtxnJ8/zHLY3xik06vUZ7uA== -natives@^1.1.0: - version "1.1.4" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.4.tgz#2f0f224fc9a7dd53407c7667c84cf8dbe773de58" - integrity sha512-Q29yeg9aFKwhLVdkTAejM/HvYG0Y1Am1+HUkFQGn5k2j8GS+v60TVmZh6nujpEAj/qql+wGUrlryO8bF+b1jEg== - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6000,11 +5992,6 @@ node-pty@0.8.1: dependencies: nan "2.12.1" -node-uuid@~1.4.0, node-uuid@~1.4.7: - version "1.4.8" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" - integrity sha1-sEDrCSOWivq/jTL7HxfxFn/auQc= - node.extend@~1.1.2: version "1.1.6" resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" @@ -6017,14 +6004,14 @@ noop-logger@^0.1.1: resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= -nopt@3.x, nopt@^3.0.1, nopt@~3.0.1: +nopt@3.x, nopt@^3.0.1: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" -nopt@^4.0.1: +nopt@^4.0.1, nopt@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= @@ -6066,6 +6053,11 @@ normalize-path@^2.0.1: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.0.1.tgz#47886ac1662760d4261b7d979d241709d3ce3f7a" integrity sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o= +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== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" @@ -6163,11 +6155,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^3.0.0: - version "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.0, 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" @@ -6209,7 +6196,7 @@ object.assign@^4.0.4: has-symbols "^1.0.0" object-keys "^1.0.11" -object.defaults@^1.1.0: +object.defaults@^1.0.0, object.defaults@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= @@ -6219,6 +6206,14 @@ object.defaults@^1.1.0: for-own "^1.0.0" isobject "^3.0.0" +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + object.omit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.0.tgz#868597333d54e60662940bb458605dd6ae12fe94" @@ -6234,6 +6229,14 @@ object.pick@^1.2.0, object.pick@^1.3.0: dependencies: isobject "^3.0.1" +object.reduce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.reduce/-/object.reduce-1.0.1.tgz#6fe348f2ac7fa0f95ca621226599096825bb03ad" + integrity sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60= + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -6248,13 +6251,6 @@ once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - integrity sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA= - dependencies: - wrappy "1" - onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -6313,20 +6309,6 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - integrity sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4= - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - integrity sha1-/VZamvjrRHO6abbtijQ1LLVS8SY= - ordered-read-streams@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" @@ -6352,6 +6334,13 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -6458,6 +6447,13 @@ parallel-transform@^1.1.0: inherits "^2.0.3" readable-stream "^2.1.5" +parent-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" + integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== + dependencies: + callsites "^3.0.0" + parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" @@ -6495,6 +6491,11 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-node-version@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -6556,7 +6557,7 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= @@ -6571,6 +6572,11 @@ path-parse@^1.0.5: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" integrity sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME= +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + path-root-regex@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" @@ -6670,7 +6676,7 @@ plist@^3.0.1: xmlbuilder "^9.0.7" xmldom "0.1.x" -plugin-error@^0.1.2: +plugin-error@0.1.2, plugin-error@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" integrity sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4= @@ -6681,7 +6687,7 @@ plugin-error@^0.1.2: arr-union "^2.0.1" extend-shallow "^1.1.2" -plugin-error@^1.0.1: +plugin-error@1.0.1, plugin-error@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" integrity sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA== @@ -6691,13 +6697,6 @@ plugin-error@^1.0.1: arr-union "^3.1.0" extend-shallow "^3.0.2" -plur@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" - integrity sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo= - dependencies: - irregular-plurals "^1.0.0" - pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -7010,7 +7009,7 @@ priorityqueuejs@1.0.0: resolved "https://registry.yarnpkg.com/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz#2ee4f23c2560913e08c07ce5ccdd6de3df2c5af8" integrity sha1-LuTyPCVgkT4IwHzlzN1t498sWvg= -process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: +process-nextick-args@^1.0.6, process-nextick-args@^1.0.7, process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= @@ -7038,6 +7037,11 @@ progress@^1.1.8: resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" @@ -7140,11 +7144,6 @@ qs@6.5.1, qs@~6.5.1: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" integrity sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A== -qs@~6.2.0: - version "6.2.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" - integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= - qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" @@ -7299,6 +7298,15 @@ read@^1.0.7: string_decoder "~1.1.1" util-deprecate "~1.0.1" +"readable-stream@2 || 3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.1.1.tgz#ed6bbc6c5ba58b090039ff18ce670515795aeb06" + integrity sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + "readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -7332,7 +7340,7 @@ readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@~2.0.0, readable-stream@~2.0.5: +readable-stream@~2.0.0: version "2.0.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" integrity sha1-j5A0HmilPMySh4jaz80Rs265t44= @@ -7354,6 +7362,15 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^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" + readline2@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" @@ -7410,16 +7427,21 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -remap-istanbul@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.6.4.tgz#ac551eff1aa641504b4f318d0303dda61e3bb695" - integrity sha1-rFUe/xqmQVBLTzGNAwPdph47tpU= +regexpp@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== + +remap-istanbul@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/remap-istanbul/-/remap-istanbul-0.13.0.tgz#a529dfd080bb760f5274e3671c9c065f29923ed1" + integrity sha512-rS5ZpVAx3fGtKZkiBe1esXg5mKYbgW9iz8kkADFt3p6lo3NsBBUX1q6SwdhwUtYCGnr7nK6gRlbYK3i8R0jbRA== dependencies: - amdefine "1.0.0" - gulp-util "3.0.7" - istanbul "0.4.3" - source-map ">=0.5.6" - through2 "2.0.1" + istanbul "0.4.5" + minimatch "^3.0.4" + plugin-error "^1.0.1" + source-map "0.6.1" + through2 "3.0.0" remove-bom-buffer@^3.0.0: version "3.0.0" @@ -7438,7 +7460,7 @@ remove-bom-stream@^1.2.0: safe-buffer "^5.1.0" through2 "^2.0.3" -remove-trailing-separator@^1.0.1: +remove-trailing-separator@^1.0.1, remove-trailing-separator@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= @@ -7458,13 +7480,6 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -repeating@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" - integrity sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw= - dependencies: - is-finite "^1.0.0" - repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" @@ -7482,6 +7497,15 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= +replace-homedir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-homedir/-/replace-homedir-1.0.0.tgz#e87f6d513b928dde808260c12be7fec6ff6e798c" + integrity sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw= + dependencies: + homedir-polyfill "^1.0.1" + is-absolute "^1.0.0" + remove-trailing-separator "^1.1.0" + replacestream@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/replacestream/-/replacestream-4.0.3.tgz#3ee5798092be364b1cdb1484308492cb3dff2f36" @@ -7545,7 +7569,7 @@ request@2.79.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.88.0: +request@^2.86.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -7571,33 +7595,6 @@ request@^2.88.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -request@~2.74.0: - version "2.74.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" - integrity sha1-dpPKdou7DqXIzgjAhKRe+gW4kqs= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - bl "~1.1.2" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~1.0.0-rc4" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - node-uuid "~1.4.7" - oauth-sign "~0.8.1" - qs "~6.2.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -7623,13 +7620,13 @@ resolve-cwd@^2.0.0: dependencies: resolve-from "^3.0.0" -resolve-dir@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" - integrity sha1-shklmlYC+sXFxJatiUpujMQwJh4= +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= dependencies: - expand-tilde "^1.2.2" - global-modules "^0.2.3" + expand-tilde "^2.0.0" + global-modules "^1.0.0" resolve-from@^1.0.0: version "1.0.1" @@ -7641,6 +7638,11 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + resolve-options@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" @@ -7665,6 +7667,13 @@ resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: dependencies: path-parse "^1.0.5" +resolve@^1.4.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -7753,6 +7762,13 @@ rxjs@^6.1.0: dependencies: tslib "^1.9.0" +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -7785,10 +7801,10 @@ samsam@~1.1: resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" integrity sha1-n1CHQZtNCR8jJXHn+lLpCw9VJiE= -sax@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.2.tgz#735ffaa39a1cff8ffb9598f0223abdb03a9fb2ea" - integrity sha1-c1/6o5oc/4/7lZjwIjq9sDqfsuo= +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= sax@>=0.6.0, sax@^1.2.4, sax@~1.2.1: version "1.2.4" @@ -7808,12 +7824,19 @@ semaphore@1.0.5: resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.0.5.tgz#b492576e66af193db95d65e25ec53f5f19798d60" integrity sha1-tJJXbmavGT25XWXiXsU/Xxl5jWA= +semver-greatest-satisfied-range@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" + integrity sha1-E+jCZYq5aRywzXEJMkAoDTb3els= + dependencies: + sver-compat "^1.5.0" + "semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== -semver@^4.1.0, semver@^4.3.4: +semver@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" integrity sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto= @@ -7823,6 +7846,11 @@ semver@^5.0.1, semver@^5.4.1, semver@^5.5.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== +semver@^5.5.1, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + send@0.16.1: version "0.16.1" resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" @@ -7842,11 +7870,6 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - integrity sha1-kM/xnQLgcCf9dn9erT57ldHnOAw= - serialize-javascript@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" @@ -7987,6 +8010,15 @@ slice-ansi@0.0.4: resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= +slice-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== + dependencies: + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" + smart-buffer@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" @@ -8087,7 +8119,7 @@ source-map@0.4.x, source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@>=0.5.6, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -8181,6 +8213,11 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" +stack-trace@0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" @@ -8214,11 +8251,6 @@ stream-combiner@~0.0.4: dependencies: duplexer "~0.1.1" -stream-consume@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" - integrity sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8= - stream-each@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" @@ -8227,6 +8259,11 @@ stream-each@^1.1.0: end-of-stream "^1.1.0" stream-shift "^1.0.0" +stream-exhaust@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/stream-exhaust/-/stream-exhaust-1.0.2.tgz#acdac8da59ef2bc1e17a2c0ccf6c320d120e555d" + integrity sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw== + stream-http@^2.7.2: version "2.8.3" resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" @@ -8260,7 +8297,7 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= -string-width@^1.0.1: +string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -8284,6 +8321,13 @@ string_decoder@^1.0.0, string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -8301,13 +8345,6 @@ 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@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - integrity sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA= - dependencies: - ansi-regex "^0.2.1" - 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" @@ -8322,6 +8359,13 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== + dependencies: + ansi-regex "^4.0.0" + strip-bom-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" @@ -8330,14 +8374,6 @@ strip-bom-stream@^1.0.0: first-chunk-stream "^1.0.0" strip-bom "^2.0.0" -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - integrity sha1-hbiGLzhEtabV7IRnqTWYFzo295Q= - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8362,7 +8398,7 @@ strip-indent@^1.0.1: dependencies: get-stdin "^4.0.1" -strip-json-comments@~2.0.1: +strip-json-comments@^2.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= @@ -8384,11 +8420,6 @@ supports-color@1.2.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" integrity sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4= -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - integrity sha1-2S3iaU6z9nMjlz1649i1W0wiGQo= - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" @@ -8408,6 +8439,13 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.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" @@ -8415,6 +8453,14 @@ supports-color@^5.3.0, supports-color@^5.4.0: dependencies: has-flag "^3.0.0" +sver-compat@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" + integrity sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg= + dependencies: + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -8440,6 +8486,16 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" +table@^5.0.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/table/-/table-5.2.2.tgz#61d474c9e4d8f4f7062c98c7504acb3c08aa738f" + integrity sha512-f8mJmuu9beQEDkKHLzOv4VxVYlU68NpdzjbGPl69i4Hx0sTopJuNxuzJd17iV2h24dAfa93u794OnDA5jqXvfQ== + dependencies: + ajv "^6.6.1" + lodash "^4.17.11" + slice-ansi "^2.0.0" + string-width "^2.1.1" + tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" @@ -8489,7 +8545,7 @@ temp@^0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -text-table@~0.2.0: +text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= @@ -8512,31 +8568,7 @@ through2-filter@^2.0.0: through2 "~2.0.0" xtend "~4.0.0" -through2@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.1.tgz#384e75314d49f32de12eebb8136b8eb6b5d59da9" - integrity sha1-OE51MU1J8y3hLuu4E2uOtrXVnak= - dependencies: - readable-stream "~2.0.0" - xtend "~4.0.0" - -through2@^0.5.0, through2@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" - integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac= - dependencies: - readable-stream "~1.0.17" - xtend "~3.0.0" - -through2@^0.6.0, through2@^0.6.1, through2@~0.6.3: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: +through2@2.0.3, through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= @@ -8544,6 +8576,22 @@ through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2. readable-stream "^2.1.5" xtend "~4.0.1" +through2@3.0.0, through2@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.0.tgz#468b461df9cd9fcc170f22ebf6852e467e578ff2" + integrity sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ== + dependencies: + readable-stream "2 || 3" + xtend "~4.0.1" + +through2@^0.6.0: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + integrity sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg= + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + through2@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" @@ -8560,18 +8608,11 @@ through2@~0.4.0: readable-stream "~1.0.17" xtend "~2.1.1" -through@2, through@^2.3.4, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.8: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3, through@~2.3.1, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo= - dependencies: - os-homedir "^1.0.0" - time-stamp@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" @@ -8906,15 +8947,30 @@ unc-path-regex@^0.1.0, unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= -underscore@1.8.3, underscore@^1.8.2, underscore@^1.8.3: +underscore@1.8.3, underscore@^1.8.2, underscore@^1.8.3, underscore@~1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI= -underscore@~1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.4.4.tgz#61a6a32010622afa07963bf325203cf12239d604" - integrity sha1-YaajIBBiKvoHljvzJSA88SI51gQ= +undertaker-registry@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" + integrity sha1-XkvaMI5KiirlhPm5pDWaSZglzFA= + +undertaker@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/undertaker/-/undertaker-1.2.0.tgz#339da4646252d082dc378e708067299750e11b49" + integrity sha1-M52kZGJS0ILcN45wgGcpl1DhG0k= + dependencies: + arr-flatten "^1.0.1" + arr-map "^2.0.0" + bach "^1.0.0" + collection-map "^1.0.0" + es6-weak-map "^2.0.1" + last-run "^1.1.0" + object.defaults "^1.0.0" + object.reduce "^1.0.0" + undertaker-registry "^1.0.0" union-value@^1.0.0: version "1.0.0" @@ -8957,11 +9013,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - integrity sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs= - unique-stream@^2.0.2: version "2.2.1" resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" @@ -8988,12 +9039,12 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5: +upath@^1.0.5, upath@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== -uri-js@^4.2.1: +uri-js@^4.2.1, uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== @@ -9023,11 +9074,6 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - integrity sha1-K1viOjK2Onyd640PKNSFcko98ZA= - user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" @@ -9035,7 +9081,7 @@ user-home@^2.0.0: dependencies: os-homedir "^1.0.0" -util-deprecate@~1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= @@ -9081,12 +9127,12 @@ v8-inspect-profiler@^0.0.20: dependencies: chrome-remote-interface "0.26.1" -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - integrity sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ= +v8flags@^3.0.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.1.2.tgz#fc5cd0c227428181e6c29b2992e4f8f1da5e0c9f" + integrity sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw== dependencies: - user-home "^1.1.1" + homedir-polyfill "^1.0.1" vali-date@^1.0.0: version "1.0.0" @@ -9101,10 +9147,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" -validator@~3.22.2: - version "3.22.2" - resolved "https://registry.yarnpkg.com/validator/-/validator-3.22.2.tgz#6f297ae67f7f82acc76d0afdb49f18d9a09c18c0" - integrity sha1-byl65n9/gqzHbQr9tJ8Y2aCcGMA= +validator@~9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663" + integrity sha512-YV5KjzvRmSyJ1ee/Dm5UED0G+1L4GZnLN3w6/T+zZm8scVua4sOhYKWTUrKa0H/tMiJyO9QLHMPN+9mB/aMunA== value-or-function@^3.0.0: version "3.0.0" @@ -9130,20 +9176,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl-fs@^0.3.0, vinyl-fs@^0.3.13: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - integrity sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY= - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - vinyl-fs@^2.4.3: version "2.4.4" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" @@ -9167,7 +9199,7 @@ vinyl-fs@^2.4.3: vali-date "^1.0.0" vinyl "^1.0.0" -vinyl-fs@^3.0.3: +vinyl-fs@^3.0.0, vinyl-fs@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== @@ -9210,30 +9242,6 @@ vinyl-sourcemaps-apply@^0.2.0, vinyl-sourcemaps-apply@^0.2.1: dependencies: source-map "^0.5.1" -vinyl@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" - integrity sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI= - dependencies: - clone-stats "~0.0.1" - -vinyl@^0.4.0, vinyl@^0.4.3, vinyl@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - integrity sha1-LzVsh6VQolVGHza76ypbqL94SEc= - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - integrity sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4= - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - vinyl@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" @@ -9372,15 +9380,16 @@ vscode-languageserver@^5.1.0: vscode-languageserver-protocol "3.13.0" vscode-uri "^1.0.6" -vscode-nls-dev@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vscode-nls-dev/-/vscode-nls-dev-3.2.2.tgz#5855c9b3e566dd00fd6108f9c2e1bd02c925c153" - integrity sha512-6XyESZOyNowLza/fV6Kfmwx0+0iNwa4OkTsBRepwP+eaR7JYnf/ohPaFDX7Egqe4330swtRDCbqr+7i3Q9/TvA== +vscode-nls-dev@3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/vscode-nls-dev/-/vscode-nls-dev-3.2.4.tgz#9eb92a539fb1ee675836b6aeab8a2846c281c8d9" + integrity sha512-mWERxHbifhuNZomuL3iRyw2LTwKnoKoA8fjWJrlfnbOUF9EN/tbDT0ly2GnOEvLRq0hzEzZNqKLWu0jXPDs7UA== dependencies: + ansi-colors "^3.2.3" clone "^2.1.1" event-stream "^3.3.4" + fancy-log "^1.3.3" glob "^7.1.2" - gulp-util "^3.0.8" iconv-lite "^0.4.19" is "^3.2.1" source-map "^0.6.1" @@ -9433,10 +9442,10 @@ vscode-uri@^1.0.6: resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-1.0.6.tgz#6b8f141b0bbc44ad7b07e94f82f168ac7608ad4d" integrity sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww== -vscode-xterm@3.12.0-beta1: - version "3.12.0-beta1" - resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.12.0-beta1.tgz#7dc28214077d1d8fc306fb6f392b4b553c6b0024" - integrity sha512-bv6AbbtzMfNdku97BomTY7PJNo1Bd0sHnNy9GZmMeVm8SoLxxvhmR2PRsbYY0AD1n7wbA7l55msJKye57+mD/w== +vscode-xterm@3.12.0-beta2: + version "3.12.0-beta2" + resolved "https://registry.yarnpkg.com/vscode-xterm/-/vscode-xterm-3.12.0-beta2.tgz#fbbf6d1926e0628d4e0b85b1bfdefa2b0bf40df6" + integrity sha512-NhLYyJXjwLXXzn+NYEOkAtTxbdbAGkjztabE2Vy8j4fXXOwHHHg6KurMCbL7bd8BOEMIPrTIw6zLhzfexs5Vhw== vso-node-api@6.1.2-preview: version "6.1.2-preview" @@ -9533,6 +9542,11 @@ whet.extend@~0.9.9: resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" integrity sha1-+HfVv2SMl+WqVC+twW1qJZucEaE= +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -9543,13 +9557,20 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= -which@^1.1.1, which@^1.2.12, which@^1.2.9: +which@^1.1.1, which@^1.2.9: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" integrity sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg== dependencies: isexe "^2.0.0" +which@^1.2.14: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -9643,12 +9664,12 @@ xml-name-validator@^1.0.0: resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-1.0.0.tgz#dcf82ee092322951ef8cc1ba596c9cbfd14a83f1" integrity sha1-3Pgu4JIyKVHvjMG6WWycv9FKg/E= -xml2js@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.7.tgz#1838518bb01741cae0878bab4915e494c32306af" - integrity sha1-GDhRi7AXQcrgh4urSRXklMMjBq8= +xml2js@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.8.tgz#9b81690931631ff09d1957549faf54f4f980b3c2" + integrity sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I= dependencies: - sax "0.5.2" + sax "0.5.x" xml2js@^0.4.19: version "0.4.19" @@ -9663,11 +9684,6 @@ xml@^1.0.0: resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5" integrity sha1-eLpyAgApxbyHuKgaPPzXS0ovweU= -xmlbuilder@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.3.tgz#c4614ba74e0ad196e609c9272cd9e1ddb28a8a58" - integrity sha1-xGFLp04K0ZbmCcknLNnh3bKKilg= - xmlbuilder@^9.0.7: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" @@ -9705,11 +9721,6 @@ xtend@~2.1.1: dependencies: object-keys "~0.4.0" -xtend@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" - integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= - y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" @@ -9737,6 +9748,13 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= + dependencies: + camelcase "^3.0.0" + yargs-parser@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" @@ -9780,6 +9798,25 @@ yargs@^12.0.1: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"