diff options
| author | bors <bors@rust-lang.org> | 2022-05-03 20:03:54 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-05-03 20:03:54 +0000 |
| commit | e1b71feb592ba64805689e2b15b9fa570182c442 (patch) | |
| tree | bfd9b0a882376f64b21a6529fe6ccf036d425b5e /compiler/rustc_builtin_macros/src | |
| parent | 086bf7a8ff3550ff1f4c8e78d8b3a7804fdbbb36 (diff) | |
| parent | d33140d2dc95c33bc8281b476048c923476c8b73 (diff) | |
| download | rust-e1b71feb592ba64805689e2b15b9fa570182c442.tar.gz rust-e1b71feb592ba64805689e2b15b9fa570182c442.zip | |
Auto merge of #96558 - bjorn3:librarify_parse_format, r=davidtwco
Make rustc_parse_format compile on stable This allows it to be used by lightweight formatting systems and may allow it to be used by rust-analyzer.
Diffstat (limited to 'compiler/rustc_builtin_macros/src')
| -rw-r--r-- | compiler/rustc_builtin_macros/src/asm.rs | 39 | ||||
| -rw-r--r-- | compiler/rustc_builtin_macros/src/format.rs | 34 |
2 files changed, 50 insertions, 23 deletions
diff --git a/compiler/rustc_builtin_macros/src/asm.rs b/compiler/rustc_builtin_macros/src/asm.rs index e9e3307ca95..c95d7147176 100644 --- a/compiler/rustc_builtin_macros/src/asm.rs +++ b/compiler/rustc_builtin_macros/src/asm.rs @@ -626,7 +626,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl if !parser.errors.is_empty() { let err = parser.errors.remove(0); - let err_sp = template_span.from_inner(err.span); + let err_sp = template_span.from_inner(InnerSpan::new(err.span.start, err.span.end)); let msg = &format!("invalid asm template string: {}", err.description); let mut e = ecx.struct_span_err(err_sp, msg); e.span_label(err_sp, err.label + " in asm template string"); @@ -634,7 +634,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl e.note(¬e); } if let Some((label, span)) = err.secondary_label { - let err_sp = template_span.from_inner(span); + let err_sp = template_span.from_inner(InnerSpan::new(span.start, span.end)); e.span_label(err_sp, label); } e.emit(); @@ -643,7 +643,10 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl curarg = parser.curarg; - let mut arg_spans = parser.arg_places.iter().map(|span| template_span.from_inner(*span)); + let mut arg_spans = parser + .arg_places + .iter() + .map(|span| template_span.from_inner(InnerSpan::new(span.start, span.end))); for piece in unverified_pieces { match piece { parse::Piece::String(s) => { @@ -699,14 +702,21 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl Some(idx) } } - parse::ArgumentNamed(name, span) => match args.named_args.get(&name) { - Some(&idx) => Some(idx), - None => { - let msg = format!("there is no argument named `{}`", name); - ecx.struct_span_err(template_span.from_inner(span), &msg).emit(); - None + parse::ArgumentNamed(name, span) => { + match args.named_args.get(&Symbol::intern(name)) { + Some(&idx) => Some(idx), + None => { + let msg = format!("there is no argument named `{}`", name); + ecx.struct_span_err( + template_span + .from_inner(InnerSpan::new(span.start, span.end)), + &msg, + ) + .emit(); + None + } } - }, + } }; let mut chars = arg.format.ty.chars(); @@ -715,7 +725,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl let span = arg .format .ty_span - .map(|sp| template_sp.from_inner(sp)) + .map(|sp| template_sp.from_inner(InnerSpan::new(sp.start, sp.end))) .unwrap_or(template_sp); ecx.struct_span_err( span, @@ -741,7 +751,12 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl let template_num_lines = 1 + template_str.matches('\n').count(); line_spans.extend(std::iter::repeat(template_sp).take(template_num_lines)); } else { - line_spans.extend(parser.line_spans.iter().map(|span| template_span.from_inner(*span))); + line_spans.extend( + parser + .line_spans + .iter() + .map(|span| template_span.from_inner(InnerSpan::new(span.start, span.end))), + ); }; } diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs index 138e1fa0176..60b96399b5e 100644 --- a/compiler/rustc_builtin_macros/src/format.rs +++ b/compiler/rustc_builtin_macros/src/format.rs @@ -242,7 +242,7 @@ impl<'a, 'b> Context<'a, 'b> { fn resolve_name_inplace(&self, p: &mut parse::Piece<'_>) { // NOTE: the `unwrap_or` branch is needed in case of invalid format // arguments, e.g., `format_args!("{foo}")`. - let lookup = |s: Symbol| *self.names.get(&s).unwrap_or(&0); + let lookup = |s: &str| *self.names.get(&Symbol::intern(s)).unwrap_or(&0); match *p { parse::String(_) => {} @@ -276,7 +276,9 @@ impl<'a, 'b> Context<'a, 'b> { // it's written second, so it should come after width/precision. let pos = match arg.position { parse::ArgumentIs(i) | parse::ArgumentImplicitlyIs(i) => Exact(i), - parse::ArgumentNamed(s, span) => Named(s, span), + parse::ArgumentNamed(s, span) => { + Named(Symbol::intern(s), InnerSpan::new(span.start, span.end)) + } }; let ty = Placeholder(match arg.format.ty { @@ -291,7 +293,10 @@ impl<'a, 'b> Context<'a, 'b> { "X" => "UpperHex", _ => { let fmtsp = self.fmtsp; - let sp = arg.format.ty_span.map(|sp| fmtsp.from_inner(sp)); + let sp = arg + .format + .ty_span + .map(|sp| fmtsp.from_inner(InnerSpan::new(sp.start, sp.end))); let mut err = self.ecx.struct_span_err( sp.unwrap_or(fmtsp), &format!("unknown format trait `{}`", arg.format.ty), @@ -340,14 +345,17 @@ impl<'a, 'b> Context<'a, 'b> { } } - fn verify_count(&mut self, c: parse::Count) { + fn verify_count(&mut self, c: parse::Count<'_>) { match c { parse::CountImplied | parse::CountIs(..) => {} parse::CountIsParam(i) => { self.verify_arg_type(Exact(i), Count); } parse::CountIsName(s, span) => { - self.verify_arg_type(Named(s, span), Count); + self.verify_arg_type( + Named(Symbol::intern(s), InnerSpan::new(span.start, span.end)), + Count, + ); } } } @@ -425,7 +433,7 @@ impl<'a, 'b> Context<'a, 'b> { for fmt in &self.arg_with_formatting { if let Some(span) = fmt.precision_span { - let span = self.fmtsp.from_inner(span); + let span = self.fmtsp.from_inner(InnerSpan::new(span.start, span.end)); match fmt.precision { parse::CountIsParam(pos) if pos > self.num_args() => { e.span_label( @@ -471,7 +479,7 @@ impl<'a, 'b> Context<'a, 'b> { } } if let Some(span) = fmt.width_span { - let span = self.fmtsp.from_inner(span); + let span = self.fmtsp.from_inner(InnerSpan::new(span.start, span.end)); match fmt.width { parse::CountIsParam(pos) if pos > self.num_args() => { e.span_label( @@ -610,7 +618,7 @@ impl<'a, 'b> Context<'a, 'b> { ecx.std_path(&[sym::fmt, sym::rt, sym::v1, s]) } - fn build_count(&self, c: parse::Count) -> P<ast::Expr> { + fn build_count(&self, c: parse::Count<'_>) -> P<ast::Expr> { let sp = self.macsp; let count = |c, arg| { let mut path = Context::rtpath(self.ecx, sym::Count); @@ -1033,7 +1041,7 @@ pub fn expand_preparsed_format_args( if !parser.errors.is_empty() { let err = parser.errors.remove(0); let sp = if efmt_kind_is_lit { - fmt_span.from_inner(err.span) + fmt_span.from_inner(InnerSpan::new(err.span.start, err.span.end)) } else { // The format string could be another macro invocation, e.g.: // format!(concat!("abc", "{}"), 4); @@ -1052,14 +1060,18 @@ pub fn expand_preparsed_format_args( } if let Some((label, span)) = err.secondary_label { if efmt_kind_is_lit { - e.span_label(fmt_span.from_inner(span), label); + e.span_label(fmt_span.from_inner(InnerSpan::new(span.start, span.end)), label); } } e.emit(); return DummyResult::raw_expr(sp, true); } - let arg_spans = parser.arg_places.iter().map(|span| fmt_span.from_inner(*span)).collect(); + let arg_spans = parser + .arg_places + .iter() + .map(|span| fmt_span.from_inner(InnerSpan::new(span.start, span.end))) + .collect(); let named_pos: FxHashSet<usize> = names.values().cloned().collect(); |
