fix: Fix format_args lowering passing incorrect parameters to rustc_parse_format
This commit is contained in:
parent
9f4b651720
commit
2ff9bab2eb
3 changed files with 18 additions and 6 deletions
|
@ -17,7 +17,7 @@ use syntax::{
|
||||||
self, ArrayExprKind, AstChildren, BlockExpr, HasArgList, HasAttrs, HasLoopBody, HasName,
|
self, ArrayExprKind, AstChildren, BlockExpr, HasArgList, HasAttrs, HasLoopBody, HasName,
|
||||||
RangeItem, SlicePatComponents,
|
RangeItem, SlicePatComponents,
|
||||||
},
|
},
|
||||||
AstNode, AstPtr, SyntaxNodePtr,
|
AstNode, AstPtr, AstToken as _, SyntaxNodePtr,
|
||||||
};
|
};
|
||||||
use triomphe::Arc;
|
use triomphe::Arc;
|
||||||
|
|
||||||
|
@ -1577,7 +1577,13 @@ impl ExprCollector<'_> {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
let template = f.template();
|
let template = f.template();
|
||||||
let fmt_snippet = template.as_ref().map(ToString::to_string);
|
let fmt_snippet = template.as_ref().and_then(|it| match it {
|
||||||
|
ast::Expr::Literal(literal) => match literal.kind() {
|
||||||
|
ast::LiteralKind::String(s) => Some(s.text().to_owned()),
|
||||||
|
_ => None,
|
||||||
|
},
|
||||||
|
_ => None,
|
||||||
|
});
|
||||||
let mut mappings = vec![];
|
let mut mappings = vec![];
|
||||||
let fmt = match template.and_then(|it| self.expand_macros_to_string(it)) {
|
let fmt = match template.and_then(|it| self.expand_macros_to_string(it)) {
|
||||||
Some((s, is_direct_literal)) => format_args::parse(
|
Some((s, is_direct_literal)) => format_args::parse(
|
||||||
|
|
|
@ -150,7 +150,7 @@ fn desugar_builtin_format_args() {
|
||||||
fn main() {
|
fn main() {
|
||||||
let are = "are";
|
let are = "are";
|
||||||
let count = 10;
|
let count = 10;
|
||||||
builtin#format_args("hello {count:02} {} friends, we {are:?} {0}{last}", "fancy", last = "!");
|
builtin#format_args("\u{1b}hello {count:02} {} friends, we {are:?} {0}{last}", "fancy", last = "!");
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
|
@ -161,7 +161,7 @@ fn main() {
|
||||||
let count = 10;
|
let count = 10;
|
||||||
builtin#lang(Arguments::new_v1_formatted)(
|
builtin#lang(Arguments::new_v1_formatted)(
|
||||||
&[
|
&[
|
||||||
"hello ", " ", " friends, we ", " ", "",
|
"\u{1b}hello ", " ", " friends, we ", " ", "",
|
||||||
],
|
],
|
||||||
&[
|
&[
|
||||||
builtin#lang(Argument::new_display)(
|
builtin#lang(Argument::new_display)(
|
||||||
|
|
|
@ -175,7 +175,13 @@ pub(crate) fn parse(
|
||||||
mut synth: impl FnMut(Name) -> ExprId,
|
mut synth: impl FnMut(Name) -> ExprId,
|
||||||
mut record_usage: impl FnMut(Name, Option<TextRange>),
|
mut record_usage: impl FnMut(Name, Option<TextRange>),
|
||||||
) -> FormatArgs {
|
) -> FormatArgs {
|
||||||
let text = s.text_without_quotes();
|
let Ok(text) = s.value() else {
|
||||||
|
return FormatArgs {
|
||||||
|
template: Default::default(),
|
||||||
|
arguments: args.finish(),
|
||||||
|
orphans: vec![],
|
||||||
|
};
|
||||||
|
};
|
||||||
let str_style = match s.quote_offsets() {
|
let str_style = match s.quote_offsets() {
|
||||||
Some(offsets) => {
|
Some(offsets) => {
|
||||||
let raw = usize::from(offsets.quotes.0.len()) - 1;
|
let raw = usize::from(offsets.quotes.0.len()) - 1;
|
||||||
|
@ -186,7 +192,7 @@ pub(crate) fn parse(
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut parser =
|
let mut parser =
|
||||||
parse::Parser::new(text, str_style, fmt_snippet, false, parse::ParseMode::Format);
|
parse::Parser::new(&text, str_style, fmt_snippet, false, parse::ParseMode::Format);
|
||||||
|
|
||||||
let mut pieces = Vec::new();
|
let mut pieces = Vec::new();
|
||||||
while let Some(piece) = parser.next() {
|
while let Some(piece) = parser.next() {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue