mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 20:32:10 +00:00
perf(lexer): improve comment building performance by using a vec instead of btreemap (#3186)
closes #2693
This commit is contained in:
parent
b66d578fed
commit
7338364219
1 changed files with 17 additions and 7 deletions
|
|
@ -1,28 +1,38 @@
|
||||||
use std::collections::BTreeMap;
|
use oxc_ast::{Comment, CommentKind, Trivias, TriviasMap};
|
||||||
|
|
||||||
use oxc_ast::{Comment, CommentKind, Trivias};
|
|
||||||
use oxc_span::Span;
|
use oxc_span::Span;
|
||||||
|
|
||||||
#[derive(Debug, Default)]
|
#[derive(Debug, Default)]
|
||||||
pub struct TriviaBuilder {
|
pub struct TriviaBuilder {
|
||||||
// Duplicated comments can be added from rewind, use `BTreeMap` to ensure uniqueness
|
// Duplicated comments can be added from rewind, use `BTreeMap` to ensure uniqueness
|
||||||
comments: BTreeMap<u32, Comment>,
|
comments: Vec<(u32, Comment)>,
|
||||||
irregular_whitespaces: Vec<Span>,
|
irregular_whitespaces: Vec<Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TriviaBuilder {
|
impl TriviaBuilder {
|
||||||
pub fn build(self) -> Trivias {
|
pub fn build(self) -> Trivias {
|
||||||
Trivias::new(self.comments, self.irregular_whitespaces)
|
let comments = TriviasMap::from_iter(self.comments);
|
||||||
|
Trivias::new(comments, self.irregular_whitespaces)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_single_line_comment(&mut self, start: u32, end: u32) {
|
pub fn add_single_line_comment(&mut self, start: u32, end: u32) {
|
||||||
// skip leading `//`
|
// skip leading `//`
|
||||||
self.comments.insert(start + 2, Comment::new(end, CommentKind::SingleLine));
|
self.add_comment(start + 2, Comment::new(end, CommentKind::SingleLine));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_multi_line_comment(&mut self, start: u32, end: u32) {
|
pub fn add_multi_line_comment(&mut self, start: u32, end: u32) {
|
||||||
// skip leading `/*` and trailing `*/`
|
// skip leading `/*` and trailing `*/`
|
||||||
self.comments.insert(start + 2, Comment::new(end - 2, CommentKind::MultiLine));
|
self.add_comment(start + 2, Comment::new(end - 2, CommentKind::MultiLine));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn add_comment(&mut self, start: u32, comment: Comment) {
|
||||||
|
// The comments array is an ordered vec, only add the comment if its not added before,
|
||||||
|
// to avoid situations where the parser needs to rewind and reinsert the comment.
|
||||||
|
if let Some(comment) = self.comments.last_mut() {
|
||||||
|
if start <= comment.0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.comments.push((start, comment));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_irregular_whitespace(&mut self, start: u32, end: u32) {
|
pub fn add_irregular_whitespace(&mut self, start: u32, end: u32) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue