Rollup merge of #142341 - xizheyin:142311, r=fee1-dead

Don't suggest converting `///` to `//` when expecting `,`

Fixes rust-lang/rust#142311
This commit is contained in:
Jakub Beránek 2025-06-16 19:54:33 +02:00 committed by GitHub
commit d68432a1a9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 105 additions and 17 deletions

View file

@ -686,23 +686,34 @@ impl<'a> Parser<'a> {
}
if let token::DocComment(kind, style, _) = self.token.kind {
// We have something like `expr //!val` where the user likely meant `expr // !val`
let pos = self.token.span.lo() + BytePos(2);
let span = self.token.span.with_lo(pos).with_hi(pos);
err.span_suggestion_verbose(
span,
format!(
"add a space before {} to write a regular comment",
match (kind, style) {
(token::CommentKind::Line, ast::AttrStyle::Inner) => "`!`",
(token::CommentKind::Block, ast::AttrStyle::Inner) => "`!`",
(token::CommentKind::Line, ast::AttrStyle::Outer) => "the last `/`",
(token::CommentKind::Block, ast::AttrStyle::Outer) => "the last `*`",
},
),
" ".to_string(),
Applicability::MachineApplicable,
);
// This is to avoid suggesting converting a doc comment to a regular comment
// when missing a comma before the doc comment in lists (#142311):
//
// ```
// enum Foo{
// A /// xxxxxxx
// B,
// }
// ```
if !expected.contains(&TokenType::Comma) {
// We have something like `expr //!val` where the user likely meant `expr // !val`
let pos = self.token.span.lo() + BytePos(2);
let span = self.token.span.with_lo(pos).with_hi(pos);
err.span_suggestion_verbose(
span,
format!(
"add a space before {} to write a regular comment",
match (kind, style) {
(token::CommentKind::Line, ast::AttrStyle::Inner) => "`!`",
(token::CommentKind::Block, ast::AttrStyle::Inner) => "`!`",
(token::CommentKind::Line, ast::AttrStyle::Outer) => "the last `/`",
(token::CommentKind::Block, ast::AttrStyle::Outer) => "the last `*`",
},
),
" ".to_string(),
Applicability::MaybeIncorrect,
);
}
}
let sp = if self.token == token::Eof {

View file

@ -0,0 +1,34 @@
//! Check that if the parser suggests converting `///` to a regular comment
//! when it appears after a missing comma in an list (e.g. `enum` variants).
//!
//! Related issue
//! - https://github.com/rust-lang/rust/issues/142311
enum Foo {
/// Like the noise a sheep makes
Bar
/// Like where people drink
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `/// Like where people drink`
Baa///xxxxxx
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `///xxxxxx`
Baz///xxxxxx
//~^ ERROR expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `///xxxxxx`
}
fn foo() {
let a = [
1///xxxxxx
//~^ ERROR expected one of `,`, `.`, `;`, `?`, `]`, or an operator, found doc comment `///xxxxxx`
2
];
}
fn bar() {
let a = [
1,
2///xxxxxx
//~^ ERROR expected one of `,`, `.`, `?`, `]`, or an operator, found doc comment `///xxxxxx`
];
}
fn main() {}

View file

@ -0,0 +1,43 @@
error: expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `/// Like where people drink`
--> $DIR/doc-comment-after-missing-comma-issue-142311.rs:10:5
|
LL | Bar
| -
| |
| expected one of `(`, `,`, `=`, `{`, or `}`
| help: missing `,`
LL | /// Like where people drink
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ unexpected token
error: expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `///xxxxxx`
--> $DIR/doc-comment-after-missing-comma-issue-142311.rs:12:8
|
LL | Baa///xxxxxx
| -^^^^^^^^
| |
| expected one of `(`, `,`, `=`, `{`, or `}`
| help: missing `,`
error: expected one of `(`, `,`, `=`, `{`, or `}`, found doc comment `///xxxxxx`
--> $DIR/doc-comment-after-missing-comma-issue-142311.rs:14:8
|
LL | Baz///xxxxxx
| ^^^^^^^^^ expected one of `(`, `,`, `=`, `{`, or `}`
|
= help: doc comments must come before what they document, if a comment was intended use `//`
= help: enum variants can be `Variant`, `Variant = <integer>`, `Variant(Type, ..., TypeN)` or `Variant { fields: Types }`
error: expected one of `,`, `.`, `;`, `?`, `]`, or an operator, found doc comment `///xxxxxx`
--> $DIR/doc-comment-after-missing-comma-issue-142311.rs:20:10
|
LL | 1///xxxxxx
| ^^^^^^^^^ expected one of `,`, `.`, `;`, `?`, `]`, or an operator
error: expected one of `,`, `.`, `?`, `]`, or an operator, found doc comment `///xxxxxx`
--> $DIR/doc-comment-after-missing-comma-issue-142311.rs:29:10
|
LL | 2///xxxxxx
| ^^^^^^^^^ expected one of `,`, `.`, `?`, `]`, or an operator
error: aborting due to 5 previous errors