@@ -454,8 +454,58 @@ class NavigateTypeAdapter implements INavigateTypesSupport {
454454 }
455455}
456456
457+ class RenameAdapter implements modes . IRenameSupport {
458+
459+ private _documents : PluginHostModelService ;
460+ private _provider : vscode . RenameProvider ;
461+
462+ constructor ( documents : PluginHostModelService , provider : vscode . RenameProvider ) {
463+ this . _documents = documents ;
464+ this . _provider = provider ;
465+ }
466+
467+ rename ( resource : URI , position : IPosition , newName : string ) : TPromise < modes . IRenameResult > {
468+
469+ let doc = this . _documents . getDocument ( resource ) ;
470+ let pos = TypeConverters . toPosition ( position ) ;
471+
472+ return asWinJsPromise ( token => this . _provider . provideRenameEdits ( doc , pos , newName , token ) ) . then ( value => {
473+
474+ if ( ! value ) {
475+ return ;
476+ }
477+
478+ let result = < modes . IRenameResult > {
479+ currentName : undefined ,
480+ edits : [ ]
481+ } ;
482+
483+ for ( let entry of value . entries ( ) ) {
484+ let [ uri , textEdits ] = entry ;
485+ for ( let textEdit of textEdits ) {
486+ result . edits . push ( {
487+ resource : < URI > uri ,
488+ newText : textEdit . newText ,
489+ range : TypeConverters . fromRange ( textEdit . range )
490+ } ) ;
491+ }
492+ }
493+ return result ;
494+ } , err => {
495+ if ( typeof err === 'string' ) {
496+ return < modes . IRenameResult > {
497+ currentName : undefined ,
498+ edits : undefined ,
499+ rejectReason : err
500+ } ;
501+ }
502+ return TPromise . wrapError ( err ) ;
503+ } ) ;
504+ }
505+ }
506+
457507type Adapter = OutlineAdapter | CodeLensAdapter | DeclarationAdapter | ExtraInfoAdapter | OccurrencesAdapter | ReferenceAdapter | QuickFixAdapter
458- | DocumentFormattingAdapter | RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter ;
508+ | DocumentFormattingAdapter | RangeFormattingAdapter | OnTypeFormattingAdapter | NavigateTypeAdapter | RenameAdapter ;
459509
460510@Remotable . PluginHostContext ( 'ExtHostLanguageFeatures' )
461511export class ExtHostLanguageFeatures {
@@ -638,6 +688,19 @@ export class ExtHostLanguageFeatures {
638688 $getNavigateToItems ( handle : number , search : string ) : TPromise < ITypeBearing [ ] > {
639689 return this . _withAdapter ( handle , NavigateTypeAdapter , adapter => adapter . getNavigateToItems ( search ) ) ;
640690 }
691+
692+ // --- rename
693+
694+ registerRenameProvider ( selector : vscode . DocumentSelector , provider : vscode . RenameProvider ) : vscode . Disposable {
695+ const handle = this . _nextHandle ( ) ;
696+ this . _adapter [ handle ] = new RenameAdapter ( this . _documents , provider ) ;
697+ this . _proxy . $registerRenameSupport ( handle , selector ) ;
698+ return this . _createDisposable ( handle ) ;
699+ }
700+
701+ $rename ( handle : number , resource : URI , position : IPosition , newName : string ) : TPromise < modes . IRenameResult > {
702+ return this . _withAdapter ( handle , RenameAdapter , adapter => adapter . rename ( resource , position , newName ) ) ;
703+ }
641704}
642705
643706@Remotable . MainContext ( 'MainThreadLanguageFeatures' )
@@ -798,4 +861,15 @@ export class MainThreadLanguageFeatures {
798861 } ) ;
799862 return undefined ;
800863 }
864+
865+ // --- rename
866+
867+ $registerRenameSupport ( handle : number , selector : vscode . DocumentSelector ) : TPromise < any > {
868+ this . _registrations [ handle ] = RenameRegistry . register ( selector , < modes . IRenameSupport > {
869+ rename : ( resource : URI , position : IPosition , newName : string ) : TPromise < modes . IRenameResult > => {
870+ return this . _proxy . $rename ( handle , resource , position , newName ) ;
871+ }
872+ } ) ;
873+ return undefined ;
874+ }
801875}
0 commit comments