diff --git a/build/lib/i18n.resources.json b/build/lib/i18n.resources.json index 715a478c13547c2aa757745fb6346935014a46e9..fe693b695b40bddeac45f19f1f6b148f33670701 100644 --- a/build/lib/i18n.resources.json +++ b/build/lib/i18n.resources.json @@ -62,10 +62,6 @@ "name": "vs/workbench/contrib/debug", "project": "vscode-workbench" }, - { - "name": "vs/workbench/contrib/documentation", - "project": "vscode-workbench" - }, { "name": "vs/workbench/contrib/emmet", "project": "vscode-workbench" diff --git a/extensions/git/package.json b/extensions/git/package.json index 922a16d0bf0bd58fc726abdc40709636279fc0f2..596f04228870df080e88c0225e941514375b38e5 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1762,35 +1762,33 @@ ] } }, - "documentation": { - "view": [ - { - "view": "workbench.scm", - "contents": "%view.workbench.scm.disabled%", - "when": "!config.git.enabled" - }, - { - "view": "workbench.scm", - "contents": "%view.workbench.scm.missing%", - "when": "config.git.enabled && git.missing" - }, - { - "view": "workbench.scm", - "contents": "%view.workbench.scm.empty%", - "when": "config.git.enabled && !git.missing && workbenchState == empty" - }, - { - "view": "workbench.scm", - "contents": "%view.workbench.scm.folder%", - "when": "config.git.enabled && !git.missing && workbenchState == folder" - }, - { - "view": "workbench.scm", - "contents": "%view.workbench.scm.workspace%", - "when": "config.git.enabled && !git.missing && workbenchState == workspace" - } - ] - } + "viewsWelcome": [ + { + "view": "workbench.scm", + "contents": "%view.workbench.scm.disabled%", + "when": "!config.git.enabled" + }, + { + "view": "workbench.scm", + "contents": "%view.workbench.scm.missing%", + "when": "config.git.enabled && git.missing" + }, + { + "view": "workbench.scm", + "contents": "%view.workbench.scm.empty%", + "when": "config.git.enabled && !git.missing && workbenchState == empty" + }, + { + "view": "workbench.scm", + "contents": "%view.workbench.scm.folder%", + "when": "config.git.enabled && !git.missing && workbenchState == folder" + }, + { + "view": "workbench.scm", + "contents": "%view.workbench.scm.workspace%", + "when": "config.git.enabled && !git.missing && workbenchState == workspace" + } + ] }, "dependencies": { "byline": "^5.0.0", diff --git a/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts b/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts index ccdbb435b2505ae9b7091fdbc00a6e8ed93bb9ca..c7969c9d1c0b842b07eb493d623d190a9d96e707 100644 --- a/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts +++ b/src/vs/workbench/contrib/codeActions/common/codeActions.contribution.ts @@ -10,9 +10,12 @@ import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; import { CodeActionsContribution, editorConfiguration } from 'vs/workbench/contrib/codeActions/common/codeActionsContribution'; import { CodeActionsExtensionPoint, codeActionsExtensionPointDescriptor } from 'vs/workbench/contrib/codeActions/common/codeActionsExtensionPoint'; +import { CodeActionDocumentationContribution } from 'vs/workbench/contrib/codeActions/common/documentationContribution'; +import { DocumentationExtensionPoint, documentationExtensionPointDescriptor } from 'vs/workbench/contrib/codeActions/common/documentationExtensionPoint'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; const codeActionsExtensionPoint = ExtensionsRegistry.registerExtensionPoint(codeActionsExtensionPointDescriptor); +const documentationExtensionPoint = ExtensionsRegistry.registerExtensionPoint(documentationExtensionPointDescriptor); Registry.as(Extensions.Configuration) .registerConfiguration(editorConfiguration); @@ -22,6 +25,7 @@ class WorkbenchConfigurationContribution { @IInstantiationService instantiationService: IInstantiationService, ) { instantiationService.createInstance(CodeActionsContribution, codeActionsExtensionPoint); + instantiationService.createInstance(CodeActionDocumentationContribution, documentationExtensionPoint); } } diff --git a/src/vs/workbench/contrib/codeActions/common/documentationContribution.ts b/src/vs/workbench/contrib/codeActions/common/documentationContribution.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c2b75c277dc4103aa688f7481e3719f184fff1b --- /dev/null +++ b/src/vs/workbench/contrib/codeActions/common/documentationContribution.ts @@ -0,0 +1,84 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { CancellationToken } from 'vs/base/common/cancellation'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { Range } from 'vs/editor/common/core/range'; +import { Selection } from 'vs/editor/common/core/selection'; +import { ITextModel } from 'vs/editor/common/model'; +import * as modes from 'vs/editor/common/modes'; +import { CodeActionKind } from 'vs/editor/contrib/codeAction/types'; +import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { DocumentationExtensionPoint } from './documentationExtensionPoint'; + + +export class CodeActionDocumentationContribution extends Disposable implements IWorkbenchContribution, modes.CodeActionProvider { + + private contributions: { + title: string; + when: ContextKeyExpr; + command: string; + }[] = []; + + private readonly emptyCodeActionsList = { + actions: [], + dispose: () => { } + }; + + constructor( + extensionPoint: IExtensionPoint, + @IContextKeyService private readonly contextKeyService: IContextKeyService, + ) { + super(); + + this._register(modes.CodeActionProviderRegistry.register('*', this)); + + extensionPoint.setHandler(points => { + this.contributions = []; + for (const documentation of points) { + if (!documentation.value.refactoring) { + continue; + } + + for (const contribution of documentation.value.refactoring) { + const precondition = ContextKeyExpr.deserialize(contribution.when); + if (!precondition) { + continue; + } + + this.contributions.push({ + title: contribution.title, + when: precondition, + command: contribution.command + }); + + } + } + }); + } + + async provideCodeActions(_model: ITextModel, _range: Range | Selection, context: modes.CodeActionContext, _token: CancellationToken): Promise { + return this.emptyCodeActionsList; + } + + public _getAdditionalMenuItems(context: modes.CodeActionContext, actions: readonly modes.CodeAction[]): modes.Command[] { + if (context.only !== CodeActionKind.Refactor.value) { + if (!actions.some(action => action.kind && CodeActionKind.Refactor.contains(new CodeActionKind(action.kind)))) { + return []; + } + } + + return this.contributions + .filter(contribution => this.contextKeyService.contextMatchesRules(contribution.when)) + .map(contribution => { + return { + id: contribution.command, + title: contribution.title + }; + }); + } +} diff --git a/src/vs/workbench/contrib/documentation/common/documentationExtensionPoint.ts b/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint.ts similarity index 65% rename from src/vs/workbench/contrib/documentation/common/documentationExtensionPoint.ts rename to src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint.ts index d2099c4a8bc4725ba81de9a49c3440ce38f2c6a6..bb848f8d64d17d2f5ca6c9cf53516ff524099348 100644 --- a/src/vs/workbench/contrib/documentation/common/documentationExtensionPoint.ts +++ b/src/vs/workbench/contrib/codeActions/common/documentationExtensionPoint.ts @@ -11,8 +11,6 @@ export enum DocumentationExtensionPointFields { when = 'when', title = 'title', command = 'command', - view = 'view', - contents = 'contents', } export interface RefactoringDocumentationExtensionPoint { @@ -21,15 +19,8 @@ export interface RefactoringDocumentationExtensionPoint { readonly [DocumentationExtensionPointFields.command]: string; } -export interface ViewDocumentationExtensionPoint { - readonly [DocumentationExtensionPointFields.view]: string; - readonly [DocumentationExtensionPointFields.contents]: string; - readonly [DocumentationExtensionPointFields.when]: string; -} - export interface DocumentationExtensionPoint { readonly refactoring?: readonly RefactoringDocumentationExtensionPoint[]; - readonly view?: readonly ViewDocumentationExtensionPoint[]; } const documentationExtensionPointSchema = Object.freeze({ @@ -62,32 +53,6 @@ const documentationExtensionPointSchema = Object.freeze(ViewContainerExtensions.ViewsRegistry); - -export class DocumentationContribution extends Disposable implements IWorkbenchContribution, modes.CodeActionProvider { - - private codeActionContributions: ICodeActionContribution[] = []; - private readonly emptyCodeActionsList = { actions: [], dispose: () => { } }; - - private emptyViewContents = new Map(); - - constructor( - extensionPoint: IExtensionPoint, - @IContextKeyService private readonly contextKeyService: IContextKeyService, - ) { - super(); - - this._register(modes.CodeActionProviderRegistry.register('*', this)); - - extensionPoint.setHandler((points, { added, removed }) => { - for (const documentation of points) { - if (documentation.value.refactoring) { - for (const contribution of documentation.value.refactoring) { - const precondition = ContextKeyExpr.deserialize(contribution.when); - if (!precondition) { - continue; - } - - this.codeActionContributions.push({ - title: contribution.title, - when: precondition, - command: contribution.command - }); - } - } - } - - for (const documentation of removed) { - if (documentation.value.view) { - for (const contribution of documentation.value.view) { - const disposable = this.emptyViewContents.get(contribution); - - if (disposable) { - disposable.dispose(); - } - } - } - } - - for (const documentation of added) { - if (documentation.value.view) { - for (const contribution of documentation.value.view) { - const disposable = viewsRegistry.registerEmptyViewContent(contribution.view, { - content: contribution.contents, - when: ContextKeyExpr.deserialize(contribution.when) - }); - - this.emptyViewContents.set(contribution, disposable); - } - } - } - }); - } - - async provideCodeActions(_model: ITextModel, _range: Range | Selection, context: modes.CodeActionContext, _token: CancellationToken): Promise { - return this.emptyCodeActionsList; - } - - public _getAdditionalMenuItems(context: modes.CodeActionContext, actions: readonly modes.CodeAction[]): modes.Command[] { - if (context.only !== CodeActionKind.Refactor.value) { - if (!actions.some(action => action.kind && CodeActionKind.Refactor.contains(new CodeActionKind(action.kind)))) { - return []; - } - } - - return this.codeActionContributions - .filter(contribution => this.contextKeyService.contextMatchesRules(contribution.when)) - .map(contribution => { - return { - id: contribution.command, - title: contribution.title - }; - }); - } -} diff --git a/src/vs/workbench/contrib/documentation/common/documentation.contribution.ts b/src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts similarity index 68% rename from src/vs/workbench/contrib/documentation/common/documentation.contribution.ts rename to src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts index 13f09eee18727a333e89466d1a1523b585d75d03..9153e3c1a4d8d8b79c5f12193212b0de87bb51dd 100644 --- a/src/vs/workbench/contrib/documentation/common/documentation.contribution.ts +++ b/src/vs/workbench/contrib/welcome/common/viewsWelcome.contribution.ts @@ -7,17 +7,17 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { LifecyclePhase } from 'vs/platform/lifecycle/common/lifecycle'; import { Registry } from 'vs/platform/registry/common/platform'; import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions'; -import { DocumentationContribution } from 'vs/workbench/contrib/documentation/common/documentationContribution'; -import { DocumentationExtensionPoint, documentationExtensionPointDescriptor } from 'vs/workbench/contrib/documentation/common/documentationExtensionPoint'; +import { ViewsWelcomeContribution } from 'vs/workbench/contrib/welcome/common/viewsWelcomeContribution'; +import { ViewsWelcomeExtensionPoint, viewsWelcomeExtensionPointDescriptor } from 'vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint'; import { ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry'; -const documentationExtensionPoint = ExtensionsRegistry.registerExtensionPoint(documentationExtensionPointDescriptor); +const extensionPoint = ExtensionsRegistry.registerExtensionPoint(viewsWelcomeExtensionPointDescriptor); class WorkbenchConfigurationContribution { constructor( @IInstantiationService instantiationService: IInstantiationService, ) { - instantiationService.createInstance(DocumentationContribution, documentationExtensionPoint); + instantiationService.createInstance(ViewsWelcomeContribution, extensionPoint); } } diff --git a/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts b/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts new file mode 100644 index 0000000000000000000000000000000000000000..d943b90176c2ba0c84e5819a7d2d1051a15b497f --- /dev/null +++ b/src/vs/workbench/contrib/welcome/common/viewsWelcomeContribution.ts @@ -0,0 +1,46 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; +import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; +import { IExtensionPoint } from 'vs/workbench/services/extensions/common/extensionsRegistry'; +import { ViewsWelcomeExtensionPoint, ViewWelcome } from './viewsWelcomeExtensionPoint'; +import { Registry } from 'vs/platform/registry/common/platform'; +import { Extensions as ViewContainerExtensions, IViewsRegistry } from 'vs/workbench/common/views'; + +const viewsRegistry = Registry.as(ViewContainerExtensions.ViewsRegistry); + +export class ViewsWelcomeContribution extends Disposable implements IWorkbenchContribution { + + private viewWelcomeContents = new Map(); + + constructor(extensionPoint: IExtensionPoint) { + super(); + + extensionPoint.setHandler((_, { added, removed }) => { + for (const contribution of removed) { + for (const welcome of contribution.value) { + const disposable = this.viewWelcomeContents.get(welcome); + + if (disposable) { + disposable.dispose(); + } + } + } + + for (const contribution of added) { + for (const welcome of contribution.value) { + const disposable = viewsRegistry.registerEmptyViewContent(welcome.view, { + content: welcome.contents, + when: ContextKeyExpr.deserialize(welcome.when) + }); + + this.viewWelcomeContents.set(welcome, disposable); + } + } + }); + } +} diff --git a/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint.ts b/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint.ts new file mode 100644 index 0000000000000000000000000000000000000000..28a5bc02dfad341bdad7e7ac3d9c938547f380c7 --- /dev/null +++ b/src/vs/workbench/contrib/welcome/common/viewsWelcomeExtensionPoint.ts @@ -0,0 +1,53 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import * as nls from 'vs/nls'; +import { IConfigurationPropertySchema } from 'vs/platform/configuration/common/configurationRegistry'; + +export enum ViewsWelcomeExtensionPointFields { + view = 'view', + contents = 'contents', + when = 'when', +} + +export interface ViewWelcome { + readonly [ViewsWelcomeExtensionPointFields.view]: string; + readonly [ViewsWelcomeExtensionPointFields.contents]: string; + readonly [ViewsWelcomeExtensionPointFields.when]: string; +} + +export type ViewsWelcomeExtensionPoint = ViewWelcome[]; + +const viewsWelcomeExtensionPointSchema = Object.freeze({ + type: 'array', + description: nls.localize('contributes.viewsWelcome', "Contributed views welcome content."), + items: { + type: 'object', + description: nls.localize('contributes.viewsWelcome.view', "Contributed welcome content for a specific view."), + required: [ + ViewsWelcomeExtensionPointFields.view, + ViewsWelcomeExtensionPointFields.contents + ], + properties: { + [ViewsWelcomeExtensionPointFields.view]: { + type: 'string', + description: nls.localize('contributes.viewsWelcome.view.view', "View identifier for this welcome content."), + }, + [ViewsWelcomeExtensionPointFields.contents]: { + type: 'string', + description: nls.localize('contributes.viewsWelcome.view.contents', "Welcome content."), + }, + [ViewsWelcomeExtensionPointFields.when]: { + type: 'string', + description: nls.localize('contributes.viewsWelcome.view.when', "When clause for this welcome content."), + }, + } + } +}); + +export const viewsWelcomeExtensionPointDescriptor = { + extensionPoint: 'viewsWelcome', + jsonSchema: viewsWelcomeExtensionPointSchema +}; diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index ee4edc24c591cc93301541b77024b83c8ca34921..1e943601b665e8fd86bd42c9f18b64a664dcda5e 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -272,8 +272,8 @@ import 'vs/workbench/contrib/userDataSync/browser/userDataSync.contribution'; // Code Actions import 'vs/workbench/contrib/codeActions/common/codeActions.contribution'; -// Documentation -import 'vs/workbench/contrib/documentation/common/documentation.contribution'; +// Welcome +import 'vs/workbench/contrib/welcome/common/viewsWelcome.contribution'; // Timeline import 'vs/workbench/contrib/timeline/browser/timeline.contribution';