@@ -2642,6 +2642,38 @@ fn filter_tokens_from_list(
2642
2642
tokens
2643
2643
}
2644
2644
2645
+ fn filter_doc_attr_ident ( ident : Symbol , is_inline : bool ) -> bool {
2646
+ if is_inline {
2647
+ ident == sym:: hidden || ident == sym:: inline || ident == sym:: no_inline
2648
+ } else {
2649
+ ident == sym:: cfg
2650
+ }
2651
+ }
2652
+
2653
+ fn filter_doc_attr ( normal : & mut ast:: NormalAttr , is_inline : bool ) {
2654
+ match normal. item . args {
2655
+ ast:: AttrArgs :: Delimited ( ref mut args) => {
2656
+ let tokens = filter_tokens_from_list ( & args. tokens , |token| {
2657
+ !matches ! (
2658
+ token,
2659
+ TokenTree :: Token (
2660
+ Token {
2661
+ kind: TokenKind :: Ident (
2662
+ ident,
2663
+ _,
2664
+ ) ,
2665
+ ..
2666
+ } ,
2667
+ _,
2668
+ ) if filter_doc_attr_ident( * ident, is_inline) ,
2669
+ )
2670
+ } ) ;
2671
+ args. tokens = TokenStream :: new ( tokens) ;
2672
+ }
2673
+ ast:: AttrArgs :: Empty | ast:: AttrArgs :: Eq ( ..) => { }
2674
+ }
2675
+ }
2676
+
2645
2677
/// When inlining items, we merge their attributes (and all the reexports attributes too) with the
2646
2678
/// final reexport. For example:
2647
2679
///
@@ -2668,13 +2700,6 @@ fn add_without_unwanted_attributes<'hir>(
2668
2700
is_inline : bool ,
2669
2701
import_parent : Option < DefId > ,
2670
2702
) {
2671
- // If it's not `#[doc(inline)]`, we don't want all attributes, otherwise we keep everything.
2672
- if !is_inline {
2673
- for attr in new_attrs {
2674
- attrs. push ( ( Cow :: Borrowed ( attr) , import_parent) ) ;
2675
- }
2676
- return ;
2677
- }
2678
2703
for attr in new_attrs {
2679
2704
if matches ! ( attr. kind, ast:: AttrKind :: DocComment ( ..) ) {
2680
2705
attrs. push ( ( Cow :: Borrowed ( attr) , import_parent) ) ;
@@ -2683,34 +2708,14 @@ fn add_without_unwanted_attributes<'hir>(
2683
2708
let mut attr = attr. clone ( ) ;
2684
2709
match attr. kind {
2685
2710
ast:: AttrKind :: Normal ( ref mut normal) => {
2686
- if let [ ident] = & * normal. item . path . segments &&
2687
- let ident = ident. ident . name &&
2688
- ident == sym:: doc
2689
- {
2690
- match normal. item . args {
2691
- ast:: AttrArgs :: Delimited ( ref mut args) => {
2692
- let tokens =
2693
- filter_tokens_from_list ( & args. tokens , |token| {
2694
- !matches ! (
2695
- token,
2696
- TokenTree :: Token (
2697
- Token {
2698
- kind: TokenKind :: Ident (
2699
- sym:: hidden | sym:: inline | sym:: no_inline,
2700
- _,
2701
- ) ,
2702
- ..
2703
- } ,
2704
- _,
2705
- ) ,
2706
- )
2707
- } ) ;
2708
- args. tokens = TokenStream :: new ( tokens) ;
2709
- attrs. push ( ( Cow :: Owned ( attr) , import_parent) ) ;
2710
- }
2711
- ast:: AttrArgs :: Empty | ast:: AttrArgs :: Eq ( ..) => {
2712
- attrs. push ( ( Cow :: Owned ( attr) , import_parent) ) ;
2713
- }
2711
+ if let [ ident] = & * normal. item . path . segments {
2712
+ let ident = ident. ident . name ;
2713
+ if ident == sym:: doc {
2714
+ filter_doc_attr ( normal, is_inline) ;
2715
+ attrs. push ( ( Cow :: Owned ( attr) , import_parent) ) ;
2716
+ } else if ident != sym:: cfg {
2717
+ // If it's not a `cfg()` attribute, we keep it.
2718
+ attrs. push ( ( Cow :: Owned ( attr) , import_parent) ) ;
2714
2719
}
2715
2720
}
2716
2721
}
0 commit comments