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

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

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

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