diff --git a/crates/oxc_ast/src/lib.rs b/crates/oxc_ast/src/lib.rs index 271800465..c29788993 100644 --- a/crates/oxc_ast/src/lib.rs +++ b/crates/oxc_ast/src/lib.rs @@ -22,7 +22,11 @@ mod visit_mut; pub use num_bigint::BigUint; pub use crate::{ - ast_builder::AstBuilder, ast_kind::AstKind, trivia::Trivias, visit::Visit, visit_mut::VisitMut, + ast_builder::AstBuilder, + ast_kind::AstKind, + trivia::{Comment, CommentKind, Trivias, TriviasMap}, + visit::Visit, + visit_mut::VisitMut, }; // After experimenting with two types of boxed enum variants: diff --git a/crates/oxc_ast/src/trivia.rs b/crates/oxc_ast/src/trivia.rs index 230680c62..c6582d7f2 100644 --- a/crates/oxc_ast/src/trivia.rs +++ b/crates/oxc_ast/src/trivia.rs @@ -4,16 +4,25 @@ use std::collections::BTreeMap; use oxc_span::Span; +/// A vec of trivias from the lexer, tupled by (span.start, span.end). +pub type Trivias = Vec<(u32, u32, CommentKind)>; + /// Trivias such as comments /// /// Trivia (called that because it's trivial) represent the parts of the source text that are largely insignificant for normal understanding of the code. /// For example: whitespace, comments, and even conflict markers. #[derive(Debug, Default)] -pub struct Trivias { +pub struct TriviasMap { /// Keyed by span.start comments: BTreeMap, } +impl From for TriviasMap { + fn from(trivias: Trivias) -> Self { + Self { comments: trivias.iter().map(|t| (t.0, Comment::new(t.1, t.2))).collect() } + } +} + /// Single or multiline comment #[derive(Debug, Clone, Copy)] #[allow(unused)] @@ -46,7 +55,7 @@ impl Comment { } } -impl Trivias { +impl TriviasMap { pub fn comments(&self) -> &BTreeMap { &self.comments } diff --git a/crates/oxc_linter/src/disable_directives.rs b/crates/oxc_linter/src/disable_directives.rs index a95df28d8..3088b98df 100644 --- a/crates/oxc_linter/src/disable_directives.rs +++ b/crates/oxc_linter/src/disable_directives.rs @@ -1,4 +1,4 @@ -use oxc_ast::Trivias; +use oxc_ast::TriviasMap; use oxc_span::Span; use rust_lapper::{Interval, Lapper}; use rustc_hash::FxHashMap; @@ -28,7 +28,7 @@ impl<'a> DisableDirectives<'a> { pub struct DisableDirectivesBuilder<'a, 'b> { source_text: &'a str, - trivias: &'b Trivias, + trivias: &'b TriviasMap, /// All the disabled rules with their corresponding covering spans intervals: Lapper>, /// Start of `eslint-disable` @@ -38,7 +38,7 @@ pub struct DisableDirectivesBuilder<'a, 'b> { } impl<'a, 'b> DisableDirectivesBuilder<'a, 'b> { - pub fn new(source_text: &'a str, trivias: &'b Trivias) -> Self { + pub fn new(source_text: &'a str, trivias: &'b TriviasMap) -> Self { Self { source_text, trivias, diff --git a/crates/oxc_parser/src/lexer/trivia_builder.rs b/crates/oxc_parser/src/lexer/trivia_builder.rs index 2f5eceafb..1cc84602b 100644 --- a/crates/oxc_parser/src/lexer/trivia_builder.rs +++ b/crates/oxc_parser/src/lexer/trivia_builder.rs @@ -1,5 +1,4 @@ -use oxc_ast::Trivias; -use oxc_span::Span; +use oxc_ast::{CommentKind, Trivias}; #[derive(Debug, Default)] pub struct TriviaBuilder { @@ -11,13 +10,13 @@ impl TriviaBuilder { self.trivias } + /// skip leading `//` pub fn add_single_line_comment(&mut self, start: u32, end: u32) { - // skip leading `//` - self.trivias.add_single_line_comment(Span::new(start + 2, end)); + self.trivias.push((start + 2, end, CommentKind::SingleLine)); } + /// skip leading `/*` and trailing `*/` pub fn add_multi_line_comment(&mut self, start: u32, end: u32) { - // skip leading `/*` and trailing `*/` - self.trivias.add_multi_line_comment(Span::new(start + 2, end - 2)); + self.trivias.push((start + 2, end - 2, CommentKind::MultiLine)); } } diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 300abbdbe..8a3d5dcae 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -4,7 +4,7 @@ use std::{cell::RefCell, path::PathBuf, rc::Rc, sync::Arc}; use itertools::Itertools; #[allow(clippy::wildcard_imports)] -use oxc_ast::{ast::*, AstKind, Trivias, Visit}; +use oxc_ast::{ast::*, AstKind, Trivias, TriviasMap, Visit}; use oxc_diagnostics::Error; use oxc_span::{Atom, SourceType, Span}; use oxc_syntax::{module_record::ModuleRecord, operator::AssignmentOperator}; @@ -40,7 +40,7 @@ pub struct SemanticBuilder<'a> { pub source_type: SourceType, - trivias: Rc, + trivias: Rc, /// Semantic early errors such as redeclaration errors. errors: RefCell>, @@ -82,7 +82,7 @@ impl<'a> SemanticBuilder<'a> { let scope = ScopeTree::new(source_type); let current_scope_id = scope.root_scope_id(); - let trivias = Rc::new(Trivias::default()); + let trivias = Rc::new(TriviasMap::default()); Self { source_text, source_type, @@ -106,9 +106,8 @@ impl<'a> SemanticBuilder<'a> { #[must_use] pub fn with_trivias(mut self, trivias: Trivias) -> Self { - let trivias = Rc::new(trivias); - self.trivias = Rc::clone(&trivias); - self.jsdoc = JSDocBuilder::new(self.source_text, &trivias); + self.trivias = Rc::new(TriviasMap::from(trivias)); + self.jsdoc = JSDocBuilder::new(self.source_text, &self.trivias); self } diff --git a/crates/oxc_semantic/src/jsdoc/builder.rs b/crates/oxc_semantic/src/jsdoc/builder.rs index ca424e046..76085b004 100644 --- a/crates/oxc_semantic/src/jsdoc/builder.rs +++ b/crates/oxc_semantic/src/jsdoc/builder.rs @@ -1,6 +1,6 @@ use std::{collections::BTreeMap, rc::Rc}; -use oxc_ast::{AstKind, Trivias}; +use oxc_ast::{AstKind, TriviasMap}; use oxc_span::{GetSpan, Span}; use super::{JSDoc, JSDocComment}; @@ -8,13 +8,13 @@ use super::{JSDoc, JSDocComment}; pub struct JSDocBuilder<'a> { source_text: &'a str, - trivias: Rc, + trivias: Rc, docs: BTreeMap>, } impl<'a> JSDocBuilder<'a> { - pub fn new(source_text: &'a str, trivias: &Rc) -> Self { + pub fn new(source_text: &'a str, trivias: &Rc) -> Self { Self { source_text, trivias: Rc::clone(trivias), docs: BTreeMap::default() } } diff --git a/crates/oxc_semantic/src/lib.rs b/crates/oxc_semantic/src/lib.rs index 24a41f1fc..9eea088cf 100644 --- a/crates/oxc_semantic/src/lib.rs +++ b/crates/oxc_semantic/src/lib.rs @@ -13,7 +13,7 @@ use std::{rc::Rc, sync::Arc}; pub use builder::{SemanticBuilder, SemanticBuilderReturn}; pub use jsdoc::{JSDoc, JSDocComment, JSDocTag}; -use oxc_ast::{ast::IdentifierReference, AstKind, Trivias}; +use oxc_ast::{ast::IdentifierReference, AstKind, TriviasMap}; use oxc_span::SourceType; pub use oxc_syntax::{ module_record::ModuleRecord, @@ -39,7 +39,7 @@ pub struct Semantic<'a> { symbols: SymbolTable, - trivias: Rc, + trivias: Rc, module_record: Arc, @@ -69,7 +69,7 @@ impl<'a> Semantic<'a> { &self.scopes } - pub fn trivias(&self) -> &Trivias { + pub fn trivias(&self) -> &TriviasMap { &self.trivias }