mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-10-31 03:54:42 +00:00 
			
		
		
		
	add qualifiers to attribute completions
This commit is contained in:
		
							parent
							
								
									f1cc7c5c92
								
							
						
					
					
						commit
						b95101ce46
					
				
					 1 changed files with 30 additions and 14 deletions
				
			
		|  | @ -152,17 +152,22 @@ pub(crate) fn complete_attribute_path( | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     let add_completion = |attr_completion: &AttrCompletion| { |     let add_completion = |attr_completion: &AttrCompletion| { | ||||||
|         // if we already have the qualifier of the completion, then trim it from the label and the snippet
 |         // if we don't already have the qualifiers of the completion, then
 | ||||||
|         let mut label = attr_completion.label; |         // add the missing parts to the label and snippet
 | ||||||
|         let mut snippet = attr_completion.snippet; |         let mut label = attr_completion.label.to_owned(); | ||||||
|         if let Some(name_ref) = qualifier_path.and_then(|q| q.as_single_name_ref()) { |         let mut snippet = attr_completion.snippet.map(|s| s.to_owned()); | ||||||
|             if let Some((label_qual, label_seg)) = attr_completion.label.split_once("::") { |         let segments = qualifier_path.iter().flat_map(|q| q.segments()).collect::<Vec<_>>(); | ||||||
|                 if name_ref.text() == label_qual { |         let qualifiers = attr_completion.qualifiers; | ||||||
|                     label = label_seg; |         let matching_qualifiers = segments | ||||||
|                     snippet = snippet.map(|snippet| { |             .iter() | ||||||
|                         snippet.trim_start_matches(label_qual).trim_start_matches("::") |             .zip(qualifiers) | ||||||
|                     }); |             .take_while(|(s, q)| s.name_ref().is_some_and(|t| t.text() == **q)) | ||||||
|                 } |             .count(); | ||||||
|  |         if matching_qualifiers != qualifiers.len() { | ||||||
|  |             let prefix = qualifiers[matching_qualifiers..].join("::"); | ||||||
|  |             label = format!("{prefix}::{label}"); | ||||||
|  |             if let Some(s) = snippet.as_mut() { | ||||||
|  |                 *s = format!("{prefix}::{s}"); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  | @ -197,6 +202,7 @@ struct AttrCompletion { | ||||||
|     label: &'static str, |     label: &'static str, | ||||||
|     lookup: Option<&'static str>, |     lookup: Option<&'static str>, | ||||||
|     snippet: Option<&'static str>, |     snippet: Option<&'static str>, | ||||||
|  |     qualifiers: &'static [&'static str], | ||||||
|     prefer_inner: bool, |     prefer_inner: bool, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -205,6 +211,10 @@ impl AttrCompletion { | ||||||
|         self.lookup.unwrap_or(self.label) |         self.lookup.unwrap_or(self.label) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     const fn qualifiers(self, qualifiers: &'static [&'static str]) -> AttrCompletion { | ||||||
|  |         AttrCompletion { qualifiers, ..self } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     const fn prefer_inner(self) -> AttrCompletion { |     const fn prefer_inner(self) -> AttrCompletion { | ||||||
|         AttrCompletion { prefer_inner: true, ..self } |         AttrCompletion { prefer_inner: true, ..self } | ||||||
|     } |     } | ||||||
|  | @ -215,7 +225,7 @@ const fn attr( | ||||||
|     lookup: Option<&'static str>, |     lookup: Option<&'static str>, | ||||||
|     snippet: Option<&'static str>, |     snippet: Option<&'static str>, | ||||||
| ) -> AttrCompletion { | ) -> AttrCompletion { | ||||||
|     AttrCompletion { label, lookup, snippet, prefer_inner: false } |     AttrCompletion { label, lookup, snippet, qualifiers: &[], prefer_inner: false } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| macro_rules! attrs { | macro_rules! attrs { | ||||||
|  | @ -324,8 +334,14 @@ const ATTRIBUTES: &[AttrCompletion] = &[ | ||||||
|     attr("deny(…)", Some("deny"), Some("deny(${0:lint})")), |     attr("deny(…)", Some("deny"), Some("deny(${0:lint})")), | ||||||
|     attr(r#"deprecated"#, Some("deprecated"), Some(r#"deprecated"#)), |     attr(r#"deprecated"#, Some("deprecated"), Some(r#"deprecated"#)), | ||||||
|     attr("derive(…)", Some("derive"), Some(r#"derive(${0:Debug})"#)), |     attr("derive(…)", Some("derive"), Some(r#"derive(${0:Debug})"#)), | ||||||
|     attr("diagnostic::do_not_recommend", None, None), |     attr("do_not_recommend", Some("diagnostic::do_not_recommend"), None) | ||||||
|     attr("diagnostic::on_unimplemented", None, Some(r#"diagnostic::on_unimplemented(${0:keys})"#)), |         .qualifiers(&["diagnostic"]), | ||||||
|  |     attr( | ||||||
|  |         "on_unimplemented", | ||||||
|  |         Some("diagnostic::on_unimplemented"), | ||||||
|  |         Some(r#"on_unimplemented(${0:keys})"#), | ||||||
|  |     ) | ||||||
|  |     .qualifiers(&["diagnostic"]), | ||||||
|     attr(r#"doc = "…""#, Some("doc"), Some(r#"doc = "${0:docs}""#)), |     attr(r#"doc = "…""#, Some("doc"), Some(r#"doc = "${0:docs}""#)), | ||||||
|     attr(r#"doc(alias = "…")"#, Some("docalias"), Some(r#"doc(alias = "${0:docs}")"#)), |     attr(r#"doc(alias = "…")"#, Some("docalias"), Some(r#"doc(alias = "${0:docs}")"#)), | ||||||
|     attr(r#"doc(hidden)"#, Some("dochidden"), Some(r#"doc(hidden)"#)), |     attr(r#"doc(hidden)"#, Some("dochidden"), Some(r#"doc(hidden)"#)), | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ryan Mehri
						Ryan Mehri