Add enum for find_width_map_from_snippet
This makes the relationship between the vec and the boolean clearer.
This commit is contained in:
parent
e6c02aad93
commit
31b490d8ba
@ -57,6 +57,13 @@ impl InnerWidthMapping {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether the input string is a literal. If yes, it contains the inner width mappings.
|
||||||
|
#[derive(Clone, PartialEq, Eq)]
|
||||||
|
enum InputStringKind {
|
||||||
|
NotALiteral,
|
||||||
|
Literal { width_mappings: Vec<InnerWidthMapping> },
|
||||||
|
}
|
||||||
|
|
||||||
/// The type of format string that we are parsing.
|
/// The type of format string that we are parsing.
|
||||||
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||||
pub enum ParseMode {
|
pub enum ParseMode {
|
||||||
@ -307,7 +314,11 @@ impl<'a> Parser<'a> {
|
|||||||
append_newline: bool,
|
append_newline: bool,
|
||||||
mode: ParseMode,
|
mode: ParseMode,
|
||||||
) -> Parser<'a> {
|
) -> Parser<'a> {
|
||||||
let (width_map, is_literal) = find_width_map_from_snippet(s, snippet, style);
|
let input_string_kind = find_width_map_from_snippet(s, snippet, style);
|
||||||
|
let (width_map, is_literal) = match input_string_kind {
|
||||||
|
InputStringKind::Literal { width_mappings } => (width_mappings, true),
|
||||||
|
InputStringKind::NotALiteral => (Vec::new(), false),
|
||||||
|
};
|
||||||
Parser {
|
Parser {
|
||||||
mode,
|
mode,
|
||||||
input: s,
|
input: s,
|
||||||
@ -848,14 +859,14 @@ fn find_width_map_from_snippet(
|
|||||||
input: &str,
|
input: &str,
|
||||||
snippet: Option<string::String>,
|
snippet: Option<string::String>,
|
||||||
str_style: Option<usize>,
|
str_style: Option<usize>,
|
||||||
) -> (Vec<InnerWidthMapping>, bool) {
|
) -> InputStringKind {
|
||||||
let snippet = match snippet {
|
let snippet = match snippet {
|
||||||
Some(ref s) if s.starts_with('"') || s.starts_with("r\"") || s.starts_with("r#") => s,
|
Some(ref s) if s.starts_with('"') || s.starts_with("r\"") || s.starts_with("r#") => s,
|
||||||
_ => return (vec![], false),
|
_ => return InputStringKind::NotALiteral,
|
||||||
};
|
};
|
||||||
|
|
||||||
if str_style.is_some() {
|
if str_style.is_some() {
|
||||||
return (vec![], true);
|
return InputStringKind::Literal { width_mappings: Vec::new() };
|
||||||
}
|
}
|
||||||
|
|
||||||
// Strip quotes.
|
// Strip quotes.
|
||||||
@ -868,7 +879,7 @@ fn find_width_map_from_snippet(
|
|||||||
// Alternatively, we could just count the trailing newlines and only trim one from the input if they don't match up.
|
// Alternatively, we could just count the trailing newlines and only trim one from the input if they don't match up.
|
||||||
let input_no_nl = input.trim_end_matches('\n');
|
let input_no_nl = input.trim_end_matches('\n');
|
||||||
let Ok(unescaped) = unescape_string(snippet) else {
|
let Ok(unescaped) = unescape_string(snippet) else {
|
||||||
return (vec![], false);
|
return InputStringKind::NotALiteral;
|
||||||
};
|
};
|
||||||
|
|
||||||
let unescaped_no_nl = unescaped.trim_end_matches('\n');
|
let unescaped_no_nl = unescaped.trim_end_matches('\n');
|
||||||
@ -876,7 +887,7 @@ fn find_width_map_from_snippet(
|
|||||||
if unescaped_no_nl != input_no_nl {
|
if unescaped_no_nl != input_no_nl {
|
||||||
// The source string that we're pointing at isn't our input, so spans pointing at it will be incorrect.
|
// The source string that we're pointing at isn't our input, so spans pointing at it will be incorrect.
|
||||||
// This can for example happen with proc macros that respan generated literals.
|
// This can for example happen with proc macros that respan generated literals.
|
||||||
return (vec![], false);
|
return InputStringKind::NotALiteral;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut s = snippet.char_indices();
|
let mut s = snippet.char_indices();
|
||||||
@ -958,7 +969,7 @@ fn find_width_map_from_snippet(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(width_mappings, true)
|
InputStringKind::Literal { width_mappings }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn unescape_string(string: &str) -> Result<string::String, unescape::EscapeError> {
|
fn unescape_string(string: &str) -> Result<string::String, unescape::EscapeError> {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user