11mod document;
2+ mod file_uri;
23mod log;
34mod message;
45mod methods;
56
6- use crate :: message:: { Message , Response } ;
7+ use crate :: {
8+ file_uri:: FileUri ,
9+ message:: { Message , Response } ,
10+ } ;
711use daemon:: connect_to_daemon;
812pub ( crate ) use document:: * ;
913use fingerprint:: COMPILER_BUILT_AT ;
1014use ipc_message:: { IpcMessage , IpcMessageId , IpcRequest , IpcResponse } ;
1115pub ( crate ) use log:: * ;
1216use lsp_types:: {
13- CompletionItem , CompletionList , CompletionResponse , DidChangeTextDocumentParams , Uri ,
17+ CompletionItem , CompletionList , CompletionResponse , DidChangeTextDocumentParams ,
18+ InitializeParams , Uri ,
1419} ;
1520use pin_project_lite:: pin_project;
21+ use serde:: Deserialize ;
1622use smol:: {
1723 io:: { AsyncWriteExt , WriteHalf } ,
1824 net:: TcpStream ,
@@ -22,8 +28,12 @@ use std::{
2228 io:: { BufReader , BufWriter , Stdin , Stdout , Write } ,
2329 pin:: pin,
2430 process:: ExitCode ,
31+ sync:: Arc ,
32+ } ;
33+ use text_edit:: {
34+ DocumentChange , TextEditLineColumnUtf16 , TextPosition , TextPositionLineColumnUtf16 ,
35+ TextRangeLineColumnUtf16 ,
2536} ;
26- use text_edit:: TextPosition ;
2737use transport:: { read_message_raw_async, write_message_raw_async} ;
2838
2939pin_project ! {
@@ -137,7 +147,6 @@ pub async fn start() -> ExitCode {
137147 )
138148 . await ;
139149 }
140- IpcResponse :: Changed => todo ! ( ) ,
141150 IpcResponse :: Saved => todo ! ( ) ,
142151 IpcResponse :: Completion ( items) => {
143152 Server :: send_to_editor (
@@ -234,6 +243,8 @@ pub async fn start() -> ExitCode {
234243 ) )
235244 . unwrap ( ) ;
236245
246+ let init_params = InitializeParams :: deserialize ( request. params ) ;
247+
237248 write_message_raw_async ( server. as_mut ( ) . project ( ) . daemon , & data)
238249 . await
239250 . unwrap ( ) ;
@@ -270,33 +281,68 @@ pub async fn start() -> ExitCode {
270281 } ;
271282 }
272283 Message :: Response ( _) => ( ) ,
273- Message :: Notification ( notif) => match notif. method . as_str ( ) {
274- "initialized" => ( ) ,
275- "textDocument/didChange" => {
276- let params =
277- serde_json:: from_value :: < DidChangeTextDocumentParams > ( notif. params )
278- . unwrap ( ) ;
279-
280- dbg ! ( params) ;
281-
282- /*
283- notification.params
284-
285- write_message_raw_async(server.as_mut().project().daemon, &data)
286- .await
287- .unwrap();
288- server.as_mut().project().daemon.flush().await.unwrap();
289- */
290- }
291- "exit" => {
292- return if server. did_shutdown {
293- ExitCode :: SUCCESS
294- } else {
295- ExitCode :: FAILURE
296- } ;
284+ Message :: Notification ( notif) => {
285+ match notif. method . as_str ( ) {
286+ "initialized" => ( ) ,
287+ "textDocument/didChange" => {
288+ let params =
289+ serde_json:: from_value :: < DidChangeTextDocumentParams > ( notif. params )
290+ . unwrap ( ) ;
291+
292+ if let Some ( "file" ) = params
293+ . text_document
294+ . uri
295+ . scheme ( )
296+ . map ( |scheme| scheme. as_str ( ) )
297+ {
298+ let document_changes =
299+ params. content_changes . into_iter ( ) . map ( |change| {
300+ if let Some ( range) = change. range {
301+ assert ! ( range. start <= range. end, "Invalid range" ) ;
302+
303+ DocumentChange :: IncrementalUtf16 ( TextEditLineColumnUtf16 {
304+ range : TextRangeLineColumnUtf16 {
305+ start : TextPositionLineColumnUtf16 {
306+ line_utf16 : range. start . line ,
307+ column_utf16 : range. start . character ,
308+ } ,
309+ end : TextPositionLineColumnUtf16 {
310+ line_utf16 : range. end . line ,
311+ column_utf16 : range. end . character ,
312+ } ,
313+ } ,
314+ replace_with : Arc :: from ( change. text ) ,
315+ } )
316+ } else {
317+ DocumentChange :: Full ( Arc :: from ( change. text ) )
318+ }
319+ } ) ;
320+
321+ eprintln ! (
322+ "{:?} {:?}" ,
323+ & params. text_document. uri. to_file_path( ) ,
324+ & document_changes
325+ ) ;
326+ }
327+
328+ /*
329+ notification.params
330+ write_message_raw_async(server.as_mut().project().daemon, &data)
331+ .await
332+ .unwrap();
333+ server.as_mut().project().daemon.flush().await.unwrap();
334+ */
335+ }
336+ "exit" => {
337+ return if server. did_shutdown {
338+ ExitCode :: SUCCESS
339+ } else {
340+ ExitCode :: FAILURE
341+ } ;
342+ }
343+ _ => ( ) ,
297344 }
298- _ => ( ) ,
299- } ,
345+ }
300346 }
301347 }
302348
0 commit comments