From 2f48bdf26faba45ed2b4bf3092ace39aaf66df9b Mon Sep 17 00:00:00 2001 From: Boshen Date: Thu, 10 Aug 2023 15:30:32 +0800 Subject: [PATCH] fix(parser,semantic): make semantic own `Trivias` (#711) closes #708 Making the parser return Rc is not a good API, and ideally `Semantic` should just own `Trivias` so it can process or mutate it. --- crates/oxc_cli/src/lint/isolated_handler.rs | 2 +- crates/oxc_linter/examples/linter.rs | 2 +- crates/oxc_linter/src/tester.rs | 2 +- crates/oxc_parser/src/lexer/trivia_builder.rs | 6 ++---- crates/oxc_parser/src/lib.rs | 4 +--- crates/oxc_query/examples/simple.rs | 2 +- crates/oxc_query/src/tests.rs | 4 ++-- crates/oxc_semantic/src/builder.rs | 7 ++++--- crates/oxc_semantic/src/jsdoc/builder.rs | 2 +- crates/oxc_semantic/src/module_record/mod.rs | 2 +- crates/oxc_semantic/tests/util/mod.rs | 2 +- crates/oxc_wasm/src/lib.rs | 8 +++----- editor/vscode/server/src/linter.rs | 2 +- tasks/coverage/src/suite.rs | 2 +- 14 files changed, 21 insertions(+), 26 deletions(-) diff --git a/crates/oxc_cli/src/lint/isolated_handler.rs b/crates/oxc_cli/src/lint/isolated_handler.rs index e5b9df480..39578b05e 100644 --- a/crates/oxc_cli/src/lint/isolated_handler.rs +++ b/crates/oxc_cli/src/lint/isolated_handler.rs @@ -167,7 +167,7 @@ impl IsolatedLintHandler { let program = allocator.alloc(ret.program); let semantic_ret = SemanticBuilder::new(&source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_check_syntax_error(true) .with_module_record_builder(true) .build(program); diff --git a/crates/oxc_linter/examples/linter.rs b/crates/oxc_linter/examples/linter.rs index b6f0227ee..98a551a7d 100644 --- a/crates/oxc_linter/examples/linter.rs +++ b/crates/oxc_linter/examples/linter.rs @@ -33,7 +33,7 @@ fn main() { let program = allocator.alloc(ret.program); 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 = vec![]; diff --git a/crates/oxc_linter/src/tester.rs b/crates/oxc_linter/src/tester.rs index b9bc1663d..172ee867c 100644 --- a/crates/oxc_linter/src/tester.rs +++ b/crates/oxc_linter/src/tester.rs @@ -135,7 +135,7 @@ impl Tester { assert!(ret.errors.is_empty(), "{:?}", &ret.errors); let program = allocator.alloc(ret.program); let semantic_ret = SemanticBuilder::new(source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_module_record_builder(true) .build(program); assert!(semantic_ret.errors.is_empty(), "{:?}", &semantic_ret.errors); diff --git a/crates/oxc_parser/src/lexer/trivia_builder.rs b/crates/oxc_parser/src/lexer/trivia_builder.rs index 3c7d53b6c..2f5eceafb 100644 --- a/crates/oxc_parser/src/lexer/trivia_builder.rs +++ b/crates/oxc_parser/src/lexer/trivia_builder.rs @@ -1,5 +1,3 @@ -use std::rc::Rc; - use oxc_ast::Trivias; use oxc_span::Span; @@ -9,8 +7,8 @@ pub struct TriviaBuilder { } impl TriviaBuilder { - pub fn build(self) -> Rc { - Rc::new(self.trivias) + pub fn build(self) -> Trivias { + self.trivias } pub fn add_single_line_comment(&mut self, start: u32, end: u32) { diff --git a/crates/oxc_parser/src/lib.rs b/crates/oxc_parser/src/lib.rs index 8e40738c4..c33f8c5d8 100644 --- a/crates/oxc_parser/src/lib.rs +++ b/crates/oxc_parser/src/lib.rs @@ -73,8 +73,6 @@ mod ts; mod diagnostics; mod lexer; -use std::rc::Rc; - use context::{Context, StatementContext}; use oxc_allocator::Allocator; use oxc_ast::{ast::Program, AstBuilder, Trivias}; @@ -94,7 +92,7 @@ use crate::{ pub struct ParserReturn<'a> { pub program: Program<'a>, pub errors: Vec, - pub trivias: Rc, + pub trivias: Trivias, pub panicked: bool, } diff --git a/crates/oxc_query/examples/simple.rs b/crates/oxc_query/examples/simple.rs index cc3b64d84..0256999ab 100644 --- a/crates/oxc_query/examples/simple.rs +++ b/crates/oxc_query/examples/simple.rs @@ -22,7 +22,7 @@ fn main() { let program = allocator.alloc(ret.program); 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())]); diff --git a/crates/oxc_query/src/tests.rs b/crates/oxc_query/src/tests.rs index 9c2aa7876..5bb3e3dbd 100644 --- a/crates/oxc_query/src/tests.rs +++ b/crates/oxc_query/src/tests.rs @@ -17,7 +17,7 @@ fn run_query serde::Deserialize<'de> + std::cmp::Ord>( let ret = Parser::new(&allocator, code, source_type).parse(); let program = allocator.alloc(ret.program); 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 { 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 program = allocator.alloc(ret.program); 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) }; check_adapter_invariants(schema(), &adapter); diff --git a/crates/oxc_semantic/src/builder.rs b/crates/oxc_semantic/src/builder.rs index 5b289387b..bdbfe53a0 100644 --- a/crates/oxc_semantic/src/builder.rs +++ b/crates/oxc_semantic/src/builder.rs @@ -106,9 +106,10 @@ impl<'a> SemanticBuilder<'a> { } #[must_use] - pub fn with_trivias(mut self, trivias: &Rc) -> Self { - self.trivias = Rc::clone(trivias); - self.jsdoc = JSDocBuilder::new(self.source_text, trivias); + 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 } diff --git a/crates/oxc_semantic/src/jsdoc/builder.rs b/crates/oxc_semantic/src/jsdoc/builder.rs index acb66912c..ca424e046 100644 --- a/crates/oxc_semantic/src/jsdoc/builder.rs +++ b/crates/oxc_semantic/src/jsdoc/builder.rs @@ -83,7 +83,7 @@ mod test { let ret = Parser::new(allocator, source_text, source_type).parse(); let program = allocator.alloc(ret.program); let semantic = SemanticBuilder::new(source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .build(program) .semantic; let jsdoc = semantic.jsdoc(); diff --git a/crates/oxc_semantic/src/module_record/mod.rs b/crates/oxc_semantic/src/module_record/mod.rs index a342bf917..c40ae6cd2 100644 --- a/crates/oxc_semantic/src/module_record/mod.rs +++ b/crates/oxc_semantic/src/module_record/mod.rs @@ -18,7 +18,7 @@ mod module_record_tests { let ret = Parser::new(&allocator, source_text, source_type).parse(); let program = allocator.alloc(ret.program); let semantic_ret = SemanticBuilder::new(source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_module_record_builder(true) .build(program); semantic_ret.semantic.module_record diff --git a/crates/oxc_semantic/tests/util/mod.rs b/crates/oxc_semantic/tests/util/mod.rs index f02e3bb2c..360128085 100644 --- a/crates/oxc_semantic/tests/util/mod.rs +++ b/crates/oxc_semantic/tests/util/mod.rs @@ -85,7 +85,7 @@ impl SemanticTester { let program = self.allocator.alloc(parse.program); let semantic_ret = SemanticBuilder::new(self.source_text, self.source_type) .with_check_syntax_error(true) - .with_trivias(&parse.trivias) + .with_trivias(parse.trivias) .with_module_record_builder(self.use_module_record_builder) .build(program); diff --git a/crates/oxc_wasm/src/lib.rs b/crates/oxc_wasm/src/lib.rs index 2b3c3f0c9..556da0c9e 100644 --- a/crates/oxc_wasm/src/lib.rs +++ b/crates/oxc_wasm/src/lib.rs @@ -173,15 +173,13 @@ impl Oxc { if run_options.syntax() && !run_options.lint() { let semantic_ret = SemanticBuilder::new(source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_check_syntax_error(true) .build(program); self.save_diagnostics(semantic_ret.errors); - } - - if run_options.lint() { + } else if run_options.lint() { let semantic_ret = SemanticBuilder::new(source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_check_syntax_error(true) .build(program); self.save_diagnostics(semantic_ret.errors); diff --git a/editor/vscode/server/src/linter.rs b/editor/vscode/server/src/linter.rs index e7a115f07..5a20c0411 100644 --- a/editor/vscode/server/src/linter.rs +++ b/editor/vscode/server/src/linter.rs @@ -238,7 +238,7 @@ impl IsolatedLintHandler { let program = allocator.alloc(ret.program); let semantic_ret = SemanticBuilder::new(&source_text, source_type) - .with_trivias(&ret.trivias) + .with_trivias(ret.trivias) .with_check_syntax_error(true) .build(program); diff --git a/tasks/coverage/src/suite.rs b/tasks/coverage/src/suite.rs index 083a7f70d..7dc320390 100644 --- a/tasks/coverage/src/suite.rs +++ b/tasks/coverage/src/suite.rs @@ -281,7 +281,7 @@ pub trait Case: Sized + Sync + Send + UnwindSafe { let program = allocator.alloc(parser_ret.program); 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_check_syntax_error(true) .build(program);