diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_expand/src/builtin_macro.rs | 24 | ||||
-rw-r--r-- | crates/rust-analyzer/src/config.rs | 7 | ||||
-rw-r--r-- | crates/rust-analyzer/src/handlers.rs | 70 |
3 files changed, 52 insertions, 49 deletions
diff --git a/crates/hir_expand/src/builtin_macro.rs b/crates/hir_expand/src/builtin_macro.rs index 80b60d59f..2806842cd 100644 --- a/crates/hir_expand/src/builtin_macro.rs +++ b/crates/hir_expand/src/builtin_macro.rs | |||
@@ -327,17 +327,12 @@ fn concat_expand( | |||
327 | // concat works with string and char literals, so remove any quotes. | 327 | // concat works with string and char literals, so remove any quotes. |
328 | // It also works with integer, float and boolean literals, so just use the rest | 328 | // It also works with integer, float and boolean literals, so just use the rest |
329 | // as-is. | 329 | // as-is. |
330 | 330 | let component = unquote_str(&it).unwrap_or_else(|| it.text.to_string()); | |
331 | text += it | 331 | text.push_str(&component); |
332 | .text | 332 | } |
333 | .trim_start_matches(|c| match c { | 333 | // handle boolean literals |
334 | 'r' | '#' | '\'' | '"' => true, | 334 | tt::TokenTree::Leaf(tt::Leaf::Ident(id)) if i % 2 == 0 => { |
335 | _ => false, | 335 | text.push_str(id.text.as_str()); |
336 | }) | ||
337 | .trim_end_matches(|c| match c { | ||
338 | '#' | '\'' | '"' => true, | ||
339 | _ => false, | ||
340 | }); | ||
341 | } | 336 | } |
342 | tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (), | 337 | tt::TokenTree::Leaf(tt::Leaf::Punct(punct)) if i % 2 == 1 && punct.char == ',' => (), |
343 | _ => { | 338 | _ => { |
@@ -345,7 +340,6 @@ fn concat_expand( | |||
345 | } | 340 | } |
346 | } | 341 | } |
347 | } | 342 | } |
348 | |||
349 | ExpandResult { value: Some((quote!(#text), FragmentKind::Expr)), err } | 343 | ExpandResult { value: Some((quote!(#text), FragmentKind::Expr)), err } |
350 | } | 344 | } |
351 | 345 | ||
@@ -745,12 +739,10 @@ mod tests { | |||
745 | r##" | 739 | r##" |
746 | #[rustc_builtin_macro] | 740 | #[rustc_builtin_macro] |
747 | macro_rules! concat {} | 741 | macro_rules! concat {} |
748 | concat!("foo", 0, r#"bar"#); | 742 | concat!("foo", r, 0, r#"bar"#, false); |
749 | "##, | 743 | "##, |
750 | ); | 744 | ); |
751 | 745 | ||
752 | assert_eq!(expanded, r#""foo0bar""#); | 746 | assert_eq!(expanded, r#""foor0barfalse""#); |
753 | |||
754 | // FIXME: `true`/`false` literals don't work. | ||
755 | } | 747 | } |
756 | } | 748 | } |
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs index 3ddb9e19a..247bfe71e 100644 --- a/crates/rust-analyzer/src/config.rs +++ b/crates/rust-analyzer/src/config.rs | |||
@@ -147,6 +147,9 @@ config_data! { | |||
147 | /// Whether to show `Method References` lens. Only applies when | 147 | /// Whether to show `Method References` lens. Only applies when |
148 | /// `#rust-analyzer.lens.enable#` is set. | 148 | /// `#rust-analyzer.lens.enable#` is set. |
149 | lens_methodReferences: bool = "false", | 149 | lens_methodReferences: bool = "false", |
150 | /// Whether to show `References` lens. Only applies when | ||
151 | /// `#rust-analyzer.lens.enable#` is set. | ||
152 | lens_references: bool = "false", | ||
150 | 153 | ||
151 | /// Disable project auto-discovery in favor of explicitly specified set | 154 | /// Disable project auto-discovery in favor of explicitly specified set |
152 | /// of projects.\n\nElements must be paths pointing to `Cargo.toml`, | 155 | /// of projects.\n\nElements must be paths pointing to `Cargo.toml`, |
@@ -221,6 +224,7 @@ pub struct LensConfig { | |||
221 | pub debug: bool, | 224 | pub debug: bool, |
222 | pub implementations: bool, | 225 | pub implementations: bool, |
223 | pub method_refs: bool, | 226 | pub method_refs: bool, |
227 | pub refs: bool, // for Struct, Enum, Union and Trait | ||
224 | } | 228 | } |
225 | 229 | ||
226 | impl LensConfig { | 230 | impl LensConfig { |
@@ -237,7 +241,7 @@ impl LensConfig { | |||
237 | } | 241 | } |
238 | 242 | ||
239 | pub fn references(&self) -> bool { | 243 | pub fn references(&self) -> bool { |
240 | self.method_refs | 244 | self.method_refs || self.refs |
241 | } | 245 | } |
242 | } | 246 | } |
243 | 247 | ||
@@ -593,6 +597,7 @@ impl Config { | |||
593 | debug: self.data.lens_enable && self.data.lens_debug, | 597 | debug: self.data.lens_enable && self.data.lens_debug, |
594 | implementations: self.data.lens_enable && self.data.lens_implementations, | 598 | implementations: self.data.lens_enable && self.data.lens_implementations, |
595 | method_refs: self.data.lens_enable && self.data.lens_methodReferences, | 599 | method_refs: self.data.lens_enable && self.data.lens_methodReferences, |
600 | refs: self.data.lens_enable && self.data.lens_references, | ||
596 | } | 601 | } |
597 | } | 602 | } |
598 | pub fn hover(&self) -> HoverConfig { | 603 | pub fn hover(&self) -> HoverConfig { |
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs index 809452e6d..07204436c 100644 --- a/crates/rust-analyzer/src/handlers.rs +++ b/crates/rust-analyzer/src/handlers.rs | |||
@@ -1112,42 +1112,48 @@ pub(crate) fn handle_code_lens( | |||
1112 | } | 1112 | } |
1113 | } | 1113 | } |
1114 | 1114 | ||
1115 | if lens_config.implementations { | 1115 | if lens_config.implementations || lens_config.refs { |
1116 | // Handle impls | 1116 | snap.analysis |
1117 | lenses.extend( | 1117 | .file_structure(file_id)? |
1118 | snap.analysis | 1118 | .into_iter() |
1119 | .file_structure(file_id)? | 1119 | .filter(|it| { |
1120 | .into_iter() | 1120 | matches!( |
1121 | .filter(|it| { | 1121 | it.kind, |
1122 | matches!( | 1122 | SymbolKind::Trait | SymbolKind::Struct | SymbolKind::Enum | SymbolKind::Union |
1123 | it.kind, | 1123 | ) |
1124 | SymbolKind::Trait | 1124 | }) |
1125 | | SymbolKind::Struct | 1125 | .for_each(|it| { |
1126 | | SymbolKind::Enum | 1126 | let range = to_proto::range(&line_index, it.node_range); |
1127 | | SymbolKind::Union | 1127 | let position = to_proto::position(&line_index, it.navigation_range.start()); |
1128 | ) | 1128 | let doc_pos = lsp_types::TextDocumentPositionParams::new( |
1129 | }) | 1129 | params.text_document.clone(), |
1130 | .map(|it| { | 1130 | position, |
1131 | let range = to_proto::range(&line_index, it.node_range); | 1131 | ); |
1132 | let pos = range.start; | 1132 | let goto_params = lsp_types::request::GotoImplementationParams { |
1133 | let lens_params = lsp_types::request::GotoImplementationParams { | 1133 | text_document_position_params: doc_pos.clone(), |
1134 | text_document_position_params: lsp_types::TextDocumentPositionParams::new( | 1134 | work_done_progress_params: Default::default(), |
1135 | params.text_document.clone(), | 1135 | partial_result_params: Default::default(), |
1136 | pos, | 1136 | }; |
1137 | ), | 1137 | |
1138 | work_done_progress_params: Default::default(), | 1138 | if lens_config.implementations { |
1139 | partial_result_params: Default::default(), | 1139 | lenses.push(CodeLens { |
1140 | }; | ||
1141 | CodeLens { | ||
1142 | range, | 1140 | range, |
1143 | command: None, | 1141 | command: None, |
1144 | data: Some(to_value(CodeLensResolveData::Impls(lens_params)).unwrap()), | 1142 | data: Some(to_value(CodeLensResolveData::Impls(goto_params)).unwrap()), |
1145 | } | 1143 | }) |
1146 | }), | 1144 | } |
1147 | ); | 1145 | |
1146 | if lens_config.refs { | ||
1147 | lenses.push(CodeLens { | ||
1148 | range, | ||
1149 | command: None, | ||
1150 | data: Some(to_value(CodeLensResolveData::References(doc_pos)).unwrap()), | ||
1151 | }) | ||
1152 | } | ||
1153 | }); | ||
1148 | } | 1154 | } |
1149 | 1155 | ||
1150 | if lens_config.references() { | 1156 | if lens_config.method_refs { |
1151 | lenses.extend(snap.analysis.find_all_methods(file_id)?.into_iter().map(|it| { | 1157 | lenses.extend(snap.analysis.find_all_methods(file_id)?.into_iter().map(|it| { |
1152 | let range = to_proto::range(&line_index, it.range); | 1158 | let range = to_proto::range(&line_index, it.range); |
1153 | let position = to_proto::position(&line_index, it.range.start()); | 1159 | let position = to_proto::position(&line_index, it.range.start()); |