]> git.lizzy.rs Git - rust.git/commitdiff
Fix nitpicks
authorAleksei Sidorov <gorthauer87@yandex.ru>
Fri, 4 Sep 2020 12:24:36 +0000 (15:24 +0300)
committerAleksei Sidorov <gorthauer87@yandex.ru>
Fri, 4 Sep 2020 12:24:36 +0000 (15:24 +0300)
crates/assists/src/handlers/replace_impl_trait_with_generic.rs
crates/syntax/src/ast/edit.rs

index 5b0d5d97103bd3bf37423b60c3e0f4ca97742cd7..612c48466e4f004c6c719155f09b69b74beb2cb2 100644 (file)
@@ -5,13 +5,21 @@
 // Assist: replace_impl_trait_with_generic
 //
 // Replaces `impl Trait` function argument with the named generic.
+//
+// ```
+// fn foo<G>(bar: <|>impl Bar) {}
+// ```
+// ->
+// ```
+// fn foo<B: Bar>(bar: B) {}
+// ```
 pub(crate) fn replace_impl_trait_with_generic(
     acc: &mut Assists,
     ctx: &AssistContext,
 ) -> Option<()> {
     let type_impl_trait = ctx.find_node_at_offset::<ast::ImplTraitType>()?;
     let type_param = type_impl_trait.syntax().parent().and_then(ast::Param::cast)?;
-    let type_fn = type_param.syntax().ancestors().nth(2).and_then(ast::Fn::cast)?;
+    let type_fn = type_param.syntax().ancestors().find_map(ast::Fn::cast)?;
 
     let impl_trait_ty = type_impl_trait
         .syntax()
@@ -27,7 +35,7 @@ pub(crate) fn replace_impl_trait_with_generic(
         "Replace impl trait with generic",
         target,
         |edit| {
-            let generic_letter = impl_trait_ty[..1].to_string();
+            let generic_letter = impl_trait_ty.chars().next().unwrap().to_string();
 
             let generic_param_list = type_fn
                 .generic_param_list()
@@ -36,7 +44,7 @@ pub(crate) fn replace_impl_trait_with_generic(
 
             let new_type_fn = type_fn
                 .replace_descendant::<ast::Type>(type_impl_trait.into(), make::ty(&generic_letter))
-                .with_generic_params(generic_param_list);
+                .with_generic_param_list(generic_param_list);
 
             edit.replace_ast(type_fn.clone(), new_type_fn);
         },
@@ -103,8 +111,6 @@ fn foo<B: Bar>(bar: B) {}
 
     #[test]
     fn replace_impl_trait_with_empty_multiline_generic_params() {
-        // FIXME: It would be more correct to place the generic parameter
-        // on the next line after the left angle.
         check_assist(
             replace_impl_trait_with_generic,
             r#"
@@ -147,8 +153,7 @@ fn foo<
             fn foo<
                 G: Foo,
                 F,
-                H,
-                B: Bar,
+                H, B: Bar,
             >(bar: B) {}
             "#,
         );
index 68987dbf6c50bbac6c5f56be7d6b1768e728525e..5b5454c72d23479569ee73e58c418bdd95a85523 100644 (file)
@@ -48,7 +48,7 @@ pub fn with_body(&self, body: ast::BlockExpr) -> ast::Fn {
     }
 
     #[must_use]
-    pub fn with_generic_params(&self, generic_args: ast::GenericParamList) -> ast::Fn {
+    pub fn with_generic_param_list(&self, generic_args: ast::GenericParamList) -> ast::Fn {
         if let Some(old) = self.generic_param_list() {
             return self.replace_descendant(old, generic_args);
         }
@@ -485,17 +485,7 @@ pub fn append_params(
 
     #[must_use]
     pub fn append_param(&self, item: ast::GenericParam) -> ast::GenericParamList {
-        let is_multiline = self.syntax().text().contains_char('\n');
-        let ws;
-        let space = if is_multiline {
-            ws = tokens::WsBuilder::new(&format!(
-                "\n{}    ",
-                leading_indent(self.syntax()).unwrap_or_default()
-            ));
-            ws.ws()
-        } else {
-            tokens::single_space()
-        };
+        let space = tokens::single_space();
 
         let mut to_insert: ArrayVec<[SyntaxElement; 4]> = ArrayVec::new();
         if self.generic_params().next().is_some() {
@@ -529,11 +519,6 @@ macro_rules! after_field {
             };
         };
 
-        if !is_multiline {
-            // don't insert comma before angle
-            to_insert.pop();
-        }
-
         let position = match self.generic_params().last() {
             Some(it) => after_field!(it),
             None => after_l_angle!(),