aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_lsp_server
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_lsp_server')
-rw-r--r--crates/ra_lsp_server/src/main_loop/handlers.rs56
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
3use gen_lsp_server::ErrorCode; 3use gen_lsp_server::ErrorCode;
4use languageserver_types::{ 4use 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};
12use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FileRange, FilePosition, Severity}; 11use ra_analysis::{
13use ra_syntax::{TextUnit, text_utils::intersect}; 12 FileId, FilePosition, FileRange, FoldKind, Query, RunnableKind, Severity, SourceChange,
13};
14use ra_syntax::{text_utils::intersect, TextUnit};
14use ra_text_edit::text_utils::contains_offset_nonstrict; 15use ra_text_edit::text_utils::contains_offset_nonstrict;
15use rustc_hash::FxHashMap; 16use rustc_hash::FxHashMap;
16use serde_json::to_value; 17use 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
120pub fn handle_document_symbol( 132pub fn handle_document_symbol(