diff --git a/extensions/typescript-language-features/src/features/autoFix.ts b/extensions/typescript-language-features/src/features/autoFix.ts index 7dfd96d3d23..2a9e9d1f0e7 100644 --- a/extensions/typescript-language-features/src/features/autoFix.ts +++ b/extensions/typescript-language-features/src/features/autoFix.ts @@ -38,7 +38,7 @@ class TypeScriptAutoFixProvider implements vscode.CodeActionProvider { context: vscode.CodeActionContext, token: vscode.CancellationToken ): Promise { - if (!context.only || !(context.only.contains(vscode.CodeActionKind.SourceAutoFix) || vscode.CodeActionKind.SourceAutoFix.contains(context.only))) { + if (!context.only || !vscode.CodeActionKind.SourceAutoFix.intersects(context.only)) { return undefined; } diff --git a/extensions/typescript-language-features/src/features/organizeImports.ts b/extensions/typescript-language-features/src/features/organizeImports.ts index 55458284c20..58dbea70714 100644 --- a/extensions/typescript-language-features/src/features/organizeImports.ts +++ b/extensions/typescript-language-features/src/features/organizeImports.ts @@ -82,7 +82,7 @@ export class OrganizeImportsCodeActionProvider implements vscode.CodeActionProvi return []; } - if (!context.only || !(context.only.contains(vscode.CodeActionKind.SourceOrganizeImports) || vscode.CodeActionKind.SourceOrganizeImports.contains(context.only))) { + if (!context.only || !vscode.CodeActionKind.SourceOrganizeImports.intersects(context.only)) { return []; } diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 42d9d87e05e..fd07204c108 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -2029,9 +2029,20 @@ declare module 'vscode' { append(parts: string): CodeActionKind; /** - * Does this kind contain `other`? + * Checks if this code action kind intersects `other`. * - * The kind `"refactor"` for example contains `"refactor.extract"` and ``"refactor.extract.function"`, but not `"unicorn.refactor.extract"` or `"refactory.extract"` + * The kind `"refactor.extract"` for example intersects `refactor`, `"refactor.extract"` and ``"refactor.extract.function"`, + * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"`. + * + * @param other Kind to check. + */ + intersects(other: CodeActionKind): boolean; + + /** + * Checks if `other` is a sub-kind of this `CodeActionKind`. + * + * The kind `"refactor.extract"` for example contains `"refactor.extract"` and ``"refactor.extract.function"`, + * but not `"unicorn.refactor.extract"`, or `"refactor.extractAll"` or `refactor`. * * @param other Kind to check. */ diff --git a/src/vs/workbench/api/node/extHostTypes.ts b/src/vs/workbench/api/node/extHostTypes.ts index 3662ff559ee..5535461e3dc 100644 --- a/src/vs/workbench/api/node/extHostTypes.ts +++ b/src/vs/workbench/api/node/extHostTypes.ts @@ -1032,6 +1032,10 @@ export class CodeActionKind { return new CodeActionKind(this.value ? this.value + CodeActionKind.sep + parts : parts); } + public intersects(other: CodeActionKind): boolean { + return this.contains(other) || other.contains(this); + } + public contains(other: CodeActionKind): boolean { return this.value === other.value || startsWith(other.value, this.value + CodeActionKind.sep); } diff --git a/src/vs/workbench/test/electron-browser/api/extHostTypes.test.ts b/src/vs/workbench/test/electron-browser/api/extHostTypes.test.ts index d2deeaf2163..30cf11ba5f5 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostTypes.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostTypes.test.ts @@ -532,4 +532,24 @@ suite('ExtHostTypes', function () { assert.ok(error instanceof Error); assert.ok(error instanceof types.FileSystemError); }); + + test('CodeActionKind contains', () => { + assert.ok(types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.RefactorExtract)); + assert.ok(types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.RefactorExtract.append('other'))); + + assert.ok(!types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.Refactor)); + assert.ok(!types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.Refactor.append('other'))); + assert.ok(!types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.Empty.append('other').append('refactor'))); + assert.ok(!types.CodeActionKind.RefactorExtract.contains(types.CodeActionKind.Empty.append('refactory'))); + }); + + test('CodeActionKind intersects', () => { + assert.ok(types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.RefactorExtract)); + assert.ok(types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.Refactor)); + assert.ok(types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.RefactorExtract.append('other'))); + + assert.ok(!types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.Refactor.append('other'))); + assert.ok(!types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.Empty.append('other').append('refactor'))); + assert.ok(!types.CodeActionKind.RefactorExtract.intersects(types.CodeActionKind.Empty.append('refactory'))); + }); });