Skip to content

Commit f1ffd14

Browse files
committed
Reduce string copying
1 parent 5b86ff3 commit f1ffd14

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

crates/mbe/src/syntax_bridge.rs

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ trait TokenConvertor {
414414
fn id_alloc(&mut self) -> &mut TokenIdAlloc;
415415
}
416416

417-
impl<'a> SrcToken for (RawToken, &'a str) {
417+
impl<'a> SrcToken for (&'a RawToken, &'a str) {
418418
fn kind(&self) -> SyntaxKind {
419419
self.0.kind
420420
}
@@ -431,7 +431,7 @@ impl<'a> SrcToken for (RawToken, &'a str) {
431431
impl RawConvertor<'_> {}
432432

433433
impl<'a> TokenConvertor for RawConvertor<'a> {
434-
type Token = (RawToken, &'a str);
434+
type Token = (&'a RawToken, &'a str);
435435

436436
fn convert_doc_comment(&self, token: &Self::Token) -> Option<Vec<tt::TokenTree>> {
437437
convert_doc_comment(&doc_comment(token.1))
@@ -442,11 +442,11 @@ impl<'a> TokenConvertor for RawConvertor<'a> {
442442
let range = TextRange::at(self.offset, token.len);
443443
self.offset += token.len;
444444

445-
Some(((*token, &self.text[range]), range))
445+
Some(((token, &self.text[range]), range))
446446
}
447447

448448
fn peek(&self) -> Option<Self::Token> {
449-
let token = self.inner.as_slice().get(0).cloned();
449+
let token = self.inner.as_slice().get(0);
450450

451451
token.map(|it| {
452452
let range = TextRange::at(self.offset, it.len);
@@ -601,17 +601,16 @@ impl<'a> TtTreeSink<'a> {
601601
}
602602
}
603603

604-
fn delim_to_str(d: Option<tt::DelimiterKind>, closing: bool) -> SmolStr {
604+
fn delim_to_str(d: Option<tt::DelimiterKind>, closing: bool) -> &'static str {
605605
let texts = match d {
606606
Some(tt::DelimiterKind::Parenthesis) => "()",
607607
Some(tt::DelimiterKind::Brace) => "{}",
608608
Some(tt::DelimiterKind::Bracket) => "[]",
609-
None => return "".into(),
609+
None => return "",
610610
};
611611

612612
let idx = closing as usize;
613-
let text = &texts[idx..texts.len() - (1 - idx)];
614-
text.into()
613+
&texts[idx..texts.len() - (1 - idx)]
615614
}
616615

617616
impl<'a> TreeSink for TtTreeSink<'a> {
@@ -626,22 +625,25 @@ impl<'a> TreeSink for TtTreeSink<'a> {
626625

627626
let mut last = self.cursor;
628627
for _ in 0..n_tokens {
628+
let tmp_str: SmolStr;
629629
if self.cursor.eof() {
630630
break;
631631
}
632632
last = self.cursor;
633-
let text: SmolStr = match self.cursor.token_tree() {
633+
let text: &str = match self.cursor.token_tree() {
634634
Some(tt::TokenTree::Leaf(leaf)) => {
635635
// Mark the range if needed
636636
let (text, id) = match leaf {
637-
tt::Leaf::Ident(ident) => (ident.text.clone(), ident.id),
637+
tt::Leaf::Ident(ident) => (&ident.text, ident.id),
638638
tt::Leaf::Punct(punct) => {
639639
assert!(punct.char.is_ascii());
640640
let char = &(punct.char as u8);
641-
let text = std::str::from_utf8(std::slice::from_ref(char)).unwrap();
642-
(SmolStr::new_inline(text), punct.id)
641+
tmp_str = SmolStr::new_inline(
642+
std::str::from_utf8(std::slice::from_ref(char)).unwrap(),
643+
);
644+
(&tmp_str, punct.id)
643645
}
644-
tt::Leaf::Literal(lit) => (lit.text.clone(), lit.id),
646+
tt::Leaf::Literal(lit) => (&lit.text, lit.id),
645647
};
646648
let range = TextRange::at(self.text_pos, TextSize::of(text.as_str()));
647649
self.token_map.insert(id, range);
@@ -672,7 +674,7 @@ impl<'a> TreeSink for TtTreeSink<'a> {
672674
}
673675
};
674676
self.buf += &text;
675-
self.text_pos += TextSize::of(text.as_str());
677+
self.text_pos += TextSize::of(text);
676678
}
677679

678680
let text = SmolStr::new(self.buf.as_str());

0 commit comments

Comments
 (0)