Refactor code a little bit
This commit is contained in:
		
							parent
							
								
									b71c253942
								
							
						
					
					
						commit
						c7aacfe756
					
				| @ -3,12 +3,12 @@ use std::path::PathBuf; | |||||||
| 
 | 
 | ||||||
| use dashmap::DashMap; | use dashmap::DashMap; | ||||||
| use reid::ast::lexer::{FullToken, Position}; | use reid::ast::lexer::{FullToken, Position}; | ||||||
|  | use reid::error_raporting::{ErrorModules, ReidError}; | ||||||
| use reid::mir::{ | use reid::mir::{ | ||||||
|     self, Context, FunctionCall, FunctionDefinition, FunctionParam, IfExpression, SourceModuleId, StructType, TypeKind, |     self, Context, FunctionCall, FunctionDefinition, FunctionParam, IfExpression, SourceModuleId, StructType, TypeKind, | ||||||
|     WhileStatement, |     WhileStatement, | ||||||
| }; | }; | ||||||
| use reid::{compile_module, parse_module, perform_all_passes}; | use reid::{compile_module, parse_module, perform_all_passes}; | ||||||
| use tower_lsp::jsonrpc::Result; |  | ||||||
| use tower_lsp::lsp_types::{ | use tower_lsp::lsp_types::{ | ||||||
|     self, CompletionItem, CompletionOptions, CompletionParams, CompletionResponse, Diagnostic, DiagnosticSeverity, |     self, CompletionItem, CompletionOptions, CompletionParams, CompletionResponse, Diagnostic, DiagnosticSeverity, | ||||||
|     DidChangeTextDocumentParams, DidOpenTextDocumentParams, Hover, HoverContents, HoverParams, HoverProviderCapability, |     DidChangeTextDocumentParams, DidOpenTextDocumentParams, Hover, HoverContents, HoverParams, HoverProviderCapability, | ||||||
| @ -16,7 +16,7 @@ use tower_lsp::lsp_types::{ | |||||||
|     TextDocumentItem, TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, |     TextDocumentItem, TextDocumentSyncCapability, TextDocumentSyncKind, TextDocumentSyncOptions, | ||||||
|     WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, |     WorkspaceFoldersServerCapabilities, WorkspaceServerCapabilities, | ||||||
| }; | }; | ||||||
| use tower_lsp::{Client, LanguageServer, LspService, Server}; | use tower_lsp::{Client, LanguageServer, LspService, Server, jsonrpc}; | ||||||
| 
 | 
 | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| struct Backend { | struct Backend { | ||||||
| @ -28,7 +28,7 @@ struct Backend { | |||||||
| 
 | 
 | ||||||
| #[tower_lsp::async_trait] | #[tower_lsp::async_trait] | ||||||
| impl LanguageServer for Backend { | impl LanguageServer for Backend { | ||||||
|     async fn initialize(&self, _: InitializeParams) -> Result<InitializeResult> { |     async fn initialize(&self, _: InitializeParams) -> jsonrpc::Result<InitializeResult> { | ||||||
|         self.client |         self.client | ||||||
|             .log_message(MessageType::INFO, "Initializing Reid Language Server") |             .log_message(MessageType::INFO, "Initializing Reid Language Server") | ||||||
|             .await; |             .await; | ||||||
| @ -64,18 +64,18 @@ impl LanguageServer for Backend { | |||||||
|             .await; |             .await; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async fn shutdown(&self) -> Result<()> { |     async fn shutdown(&self) -> jsonrpc::Result<()> { | ||||||
|         Ok(()) |         Ok(()) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async fn completion(&self, _: CompletionParams) -> Result<Option<CompletionResponse>> { |     async fn completion(&self, _: CompletionParams) -> jsonrpc::Result<Option<CompletionResponse>> { | ||||||
|         Ok(Some(CompletionResponse::Array(vec![ |         Ok(Some(CompletionResponse::Array(vec![ | ||||||
|             CompletionItem::new_simple("Hello".to_string(), "Some detail".to_string()), |             CompletionItem::new_simple("Hello".to_string(), "Some detail".to_string()), | ||||||
|             CompletionItem::new_simple("Bye".to_string(), "More detail".to_string()), |             CompletionItem::new_simple("Bye".to_string(), "More detail".to_string()), | ||||||
|         ]))) |         ]))) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async fn hover(&self, params: HoverParams) -> Result<Option<Hover>> { |     async fn hover(&self, params: HoverParams) -> jsonrpc::Result<Option<Hover>> { | ||||||
|         let path = PathBuf::from(params.text_document_position_params.text_document.uri.path()); |         let path = PathBuf::from(params.text_document_position_params.text_document.uri.path()); | ||||||
|         let file_name = path.file_name().unwrap().to_str().unwrap().to_owned(); |         let file_name = path.file_name().unwrap().to_str().unwrap().to_owned(); | ||||||
|         let tokens = self.tokens.get(&file_name); |         let tokens = self.tokens.get(&file_name); | ||||||
| @ -134,55 +134,24 @@ impl LanguageServer for Backend { | |||||||
| 
 | 
 | ||||||
| impl Backend { | impl Backend { | ||||||
|     async fn recompile(&self, params: TextDocumentItem) { |     async fn recompile(&self, params: TextDocumentItem) { | ||||||
|         let mut map = Default::default(); |  | ||||||
|         let path = PathBuf::from(params.uri.clone().path()); |         let path = PathBuf::from(params.uri.clone().path()); | ||||||
|         let file_name = path.file_name().unwrap().to_str().unwrap().to_owned(); |         let file_name = path.file_name().unwrap().to_str().unwrap().to_owned(); | ||||||
| 
 | 
 | ||||||
|         let mut reid_error = None; |         let mut map = Default::default(); | ||||||
|         let mut tokens = None; |         let parse_res = parse(¶ms.text, path.clone(), &mut map); | ||||||
|         let mut token_types_opt = None; |         let (tokens, result) = match parse_res { | ||||||
|  |             Ok((module_id, tokens)) => (tokens.clone(), compile(module_id, tokens, path, &mut map)), | ||||||
|  |             Err(e) => (Vec::new(), Err(e)), | ||||||
|  |         }; | ||||||
| 
 | 
 | ||||||
|         match parse_module(¶ms.text, file_name.clone(), &mut map) { |  | ||||||
|             Ok(module) => { |  | ||||||
|                 self.client |  | ||||||
|                     .log_message(MessageType::INFO, format!("successfully parsed!")) |  | ||||||
|                     .await; |  | ||||||
|                 tokens = Some(module.1.clone()); |  | ||||||
|                 match compile_module(module.0, module.1, &mut map, Some(path.clone()), true) { |  | ||||||
|                     Ok(module) => { |  | ||||||
|                         let module_id = module.module_id; |  | ||||||
|                         let mut context = Context::from(vec![module], path.parent().unwrap().to_owned()); |  | ||||||
|                         match perform_all_passes(&mut context, &mut map) { |  | ||||||
|                             Ok(_) => { |  | ||||||
|                                 for module in context.modules.values() { |  | ||||||
|                                     if module.module_id != module_id { |  | ||||||
|                                         continue; |  | ||||||
|                                     } |  | ||||||
|                                     let token_types = DashMap::new(); |  | ||||||
|                                     for (idx, token) in module.tokens.iter().enumerate() { |  | ||||||
|                                         token_types.insert(token.clone(), find_type_in_context(&module, idx)); |  | ||||||
|                                     } |  | ||||||
|                                     token_types_opt = Some(token_types); |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                             Err(e) => { |  | ||||||
|                                 reid_error = Some(e); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                     Err(e) => { |  | ||||||
|                         reid_error = Some(e); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|             Err(e) => { |  | ||||||
|                 reid_error = Some(e); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if let Some(tokens) = &tokens { |  | ||||||
|             if let Some(mut reid_error) = reid_error { |  | ||||||
|         let mut diagnostics = Vec::new(); |         let mut diagnostics = Vec::new(); | ||||||
|  |         match result { | ||||||
|  |             Ok(Some(result)) => { | ||||||
|  |                 self.tokens.insert(file_name.clone(), result.tokens); | ||||||
|  |                 self.types.insert(file_name.clone(), result.types); | ||||||
|  |             } | ||||||
|  |             Ok(_) => {} | ||||||
|  |             Err(mut reid_error) => { | ||||||
|                 reid_error.errors.dedup(); |                 reid_error.errors.dedup(); | ||||||
|                 for error in reid_error.errors { |                 for error in reid_error.errors { | ||||||
|                     let meta = error.get_meta(); |                     let meta = error.get_meta(); | ||||||
| @ -217,23 +186,54 @@ impl Backend { | |||||||
|                     }); |                     }); | ||||||
|                     self.client.log_message(MessageType::INFO, format!("{}", error)).await; |                     self.client.log_message(MessageType::INFO, format!("{}", error)).await; | ||||||
|                 } |                 } | ||||||
|                 self.client |  | ||||||
|                     .publish_diagnostics(params.uri.clone(), diagnostics, Some(params.version)) |  | ||||||
|                     .await; |  | ||||||
|             } else { |  | ||||||
|                 self.client |  | ||||||
|                     .publish_diagnostics(params.uri.clone(), Vec::new(), Some(params.version)) |  | ||||||
|                     .await; |  | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if let Some(tokens) = tokens.take() { |         self.client | ||||||
|             self.tokens.insert(file_name.clone(), tokens); |             .publish_diagnostics(params.uri.clone(), diagnostics, Some(params.version)) | ||||||
|  |             .await; | ||||||
|     } |     } | ||||||
|         if let Some(token_types) = token_types_opt { | } | ||||||
|             self.types.insert(file_name.clone(), token_types); | 
 | ||||||
|  | struct CompileResult { | ||||||
|  |     tokens: Vec<FullToken>, | ||||||
|  |     types: DashMap<FullToken, Option<TypeKind>>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn parse(source: &str, path: PathBuf, map: &mut ErrorModules) -> Result<(SourceModuleId, Vec<FullToken>), ReidError> { | ||||||
|  |     let file_name = path.file_name().unwrap().to_str().unwrap().to_owned(); | ||||||
|  | 
 | ||||||
|  |     Ok(parse_module(source, file_name.clone(), map)?) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn compile( | ||||||
|  |     module_id: SourceModuleId, | ||||||
|  |     tokens: Vec<FullToken>, | ||||||
|  |     path: PathBuf, | ||||||
|  |     map: &mut ErrorModules, | ||||||
|  | ) -> Result<Option<CompileResult>, ReidError> { | ||||||
|  |     let token_types = DashMap::new(); | ||||||
|  | 
 | ||||||
|  |     let module = compile_module(module_id, tokens, map, Some(path.clone()), true)?; | ||||||
|  | 
 | ||||||
|  |     let module_id = module.module_id; | ||||||
|  |     let mut context = Context::from(vec![module], path.parent().unwrap().to_owned()); | ||||||
|  |     perform_all_passes(&mut context, map)?; | ||||||
|  | 
 | ||||||
|  |     for module in context.modules.into_values() { | ||||||
|  |         if module.module_id != module_id { | ||||||
|  |             continue; | ||||||
|         } |         } | ||||||
|  |         for (idx, token) in module.tokens.iter().enumerate() { | ||||||
|  |             token_types.insert(token.clone(), find_type_in_context(&module, idx)); | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         return Ok(Some(CompileResult { | ||||||
|  |             tokens: module.tokens, | ||||||
|  |             types: token_types, | ||||||
|  |         })); | ||||||
|  |     } | ||||||
|  |     return Ok(None); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[tokio::main] | #[tokio::main] | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user