22 * Copyright (c) 2017 TypeFox GmbH (http://www.typefox.io). All rights reserved.
33 * Licensed under the MIT License. See License.txt in the project root for license information.
44 * ------------------------------------------------------------------------------------------ */
5- import { MonacoToProtocolConverter } from './converter' ;
5+ import { MonacoToProtocolConverter , ProtocolToMonacoConverter } from './converter' ;
66import { Workspace , TextDocumentDidChangeEvent , TextDocument , Event , Emitter } from "vscode-base-languageclient/lib/services" ;
7+ import { WorkspaceEdit , TextEdit } from 'vscode-base-languageclient/lib/base' ;
78import IModel = monaco . editor . IModel ;
89
910export class MonacoWorkspace implements Workspace {
@@ -15,8 +16,7 @@ export class MonacoWorkspace implements Workspace {
1516 protected readonly onDidCloseTextDocumentEmitter = new Emitter < TextDocument > ( ) ;
1617 protected readonly onDidChangeTextDocumentEmitter = new Emitter < TextDocumentDidChangeEvent > ( ) ;
1718
18- constructor (
19- protected readonly m2p : MonacoToProtocolConverter ) {
19+ constructor ( protected readonly p2m : ProtocolToMonacoConverter , protected readonly m2p : MonacoToProtocolConverter ) {
2020 for ( const model of monaco . editor . getModels ( ) ) {
2121 this . addModel ( model ) ;
2222 }
@@ -83,4 +83,36 @@ export class MonacoWorkspace implements Workspace {
8383 return this . onDidChangeTextDocumentEmitter . event ;
8484 }
8585
86+ public applyEdit ( workspaceEdit : WorkspaceEdit ) : Thenable < boolean > {
87+ let applied = true ;
88+ if ( workspaceEdit . documentChanges ) {
89+ for ( const change of workspaceEdit . documentChanges ) {
90+ if ( change . textDocument . version && change . textDocument . version >= 0 ) {
91+ const textDocument = this . documents . get ( change . textDocument . uri ) ;
92+ if ( textDocument && textDocument . version === change . textDocument . version ) {
93+ monaco . editor . getModel ( monaco . Uri . parse ( textDocument . uri ) ) . pushEditOperations (
94+ [ ] , // Do not try and preserve editor selections.
95+ change . edits . map ( ( edit : TextEdit ) => {
96+ return {
97+ identifier : { major : 1 , minor : 0 } ,
98+ range : this . p2m . asRange ( edit . range ) ,
99+ text : edit . newText ,
100+ forceMoveMarkers : true ,
101+ } ;
102+ } ) ,
103+ ( ) => [ ] , // Do not try and preserve editor selections.
104+ ) ;
105+ } else {
106+ applied = false ;
107+ }
108+ } else {
109+ applied = false ;
110+ }
111+ }
112+ } else {
113+ applied = false ;
114+ }
115+ return Promise . resolve ( applied ) ;
116+ }
117+
86118}
0 commit comments