diff options
| author | Matthias Krüger <matthias.krueger@famsik.de> | 2023-06-11 01:57:25 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-06-11 01:57:25 +0200 |
| commit | e19a509f8fe93ede778f11338c9f392b3f37bfae (patch) | |
| tree | 37e8336290f6888df5e5efb676e9e3400b4dc965 /compiler/rustc_parse/src/parser | |
| parent | 7820972f866ca2cea281ccc39201c0cd27087110 (diff) | |
| parent | f54e75730bb33d08281c91a9b77332606ec69942 (diff) | |
| download | rust-e19a509f8fe93ede778f11338c9f392b3f37bfae.tar.gz rust-e19a509f8fe93ede778f11338c9f392b3f37bfae.zip | |
Rollup merge of #112475 - chenyukang:yukang-fix-112278, r=compiler-errors
Fix issue for module name when surround the struct literal with parentheses Fixes #112278
Diffstat (limited to 'compiler/rustc_parse/src/parser')
| -rw-r--r-- | compiler/rustc_parse/src/parser/diagnostics.rs | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index c1454039685..228eff1269f 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -751,13 +751,24 @@ impl<'a> Parser<'a> { tail.could_be_bare_literal = true; if maybe_struct_name.is_ident() && can_be_struct_literal { // Account for `if Example { a: one(), }.is_pos() {}`. - Err(self.sess.create_err(StructLiteralNeedingParens { - span: maybe_struct_name.span.to(expr.span), - sugg: StructLiteralNeedingParensSugg { - before: maybe_struct_name.span.shrink_to_lo(), - after: expr.span.shrink_to_hi(), - }, - })) + // expand `before` so that we take care of module path such as: + // `foo::Bar { ... } ` + // we expect to suggest `(foo::Bar { ... })` instead of `foo::(Bar { ... })` + let sm = self.sess.source_map(); + let before = maybe_struct_name.span.shrink_to_lo(); + if let Ok(extend_before) = sm.span_extend_prev_while(before, |t| { + t.is_alphanumeric() || t == ':' || t == '_' + }) { + Err(self.sess.create_err(StructLiteralNeedingParens { + span: maybe_struct_name.span.to(expr.span), + sugg: StructLiteralNeedingParensSugg { + before: extend_before.shrink_to_lo(), + after: expr.span.shrink_to_hi(), + }, + })) + } else { + return None; + } } else { self.sess.emit_err(StructLiteralBodyWithoutPath { span: expr.span, |
