File tree 4 files changed +189
-1
lines changed
4 files changed +189
-1
lines changed Original file line number Diff line number Diff line change @@ -389,6 +389,10 @@ impl Rewrite for [ast::Attribute] {
389
389
let mut attrs = self ;
390
390
let mut result = String :: new ( ) ;
391
391
392
+ // Determine if the source text is annotated with `#[rustfmt::skip::attributes(derive)]`
393
+ // or `#![rustfmt::skip::attributes(derive)]`
394
+ let skip_derives = context. skip_context . skip_attribute ( "derive" ) ;
395
+
392
396
// This is not just a simple map because we need to handle doc comments
393
397
// (where we take as many doc comment attributes as possible) and possibly
394
398
// merging derives into a single attribute.
@@ -431,7 +435,7 @@ impl Rewrite for [ast::Attribute] {
431
435
}
432
436
433
437
// Handle derives if we will merge them.
434
- if context. config . merge_derives ( ) && is_derive ( & attrs[ 0 ] ) {
438
+ if !skip_derives && context. config . merge_derives ( ) && is_derive ( & attrs[ 0 ] ) {
435
439
let derives = take_while_with_pred ( context, attrs, is_derive) ;
436
440
let derive_str = format_derive ( derives, shape, context) ?;
437
441
result. push_str ( & derive_str) ;
Original file line number Diff line number Diff line change
1
+ // rustfmt-merge_derives:true
2
+
3
+ #[ rustfmt:: skip:: attributes( derive) ]
4
+ #[ allow( dead_code) ]
5
+ #[ derive( StructField ) ]
6
+ #[ derive( Clone ) ]
7
+ struct DoNotMergeDerives {
8
+ field : String ,
9
+ }
10
+
11
+ #[ allow( dead_code) ]
12
+ #[ derive( StructField ) ]
13
+ #[ rustfmt:: skip:: attributes( derive) ]
14
+ #[ derive( Clone ) ]
15
+ struct DoNotMergeDerivesSkipInMiddle {
16
+ field : String ,
17
+ }
18
+
19
+ #[ allow( dead_code) ]
20
+ #[ derive( StructField ) ]
21
+ #[ derive( Clone ) ]
22
+ #[ rustfmt:: skip:: attributes( derive) ]
23
+ struct DoNotMergeDerivesSkipAtEnd {
24
+ field : String ,
25
+ }
26
+
27
+ #[ allow( dead_code) ]
28
+ #[ derive( StructField ) ]
29
+ #[ derive( Clone ) ]
30
+ struct MergeDerives {
31
+ field : String ,
32
+ }
33
+
34
+ mod inner_attribute_derive_skip {
35
+ #![ rustfmt:: skip:: attributes( derive) ]
36
+
37
+ #[ allow( dead_code) ]
38
+ #[ derive( StructField ) ]
39
+ #[ derive( Clone ) ]
40
+ struct DoNotMergeDerives {
41
+ field : String ,
42
+ }
43
+ }
44
+
45
+ #[ rustfmt:: skip:: attributes( derive) ]
46
+ mod outer_attribute_derive_skip {
47
+ #[ allow( dead_code) ]
48
+ #[ derive( StructField ) ]
49
+ #[ derive( Clone ) ]
50
+ struct DoNotMergeDerives {
51
+ field : String ,
52
+ }
53
+ }
54
+
55
+ mod no_derive_skip {
56
+ #[ allow( dead_code) ]
57
+ #[ derive( StructField ) ]
58
+ #[ derive( Clone ) ]
59
+ struct MergeDerives {
60
+ field : String ,
61
+ }
62
+ }
Original file line number Diff line number Diff line change
1
+ // rustfmt-merge_derives:false
2
+
3
+ #[ rustfmt:: skip:: attributes( derive) ]
4
+ #[ allow( dead_code) ]
5
+ #[ derive( StructField ) ]
6
+ #[ derive( Clone ) ]
7
+ struct DoNotMergeDerives {
8
+ field : String ,
9
+ }
10
+
11
+ #[ allow( dead_code) ]
12
+ #[ derive( StructField ) ]
13
+ #[ rustfmt:: skip:: attributes( derive) ]
14
+ #[ derive( Clone ) ]
15
+ struct DoNotMergeDerivesSkipInMiddle {
16
+ field : String ,
17
+ }
18
+
19
+ #[ allow( dead_code) ]
20
+ #[ derive( StructField ) ]
21
+ #[ derive( Clone ) ]
22
+ #[ rustfmt:: skip:: attributes( derive) ]
23
+ struct DoNotMergeDerivesSkipAtEnd {
24
+ field : String ,
25
+ }
26
+
27
+ #[ allow( dead_code) ]
28
+ #[ derive( StructField ) ]
29
+ #[ derive( Clone ) ]
30
+ struct MergeDerives {
31
+ field : String ,
32
+ }
33
+
34
+ mod inner_attribute_derive_skip {
35
+ #![ rustfmt:: skip:: attributes( derive) ]
36
+
37
+ #[ allow( dead_code) ]
38
+ #[ derive( StructField ) ]
39
+ #[ derive( Clone ) ]
40
+ struct DoNotMergeDerives {
41
+ field : String ,
42
+ }
43
+ }
44
+
45
+ #[ rustfmt:: skip:: attributes( derive) ]
46
+ mod outer_attribute_derive_skip {
47
+ #[ allow( dead_code) ]
48
+ #[ derive( StructField ) ]
49
+ #[ derive( Clone ) ]
50
+ struct DoNotMergeDerives {
51
+ field : String ,
52
+ }
53
+ }
54
+
55
+ mod no_derive_skip {
56
+ #[ allow( dead_code) ]
57
+ #[ derive( StructField ) ]
58
+ #[ derive( Clone ) ]
59
+ struct MergeDerives {
60
+ field : String ,
61
+ }
62
+ }
Original file line number Diff line number Diff line change
1
+ // rustfmt-merge_derives:true
2
+
3
+ #[ rustfmt:: skip:: attributes( derive) ]
4
+ #[ allow( dead_code) ]
5
+ #[ derive( StructField ) ]
6
+ #[ derive( Clone ) ]
7
+ struct DoNotMergeDerives {
8
+ field : String ,
9
+ }
10
+
11
+ #[ allow( dead_code) ]
12
+ #[ derive( StructField ) ]
13
+ #[ rustfmt:: skip:: attributes( derive) ]
14
+ #[ derive( Clone ) ]
15
+ struct DoNotMergeDerivesSkipInMiddle {
16
+ field : String ,
17
+ }
18
+
19
+ #[ allow( dead_code) ]
20
+ #[ derive( StructField ) ]
21
+ #[ derive( Clone ) ]
22
+ #[ rustfmt:: skip:: attributes( derive) ]
23
+ struct DoNotMergeDerivesSkipAtEnd {
24
+ field : String ,
25
+ }
26
+
27
+ #[ allow( dead_code) ]
28
+ #[ derive( StructField , Clone ) ]
29
+ struct MergeDerives {
30
+ field : String ,
31
+ }
32
+
33
+ mod inner_attribute_derive_skip {
34
+ #![ rustfmt:: skip:: attributes( derive) ]
35
+
36
+ #[ allow( dead_code) ]
37
+ #[ derive( StructField ) ]
38
+ #[ derive( Clone ) ]
39
+ struct DoNotMergeDerives {
40
+ field : String ,
41
+ }
42
+ }
43
+
44
+ #[ rustfmt:: skip:: attributes( derive) ]
45
+ mod outer_attribute_derive_skip {
46
+ #[ allow( dead_code) ]
47
+ #[ derive( StructField ) ]
48
+ #[ derive( Clone ) ]
49
+ struct DoNotMergeDerives {
50
+ field : String ,
51
+ }
52
+ }
53
+
54
+ mod no_derive_skip {
55
+ #[ allow( dead_code) ]
56
+ #[ derive( StructField , Clone ) ]
57
+ struct MergeDerives {
58
+ field : String ,
59
+ }
60
+ }
You can’t perform that action at this time.
0 commit comments