Remove duplicate impl of string unescape

This commit is contained in:
Marijn Schouten
2025-02-19 11:41:31 +01:00
parent 7295b08a17
commit 3d4737fb5e
6 changed files with 453 additions and 552 deletions

View File

@@ -41,7 +41,6 @@ fn simple() {
same("}}", &[Lit("}")]);
same("\\}}", &[Lit("\\"), Lit("}")]);
}
#[test]
fn invalid01() {
musterr("{")
@@ -79,23 +78,48 @@ fn invalid_precision() {
}
#[test]
fn format_nothing() {
fn format_empty() {
same(
"{}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: fmtdflt(),
}))],
);
}
#[test]
fn format_tab_empty() {
let fmt_pre = r###""\t{}""###;
let fmt = "\t{}";
let parser = Parser::new(fmt, None, Some(fmt_pre.into()), false, ParseMode::Format);
assert_eq!(
parser.collect::<Vec<Piece<'static>>>(),
&[
Lit("\t"),
NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: 4..4,
format: fmtdflt(),
}))
],
);
}
#[test]
fn format_open_brace_tab() {
let fmt_pre = r###""{\t""###;
let fmt = "{\t";
let mut parser = Parser::new(fmt, None, Some(fmt_pre.into()), false, ParseMode::Format);
let _ = parser.by_ref().collect::<Vec<Piece<'static>>>();
assert_eq!(parser.errors[0].span, 4..4);
}
#[test]
fn format_position() {
same(
"{3}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: fmtdflt(),
}))],
);
@@ -106,7 +130,7 @@ fn format_position_nothing_else() {
"{3:}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: fmtdflt(),
}))],
);
@@ -117,18 +141,54 @@ fn format_named() {
"{name}",
&[NextArgument(Box::new(Argument {
position: ArgumentNamed("name"),
position_span: InnerSpan { start: 2, end: 6 },
position_span: 2..6,
format: fmtdflt(),
}))],
)
}
#[test]
fn format_named_space_nothing() {
same(
"{name} {}",
&[
NextArgument(Box::new(Argument {
position: ArgumentNamed("name"),
position_span: 2..6,
format: fmtdflt(),
})),
Lit(" "),
NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: 9..9,
format: fmtdflt(),
})),
],
)
}
#[test]
fn format_raw() {
let snippet = r###"r#"assertion `left {op} right` failed"#"###.into();
let source = r#"assertion `left {op} right` failed"#;
let parser = Parser::new(source, Some(1), Some(snippet), true, ParseMode::Format);
let expected = &[
Lit("assertion `left "),
NextArgument(Box::new(Argument {
position: ArgumentNamed("op"),
position_span: 20..22,
format: fmtdflt(),
})),
Lit(" right` failed"),
];
assert_eq!(parser.collect::<Vec<Piece<'static>>>(), expected);
}
#[test]
fn format_type() {
same(
"{3:x}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -153,7 +213,7 @@ fn format_align_fill() {
"{3:>}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -175,10 +235,10 @@ fn format_align_fill() {
"{3:0<}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: FormatSpec {
fill: Some('0'),
fill_span: Some(InnerSpan::new(4, 5)),
fill_span: Some(4..5),
align: AlignLeft,
sign: None,
alternate: false,
@@ -197,10 +257,10 @@ fn format_align_fill() {
"{3:*<abcd}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: FormatSpec {
fill: Some('*'),
fill_span: Some(InnerSpan::new(4, 5)),
fill_span: Some(4..5),
align: AlignLeft,
sign: None,
alternate: false,
@@ -211,7 +271,7 @@ fn format_align_fill() {
precision_span: None,
width_span: None,
ty: "abcd",
ty_span: Some(InnerSpan::new(6, 10)),
ty_span: Some(6..10),
},
}))],
);
@@ -222,7 +282,7 @@ fn format_counts() {
"{:10x}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -234,7 +294,7 @@ fn format_counts() {
precision: CountImplied,
precision_span: None,
width: CountIs(10),
width_span: Some(InnerSpan { start: 3, end: 5 }),
width_span: Some(3..5),
ty: "x",
ty_span: None,
},
@@ -244,7 +304,7 @@ fn format_counts() {
"{:10$.10x}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -254,9 +314,9 @@ fn format_counts() {
zero_pad: false,
debug_hex: None,
precision: CountIs(10),
precision_span: Some(InnerSpan { start: 6, end: 9 }),
precision_span: Some(6..9),
width: CountIsParam(10),
width_span: Some(InnerSpan { start: 3, end: 6 }),
width_span: Some(3..6),
ty: "x",
ty_span: None,
},
@@ -266,7 +326,7 @@ fn format_counts() {
"{1:0$.10x}",
&[NextArgument(Box::new(Argument {
position: ArgumentIs(1),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -276,9 +336,9 @@ fn format_counts() {
zero_pad: false,
debug_hex: None,
precision: CountIs(10),
precision_span: Some(InnerSpan { start: 6, end: 9 }),
precision_span: Some(6..9),
width: CountIsParam(0),
width_span: Some(InnerSpan { start: 4, end: 6 }),
width_span: Some(4..6),
ty: "x",
ty_span: None,
},
@@ -288,7 +348,7 @@ fn format_counts() {
"{:.*x}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(1),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -298,7 +358,7 @@ fn format_counts() {
zero_pad: false,
debug_hex: None,
precision: CountIsStar(0),
precision_span: Some(InnerSpan { start: 3, end: 5 }),
precision_span: Some(3..5),
width: CountImplied,
width_span: None,
ty: "x",
@@ -310,7 +370,7 @@ fn format_counts() {
"{:.10$x}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -321,7 +381,7 @@ fn format_counts() {
debug_hex: None,
precision: CountIsParam(10),
width: CountImplied,
precision_span: Some(InnerSpan::new(3, 7)),
precision_span: Some(3..7),
width_span: None,
ty: "x",
ty_span: None,
@@ -332,7 +392,7 @@ fn format_counts() {
"{:a$.b$?}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -341,10 +401,10 @@ fn format_counts() {
alternate: false,
zero_pad: false,
debug_hex: None,
precision: CountIsName("b", InnerSpan { start: 6, end: 7 }),
precision_span: Some(InnerSpan { start: 5, end: 8 }),
width: CountIsName("a", InnerSpan { start: 3, end: 4 }),
width_span: Some(InnerSpan { start: 3, end: 5 }),
precision: CountIsName("b", 6..7),
precision_span: Some(5..8),
width: CountIsName("a", 3..4),
width_span: Some(3..5),
ty: "?",
ty_span: None,
},
@@ -354,7 +414,7 @@ fn format_counts() {
"{:.4}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -364,7 +424,7 @@ fn format_counts() {
zero_pad: false,
debug_hex: None,
precision: CountIs(4),
precision_span: Some(InnerSpan { start: 3, end: 5 }),
precision_span: Some(3..5),
width: CountImplied,
width_span: None,
ty: "",
@@ -379,7 +439,7 @@ fn format_flags() {
"{:-}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -401,7 +461,7 @@ fn format_flags() {
"{:+#}",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 2 },
position_span: 2..2,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -428,7 +488,7 @@ fn format_mixture() {
Lit("abcd "),
NextArgument(Box::new(Argument {
position: ArgumentIs(3),
position_span: InnerSpan { start: 7, end: 8 },
position_span: 7..8,
format: FormatSpec {
fill: None,
fill_span: None,
@@ -455,7 +515,7 @@ fn format_whitespace() {
"{ }",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 3 },
position_span: 2..3,
format: fmtdflt(),
}))],
);
@@ -463,8 +523,33 @@ fn format_whitespace() {
"{ }",
&[NextArgument(Box::new(Argument {
position: ArgumentImplicitlyIs(0),
position_span: InnerSpan { start: 2, end: 4 },
position_span: 2..4,
format: fmtdflt(),
}))],
);
}
#[test]
fn asm_linespans() {
let asm_pre = r###"r"
.intel_syntax noprefix
nop""###;
let asm = r"
.intel_syntax noprefix
nop";
let mut parser = Parser::new(asm, Some(0), Some(asm_pre.into()), false, ParseMode::InlineAsm);
assert!(parser.is_source_literal);
assert_eq!(
parser.by_ref().collect::<Vec<Piece<'static>>>(),
&[Lit("\n .intel_syntax noprefix\n nop")]
);
assert_eq!(parser.line_spans, &[2..2, 11..33, 42..45]);
}
#[test]
fn asm_concat() {
let asm_pre = r###"concat!("invalid", "_", "instruction")"###;
let asm = "invalid_instruction";
let mut parser = Parser::new(asm, None, Some(asm_pre.into()), false, ParseMode::InlineAsm);
assert!(!parser.is_source_literal);
assert_eq!(parser.by_ref().collect::<Vec<Piece<'static>>>(), &[Lit(asm)]);
assert_eq!(parser.line_spans, &[]);
}