From 26e4eef6e0cab352c18525b703ef4fbda2a68191 Mon Sep 17 00:00:00 2001 From: Hana Date: Wed, 10 Apr 2024 18:50:03 +0800 Subject: [PATCH] fix: should keep locally defined variables in class (#6183) --- .../src/visitors/dependency/parser/walk.rs | 22 +++++++++---------- .../cases/parsing/rspack-issue-6164/index.js | 9 ++++++++ 2 files changed, 20 insertions(+), 11 deletions(-) create mode 100644 packages/rspack/tests/cases/parsing/rspack-issue-6164/index.js diff --git a/crates/rspack_plugin_javascript/src/visitors/dependency/parser/walk.rs b/crates/rspack_plugin_javascript/src/visitors/dependency/parser/walk.rs index eec7ce6feaf..35692eab1a7 100644 --- a/crates/rspack_plugin_javascript/src/visitors/dependency/parser/walk.rs +++ b/crates/rspack_plugin_javascript/src/visitors/dependency/parser/walk.rs @@ -12,7 +12,7 @@ use swc_core::ecma::ast::{FnExpr, ForHead, Function, Ident, KeyValueProp}; use swc_core::ecma::ast::{ForInStmt, ForOfStmt, ForStmt, IfStmt, LabeledStmt, WithStmt}; use swc_core::ecma::ast::{MetaPropExpr, NamedExport, NewExpr, ObjectLit, OptCall, OptChainBase}; use swc_core::ecma::ast::{ModuleDecl, ModuleItem, ObjectPat, ObjectPatProp, Stmt, WhileStmt}; -use swc_core::ecma::ast::{OptChainExpr, ParamOrTsParamProp, Pat, ThisExpr, UnaryOp}; +use swc_core::ecma::ast::{OptChainExpr, Pat, ThisExpr, UnaryOp}; use swc_core::ecma::ast::{Prop, PropName, PropOrSpread, RestPat, ReturnStmt, SeqExpr, TaggedTpl}; use swc_core::ecma::ast::{SwitchCase, SwitchStmt, Tpl, TryStmt, VarDecl, YieldExpr}; use swc_core::ecma::ast::{ThrowStmt, UnaryExpr, UpdateExpr}; @@ -1071,7 +1071,7 @@ impl<'parser> JavascriptParser<'parser> { Pat::Object(obj) => self.walk_object_pattern(obj), Pat::Rest(rest) => self.walk_rest_element(rest), Pat::Expr(expr) => self.walk_expression(expr), - Pat::Ident(ident) => self.walk_identifier(ident), + Pat::Ident(_) => (), Pat::Invalid(_) => (), } } @@ -1166,16 +1166,16 @@ impl<'parser> JavascriptParser<'parser> { let was_top_level = this.top_level_scope; this.top_level_scope = TopLevelScope::False; - for prop in &ctor.params { - match prop { - ParamOrTsParamProp::Param(param) => this.walk_pattern(¶m.pat), - ParamOrTsParamProp::TsParamProp(_) => unreachable!(), + let params = ctor.params.iter().map(|p| { + let p = &p.as_param().expect("should only contain param").pat; + Cow::Borrowed(p) + }); + this.in_function_scope(true, params, |this| { + // TODO: `hooks.body_value`; + if let Some(body) = &ctor.body { + this.walk_block_statement(body); } - } - // TODO: `hooks.body_value`; - if let Some(body) = &ctor.body { - this.walk_block_statement(body); - } + }); this.top_level_scope = was_top_level; } diff --git a/packages/rspack/tests/cases/parsing/rspack-issue-6164/index.js b/packages/rspack/tests/cases/parsing/rspack-issue-6164/index.js new file mode 100644 index 00000000000..e56cfbfdb8e --- /dev/null +++ b/packages/rspack/tests/cases/parsing/rspack-issue-6164/index.js @@ -0,0 +1,9 @@ +class Example { + constructor(global = false) { + this.global = global; + } +} + +it("should keep `global` as a local variable", function () { + expect(new Example().global).toBe(false); +});