Closed
Description
I have not minimized this yet but in TeXitoi/structopt#88 we are seeing inexplicable behavior when iterating over tokens of a struct field doc comment. Related to #49545 so mentioning @alexcrichton.
One of their test cases contains the following struct.
/// Lorem ipsum
#[derive(StructOpt, PartialEq, Debug)]
struct LoremIpsum {
/// Fooify a bar
/// and a baz
#[structopt(short = "f", long = "foo")]
foo: bool,
}
Within their macro implementation we are seeing the desugared doc comment of /// Fooify a bar
having an Alone spacing:
Op(Op { op: '=', spacing: Alone, span: Span(Span { lo: BytePos(0), hi: BytePos(0), ctxt: #0 }) })
Literal(Literal(Literal(Str_(/// Fooify a bar), None)))
while the desugared /// and a baz
has a Joint spacing. I believe the Joint is incorrect because only an Op followed by another Op should be able to have Joint spacing.
Op(Op { op: '=', spacing: Joint, span: Span(Span { lo: BytePos(0), hi: BytePos(0), ctxt: #0 }) })
Literal(Literal(Literal(Str_(/// and a baz), None)))
I stuck the following loop at the top of their derive entry point:
for tt in input.clone() {
println!("{:#?}", tt);
}
and it indicates that the first doc comment has kind: Tree
while the second has kind: JointTree
.
TokenStream {
kind: Tree(
Token(
Span {
lo: BytePos(
0
),
hi: BytePos(
0
),
ctxt: #0
},
DocComment(
/// Fooify a bar
)
)
)
},
TokenStream {
kind: JointTree(
Token(
Span {
lo: BytePos(
0
),
hi: BytePos(
0
),
ctxt: #0
},
DocComment(
/// and a baz
)
)
)
},