Skip to content

Commit 2c30fa5

Browse files
ytmimicalebcartwright
authored andcommitted
Adjust enum variant spans to exclude any explicit discriminant
Fixes 5686 For reference, explicit discriminants were proposed in [RFC-2363]. `ast::Variant` spans extend to include explicit discriminants when they are present. Now we'll adjust the span of enum variants to exclude any explicit discriminant. [RFC-2363]: https://rust-lang.github.io/rfcs/2363-arbitrary-enum-discriminant.html
1 parent ac2ebd3 commit 2c30fa5

File tree

3 files changed

+104
-3
lines changed

3 files changed

+104
-3
lines changed

src/items.rs

+22-3
Original file line numberDiff line numberDiff line change
@@ -560,7 +560,7 @@ impl<'a> FmtVisitor<'a> {
560560
let variant_body = match field.data {
561561
ast::VariantData::Tuple(..) | ast::VariantData::Struct(..) => format_struct(
562562
&context,
563-
&StructParts::from_variant(field),
563+
&StructParts::from_variant(field, &context),
564564
self.block_indent,
565565
Some(one_line_width),
566566
)?,
@@ -951,14 +951,14 @@ impl<'a> StructParts<'a> {
951951
format_header(context, self.prefix, self.ident, self.vis, offset)
952952
}
953953

954-
fn from_variant(variant: &'a ast::Variant) -> Self {
954+
fn from_variant(variant: &'a ast::Variant, context: &RewriteContext<'_>) -> Self {
955955
StructParts {
956956
prefix: "",
957957
ident: variant.ident,
958958
vis: &DEFAULT_VISIBILITY,
959959
def: &variant.data,
960960
generics: None,
961-
span: variant.span,
961+
span: enum_variant_span(variant, context),
962962
}
963963
}
964964

@@ -979,6 +979,25 @@ impl<'a> StructParts<'a> {
979979
}
980980
}
981981

982+
fn enum_variant_span(variant: &ast::Variant, context: &RewriteContext<'_>) -> Span {
983+
use ast::VariantData::*;
984+
if let Some(ref anon_const) = variant.disr_expr {
985+
let span_before_consts = variant.span.until(anon_const.value.span);
986+
let hi = match &variant.data {
987+
Struct(..) => context
988+
.snippet_provider
989+
.span_after_last(span_before_consts, "}"),
990+
Tuple(..) => context
991+
.snippet_provider
992+
.span_after_last(span_before_consts, ")"),
993+
Unit(..) => variant.ident.span.hi(),
994+
};
995+
mk_sp(span_before_consts.lo(), hi)
996+
} else {
997+
variant.span
998+
}
999+
}
1000+
9821001
fn format_struct(
9831002
context: &RewriteContext<'_>,
9841003
struct_parts: &StructParts<'_>,

tests/source/issue_5686.rs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#[repr(u8)]
2+
enum MyEnum {
3+
UnitWithExplicitDiscriminant = 0,
4+
EmptyStructSingleLineBlockComment {
5+
/* Comment */
6+
} = 1,
7+
EmptyStructMultiLineBlockComment {
8+
/*
9+
* Comment
10+
*/
11+
} = 2,
12+
EmptyStructLineComment {
13+
// comment
14+
} = 3,
15+
EmptyTupleSingleLineBlockComment(
16+
/* Comment */
17+
) = 4,
18+
EmptyTupleMultiLineBlockComment(
19+
/*
20+
* Comment
21+
*/
22+
) = 5,
23+
EmptyTupleLineComment(
24+
// comment
25+
) = 6,
26+
}
27+
28+
enum Animal {
29+
Dog(/* tuple variant closer in comment -> ) */) = 1,
30+
#[hello(world)]
31+
Cat(/* tuple variant close in leading attribute */) = 2,
32+
Bee(/* tuple variant closer on associated field attribute */ #[hello(world)] usize) = 3,
33+
Fox(/* tuple variant closer on const fn call */) = some_const_fn(),
34+
Ant(/* tuple variant closer on macro call */) = some_macro!(),
35+
Snake {/* stuct variant closer in comment -> } */} = 6,
36+
#[hell{world}]
37+
Cobra {/* struct variant close in leading attribute */} = 6,
38+
Eagle {/* struct variant closer on associated field attribute */ #[hell{world}]value: Sting} = 7,
39+
Koala {/* struct variant closer on macro call */} = some_macro!{}
40+
}

tests/target/issue_5686.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#[repr(u8)]
2+
enum MyEnum {
3+
UnitWithExplicitDiscriminant = 0,
4+
EmptyStructSingleLineBlockComment {/* Comment */} = 1,
5+
EmptyStructMultiLineBlockComment {
6+
/*
7+
* Comment
8+
*/
9+
} = 2,
10+
EmptyStructLineComment {
11+
// comment
12+
} = 3,
13+
EmptyTupleSingleLineBlockComment(/* Comment */) = 4,
14+
EmptyTupleMultiLineBlockComment(
15+
/*
16+
* Comment
17+
*/
18+
) = 5,
19+
EmptyTupleLineComment(
20+
// comment
21+
) = 6,
22+
}
23+
24+
enum Animal {
25+
Dog(/* tuple variant closer in comment -> ) */) = 1,
26+
#[hello(world)]
27+
Cat(/* tuple variant close in leading attribute */) = 2,
28+
Bee(
29+
/* tuple variant closer on associated field attribute */ #[hello(world)] usize,
30+
) = 3,
31+
Fox(/* tuple variant closer on const fn call */) = some_const_fn(),
32+
Ant(/* tuple variant closer on macro call */) = some_macro!(),
33+
Snake {/* stuct variant closer in comment -> } */} = 6,
34+
#[hell{world}]
35+
Cobra {/* struct variant close in leading attribute */} = 6,
36+
Eagle {
37+
/* struct variant closer on associated field attribute */
38+
#[hell{world}]
39+
value: Sting,
40+
} = 7,
41+
Koala {/* struct variant closer on macro call */} = some_macro! {},
42+
}

0 commit comments

Comments
 (0)