Skip to content

Commit

Permalink
feat: parse script
Browse files Browse the repository at this point in the history
  • Loading branch information
JSerFeng committed Apr 25, 2023
1 parent 265413c commit f1ab44e
Show file tree
Hide file tree
Showing 17 changed files with 190 additions and 199 deletions.
5 changes: 5 additions & 0 deletions .changeset/old-elephants-shake.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@rspack/binding": patch
---

fix: should parse non-module file correctly
16 changes: 8 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 12 additions & 0 deletions crates/rspack_core/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ pub use chunk::*;
mod dependency;
pub use dependency::*;
mod utils;
use swc_core::base::config::IsModule;
use tokio::sync::RwLock;
pub use utils::*;
mod chunk_graph;
Expand Down Expand Up @@ -154,6 +155,17 @@ impl ModuleType {
}
}

impl From<&ModuleType> for IsModule {
fn from(value: &ModuleType) -> Self {
/* parser options align with webpack */
match value {
ModuleType::JsEsm | ModuleType::JsxEsm => IsModule::Bool(true),
ModuleType::JsDynamic | ModuleType::JsxDynamic => IsModule::Bool(false),
_ => IsModule::Unknown,
}
}
}

impl fmt::Display for ModuleType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
Expand Down
95 changes: 54 additions & 41 deletions crates/rspack_core/src/tree_shaking/visitor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -512,12 +512,19 @@ impl<'a> Visit for ModuleRefAnalyze<'a> {
}
for module_item in &node.body {
if !is_import_decl(module_item) {
self.analyze_stmt_side_effects(module_item);
self.analyze_module_item_side_effects(module_item);
module_item.visit_with(self);
}
}
}

fn visit_script(&mut self, node: &Script) {
for stmt in &node.body {
self.analyze_stmt_side_effects(stmt);
stmt.visit_with(self);
}
}

fn visit_ident(&mut self, node: &Ident) {
let id: BetterId = node.to_id().into();
let mark = id.ctxt.outer();
Expand Down Expand Up @@ -1185,27 +1192,62 @@ pub fn get_side_effects_from_package_json(
}

impl<'a> ModuleRefAnalyze<'a> {
fn analyze_module_item_side_effects(&mut self, ele: &ModuleItem) {
match ele {
ModuleItem::ModuleDecl(module_decl) => match module_decl {
ModuleDecl::ExportDecl(decl) => {
if !is_pure_decl(&decl.decl, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleDecl::ExportDefaultDecl(decl) => {
match decl.decl {
DefaultDecl::Class(ref class) => {
if !is_pure_class(&class.class, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
DefaultDecl::Fn(_) => {}
DefaultDecl::TsInterfaceDecl(_) => unreachable!(),
};
}
ModuleDecl::ExportDefaultExpr(expr) => {
if !is_pure_expression(&expr.expr, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleDecl::ExportAll(_)
| ModuleDecl::Import(_)
| ModuleDecl::ExportNamed(_)
| ModuleDecl::TsImportEquals(_)
| ModuleDecl::TsExportAssignment(_)
| ModuleDecl::TsNamespaceExport(_) => {}
},
ModuleItem::Stmt(stmt) => self.analyze_stmt_side_effects(stmt),
}
}

/// If we find a stmt that has side effects, we will skip the rest of the stmts.
/// And mark the module as having side effects.
fn analyze_stmt_side_effects(&mut self, ele: &ModuleItem) {
fn analyze_stmt_side_effects(&mut self, ele: &Stmt) {
if !self.has_side_effects_stmt {
match ele {
ModuleItem::Stmt(Stmt::If(stmt)) => {
Stmt::If(stmt) => {
if !is_pure_expression(&stmt.test, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::While(stmt)) => {
Stmt::While(stmt) => {
if !is_pure_expression(&stmt.test, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::DoWhile(stmt)) => {
Stmt::DoWhile(stmt) => {
if !is_pure_expression(&stmt.test, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::For(stmt)) => {
Stmt::For(stmt) => {
let pure_init = match stmt.init {
Some(ref init) => match init {
VarDeclOrExpr::VarDecl(decl) => is_pure_var_decl(decl, self.unresolved_ctxt),
Expand Down Expand Up @@ -1238,53 +1280,24 @@ impl<'a> ModuleRefAnalyze<'a> {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::Expr(stmt)) => {
Stmt::Expr(stmt) => {
if !is_pure_expression(&stmt.expr, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::Switch(stmt)) => {
Stmt::Switch(stmt) => {
if !is_pure_expression(&stmt.discriminant, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::Stmt(Stmt::Decl(stmt)) => {
Stmt::Decl(stmt) => {
if !is_pure_decl(stmt, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleItem::ModuleDecl(module_decl) => match module_decl {
ModuleDecl::ExportDecl(decl) => {
if !is_pure_decl(&decl.decl, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleDecl::ExportDefaultDecl(decl) => {
match decl.decl {
DefaultDecl::Class(ref class) => {
if !is_pure_class(&class.class, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
DefaultDecl::Fn(_) => {}
DefaultDecl::TsInterfaceDecl(_) => unreachable!(),
};
}
ModuleDecl::ExportDefaultExpr(expr) => {
if !is_pure_expression(&expr.expr, self.unresolved_ctxt) {
self.has_side_effects_stmt = true;
}
}
ModuleDecl::ExportAll(_)
| ModuleDecl::Import(_)
| ModuleDecl::ExportNamed(_)
| ModuleDecl::TsImportEquals(_)
| ModuleDecl::TsExportAssignment(_)
| ModuleDecl::TsNamespaceExport(_) => {}
},
ModuleItem::Stmt(Stmt::Empty(_)) => {}
ModuleItem::Stmt(Stmt::Labeled(_)) => {}
ModuleItem::Stmt(Stmt::Block(_)) => {}
Stmt::Empty(_) => {}
Stmt::Labeled(_) => {}
Stmt::Block(_) => {}
_ => self.has_side_effects_stmt = true,
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/a.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/a.js:6:1
β”‚
Expand All @@ -26,12 +20,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/b.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/b.js:6:1
β”‚
Expand All @@ -44,12 +32,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/c.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/c.js:6:1
β”‚
Expand All @@ -62,12 +44,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/d.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/d.js:6:1
β”‚
Expand All @@ -80,12 +56,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/e.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/e.js:6:1
β”‚
Expand All @@ -98,12 +68,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/f.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/f.js:6:1
β”‚
Expand All @@ -116,12 +80,6 @@ error[javascript]: JavaScript parsing error
2 β”‚ const D {
β”‚ ^ Expected a semicolon

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/g.js:2:8
β”‚
2 β”‚ const D {
β”‚ ^ 'const' declarations must be initialized

error[javascript]: JavaScript parsing error
β”Œβ”€ tests/out_of_order/multiple_file_syntax_error/g.js:6:1
β”‚
Expand Down
4 changes: 2 additions & 2 deletions crates/rspack_fs_node/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@

/* auto-generated by NAPI-RS */

export interface ThreadsafeNodeFs {
export interface NodeFS {
writeFile: (...args: any[]) => any
mkdir: (...args: any[]) => any
mkdirp: (...args: any[]) => any
}
export interface NodeFs {
export interface ThreadsafeNodeFS {
writeFile: (...args: any[]) => any
mkdir: (...args: any[]) => any
mkdirp: (...args: any[]) => any
Expand Down
Loading

0 comments on commit f1ab44e

Please sign in to comment.