diff --git a/src/vs/editor/browser/editorBrowser.ts b/src/vs/editor/browser/editorBrowser.ts index 74d75937ecb9763e99179ddcfe7a653efe40a7cd..50eed2efb08e5508e7cdf9240486113e8d953b18 100644 --- a/src/vs/editor/browser/editorBrowser.ts +++ b/src/vs/editor/browser/editorBrowser.ts @@ -864,6 +864,11 @@ export interface IDiffEditor extends editorCommon.IEditor { * @internal */ readonly renderIndicators: boolean; + /** + * Timeout in milliseconds after which diff computation is cancelled. + * @internal + */ + readonly maxComputationTime: number; /** * @see ICodeEditor.getDomNode diff --git a/src/vs/editor/browser/widget/diffEditorWidget.ts b/src/vs/editor/browser/widget/diffEditorWidget.ts index 5577af47766e900729312be693da6f2377ac9eab..4bf628a285d8c5bf01272c3f30ca09a46274e96c 100644 --- a/src/vs/editor/browser/widget/diffEditorWidget.ts +++ b/src/vs/editor/browser/widget/diffEditorWidget.ts @@ -400,6 +400,10 @@ export class DiffEditorWidget extends Disposable implements editorBrowser.IDiffE return this._renderSideBySide; } + public get maxComputationTime(): number { + return this._maxComputationTime; + } + public get renderIndicators(): boolean { return this._renderIndicators; } diff --git a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts index c994e96d83ae01f5899b0416da8a2c0c760ed6ee..878fba9d4572d89fa7b53f20a64e134d7aaf5e34 100644 --- a/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts +++ b/src/vs/workbench/contrib/codeEditor/browser/diffEditorHelper.ts @@ -12,11 +12,11 @@ import { FloatingClickWidget } from 'vs/workbench/browser/parts/editor/editorWid import { IDiffComputationResult } from 'vs/editor/common/services/editorWorkerService'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService, ConfigurationTarget } from 'vs/platform/configuration/common/configuration'; +import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; const enum WidgetState { Hidden, - HintWhitespace, - HintTimeout + HintWhitespace } class DiffEditorHelperContribution extends Disposable implements IEditorContribution { @@ -29,6 +29,7 @@ class DiffEditorHelperContribution extends Disposable implements IEditorContribu private readonly _diffEditor: IDiffEditor, @IInstantiationService private readonly _instantiationService: IInstantiationService, @IConfigurationService private readonly _configurationService: IConfigurationService, + @INotificationService private readonly _notificationService: INotificationService, ) { super(); this._helperWidget = null; @@ -37,7 +38,22 @@ class DiffEditorHelperContribution extends Disposable implements IEditorContribu this._register(this._diffEditor.onDidUpdateDiff(() => { - this._setState(this._deduceState(this._diffEditor.getDiffComputationResult())); + const diffComputationResult = this._diffEditor.getDiffComputationResult(); + this._setState(this._deduceState(diffComputationResult)); + + if (diffComputationResult && diffComputationResult.quitEarly) { + this._notificationService.prompt( + Severity.Warning, + nls.localize('hintTimeout', "The diff algorithm was stopped early (after {0} ms.)", this._diffEditor.maxComputationTime), + [{ + label: nls.localize('removeTimeout', "Remove limit"), + run: () => { + this._configurationService.updateValue('diffEditor.maxComputationTime', 0, ConfigurationTarget.USER); + } + }], + {} + ); + } })); } @@ -48,9 +64,6 @@ class DiffEditorHelperContribution extends Disposable implements IEditorContribu if (this._diffEditor.ignoreTrimWhitespace && diffComputationResult.changes.length === 0 && !diffComputationResult.identical) { return WidgetState.HintWhitespace; } - if (diffComputationResult.quitEarly) { - return WidgetState.HintTimeout; - } return WidgetState.Hidden; } @@ -75,21 +88,12 @@ class DiffEditorHelperContribution extends Disposable implements IEditorContribu this._helperWidgetListener = this._helperWidget.onClick(() => this._onDidClickHelperWidget()); this._helperWidget.render(); } - - if (this._state === WidgetState.HintTimeout) { - this._helperWidget = this._instantiationService.createInstance(FloatingClickWidget, this._diffEditor.getModifiedEditor(), nls.localize('hintTimeout', "Remove diff computation timeout"), null); - this._helperWidgetListener = this._helperWidget.onClick(() => this._onDidClickHelperWidget()); - this._helperWidget.render(); - } } private _onDidClickHelperWidget(): void { if (this._state === WidgetState.HintWhitespace) { this._configurationService.updateValue('diffEditor.ignoreTrimWhitespace', false, ConfigurationTarget.USER); } - if (this._state === WidgetState.HintTimeout) { - this._configurationService.updateValue('diffEditor.maxComputationTime', 0, ConfigurationTarget.USER); - } } dispose(): void {