fix(parser,semantic): make semantic own Trivias (#711)

closes #708

Making the parser return Rc<Trivias> is not a good API, and ideally
`Semantic` should just own `Trivias` so it can process or mutate it.
This commit is contained in:
Boshen 2023-08-10 15:30:32 +08:00 committed by GitHub
parent 9714e46a02
commit 2f48bdf26f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 21 additions and 26 deletions

View file

@ -167,7 +167,7 @@ impl IsolatedLintHandler {
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = SemanticBuilder::new(&source_text, source_type) let semantic_ret = SemanticBuilder::new(&source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.with_module_record_builder(true) .with_module_record_builder(true)
.build(program); .build(program);

View file

@ -33,7 +33,7 @@ fn main() {
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = let semantic_ret =
SemanticBuilder::new(&source_text, source_type).with_trivias(&ret.trivias).build(program); SemanticBuilder::new(&source_text, source_type).with_trivias(ret.trivias).build(program);
let mut errors: Vec<oxc_diagnostics::Error> = vec![]; let mut errors: Vec<oxc_diagnostics::Error> = vec![];

View file

@ -135,7 +135,7 @@ impl Tester {
assert!(ret.errors.is_empty(), "{:?}", &ret.errors); assert!(ret.errors.is_empty(), "{:?}", &ret.errors);
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = SemanticBuilder::new(source_text, source_type) let semantic_ret = SemanticBuilder::new(source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_module_record_builder(true) .with_module_record_builder(true)
.build(program); .build(program);
assert!(semantic_ret.errors.is_empty(), "{:?}", &semantic_ret.errors); assert!(semantic_ret.errors.is_empty(), "{:?}", &semantic_ret.errors);

View file

@ -1,5 +1,3 @@
use std::rc::Rc;
use oxc_ast::Trivias; use oxc_ast::Trivias;
use oxc_span::Span; use oxc_span::Span;
@ -9,8 +7,8 @@ pub struct TriviaBuilder {
} }
impl TriviaBuilder { impl TriviaBuilder {
pub fn build(self) -> Rc<Trivias> { pub fn build(self) -> Trivias {
Rc::new(self.trivias) self.trivias
} }
pub fn add_single_line_comment(&mut self, start: u32, end: u32) { pub fn add_single_line_comment(&mut self, start: u32, end: u32) {

View file

@ -73,8 +73,6 @@ mod ts;
mod diagnostics; mod diagnostics;
mod lexer; mod lexer;
use std::rc::Rc;
use context::{Context, StatementContext}; use context::{Context, StatementContext};
use oxc_allocator::Allocator; use oxc_allocator::Allocator;
use oxc_ast::{ast::Program, AstBuilder, Trivias}; use oxc_ast::{ast::Program, AstBuilder, Trivias};
@ -94,7 +92,7 @@ use crate::{
pub struct ParserReturn<'a> { pub struct ParserReturn<'a> {
pub program: Program<'a>, pub program: Program<'a>,
pub errors: Vec<Error>, pub errors: Vec<Error>,
pub trivias: Rc<Trivias>, pub trivias: Trivias,
pub panicked: bool, pub panicked: bool,
} }

View file

@ -22,7 +22,7 @@ fn main() {
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = let semantic_ret =
SemanticBuilder::new(&source_text, source_type).with_trivias(&ret.trivias).build(program); SemanticBuilder::new(&source_text, source_type).with_trivias(ret.trivias).build(program);
let adapter = Adapter::new(Rc::new(semantic_ret.semantic), vec![Some("index".to_string())]); let adapter = Adapter::new(Rc::new(semantic_ret.semantic), vec![Some("index".to_string())]);

View file

@ -17,7 +17,7 @@ fn run_query<T: for<'de> serde::Deserialize<'de> + std::cmp::Ord>(
let ret = Parser::new(&allocator, code, source_type).parse(); let ret = Parser::new(&allocator, code, source_type).parse();
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = let semantic_ret =
SemanticBuilder::new(code, source_type).with_trivias(&ret.trivias).build(program); SemanticBuilder::new(code, source_type).with_trivias(ret.trivias).build(program);
let adapter = Adapter { let adapter = Adapter {
path_components: vec![Some("index".to_string())], path_components: vec![Some("index".to_string())],
@ -199,7 +199,7 @@ fn test_invariants() {
let ret = Parser::new(&allocator, source_text, source_type).parse(); let ret = Parser::new(&allocator, source_text, source_type).parse();
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = let semantic_ret =
SemanticBuilder::new(source_text, source_type).with_trivias(&ret.trivias).build(program); SemanticBuilder::new(source_text, source_type).with_trivias(ret.trivias).build(program);
let adapter = Adapter { path_components: vec![], semantic: Rc::new(semantic_ret.semantic) }; let adapter = Adapter { path_components: vec![], semantic: Rc::new(semantic_ret.semantic) };
check_adapter_invariants(schema(), &adapter); check_adapter_invariants(schema(), &adapter);

View file

@ -106,9 +106,10 @@ impl<'a> SemanticBuilder<'a> {
} }
#[must_use] #[must_use]
pub fn with_trivias(mut self, trivias: &Rc<Trivias>) -> Self { pub fn with_trivias(mut self, trivias: Trivias) -> Self {
self.trivias = Rc::clone(trivias); let trivias = Rc::new(trivias);
self.jsdoc = JSDocBuilder::new(self.source_text, trivias); self.trivias = Rc::clone(&trivias);
self.jsdoc = JSDocBuilder::new(self.source_text, &trivias);
self self
} }

View file

@ -83,7 +83,7 @@ mod test {
let ret = Parser::new(allocator, source_text, source_type).parse(); let ret = Parser::new(allocator, source_text, source_type).parse();
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic = SemanticBuilder::new(source_text, source_type) let semantic = SemanticBuilder::new(source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.build(program) .build(program)
.semantic; .semantic;
let jsdoc = semantic.jsdoc(); let jsdoc = semantic.jsdoc();

View file

@ -18,7 +18,7 @@ mod module_record_tests {
let ret = Parser::new(&allocator, source_text, source_type).parse(); let ret = Parser::new(&allocator, source_text, source_type).parse();
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = SemanticBuilder::new(source_text, source_type) let semantic_ret = SemanticBuilder::new(source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_module_record_builder(true) .with_module_record_builder(true)
.build(program); .build(program);
semantic_ret.semantic.module_record semantic_ret.semantic.module_record

View file

@ -85,7 +85,7 @@ impl SemanticTester {
let program = self.allocator.alloc(parse.program); let program = self.allocator.alloc(parse.program);
let semantic_ret = SemanticBuilder::new(self.source_text, self.source_type) let semantic_ret = SemanticBuilder::new(self.source_text, self.source_type)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.with_trivias(&parse.trivias) .with_trivias(parse.trivias)
.with_module_record_builder(self.use_module_record_builder) .with_module_record_builder(self.use_module_record_builder)
.build(program); .build(program);

View file

@ -173,15 +173,13 @@ impl Oxc {
if run_options.syntax() && !run_options.lint() { if run_options.syntax() && !run_options.lint() {
let semantic_ret = SemanticBuilder::new(source_text, source_type) let semantic_ret = SemanticBuilder::new(source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.build(program); .build(program);
self.save_diagnostics(semantic_ret.errors); self.save_diagnostics(semantic_ret.errors);
} } else if run_options.lint() {
if run_options.lint() {
let semantic_ret = SemanticBuilder::new(source_text, source_type) let semantic_ret = SemanticBuilder::new(source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.build(program); .build(program);
self.save_diagnostics(semantic_ret.errors); self.save_diagnostics(semantic_ret.errors);

View file

@ -238,7 +238,7 @@ impl IsolatedLintHandler {
let program = allocator.alloc(ret.program); let program = allocator.alloc(ret.program);
let semantic_ret = SemanticBuilder::new(&source_text, source_type) let semantic_ret = SemanticBuilder::new(&source_text, source_type)
.with_trivias(&ret.trivias) .with_trivias(ret.trivias)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.build(program); .build(program);

View file

@ -281,7 +281,7 @@ pub trait Case: Sized + Sync + Send + UnwindSafe {
let program = allocator.alloc(parser_ret.program); let program = allocator.alloc(parser_ret.program);
let semantic_ret = SemanticBuilder::new(source_text, source_type) let semantic_ret = SemanticBuilder::new(source_text, source_type)
.with_trivias(&parser_ret.trivias) .with_trivias(parser_ret.trivias)
.with_module_record_builder(true) .with_module_record_builder(true)
.with_check_syntax_error(true) .with_check_syntax_error(true)
.build(program); .build(program);