Skip to content

Commit 3ca51f6

Browse files
committed
Convert IRenameSupport to RenameProvider
1 parent 30169da commit 3ca51f6

7 files changed

Lines changed: 33 additions & 98 deletions

File tree

src/vs/editor/common/modes.ts

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -521,26 +521,18 @@ export interface IConfigurationSupport {
521521
configure(options:any):TPromise<void>;
522522
}
523523

524+
524525
export interface IResourceEdit {
525526
resource: URI;
526-
range?: editorCommon.IRange;
527+
range: editorCommon.IRange;
527528
newText: string;
528529
}
529-
530-
export interface IRenameResult {
531-
currentName: string;
530+
export interface WorkspaceEdit {
532531
edits: IResourceEdit[];
533532
rejectReason?: string;
534533
}
535-
536-
/**
537-
* Interface used to support renaming of symbols
538-
*/
539-
export interface IRenameSupport {
540-
541-
filter?: string[];
542-
543-
rename(resource: URI, position: editorCommon.IPosition, newName: string): TPromise<IRenameResult>;
534+
export interface RenameProvider {
535+
provideRenameEdits(model:editorCommon.IReadOnlyModel, position:editorCommon.IEditorPosition, newName: string, token: CancellationToken): WorkspaceEdit | Thenable<WorkspaceEdit>;
544536
}
545537

546538
export interface ICommand {
@@ -691,7 +683,7 @@ export interface IRichEditSupport {
691683

692684
export const ReferenceProviderRegistry = new LanguageFeatureRegistry<ReferenceProvider>();
693685

694-
export const RenameRegistry = new LanguageFeatureRegistry<IRenameSupport>();
686+
export const RenameProviderRegistry = new LanguageFeatureRegistry<RenameProvider>();
695687

696688
export const SuggestRegistry = new LanguageFeatureRegistry<ISuggestSupport>();
697689

src/vs/editor/common/modes/supports.ts

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -71,42 +71,6 @@ export function handleEvent<T>(context:modes.ILineContext, offset:number, runner
7171
return runner(nestedMode, newCtx, offset - firstTokenCharacterOffset);
7272
}
7373

74-
/**
75-
* Returns {{true}} if the line token at the specified
76-
* offset matches one of the provided types. Matching
77-
* happens on a substring start from the end, unless
78-
* anywhereInToken is set to true in which case matches
79-
* happen on a substring at any position.
80-
*/
81-
export function isLineToken(context:modes.ILineContext, offset:number, types:string[], anywhereInToken:boolean = false):boolean {
82-
83-
if (!Array.isArray(types) || types.length === 0) {
84-
return false;
85-
}
86-
87-
if (context.getLineContent().length <= offset) {
88-
return false;
89-
}
90-
91-
var tokenIdx = context.findIndexOfOffset(offset);
92-
var type = context.getTokenType(tokenIdx);
93-
94-
for (var i = 0, len = types.length; i < len; i++) {
95-
if (anywhereInToken) {
96-
if (type.indexOf(types[i]) >= 0) {
97-
return true;
98-
}
99-
}
100-
else {
101-
if (strings.endsWith(type, types[i])) {
102-
return true;
103-
}
104-
}
105-
}
106-
107-
return false;
108-
}
109-
11074
export class FilteredLineContext implements modes.ILineContext {
11175

11276
public modeTransitions: ModeTransition[];

src/vs/editor/contrib/rename/browser/rename.ts

Lines changed: 3 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ import {EditorAction} from 'vs/editor/common/editorAction';
1818
import {Behaviour} from 'vs/editor/common/editorActionEnablement';
1919
import {IEditorActionDescriptorData, IRange} from 'vs/editor/common/editorCommon';
2020
import {CommonEditorRegistry, ContextKey, EditorActionDescriptor} from 'vs/editor/common/editorCommonExtensions';
21-
import {isLineToken} from 'vs/editor/common/modes/supports';
22-
import {RenameRegistry} from 'vs/editor/common/modes';
21+
import {RenameProviderRegistry} from 'vs/editor/common/modes';
2322
import {BulkEdit, createBulkEdit} from 'vs/editor/common/services/bulkEdit';
2423
import {ICodeEditor} from 'vs/editor/browser/editorBrowser';
2524
import {rename} from '../common/rename';
@@ -58,28 +57,11 @@ export class RenameAction extends EditorAction {
5857
}
5958

6059
public isSupported(): boolean {
61-
return RenameRegistry.has(this.editor.getModel()) && !this.editor.getModel().hasEditableRange() && super.isSupported();
60+
return RenameProviderRegistry.has(this.editor.getModel()) && !this.editor.getModel().hasEditableRange() && super.isSupported();
6261
}
6362

6463
public getEnablementState(): boolean {
65-
66-
let model = this.editor.getModel();
67-
let position = this.editor.getSelection().getStartPosition();
68-
let lineContext = model.getLineContext(position.lineNumber);
69-
70-
return RenameRegistry.ordered(model).some(support => {
71-
if (!support.filter) {
72-
return true;
73-
}
74-
if (isLineToken(lineContext, position.column - 1, support.filter)) {
75-
return true;
76-
}
77-
78-
if (position.column > 1 && isLineToken(lineContext, position.column - 2, support.filter)) {
79-
// in case we are in between two tokens
80-
return true;
81-
}
82-
});
64+
return RenameProviderRegistry.has(this.editor.getModel());
8365
}
8466

8567
public run(event?: any): TPromise<any> {

src/vs/editor/contrib/rename/common/rename.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,25 @@
66
'use strict';
77

88
import {localize} from 'vs/nls';
9-
import {sequence} from 'vs/base/common/async';
9+
import {sequence, asWinJsPromise} from 'vs/base/common/async';
1010
import {illegalArgument} from 'vs/base/common/errors';
1111
import {TPromise} from 'vs/base/common/winjs.base';
12-
import {IReadOnlyModel, IPosition} from 'vs/editor/common/editorCommon';
12+
import {IReadOnlyModel, IEditorPosition} from 'vs/editor/common/editorCommon';
1313
import {CommonEditorRegistry} from 'vs/editor/common/editorCommonExtensions';
14-
import {IRenameResult, RenameRegistry} from 'vs/editor/common/modes';
14+
import {WorkspaceEdit, RenameProviderRegistry} from 'vs/editor/common/modes';
1515

16-
export function rename(model: IReadOnlyModel, position: IPosition, newName: string): TPromise<IRenameResult> {
16+
export function rename(model: IReadOnlyModel, position: IEditorPosition, newName: string): TPromise<WorkspaceEdit> {
1717

18-
const supports = RenameRegistry.ordered(model);
19-
const resource = model.getAssociatedResource();
18+
const supports = RenameProviderRegistry.ordered(model);
2019
const rejects: string[] = [];
2120
let hasResult = false;
2221

2322
const factory = supports.map(support => {
2423
return () => {
2524
if (!hasResult) {
26-
return support.rename(resource, position, newName).then(result => {
25+
return asWinJsPromise((token) => {
26+
return support.provideRenameEdits(model, position, newName, token);
27+
}).then(result => {
2728
if (!result) {
2829
// ignore
2930
} else if (!result.rejectReason) {
@@ -37,17 +38,15 @@ export function rename(model: IReadOnlyModel, position: IPosition, newName: stri
3738
};
3839
});
3940

40-
return sequence(factory).then(values => {
41+
return sequence(factory).then((values): WorkspaceEdit => {
4142
let result = values[0];
4243
if (rejects.length > 0) {
43-
return <IRenameResult>{
44-
currentName: undefined,
44+
return {
4545
edits: undefined,
4646
rejectReason: rejects.join('\n')
4747
};
4848
} else if (!result) {
49-
return <IRenameResult>{
50-
currentName: undefined,
49+
return {
5150
edits: undefined,
5251
rejectReason: localize('no result', "No result.")
5352
};

src/vs/workbench/api/node/extHostApiCommands.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ class ExtHostApiCommands {
285285
position: position && typeConverters.fromPosition(position),
286286
newName
287287
};
288-
return this._commands.executeCommand<modes.IRenameResult>('_executeDocumentRenameProvider', args).then(value => {
288+
return this._commands.executeCommand<modes.WorkspaceEdit>('_executeDocumentRenameProvider', args).then(value => {
289289
if (!value) {
290290
return;
291291
}

src/vs/workbench/api/node/extHostLanguageFeatures.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ class NavigateTypeAdapter implements INavigateTypesSupport {
415415
}
416416
}
417417

418-
class RenameAdapter implements modes.IRenameSupport {
418+
class RenameAdapter {
419419

420420
private _documents: ExtHostModelService;
421421
private _provider: vscode.RenameProvider;
@@ -425,7 +425,7 @@ class RenameAdapter implements modes.IRenameSupport {
425425
this._provider = provider;
426426
}
427427

428-
rename(resource: URI, position: IPosition, newName: string): TPromise<modes.IRenameResult> {
428+
provideRenameEdits(resource: URI, position: IPosition, newName: string): TPromise<modes.WorkspaceEdit> {
429429

430430
let doc = this._documents.getDocumentData(resource).document;
431431
let pos = TypeConverters.toPosition(position);
@@ -436,8 +436,7 @@ class RenameAdapter implements modes.IRenameSupport {
436436
return;
437437
}
438438

439-
let result = <modes.IRenameResult>{
440-
currentName: undefined,
439+
let result = <modes.WorkspaceEdit>{
441440
edits: []
442441
};
443442

@@ -454,8 +453,7 @@ class RenameAdapter implements modes.IRenameSupport {
454453
return result;
455454
}, err => {
456455
if (typeof err === 'string') {
457-
return <modes.IRenameResult>{
458-
currentName: undefined,
456+
return <modes.WorkspaceEdit>{
459457
edits: undefined,
460458
rejectReason: err
461459
};
@@ -792,8 +790,8 @@ export class ExtHostLanguageFeatures {
792790
return this._createDisposable(handle);
793791
}
794792

795-
$rename(handle: number, resource: URI, position: IPosition, newName: string): TPromise<modes.IRenameResult> {
796-
return this._withAdapter(handle, RenameAdapter, adapter => adapter.rename(resource, position, newName));
793+
$provideRenameEdits(handle: number, resource: URI, position: IPosition, newName: string): TPromise<modes.WorkspaceEdit> {
794+
return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(resource, position, newName));
797795
}
798796

799797
// --- suggestion
@@ -975,9 +973,9 @@ export class MainThreadLanguageFeatures {
975973
// --- rename
976974

977975
$registerRenameSupport(handle: number, selector: vscode.DocumentSelector): TPromise<any> {
978-
this._registrations[handle] = modes.RenameRegistry.register(selector, <modes.IRenameSupport>{
979-
rename: (resource: URI, position: IPosition, newName: string): TPromise<modes.IRenameResult> => {
980-
return this._proxy.$rename(handle, resource, position, newName);
976+
this._registrations[handle] = modes.RenameProviderRegistry.register(selector, <modes.RenameProvider>{
977+
provideRenameEdits: (model:IReadOnlyModel, position:IEditorPosition, newName: string, token: CancellationToken): Thenable<modes.WorkspaceEdit> => {
978+
return wireCancellationToken(token, this._proxy.$provideRenameEdits(handle, model.getAssociatedResource(), position, newName));
981979
}
982980
});
983981
return undefined;

src/vs/workbench/test/node/api/extHostLanguageFeatures.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,7 @@ suite('ExtHostLanguageFeatures', function() {
650650

651651
return threadService.sync().then(() => {
652652

653-
return rename(model, { lineNumber: 1, column: 1 }, 'newName').then(value => {
653+
return rename(model, new EditorPosition(1, 1), 'newName').then(value => {
654654
throw new Error('');
655655
}, err => {
656656
// expected
@@ -676,7 +676,7 @@ suite('ExtHostLanguageFeatures', function() {
676676

677677
return threadService.sync().then(() => {
678678

679-
return rename(model, { lineNumber: 1, column: 1 }, 'newName').then(value => {
679+
return rename(model, new EditorPosition(1, 1), 'newName').then(value => {
680680
assert.equal(value.edits.length, 1);
681681
});
682682
});
@@ -701,7 +701,7 @@ suite('ExtHostLanguageFeatures', function() {
701701

702702
return threadService.sync().then(() => {
703703

704-
return rename(model, { lineNumber: 1, column: 1 }, 'newName').then(value => {
704+
return rename(model, new EditorPosition(1, 1), 'newName').then(value => {
705705
assert.equal(value.edits.length, 2); // least relevant renamer
706706
});
707707
});

0 commit comments

Comments
 (0)