@@ -16,7 +16,8 @@ use syntax::{
16
16
ast:: {
17
17
self ,
18
18
edit:: { self , AstNodeEdit } ,
19
- make, AssocItem , GenericArgList , GenericParamList , HasGenericParams , HasName ,
19
+ edit_in_place:: AttrsOwnerEdit ,
20
+ make, AssocItem , GenericArgList , GenericParamList , HasAttrs , HasGenericParams , HasName ,
20
21
HasTypeBounds , HasVisibility as astHasVisibility, Path , WherePred ,
21
22
} ,
22
23
ted:: { self , Position } ,
@@ -619,7 +620,8 @@ fn process_assoc_item(
619
620
qual_path_ty : ast:: Path ,
620
621
base_name : & str ,
621
622
) -> Option < ast:: AssocItem > {
622
- match item {
623
+ let attrs = item. attrs ( ) ;
624
+ let assoc = match item {
623
625
AssocItem :: Const ( c) => const_assoc_item ( c, qual_path_ty) ,
624
626
AssocItem :: Fn ( f) => func_assoc_item ( f, qual_path_ty, base_name) ,
625
627
AssocItem :: MacroCall ( _) => {
@@ -628,7 +630,18 @@ fn process_assoc_item(
628
630
None
629
631
}
630
632
AssocItem :: TypeAlias ( ta) => ty_assoc_item ( ta, qual_path_ty) ,
633
+ } ;
634
+ if let Some ( assoc) = & assoc {
635
+ attrs. for_each ( |attr| {
636
+ assoc. add_attr ( attr. clone ( ) ) ;
637
+ // fix indentations
638
+ if let Some ( tok) = attr. syntax ( ) . next_sibling_or_token ( ) {
639
+ let pos = Position :: after ( tok) ;
640
+ ted:: insert ( pos, make:: tokens:: whitespace ( " " ) ) ;
641
+ }
642
+ } )
631
643
}
644
+ assoc
632
645
}
633
646
634
647
fn const_assoc_item ( item : syntax:: ast:: Const , qual_path_ty : ast:: Path ) -> Option < AssocItem > {
@@ -1703,4 +1716,65 @@ impl some_module::SomeTrait for B {
1703
1716
}"# ,
1704
1717
)
1705
1718
}
1719
+
1720
+ #[ test]
1721
+ fn test_fn_with_attrs ( ) {
1722
+ check_assist (
1723
+ generate_delegate_trait,
1724
+ r#"
1725
+ struct A;
1726
+
1727
+ trait T {
1728
+ #[cfg(test)]
1729
+ fn f(&self, a: u32);
1730
+ #[cfg(not(test))]
1731
+ fn f(&self, a: bool);
1732
+ }
1733
+
1734
+ impl T for A {
1735
+ #[cfg(test)]
1736
+ fn f(&self, a: u32) {}
1737
+ #[cfg(not(test))]
1738
+ fn f(&self, a: bool) {}
1739
+ }
1740
+
1741
+ struct B {
1742
+ a$0: A,
1743
+ }
1744
+ "# ,
1745
+ r#"
1746
+ struct A;
1747
+
1748
+ trait T {
1749
+ #[cfg(test)]
1750
+ fn f(&self, a: u32);
1751
+ #[cfg(not(test))]
1752
+ fn f(&self, a: bool);
1753
+ }
1754
+
1755
+ impl T for A {
1756
+ #[cfg(test)]
1757
+ fn f(&self, a: u32) {}
1758
+ #[cfg(not(test))]
1759
+ fn f(&self, a: bool) {}
1760
+ }
1761
+
1762
+ struct B {
1763
+ a: A,
1764
+ }
1765
+
1766
+ impl T for B {
1767
+ #[cfg(test)]
1768
+ fn f(&self, a: u32) {
1769
+ <A as T>::f(&self.a, a)
1770
+ }
1771
+
1772
+ #[cfg(not(test))]
1773
+ fn f(&self, a: bool) {
1774
+ <A as T>::f(&self.a, a)
1775
+ }
1776
+ }
1777
+ "# ,
1778
+ ) ;
1779
+ }
1706
1780
}
0 commit comments