Pass String to new_atom

This is a very tiny perf hit, but allows us to pass newly allocated
strings to new_atom(), which will be necessary for normalising
case-insensitive languages.
pull/730/merge
Wilfred Hughes 2025-02-23 14:51:00 +07:00
parent 0b386d332f
commit 8953c55cf8
4 changed files with 41 additions and 41 deletions

@ -273,9 +273,9 @@ mod tests {
fn identical_atoms() { fn identical_atoms() {
let arena = Arena::new(); let arena = Arena::new();
let lhs = Syntax::new_atom(&arena, pos_helper(0), "foo", AtomKind::Normal); let lhs = Syntax::new_atom(&arena, pos_helper(0), "foo".to_owned(), AtomKind::Normal);
// Same content as LHS. // Same content as LHS.
let rhs = Syntax::new_atom(&arena, pos_helper(0), "foo", AtomKind::Normal); let rhs = Syntax::new_atom(&arena, pos_helper(0), "foo".to_owned(), AtomKind::Normal);
init_all_info(&[lhs], &[rhs]); init_all_info(&[lhs], &[rhs]);
let start = Vertex::new(Some(lhs), Some(rhs)); let start = Vertex::new(Some(lhs), Some(rhs));
@ -303,7 +303,7 @@ mod tests {
vec![Syntax::new_atom( vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"foo", "foo".to_owned(),
AtomKind::Normal, AtomKind::Normal,
)], )],
"]", "]",
@ -354,8 +354,8 @@ mod tests {
"[", "[",
pos_helper(0), pos_helper(0),
vec![ vec![
Syntax::new_atom(&arena, pos_helper(1), "foo", AtomKind::Normal), Syntax::new_atom(&arena, pos_helper(1), "foo".to_owned(), AtomKind::Normal),
Syntax::new_atom(&arena, pos_helper(2), "foo", AtomKind::Normal), Syntax::new_atom(&arena, pos_helper(2), "foo".to_owned(), AtomKind::Normal),
], ],
"]", "]",
pos_helper(3), pos_helper(3),
@ -389,7 +389,7 @@ mod tests {
pos_helper(0), pos_helper(0),
vec![ vec![
Syntax::new_list(&arena, "(", pos_helper(1), vec![], ")", pos_helper(2)), Syntax::new_list(&arena, "(", pos_helper(1), vec![], ")", pos_helper(2)),
Syntax::new_atom(&arena, pos_helper(3), "foo", AtomKind::Normal), Syntax::new_atom(&arena, pos_helper(3), "foo".to_owned(), AtomKind::Normal),
], ],
"]", "]",
pos_helper(4), pos_helper(4),
@ -401,7 +401,7 @@ mod tests {
pos_helper(0), pos_helper(0),
vec![ vec![
Syntax::new_list(&arena, "(", pos_helper(1), vec![], ")", pos_helper(2)), Syntax::new_list(&arena, "(", pos_helper(1), vec![], ")", pos_helper(2)),
Syntax::new_atom(&arena, pos_helper(3), "foo", AtomKind::Normal), Syntax::new_atom(&arena, pos_helper(3), "foo".to_owned(), AtomKind::Normal),
], ],
"}", "}",
pos_helper(4), pos_helper(4),
@ -437,14 +437,14 @@ mod tests {
let lhs = vec![Syntax::new_atom( let lhs = vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"the quick brown fox", "the quick brown fox".to_owned(),
AtomKind::Comment, AtomKind::Comment,
)]; )];
let rhs = vec![Syntax::new_atom( let rhs = vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"the quick brown cat", "the quick brown cat".to_owned(),
AtomKind::Comment, AtomKind::Comment,
)]; )];
init_all_info(&lhs, &rhs); init_all_info(&lhs, &rhs);
@ -469,14 +469,14 @@ mod tests {
let lhs = vec![Syntax::new_atom( let lhs = vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"the quick brown fox", "the quick brown fox".to_owned(),
AtomKind::Comment, AtomKind::Comment,
)]; )];
let rhs = vec![Syntax::new_atom( let rhs = vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"foo bar", "foo bar".to_owned(),
AtomKind::Comment, AtomKind::Comment,
)]; )];
init_all_info(&lhs, &rhs); init_all_info(&lhs, &rhs);
@ -502,13 +502,13 @@ mod tests {
Syntax::new_atom( Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"the quick brown fox", "the quick brown fox".to_owned(),
AtomKind::Comment, AtomKind::Comment,
), ),
Syntax::new_atom( Syntax::new_atom(
&arena, &arena,
pos_helper(2), pos_helper(2),
"the quick brown thing", "the quick brown thing".to_owned(),
AtomKind::Comment, AtomKind::Comment,
), ),
]; ];
@ -516,7 +516,7 @@ mod tests {
let rhs = vec![Syntax::new_atom( let rhs = vec![Syntax::new_atom(
&arena, &arena,
pos_helper(1), pos_helper(1),
"the quick brown fox.", "the quick brown fox.".to_owned(),
AtomKind::Comment, AtomKind::Comment,
)]; )];
init_all_info(&lhs, &rhs); init_all_info(&lhs, &rhs);
@ -540,8 +540,8 @@ mod tests {
#[test] #[test]
fn mark_syntax_equal_atoms() { fn mark_syntax_equal_atoms() {
let arena = Arena::new(); let arena = Arena::new();
let lhs = Syntax::new_atom(&arena, pos_helper(1), "foo", AtomKind::Normal); let lhs = Syntax::new_atom(&arena, pos_helper(1), "foo".to_owned(), AtomKind::Normal);
let rhs = Syntax::new_atom(&arena, pos_helper(1), "foo", AtomKind::Normal); let rhs = Syntax::new_atom(&arena, pos_helper(1), "foo".to_owned(), AtomKind::Normal);
init_all_info(&[lhs], &[rhs]); init_all_info(&[lhs], &[rhs]);
let mut change_map = ChangeMap::default(); let mut change_map = ChangeMap::default();
@ -554,8 +554,8 @@ mod tests {
#[test] #[test]
fn mark_syntax_different_atoms() { fn mark_syntax_different_atoms() {
let arena = Arena::new(); let arena = Arena::new();
let lhs = Syntax::new_atom(&arena, pos_helper(1), "foo", AtomKind::Normal); let lhs = Syntax::new_atom(&arena, pos_helper(1), "foo".to_owned(), AtomKind::Normal);
let rhs = Syntax::new_atom(&arena, pos_helper(1), "bar", AtomKind::Normal); let rhs = Syntax::new_atom(&arena, pos_helper(1), "bar".to_owned(), AtomKind::Normal);
init_all_info(&[lhs], &[rhs]); init_all_info(&[lhs], &[rhs]);
let mut change_map = ChangeMap::default(); let mut change_map = ChangeMap::default();

@ -704,9 +704,9 @@ mod tests {
}]; }];
let lhs = [ let lhs = [
Syntax::new_atom(&arena, line1a, "a", AtomKind::Comment), Syntax::new_atom(&arena, line1a, "a".to_owned(), AtomKind::Comment),
Syntax::new_atom(&arena, line1b, "b", AtomKind::Comment), Syntax::new_atom(&arena, line1b, "b".to_owned(), AtomKind::Comment),
Syntax::new_atom(&arena, line2, "a", AtomKind::Comment), Syntax::new_atom(&arena, line2, "a".to_owned(), AtomKind::Comment),
]; ];
let pos = vec![SingleLineSpan { let pos = vec![SingleLineSpan {
@ -714,7 +714,7 @@ mod tests {
start_col: 1, start_col: 1,
end_col: 2, end_col: 2,
}]; }];
let rhs = [Syntax::new_atom(&arena, pos, "a", AtomKind::Comment)]; let rhs = [Syntax::new_atom(&arena, pos, "a".to_owned(), AtomKind::Comment)];
init_all_info(&lhs, &rhs); init_all_info(&lhs, &rhs);
@ -753,9 +753,9 @@ mod tests {
}]; }];
let lhs = [ let lhs = [
Syntax::new_atom(&arena, line1, "a", AtomKind::Comment), Syntax::new_atom(&arena, line1, "a".to_owned(), AtomKind::Comment),
Syntax::new_atom(&arena, line2a, "b", AtomKind::Comment), Syntax::new_atom(&arena, line2a, "b".to_owned(), AtomKind::Comment),
Syntax::new_atom(&arena, line2b, "a", AtomKind::Comment), Syntax::new_atom(&arena, line2b, "a".to_owned(), AtomKind::Comment),
]; ];
let pos = vec![SingleLineSpan { let pos = vec![SingleLineSpan {
@ -763,7 +763,7 @@ mod tests {
start_col: 1, start_col: 1,
end_col: 2, end_col: 2,
}]; }];
let rhs = [Syntax::new_atom(&arena, pos, "a", AtomKind::Comment)]; let rhs = [Syntax::new_atom(&arena, pos, "a".to_owned(), AtomKind::Comment)];
init_all_info(&lhs, &rhs); init_all_info(&lhs, &rhs);

@ -249,13 +249,13 @@ impl<'a> Syntax<'a> {
pub(crate) fn new_atom( pub(crate) fn new_atom(
arena: &'a Arena<Syntax<'a>>, arena: &'a Arena<Syntax<'a>>,
mut position: Vec<SingleLineSpan>, mut position: Vec<SingleLineSpan>,
mut content: &str, mut content: String,
kind: AtomKind, kind: AtomKind,
) -> &'a Syntax<'a> { ) -> &'a Syntax<'a> {
// If a parser hasn't cleaned up \r on CRLF files with // If a parser hasn't cleaned up \r on CRLF files with
// comments, discard it. // comments, discard it.
if content.ends_with('\r') { if content.ends_with('\r') {
content = &content[..content.len() - 1]; content.pop();
} }
// If a parser adds a trailing newline to the atom, discard // If a parser adds a trailing newline to the atom, discard
@ -264,13 +264,13 @@ impl<'a> Syntax<'a> {
// the end of the file. // the end of the file.
if content.ends_with('\n') { if content.ends_with('\n') {
position.pop(); position.pop();
content = &content[..content.len() - 1]; content.pop();
} }
arena.alloc(Atom { arena.alloc(Atom {
info: SyntaxInfo::default(), info: SyntaxInfo::default(),
position, position,
content: content.into(), content,
kind, kind,
}) })
} }
@ -1084,8 +1084,8 @@ mod tests {
let arena = Arena::new(); let arena = Arena::new();
let comment = Syntax::new_atom(&arena, pos.clone(), "foo", AtomKind::Comment); let comment = Syntax::new_atom(&arena, pos.clone(), "foo".to_owned(), AtomKind::Comment);
let atom = Syntax::new_atom(&arena, pos, "foo", AtomKind::Normal); let atom = Syntax::new_atom(&arena, pos, "foo".to_owned(), AtomKind::Normal);
init_all_info(&[comment], &[atom]); init_all_info(&[comment], &[atom]);
assert_ne!(comment, atom); assert_ne!(comment, atom);
@ -1097,7 +1097,7 @@ mod tests {
let position = vec![]; let position = vec![];
let content = "foo\r"; let content = "foo\r";
let atom = Syntax::new_atom(&arena, position, content, AtomKind::Comment); let atom = Syntax::new_atom(&arena, position, content.to_owned(), AtomKind::Comment);
match atom { match atom {
List { .. } => unreachable!(), List { .. } => unreachable!(),
@ -1124,7 +1124,7 @@ mod tests {
]; ];
let content = ";; hello\n"; let content = ";; hello\n";
let atom = Syntax::new_atom(&arena, position, content, AtomKind::Comment); let atom = Syntax::new_atom(&arena, position, content.to_owned(), AtomKind::Comment);
match atom { match atom {
List { .. } => unreachable!(), List { .. } => unreachable!(),
@ -1157,8 +1157,8 @@ mod tests {
let arena = Arena::new(); let arena = Arena::new();
let type_atom = Syntax::new_atom(&arena, pos.clone(), "foo", AtomKind::Type); let type_atom = Syntax::new_atom(&arena, pos.clone(), "foo".to_owned(), AtomKind::Type);
let atom = Syntax::new_atom(&arena, pos, "foo", AtomKind::Normal); let atom = Syntax::new_atom(&arena, pos, "foo".to_owned(), AtomKind::Normal);
init_all_info(&[type_atom], &[atom]); init_all_info(&[type_atom], &[atom]);
assert_eq!(type_atom, atom); assert_eq!(type_atom, atom);
@ -1173,7 +1173,7 @@ mod tests {
}]; }];
let arena = Arena::new(); let arena = Arena::new();
let atom = Syntax::new_atom(&arena, pos, "foo", AtomKind::Normal); let atom = Syntax::new_atom(&arena, pos, "foo".to_owned(), AtomKind::Normal);
let trivial_list = Syntax::new_list(&arena, "", vec![], vec![atom], "", vec![]); let trivial_list = Syntax::new_list(&arena, "", vec![], vec![atom], "", vec![]);
@ -1189,7 +1189,7 @@ mod tests {
}]; }];
let arena = Arena::new(); let arena = Arena::new();
let atom = Syntax::new_atom(&arena, pos, "", AtomKind::Normal); let atom = Syntax::new_atom(&arena, pos, "".to_owned(), AtomKind::Normal);
let trivial_list = Syntax::new_list(&arena, "(", vec![], vec![atom], ")", vec![]); let trivial_list = Syntax::new_list(&arena, "(", vec![], vec![atom], ")", vec![]);
@ -1211,8 +1211,8 @@ mod tests {
let arena = Arena::new(); let arena = Arena::new();
let x = Syntax::new_atom(&arena, pos.clone(), "foo\nbar", AtomKind::Comment); let x = Syntax::new_atom(&arena, pos.clone(), "foo\nbar".to_owned(), AtomKind::Comment);
let y = Syntax::new_atom(&arena, pos, "foo\n bar", AtomKind::Comment); let y = Syntax::new_atom(&arena, pos, "foo\n bar".to_owned(), AtomKind::Comment);
init_all_info(&[x], &[y]); init_all_info(&[x], &[y]);
assert_eq!(x, y); assert_eq!(x, y);

@ -1796,7 +1796,7 @@ fn atom_from_cursor<'a>(
AtomKind::Normal AtomKind::Normal
}; };
Some(Syntax::new_atom(arena, position, content, highlight)) Some(Syntax::new_atom(arena, position, content.to_owned(), highlight))
} }
#[cfg(test)] #[cfg(test)]