diff options
Diffstat (limited to 'crates/ra_lsp_server/src')
-rw-r--r-- | crates/ra_lsp_server/src/main_loop/handlers.rs | 56 |
1 files changed, 34 insertions, 22 deletions
diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 1baed73ad..2ec9073e4 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs | |||
@@ -2,15 +2,16 @@ use std::collections::HashMap; | |||
2 | 2 | ||
3 | use gen_lsp_server::ErrorCode; | 3 | use gen_lsp_server::ErrorCode; |
4 | use languageserver_types::{ | 4 | use languageserver_types::{ |
5 | CodeActionResponse, Command, Diagnostic, | 5 | CodeActionResponse, Command, Diagnostic, DiagnosticSeverity, DocumentFormattingParams, |
6 | DiagnosticSeverity, DocumentSymbol, Documentation, FoldingRange, FoldingRangeKind, | 6 | DocumentHighlight, DocumentSymbol, Documentation, FoldingRange, FoldingRangeKind, |
7 | FoldingRangeParams, Location, MarkupContent, MarkupKind, MarkedString, Position, | 7 | FoldingRangeParams, Hover, HoverContents, Location, MarkedString, MarkupContent, MarkupKind, |
8 | PrepareRenameResponse, RenameParams, SymbolInformation, TextDocumentIdentifier, TextEdit, | 8 | ParameterInformation, ParameterLabel, Position, PrepareRenameResponse, Range, RenameParams, |
9 | Range, WorkspaceEdit, ParameterInformation, ParameterLabel, SignatureInformation, Hover, | 9 | SignatureInformation, SymbolInformation, TextDocumentIdentifier, TextEdit, WorkspaceEdit, |
10 | HoverContents, DocumentFormattingParams, DocumentHighlight, | ||
11 | }; | 10 | }; |
12 | use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FileRange, FilePosition, Severity}; | 11 | use ra_analysis::{ |
13 | use ra_syntax::{TextUnit, text_utils::intersect}; | 12 | FileId, FilePosition, FileRange, FoldKind, Query, RunnableKind, Severity, SourceChange, |
13 | }; | ||
14 | use ra_syntax::{text_utils::intersect, TextUnit}; | ||
14 | use ra_text_edit::text_utils::contains_offset_nonstrict; | 15 | use ra_text_edit::text_utils::contains_offset_nonstrict; |
15 | use rustc_hash::FxHashMap; | 16 | use rustc_hash::FxHashMap; |
16 | use serde_json::to_value; | 17 | use serde_json::to_value; |
@@ -92,7 +93,7 @@ pub fn handle_on_type_formatting( | |||
92 | world: ServerWorld, | 93 | world: ServerWorld, |
93 | params: req::DocumentOnTypeFormattingParams, | 94 | params: req::DocumentOnTypeFormattingParams, |
94 | ) -> Result<Option<Vec<TextEdit>>> { | 95 | ) -> Result<Option<Vec<TextEdit>>> { |
95 | if params.ch != "=" { | 96 | if params.ch != "=" || params.ch != "." { |
96 | return Ok(None); | 97 | return Ok(None); |
97 | } | 98 | } |
98 | 99 | ||
@@ -102,19 +103,30 @@ pub fn handle_on_type_formatting( | |||
102 | file_id, | 103 | file_id, |
103 | offset: params.position.conv_with(&line_index), | 104 | offset: params.position.conv_with(&line_index), |
104 | }; | 105 | }; |
105 | let edits = match world.analysis().on_eq_typed(position) { | 106 | |
106 | None => return Ok(None), | 107 | let analysis: Vec<Box<Fn(FilePosition) -> Option<SourceChange>>> = vec![ |
107 | Some(mut action) => action | 108 | Box::new(|pos| world.analysis().on_eq_typed(pos)), |
108 | .source_file_edits | 109 | Box::new(|pos| world.analysis().on_dot_typed(pos)), |
109 | .pop() | 110 | ]; |
110 | .unwrap() | 111 | |
111 | .edit | 112 | // try all analysis until one succeeds |
112 | .as_atoms() | 113 | for ana in analysis { |
113 | .iter() | 114 | if let Some(mut action) = ana(position) { |
114 | .map_conv_with(&line_index) | 115 | return Ok(Some( |
115 | .collect(), | 116 | action |
116 | }; | 117 | .source_file_edits |
117 | Ok(Some(edits)) | 118 | .pop() |
119 | .unwrap() | ||
120 | .edit | ||
121 | .as_atoms() | ||
122 | .iter() | ||
123 | .map_conv_with(&line_index) | ||
124 | .collect(), | ||
125 | )); | ||
126 | } | ||
127 | } | ||
128 | |||
129 | return Ok(None); | ||
118 | } | 130 | } |
119 | 131 | ||
120 | pub fn handle_document_symbol( | 132 | pub fn handle_document_symbol( |