diff options
| author | n-salim <53019816+n-salim@users.noreply.github.com> | 2019-09-20 08:47:32 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-09-20 08:47:32 -0700 |
| commit | 66b16496e6c39e9928c5f7091d005d184889884e (patch) | |
| tree | d46ba9ea92d542462d5f01cb38ca0b244ae8a564 /src/libsyntax_ext/format.rs | |
| parent | 83e7976c842a8ad73aa176b8439e1a2480596134 (diff) | |
| parent | 9ad1e7c46cf690b7ec6953b142430d21ca2d8799 (diff) | |
Merge pull request #23 from rust-lang/master
Sync to rust-lang/rust branch master
Diffstat (limited to 'src/libsyntax_ext/format.rs')
| -rw-r--r-- | src/libsyntax_ext/format.rs | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/src/libsyntax_ext/format.rs b/src/libsyntax_ext/format.rs index ad275f421af..46c7cbb83de 100644 --- a/src/libsyntax_ext/format.rs +++ b/src/libsyntax_ext/format.rs @@ -138,15 +138,23 @@ fn parse_args<'a>( } let fmtstr = p.parse_expr()?; + let mut first = true; let mut named = false; while p.token != token::Eof { if !p.eat(&token::Comma) { - let mut err = ecx.struct_span_err(p.token.span, "expected token: `,`"); - err.span_label(p.token.span, "expected `,`"); - p.maybe_annotate_with_ascription(&mut err, false); - return Err(err); + if first { + // After `format!(""` we always expect *only* a comma... + let mut err = ecx.struct_span_err(p.token.span, "expected token: `,`"); + err.span_label(p.token.span, "expected `,`"); + p.maybe_annotate_with_ascription(&mut err, false); + return Err(err); + } else { + // ...after that delegate to `expect` to also include the other expected tokens. + return Err(p.expect(&token::Comma).err().unwrap()); + } } + first = false; if p.token == token::Eof { break; } // accept trailing commas @@ -291,7 +299,7 @@ impl<'a, 'b> Context<'a, 'b> { &format!( "{} positional argument{} in format string, but {}", count, - if count > 1 { "s" } else { "" }, + if count != 1 { "s" } else { "" }, self.describe_num_args(), ), ); @@ -478,7 +486,7 @@ impl<'a, 'b> Context<'a, 'b> { let sp = self.macsp; let count = |c, arg| { let mut path = Context::rtpath(self.ecx, "Count"); - path.push(self.ecx.ident_of(c)); + path.push(self.ecx.ident_of(c, sp)); match arg { Some(arg) => self.ecx.expr_call_global(sp, path, vec![arg]), None => self.ecx.expr_path(self.ecx.path_global(sp, path)), @@ -526,7 +534,7 @@ impl<'a, 'b> Context<'a, 'b> { let pos = { let pos = |c, arg| { let mut path = Context::rtpath(self.ecx, "Position"); - path.push(self.ecx.ident_of(c)); + path.push(self.ecx.ident_of(c, sp)); match arg { Some(i) => { let arg = self.ecx.expr_usize(sp, i); @@ -595,7 +603,7 @@ impl<'a, 'b> Context<'a, 'b> { let fill = self.ecx.expr_lit(sp, ast::LitKind::Char(fill)); let align = |name| { let mut p = Context::rtpath(self.ecx, "Alignment"); - p.push(self.ecx.ident_of(name)); + p.push(self.ecx.ident_of(name, sp)); self.ecx.path_global(sp, p) }; let align = match arg.format.align { @@ -613,11 +621,11 @@ impl<'a, 'b> Context<'a, 'b> { sp, path, vec![ - self.ecx.field_imm(sp, self.ecx.ident_of("fill"), fill), - self.ecx.field_imm(sp, self.ecx.ident_of("align"), align), - self.ecx.field_imm(sp, self.ecx.ident_of("flags"), flags), - self.ecx.field_imm(sp, self.ecx.ident_of("precision"), prec), - self.ecx.field_imm(sp, self.ecx.ident_of("width"), width), + self.ecx.field_imm(sp, self.ecx.ident_of("fill", sp), fill), + self.ecx.field_imm(sp, self.ecx.ident_of("align", sp), align), + self.ecx.field_imm(sp, self.ecx.ident_of("flags", sp), flags), + self.ecx.field_imm(sp, self.ecx.ident_of("precision", sp), prec), + self.ecx.field_imm(sp, self.ecx.ident_of("width", sp), width), ], ); @@ -626,8 +634,8 @@ impl<'a, 'b> Context<'a, 'b> { sp, path, vec![ - self.ecx.field_imm(sp, self.ecx.ident_of("position"), pos), - self.ecx.field_imm(sp, self.ecx.ident_of("format"), fmt), + self.ecx.field_imm(sp, self.ecx.ident_of("position", sp), pos), + self.ecx.field_imm(sp, self.ecx.ident_of("format", sp), fmt), ], )) } @@ -645,7 +653,7 @@ impl<'a, 'b> Context<'a, 'b> { let mut heads = Vec::with_capacity(self.args.len()); let names_pos: Vec<_> = (0..self.args.len()) - .map(|i| ast::Ident::from_str_and_span(&format!("arg{}", i), self.macsp)) + .map(|i| self.ecx.ident_of(&format!("arg{}", i), self.macsp)) .collect(); // First, build up the static array which will become our precompiled @@ -716,7 +724,7 @@ impl<'a, 'b> Context<'a, 'b> { // But the nested match expression is proved to perform not as well // as series of let's; the first approach does. let pat = self.ecx.pat_tuple(self.fmtsp, pats); - let arm = self.ecx.arm(self.fmtsp, vec![pat], args_array); + let arm = self.ecx.arm(self.fmtsp, pat, args_array); let head = self.ecx.expr(self.fmtsp, ast::ExprKind::Tup(heads)); let result = self.ecx.expr_match(self.fmtsp, head, vec![arm]); |
