diff --git a/src/vs/editor/contrib/format/common/format.ts b/src/vs/editor/contrib/format/common/format.ts index 681a9d7d0eba70ad4b4e20db09797251e12acde1..44820b30b1fd4b49cfdf5f06614ea857675a286c 100644 --- a/src/vs/editor/contrib/format/common/format.ts +++ b/src/vs/editor/contrib/format/common/format.ts @@ -22,7 +22,9 @@ export const FormatOnTypeRegistry = new LanguageFeatureRegistry { - const [support] = FormatRegistry.ordered(model); + const [support] = FormatRegistry.ordered(model) + .filter(s => typeof s.formatRange === 'function'); + if (!support) { return TPromise.as(undefined); } diff --git a/src/vs/workbench/test/common/api/extHostLanguageFeatures.test.ts b/src/vs/workbench/test/common/api/extHostLanguageFeatures.test.ts index 7d5664e138fad1a8a24bfb8d0c70528773e21f8b..9334a3a4fe50e5a7922bf665c1eddf7e282a9f38 100644 --- a/src/vs/workbench/test/common/api/extHostLanguageFeatures.test.ts +++ b/src/vs/workbench/test/common/api/extHostLanguageFeatures.test.ts @@ -958,6 +958,27 @@ suite('ExtHostLanguageFeatures', function() { }); }) + test('Format Range, + format_doc', function(done) { + disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { + provideDocumentRangeFormattingEdits(): any { + return [new types.TextEdit(new types.Range(0, 0, 1, 1), 'range')]; + } + })); + disposables.push(extHost.registerDocumentFormattingEditProvider(defaultSelector, { + provideDocumentFormattingEdits(): any { + return [new types.TextEdit(new types.Range(0, 0, 1, 1), 'doc')]; + } + })); + threadService.sync().then(() => { + formatRange(model, { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: 1 }, { insertSpaces: true, tabSize: 4 }).then(value => { + assert.equal(value.length, 1); + let [first] = value; + assert.equal(first.text, 'range'); + done(); + }); + }); + }); + test('Format Range, evil provider', function(done) { disposables.push(extHost.registerDocumentRangeFormattingEditProvider(defaultSelector, { provideDocumentRangeFormattingEdits(): any {