提交 ad984e8f 编写于 作者: J Johannes Rieken

debt - avoid winjs.promise, add cancelation token

上级 a1a3ab33
......@@ -7,7 +7,6 @@ import { isFalsyOrEmpty, mergeSort, flatten } from 'vs/base/common/arrays';
import { asWinJsPromise } from 'vs/base/common/async';
import { illegalArgument, onUnexpectedExternalError, isPromiseCanceledError } from 'vs/base/common/errors';
import URI from 'vs/base/common/uri';
import { TPromise } from 'vs/base/common/winjs.base';
import { registerLanguageCommand } from 'vs/editor/browser/editorExtensions';
import { Range } from 'vs/editor/common/core/range';
import { ITextModel } from 'vs/editor/common/model';
......@@ -15,8 +14,9 @@ import { CodeAction, CodeActionProviderRegistry, CodeActionContext, CodeActionTr
import { IModelService } from 'vs/editor/common/services/modelService';
import { CodeActionFilter, CodeActionKind, CodeActionTrigger } from './codeActionTrigger';
import { Selection } from 'vs/editor/common/core/selection';
import { CancellationToken } from 'vs/base/common/cancellation';
export function getCodeActions(model: ITextModel, rangeOrSelection: Range | Selection, trigger?: CodeActionTrigger): TPromise<CodeAction[]> {
export function getCodeActions(model: ITextModel, rangeOrSelection: Range | Selection, trigger?: CodeActionTrigger, token: CancellationToken = CancellationToken.None): Promise<CodeAction[]> {
const codeActionContext: CodeActionContext = {
only: trigger && trigger.filter && trigger.filter.kind ? trigger.filter.kind.value : undefined,
trigger: trigger && trigger.type === 'manual' ? CodeActionTriggerKind.Manual : CodeActionTriggerKind.Automatic
......@@ -38,7 +38,7 @@ export function getCodeActions(model: ITextModel, rangeOrSelection: Range | Sele
});
});
return TPromise.join(promises)
return Promise.all(promises)
.then(flatten)
.then(allCodeActions => mergeSort(allCodeActions, codeActionsComparator));
}
......
......@@ -25,6 +25,7 @@ import { LightBulbWidget } from './lightBulbWidget';
import { escapeRegExpCharacters } from 'vs/base/common/strings';
import { IBulkEditService } from 'vs/editor/browser/services/bulkEditService';
import { IProgressService } from 'vs/platform/progress/common/progress';
import { CancelablePromise } from 'vs/base/common/async';
function contextKeyForSupportedActions(kind: CodeActionKind) {
return ContextKeyExpr.regex(
......@@ -46,7 +47,7 @@ export class QuickFixController implements IEditorContribution {
private _lightBulbWidget: LightBulbWidget;
private _disposables: IDisposable[] = [];
private _activeRequest: TPromise<CodeAction[]> | undefined;
private _activeRequest: CancelablePromise<CodeAction[]> | undefined;
constructor(editor: ICodeEditor,
@IMarkerService markerService: IMarkerService,
......@@ -124,7 +125,7 @@ export class QuickFixController implements IEditorContribution {
this._codeActionContextMenu.show(this._lightBulbWidget.model.actions, coords);
}
public triggerFromEditorSelection(filter?: CodeActionFilter, autoApply?: CodeActionAutoApply): TPromise<CodeAction[] | undefined> {
public triggerFromEditorSelection(filter?: CodeActionFilter, autoApply?: CodeActionAutoApply): Thenable<CodeAction[] | undefined> {
return this._model.trigger({ type: 'manual', filter, autoApply });
}
......
......@@ -17,6 +17,7 @@ import { IMarkerService } from 'vs/platform/markers/common/markers';
import { getCodeActions } from './codeAction';
import { CodeActionTrigger } from './codeActionTrigger';
import { IProgressService } from 'vs/platform/progress/common/progress';
import { createCancelablePromise, CancelablePromise } from 'vs/base/common/async';
export const SUPPORTED_CODE_ACTIONS = new RawContextKey<string>('supportedCodeAction', '');
......@@ -99,7 +100,7 @@ export class CodeActionOracle {
return selection;
}
private _createEventAndSignalChange(trigger: CodeActionTrigger, selection: Selection | undefined): TPromise<CodeAction[] | undefined> {
private _createEventAndSignalChange(trigger: CodeActionTrigger, selection: Selection | undefined): Thenable<CodeAction[] | undefined> {
if (!selection) {
// cancel
this._signalChange({
......@@ -113,10 +114,10 @@ export class CodeActionOracle {
const model = this._editor.getModel();
const markerRange = this._getRangeOfMarker(selection);
const position = markerRange ? markerRange.getStartPosition() : selection.getStartPosition();
const actions = getCodeActions(model, selection, trigger);
const actions = createCancelablePromise(token => getCodeActions(model, selection, trigger, token));
if (this._progressService && trigger.type === 'manual') {
this._progressService.showWhile(actions, 250);
this._progressService.showWhile(TPromise.wrap(actions), 250);
}
this._signalChange({
......@@ -134,7 +135,7 @@ export interface CodeActionsComputeEvent {
trigger: CodeActionTrigger;
rangeOrSelection: Range | Selection;
position: Position;
actions: TPromise<CodeAction[]>;
actions: CancelablePromise<CodeAction[]>;
}
export class CodeActionModel {
......@@ -196,7 +197,7 @@ export class CodeActionModel {
}
}
trigger(trigger: CodeActionTrigger): TPromise<CodeAction[] | undefined> {
trigger(trigger: CodeActionTrigger): Thenable<CodeAction[] | undefined> {
if (this._codeActionOracle) {
return this._codeActionOracle.trigger(trigger);
}
......
......@@ -28,7 +28,7 @@ export class CodeActionContextMenu {
private readonly _onApplyCodeAction: (action: CodeAction) => TPromise<any>
) { }
show(fixes: TPromise<CodeAction[]>, at: { x: number; y: number } | Position) {
show(fixes: Thenable<CodeAction[]>, at: { x: number; y: number } | Position) {
const actions = fixes.then(value => {
return value.map(action => {
......@@ -53,7 +53,7 @@ export class CodeActionContextMenu {
}
return at;
},
getActions: () => actions,
getActions: () => TPromise.wrap(actions),
onHide: () => {
this._visible = false;
this._editor.focus();
......
......@@ -116,7 +116,7 @@ export class LightBulbWidget implements IDisposable, IContentWidget {
this._model = value;
const selection = this._model.rangeOrSelection;
this._model.actions.done(fixes => {
this._model.actions.then(fixes => {
if (!token.isCancellationRequested && fixes && fixes.length > 0) {
if (selection.isEmpty() && fixes.every(fix => fix.kind && CodeActionKind.Refactor.contains(fix.kind))) {
this.hide();
......@@ -126,7 +126,7 @@ export class LightBulbWidget implements IDisposable, IContentWidget {
} else {
this.hide();
}
}, err => {
}).catch(err => {
this.hide();
});
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册