@@ -7,22 +7,22 @@ use tower_lsp::{Client, LanguageServer};
77
88use crate :: client:: client_flags:: ClientFlags ;
99use crate :: server:: options:: ClientConfigurationOptions ;
10+ use crate :: session:: Session ;
1011use crate :: utils:: file_path;
1112use crate :: utils:: normalize_uri;
1213use crate :: utils:: to_proto;
13- use crate :: workspace_handler:: WorkspaceHandler ;
1414
1515struct Server {
1616 client : Client ,
17- workspace_handler : WorkspaceHandler ,
17+ session : Session ,
1818 client_capabilities : RwLock < Option < ClientFlags > > ,
1919}
2020
2121impl Server {
2222 pub async fn new ( client : Client ) -> Self {
2323 Self {
2424 client,
25- workspace_handler : WorkspaceHandler :: new ( ) ,
25+ session : Session :: new ( ) ,
2626 client_capabilities : RwLock :: new ( None ) ,
2727 }
2828 }
@@ -91,10 +91,8 @@ impl Server {
9191 async fn publish_diagnostics ( & self , mut uri : Url ) {
9292 normalize_uri ( & mut uri) ;
9393
94- let diagnostics = self
95- . workspace_handler
96- . get_diagnostics ( file_path ( & uri) )
97- . await ;
94+ let url = file_path ( & uri) ;
95+ let diagnostics = self . session . get_diagnostics ( url) . await ;
9896
9997 let diagnostics: Vec < Diagnostic > = diagnostics
10098 . into_iter ( )
@@ -177,22 +175,79 @@ impl LanguageServer for Server {
177175 . is_some_and ( |o| o. db_connection_string . is_some ( ) )
178176 {
179177 let conn_str = opts. unwrap ( ) . db_connection_string . unwrap ( ) ;
180- self . workspace_handler . change_db ( conn_str) . await ;
178+ self . session . change_db ( conn_str) . await ;
181179 return ;
182180 }
183181 }
184182
183+ // if we couldn't pull settings from the client,
184+ // we'll try parsing the passed in params.
185185 let opts = self . parse_options_from_client ( params. settings ) ;
186186
187187 if opts
188188 . as_ref ( )
189189 . is_some_and ( |o| o. db_connection_string . is_some ( ) )
190190 {
191191 let conn_str = opts. unwrap ( ) . db_connection_string . unwrap ( ) ;
192- self . workspace_handler . change_db ( conn_str) . await ;
192+ self . session . change_db ( conn_str) . await ;
193+ }
194+ }
195+
196+ async fn did_open ( & self , params : DidOpenTextDocumentParams ) {
197+ let mut uri = params. text_document . uri ;
198+ normalize_uri ( & mut uri) ;
199+
200+ let changed_urls = self
201+ . session
202+ . apply_doc_changes (
203+ file_path ( url) ,
204+ params. text_document . version ,
205+ params. text_document . text ,
206+ )
207+ . await ;
208+
209+ for url in changed_urls {
210+ self . publish_diagnostics ( url) . await ;
211+ }
212+ }
213+
214+ async fn did_save ( & self , params : DidSaveTextDocumentParams ) {
215+ let mut uri = params. text_document . uri ;
216+ normalize_uri ( & mut uri) ;
217+
218+ self . publish_diagnostics ( uri) . await ;
219+
220+ // TODO: "Compute Now"
221+ let changed_urls = self . session . recompute_and_get_changed_files ( ) ;
222+ for url in changed_urls {
223+ self . publish_diagnostics ( url) . await ;
193224 }
194225 }
195226
227+ async fn did_change ( & self , params : DidChangeTextDocumentParams ) {
228+ todo ! ( )
229+ }
230+
231+ async fn did_close ( & self , params : DidSaveTextDocumentParams ) {
232+ let mut uri = params. text_document . uri ;
233+ normalize_uri ( & mut uri) ;
234+ let path = file_path ( & uri) ;
235+
236+ self . session . on_file_closed ( path) ;
237+ }
238+
239+ async fn code_action ( & self , params : CodeActionParams ) -> Result < Option < CodeActionResponse > > {
240+ let mut uri = params. text_document . uri ;
241+ normalize_uri ( & mut uri) ;
242+
243+ let path = file_path ( & uri) ;
244+ let range = params. range ;
245+
246+ let actions = self . session . get_available_code_actions ( path, range) ;
247+
248+ Ok ( actions)
249+ }
250+
196251 async fn execute_command (
197252 & self ,
198253 params : ExecuteCommandParams ,
@@ -207,7 +262,7 @@ impl LanguageServer for Server {
207262 let stmt = serde_json:: from_value ( params)
208263 . map_err ( |_| jsonrpc:: Error :: invalid_request ( ) ) ?;
209264
210- match self . workspace_handler . run_stmt ( stmt) . await {
265+ match self . session . run_stmt ( stmt) . await {
211266 Ok ( rows_affected) => {
212267 self . client
213268 . send_notification :: < ShowMessage > ( ShowMessageParams {
0 commit comments