refactor(visit): Remove &dyn Node from Visit (#2984)

swc_visit_macros:
 - Remove `&dyn Node` from `Visit`.
 - Implement `VisitWith<V>` for `[T]`.
This commit is contained in:
Donny/강동윤 2021-12-07 14:34:16 +09:00 committed by GitHub
parent f052a65bf3
commit e48263b2f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
78 changed files with 1315 additions and 1441 deletions

View File

@ -50,9 +50,11 @@ jobs:
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: nightly-2021-09-30
override: true
- name: Run benchmark
run: cargo bench --all --exclude swc_plugin | tee output.txt
run: cargo +nightly-2021-09-30 bench --all --exclude swc_plugin | tee output.txt
- name: Download previous benchmark results
run: mkdir raw-data && curl -o raw-data/benchmark-data.json https://raw.githubusercontent.com/swc-project/raw-data/gh-pages/benchmark-data.json

View File

@ -57,5 +57,6 @@ rust-toolchain
.husky/
.prettierrc
crates/
packages/
cspell.json
deny.toml

5
Cargo.lock generated
View File

@ -1267,6 +1267,7 @@ dependencies = [
"napi-build",
"napi-derive",
"path-clean",
"proc-macro2",
"serde",
"serde_json",
"swc",
@ -1718,9 +1719,9 @@ checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
[[package]]
name = "proc-macro2"
version = "1.0.33"
version = "1.0.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a"
checksum = "ba508cc11742c0dc5c1659771673afbab7a0efab23aa17e854cbab0837ed0b43"
dependencies = [
"unicode-xid",
]

View File

@ -20,6 +20,7 @@ backtrace = "0.3"
napi = {version = "1", features = ["serde-json"]}
napi-derive = {version = "1"}
path-clean = "0.1"
proc-macro2 = "=1.0.32"
serde = {version = "1", features = ["derive"]}
serde_json = {version = "1", features = ["unbounded_depth"]}
swc = {path = "../swc", features = ["concurrent", "wrong-target", "plugin"]}

View File

@ -140,9 +140,9 @@ use swc_common::{
input::StringInput,
source_map::SourceMapGenConfig,
sync::Lrc,
BytePos, FileName, Globals, Mark, SourceFile, SourceMap, Spanned, DUMMY_SP, GLOBALS,
BytePos, FileName, Globals, Mark, SourceFile, SourceMap, Spanned, GLOBALS,
};
use swc_ecma_ast::{EsVersion, Ident, Invalid, Program};
use swc_ecma_ast::{EsVersion, Ident, Program};
use swc_ecma_codegen::{self, text_writer::WriteJs, Emitter, Node};
use swc_ecma_loader::resolvers::{
lru::CachingResolver, node::NodeModulesResolver, tsc::TsConfigResolver,
@ -982,7 +982,7 @@ impl Compiler {
names: Default::default(),
};
module.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
module.visit_with(&mut v);
v.names
};
@ -1052,7 +1052,7 @@ impl Compiler {
names: Default::default(),
};
program.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
program.visit_with(&mut v);
v.names
};
@ -1117,7 +1117,7 @@ pub struct IdentCollector {
impl Visit for IdentCollector {
noop_visit_type!();
fn visit_ident(&mut self, ident: &Ident, _: &dyn swc_ecma_visit::Node) {
fn visit_ident(&mut self, ident: &Ident) {
self.names.insert(ident.span.lo, ident.sym.clone());
}
}

View File

@ -5,7 +5,7 @@ use swc_atoms::js_word;
use swc_common::{SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{find_ids, private_ident, ExprFactory};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, Node, Visit};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, Visit};
impl<L, R> Bundler<'_, L, R>
where
@ -186,11 +186,11 @@ struct TopLevelAwaitFinder {
impl Visit for TopLevelAwaitFinder {
noop_visit_type!();
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_class_member(&mut self, _: &ClassMember, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
fn visit_class_member(&mut self, _: &ClassMember) {}
fn visit_await_expr(&mut self, _: &AwaitExpr, _: &dyn Node) {
fn visit_await_expr(&mut self, _: &AwaitExpr) {
self.found = true;
}
}

View File

@ -12,7 +12,7 @@ use swc_ecma_transforms_base::{
hygiene::hygiene,
};
use swc_ecma_utils::{find_ids, private_ident, ExprFactory};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitWith};
impl<L, R> Bundler<'_, L, R>
where
@ -143,7 +143,7 @@ where
}
let mut top_level_await_finder = TopLevelAwaitFinder::default();
module.visit_with(&Invalid { span: DUMMY_SP }, &mut top_level_await_finder);
module.visit_with(&mut top_level_await_finder);
let is_async = top_level_await_finder.found;
@ -352,9 +352,9 @@ struct TopLevelAwaitFinder {
impl Visit for TopLevelAwaitFinder {
noop_visit_type!();
fn visit_stmts(&mut self, _: &[Stmt], _: &dyn Node) {}
fn visit_stmts(&mut self, _: &[Stmt]) {}
fn visit_await_expr(&mut self, _: &AwaitExpr, _: &dyn Node) {
fn visit_await_expr(&mut self, _: &AwaitExpr) {
self.found = true;
}
}

View File

@ -14,14 +14,14 @@ use is_macro::Is;
#[cfg(feature = "rayon")]
use rayon::iter::ParallelIterator;
use swc_atoms::js_word;
use swc_common::{sync::Lrc, FileName, SourceFile, SyntaxContext, DUMMY_SP};
use swc_common::{sync::Lrc, FileName, SourceFile, SyntaxContext};
use swc_ecma_ast::{
CallExpr, Expr, ExprOrSuper, Ident, ImportDecl, ImportSpecifier, Invalid, MemberExpr, Module,
CallExpr, Expr, ExprOrSuper, Ident, ImportDecl, ImportSpecifier, MemberExpr, Module,
ModuleDecl, Str,
};
use swc_ecma_transforms_base::resolver::resolver_with_mark;
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, FoldWith, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, FoldWith, Visit, VisitMut, VisitMutWith, VisitWith,
};
/// Module after applying transformations.
#[derive(Debug, Clone)]
@ -183,7 +183,7 @@ where
forced_es6: false,
found_other: false,
};
module.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
module.visit_with(&mut v);
v.forced_es6 || !v.found_other
};
@ -415,7 +415,7 @@ struct Es6ModuleDetector {
impl Visit for Es6ModuleDetector {
noop_visit_type!();
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
e.visit_children_with(self);
match &e.callee {
@ -432,11 +432,11 @@ impl Visit for Es6ModuleDetector {
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e as _, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
match &e.obj {
@ -462,7 +462,7 @@ impl Visit for Es6ModuleDetector {
//
}
fn visit_module_decl(&mut self, decl: &ModuleDecl, _: &dyn Node) {
fn visit_module_decl(&mut self, decl: &ModuleDecl) {
match decl {
ModuleDecl::Import(_)
| ModuleDecl::ExportDecl(_)

View File

@ -2,7 +2,7 @@ use crate::{id::Id, modules::Modules, util::Readonly};
use swc_common::{collections::AHashMap, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
#[derive(Debug, Default)]
@ -60,15 +60,15 @@ impl Visit for Analyzer<'_> {
noop_visit_type!();
/// Noop
fn visit_module_decl(&mut self, _: &ModuleDecl, _: &dyn Node) {}
fn visit_module_decl(&mut self, _: &ModuleDecl) {}
/// Noop. We don't inline variables declared in subscopes.
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
/// Noop. We don't inline variables declared in subscopes.
fn visit_block_stmt(&mut self, _: &BlockStmt, _: &dyn Node) {}
fn visit_block_stmt(&mut self, _: &BlockStmt) {}
fn visit_var_decl(&mut self, n: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, n: &VarDecl) {
if n.span.ctxt != self.injected_ctxt || n.kind != VarDeclKind::Const {
return;
}
@ -76,7 +76,7 @@ impl Visit for Analyzer<'_> {
n.visit_children_with(self);
}
fn visit_var_declarator(&mut self, n: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, n: &VarDeclarator) {
n.visit_children_with(self);
match (&n.name, n.init.as_deref()) {
(Pat::Ident(from), Some(Expr::Ident(to))) => {

View File

@ -225,8 +225,7 @@ impl Modules {
where
V: Visit,
{
self.iter()
.for_each(|item| item.1.visit_with(&Invalid { span: DUMMY_SP }, v));
self.iter().for_each(|item| item.1.visit_with(v));
}
pub fn retain_mut<F>(&mut self, mut op: F)

View File

@ -8,11 +8,11 @@ use swc_common::{
collections::{AHashMap, AHashSet},
sync::Lrc,
util::take::Take,
SourceMap, Spanned, SyntaxContext, DUMMY_SP,
SourceMap, Spanned, SyntaxContext,
};
use swc_ecma_ast::*;
use swc_ecma_utils::find_ids;
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
pub(super) fn sort_stmts(
injected_ctxt: SyntaxContext,
@ -375,24 +375,24 @@ impl FieldInitFinter {
impl Visit for FieldInitFinter {
noop_visit_type!();
fn visit_assign_expr(&mut self, e: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, e: &AssignExpr) {
let old = self.in_rhs;
e.left.visit_with(e, self);
e.left.visit_with(self);
self.check_lhs_of_assign(&e.left);
self.in_rhs = true;
e.right.visit_with(e, self);
e.right.visit_with(self);
self.in_rhs = old;
}
fn visit_pat(&mut self, e: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, e: &Pat) {
let old = self.in_rhs;
self.in_rhs = false;
e.visit_children_with(self);
self.in_rhs = old;
}
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
match &e.callee {
ExprOrSuper::Super(_) => {}
ExprOrSuper::Expr(callee) => match &**callee {
@ -408,7 +408,7 @@ impl Visit for FieldInitFinter {
let old = self.in_object_assign;
self.in_object_assign = true;
e.args.visit_with(e, self);
e.args.visit_with(self);
self.in_object_assign = old;
return;
@ -427,11 +427,11 @@ impl Visit for FieldInitFinter {
e.visit_children_with(self);
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e, self);
e.prop.visit_with(self);
}
if !self.in_rhs || self.in_object_assign {
@ -464,7 +464,7 @@ struct InitializerFinder {
impl Visit for InitializerFinder {
noop_visit_type!();
fn visit_pat(&mut self, pat: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, pat: &Pat) {
match pat {
Pat::Ident(i) if self.ident == i.id => {
self.found = true;
@ -476,20 +476,20 @@ impl Visit for InitializerFinder {
}
}
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
if self.in_complex && self.ident == *i {
self.found = true;
}
}
fn visit_expr_or_spread(&mut self, node: &ExprOrSpread, _: &dyn Node) {
fn visit_expr_or_spread(&mut self, node: &ExprOrSpread) {
let in_complex = self.in_complex;
self.in_complex = true;
node.visit_children_with(self);
self.in_complex = in_complex;
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
fn visit_member_expr(&mut self, e: &MemberExpr) {
{
let in_complex = self.in_complex;
self.in_complex = true;
@ -498,7 +498,7 @@ impl Visit for InitializerFinder {
}
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
}
}
@ -520,7 +520,7 @@ struct RequirementCalculator {
macro_rules! weak {
($name:ident, $T:ty) => {
fn $name(&mut self, f: &$T, _: &dyn Node) {
fn $name(&mut self, f: &$T) {
let in_weak = self.in_weak;
self.in_weak = true;
@ -553,23 +553,23 @@ impl Visit for RequirementCalculator {
weak!(visit_private_method, PrivateMethod);
weak!(visit_method_prop, MethodProp);
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier, _: &dyn Node) {
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier) {
self.insert(n.orig.clone().into());
}
fn visit_assign_expr(&mut self, e: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, e: &AssignExpr) {
let old = self.in_assign_lhs;
self.in_assign_lhs = true;
e.left.visit_with(e, self);
e.left.visit_with(self);
self.in_assign_lhs = false;
e.right.visit_with(e, self);
e.right.visit_with(self);
self.in_assign_lhs = old;
}
fn visit_pat(&mut self, pat: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, pat: &Pat) {
match pat {
Pat::Ident(i) => {
// We do not care about variables created by current statement.
@ -584,7 +584,7 @@ impl Visit for RequirementCalculator {
}
}
fn visit_var_declarator(&mut self, var: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, var: &VarDeclarator) {
let in_var_decl = self.in_var_decl;
self.in_var_decl = true;
@ -598,7 +598,7 @@ impl Visit for RequirementCalculator {
self.in_var_decl = in_var_decl;
}
fn visit_expr(&mut self, expr: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, expr: &Expr) {
match expr {
Expr::Ident(i) => {
if self.in_var_decl && self.in_assign_lhs {
@ -612,7 +612,7 @@ impl Visit for RequirementCalculator {
}
}
fn visit_prop(&mut self, prop: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, prop: &Prop) {
match prop {
Prop::Shorthand(i) => {
self.insert(i.into());
@ -621,11 +621,11 @@ impl Visit for RequirementCalculator {
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e as _, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
}
}
@ -677,7 +677,7 @@ fn calc_deps(new: &[ModuleItem]) -> StmtDepGraph {
{
// Find extra initializations.
let mut v = FieldInitFinter::default();
item.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
item.visit_with(&mut v);
for id in v.accessed {
if let Some(declarator_indexes) = declared_by.get(&id) {
@ -726,7 +726,7 @@ fn calc_deps(new: &[ModuleItem]) -> StmtDepGraph {
found: false,
in_complex: false,
};
item.visit_with(&Invalid { span: DUMMY_SP }, &mut finder);
item.visit_with(&mut finder);
if finder.found {
declared_by.entry(uninit_id).or_default().push(idx);
break;
@ -741,7 +741,7 @@ fn calc_deps(new: &[ModuleItem]) -> StmtDepGraph {
let mut visitor = RequirementCalculator::default();
item.visit_with(&Invalid { span: DUMMY_SP }, &mut visitor);
item.visit_with(&mut visitor);
for (id, kind) in visitor.required_ids {
if visitor.excluded.contains(&id) {

View File

@ -23,7 +23,7 @@ use swc_ecma_codegen::{
use swc_ecma_minifier::option::MangleOptions;
use swc_ecma_transforms_base::{fixer::fixer, resolver::resolver_with_mark};
use swc_ecma_utils::{find_ids, Id};
use swc_ecma_visit::{Node, Visit, VisitMutWith, VisitWith};
use swc_ecma_visit::{Visit, VisitMutWith, VisitWith};
use testing::assert_eq;
#[path = "common/mod.rs"]
@ -1139,7 +1139,7 @@ impl swc_bundler::Hook for Hook {
fn collect_exports(module: &Module) -> AHashSet<String> {
let mut v = ExportCollector::default();
module.visit_with(module, &mut v);
module.visit_with(&mut v);
v.exports
}
@ -1150,7 +1150,7 @@ struct ExportCollector {
}
impl Visit for ExportCollector {
fn visit_export_specifier(&mut self, s: &ExportSpecifier, _: &dyn Node) {
fn visit_export_specifier(&mut self, s: &ExportSpecifier) {
match s {
ExportSpecifier::Namespace(ns) => {
self.exports.insert(ns.name.sym.to_string());
@ -1171,15 +1171,15 @@ impl Visit for ExportCollector {
}
}
fn visit_export_default_decl(&mut self, _: &ExportDefaultDecl, _: &dyn Node) {
fn visit_export_default_decl(&mut self, _: &ExportDefaultDecl) {
self.exports.insert("default".into());
}
fn visit_export_default_expr(&mut self, _: &ExportDefaultExpr, _: &dyn Node) {
fn visit_export_default_expr(&mut self, _: &ExportDefaultExpr) {
self.exports.insert("default".into());
}
fn visit_export_decl(&mut self, export: &ExportDecl, _: &dyn Node) {
fn visit_export_decl(&mut self, export: &ExportDecl) {
match &export.decl {
swc_ecma_ast::Decl::Class(ClassDecl { ident, .. })
| swc_ecma_ast::Decl::Fn(FnDecl { ident, .. }) => {

View File

@ -1,5 +1,5 @@
use std::path::PathBuf;
use swc_common::{errors::Handler, input::SourceFileInput, Span, Spanned, DUMMY_SP};
use swc_common::{errors::Handler, input::SourceFileInput, Span, Spanned};
use swc_css_ast::*;
use swc_css_parser::{
error::ErrorKind,
@ -266,7 +266,7 @@ struct SpanVisualizer<'a> {
macro_rules! mtd {
($T:ty,$name:ident) => {
fn $name(&mut self, n: &$T, _: &dyn swc_css_visit::Node) {
fn $name(&mut self, n: &$T) {
self.handler
.struct_span_err(n.span(), stringify!($T))
.emit();
@ -349,7 +349,7 @@ impl Visit for SpanVisualizer<'_> {
mtd!(UnknownAtRule, visit_unknown_at_rule);
mtd!(ViewportRule, visit_viewport_rule);
fn visit_token_and_span(&mut self, n: &TokenAndSpan, _parent: &dyn swc_css_visit::Node) {
fn visit_token_and_span(&mut self, n: &TokenAndSpan) {
self.handler
.struct_span_err(n.span, &format!("{:?}", n.token))
.emit();
@ -379,10 +379,7 @@ fn span(input: PathBuf) {
match stylesheet {
Ok(stylesheet) => {
stylesheet.visit_with(
&Invalid { span: DUMMY_SP },
&mut SpanVisualizer { handler: &handler },
);
stylesheet.visit_with(&mut SpanVisualizer { handler: &handler });
Err(())
}

View File

@ -2,10 +2,10 @@ use std::collections::HashMap;
use swc_atoms::JsWord;
use swc_common::{
comments::{Comment, Comments},
Span, DUMMY_SP,
Span,
};
use swc_ecma_ast as ast;
use swc_ecma_visit::{self, Node, Visit, VisitWith};
use swc_ecma_visit::{self, Visit, VisitWith};
pub fn analyze_dependencies(
module: &ast::Module,
@ -16,7 +16,7 @@ pub fn analyze_dependencies(
items: vec![],
is_top_level: true,
};
module.visit_with(&ast::Invalid { span: DUMMY_SP }, &mut v);
module.visit_with(&mut v);
v.items
}
@ -63,7 +63,7 @@ impl<'a> DependencyCollector<'a> {
}
impl<'a> Visit for DependencyCollector<'a> {
fn visit_import_decl(&mut self, node: &ast::ImportDecl, _parent: &dyn Node) {
fn visit_import_decl(&mut self, node: &ast::ImportDecl) {
let specifier = node.src.value.clone();
let leading_comments = self.get_leading_comments(node.span);
let kind = if node.type_only {
@ -83,7 +83,7 @@ impl<'a> Visit for DependencyCollector<'a> {
});
}
fn visit_named_export(&mut self, node: &ast::NamedExport, _parent: &dyn Node) {
fn visit_named_export(&mut self, node: &ast::NamedExport) {
if let Some(src) = &node.src {
let specifier = src.value.clone();
let leading_comments = self.get_leading_comments(node.span);
@ -105,7 +105,7 @@ impl<'a> Visit for DependencyCollector<'a> {
}
}
fn visit_export_all(&mut self, node: &ast::ExportAll, _parent: &dyn Node) {
fn visit_export_all(&mut self, node: &ast::ExportAll) {
let specifier = node.src.value.clone();
let leading_comments = self.get_leading_comments(node.span);
let import_assertions = parse_import_assertions(node.asserts.as_ref());
@ -120,7 +120,7 @@ impl<'a> Visit for DependencyCollector<'a> {
});
}
fn visit_ts_import_type(&mut self, node: &ast::TsImportType, _parent: &dyn Node) {
fn visit_ts_import_type(&mut self, node: &ast::TsImportType) {
let specifier = node.arg.value.clone();
let span = node.span;
let leading_comments = self.get_leading_comments(span);
@ -135,20 +135,20 @@ impl<'a> Visit for DependencyCollector<'a> {
});
}
fn visit_module_items(&mut self, items: &[ast::ModuleItem], _parent: &dyn Node) {
swc_ecma_visit::visit_module_items(self, items, _parent);
fn visit_module_items(&mut self, items: &[ast::ModuleItem]) {
swc_ecma_visit::visit_module_items(self, items);
}
fn visit_stmts(&mut self, items: &[ast::Stmt], _parent: &dyn Node) {
fn visit_stmts(&mut self, items: &[ast::Stmt]) {
self.is_top_level = false;
swc_ecma_visit::visit_stmts(self, items, _parent);
swc_ecma_visit::visit_stmts(self, items);
self.is_top_level = true;
}
fn visit_call_expr(&mut self, node: &ast::CallExpr, _parent: &dyn Node) {
fn visit_call_expr(&mut self, node: &ast::CallExpr) {
use ast::{Expr::*, ExprOrSuper::*};
swc_ecma_visit::visit_call_expr(self, node, _parent);
swc_ecma_visit::visit_call_expr(self, node);
let call_expr = match node.callee.clone() {
Super(_) => return,
Expr(boxed) => boxed,

View File

@ -10,11 +10,11 @@ use std::time::Instant;
use swc_atoms::{js_word, JsWord};
use swc_common::{
collections::{AHashMap, AHashSet},
SyntaxContext, DUMMY_SP,
SyntaxContext,
};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, Id};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
mod ctx;
pub(crate) mod storage;
@ -43,7 +43,7 @@ where
scope: Default::default(),
ctx: Default::default(),
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
let top_scope = v.scope;
v.data.top_scope().merge(top_scope, false);
@ -63,7 +63,7 @@ pub(crate) struct VarUsageInfo {
/// The number of reference to this identifier.
pub ref_count: usize,
/// `true` if a varaible is conditionally initialized.
/// `true` if a variable is conditionally initialized.
pub cond_init: bool,
/// `false` if it's only used.
@ -110,7 +110,7 @@ pub(crate) struct VarUsageInfo {
pub used_as_callee: bool,
/// In `c = b`, `b` inffects `c`.
/// In `c = b`, `b` infects `c`.
infects: Vec<Id>,
}
@ -236,14 +236,14 @@ where
{
noop_visit_type!();
fn visit_arrow_expr(&mut self, n: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, n: &ArrowExpr) {
self.with_child(n.span.ctxt, ScopeKind::Fn, |child| {
{
let ctx = Ctx {
in_pat_of_param: true,
..child.ctx
};
n.params.visit_with(n, &mut *child.with_ctx(ctx));
n.params.visit_with(&mut *child.with_ctx(ctx));
}
match &n.body {
@ -253,30 +253,30 @@ where
body.visit_children_with(child);
}
BlockStmtOrExpr::Expr(body) => {
body.visit_with(n, child);
body.visit_with(child);
}
}
})
}
fn visit_assign_expr(&mut self, n: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, n: &AssignExpr) {
let ctx = Ctx {
in_assign_lhs: true,
is_exact_reassignment: true,
is_op_assign: n.op != op!("="),
..self.ctx
};
n.left.visit_with(n, &mut *self.with_ctx(ctx));
n.left.visit_with(&mut *self.with_ctx(ctx));
let ctx = Ctx {
in_assign_lhs: false,
is_exact_reassignment: false,
..self.ctx
};
n.right.visit_with(n, &mut *self.with_ctx(ctx));
n.right.visit_with(&mut *self.with_ctx(ctx));
}
fn visit_await_expr(&mut self, n: &AwaitExpr, _: &dyn Node) {
fn visit_await_expr(&mut self, n: &AwaitExpr) {
let ctx = Ctx {
in_await_arg: true,
..self.ctx
@ -284,13 +284,13 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_block_stmt(&mut self, n: &BlockStmt, _: &dyn Node) {
fn visit_block_stmt(&mut self, n: &BlockStmt) {
self.with_child(n.span.ctxt, ScopeKind::Block, |child| {
n.visit_children_with(child);
})
}
fn visit_call_expr(&mut self, n: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, n: &CallExpr) {
let inline_prevented = self.ctx.inline_prevented
|| self
.marks
@ -302,7 +302,7 @@ where
inline_prevented,
..self.ctx
};
n.callee.visit_with(n, &mut *self.with_ctx(ctx));
n.callee.visit_with(&mut *self.with_ctx(ctx));
}
match &n.callee {
@ -326,7 +326,7 @@ where
is_exact_reassignment: false,
..self.ctx
};
n.args.visit_with(n, &mut *self.with_ctx(ctx));
n.args.visit_with(&mut *self.with_ctx(ctx));
}
match &n.callee {
@ -340,14 +340,14 @@ where
}
}
fn visit_catch_clause(&mut self, n: &CatchClause, _: &dyn Node) {
fn visit_catch_clause(&mut self, n: &CatchClause) {
{
let ctx = Ctx {
in_cond: true,
in_catch_param: true,
..self.ctx
};
n.param.visit_with(n, &mut *self.with_ctx(ctx));
n.param.visit_with(&mut *self.with_ctx(ctx));
}
{
@ -355,44 +355,44 @@ where
in_cond: true,
..self.ctx
};
n.body.visit_with(n, &mut *self.with_ctx(ctx));
n.body.visit_with(&mut *self.with_ctx(ctx));
}
}
fn visit_class(&mut self, n: &Class, _: &dyn Node) {
n.decorators.visit_with(n, self);
fn visit_class(&mut self, n: &Class) {
n.decorators.visit_with(self);
{
let ctx = Ctx {
inline_prevented: true,
..self.ctx
};
n.super_class.visit_with(n, &mut *self.with_ctx(ctx));
n.super_class.visit_with(&mut *self.with_ctx(ctx));
}
n.body.visit_with(n, self);
n.body.visit_with(self);
}
fn visit_class_decl(&mut self, n: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, n: &ClassDecl) {
self.declare_decl(&n.ident, true, None, false);
n.visit_children_with(self);
}
fn visit_cond_expr(&mut self, n: &CondExpr, _: &dyn Node) {
n.test.visit_with(n, self);
fn visit_cond_expr(&mut self, n: &CondExpr) {
n.test.visit_with(self);
{
let ctx = Ctx {
in_cond: true,
..self.ctx
};
n.cons.visit_with(n, &mut *self.with_ctx(ctx));
n.alt.visit_with(n, &mut *self.with_ctx(ctx));
n.cons.visit_with(&mut *self.with_ctx(ctx));
n.alt.visit_with(&mut *self.with_ctx(ctx));
}
}
fn visit_do_while_stmt(&mut self, n: &DoWhileStmt, _: &dyn Node) {
fn visit_do_while_stmt(&mut self, n: &DoWhileStmt) {
let ctx = Ctx {
in_loop: true,
in_cond: true,
@ -401,11 +401,11 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier, _: &dyn Node) {
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier) {
self.report_usage(&n.orig, false)
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match e {
@ -416,13 +416,13 @@ where
}
}
fn visit_fn_decl(&mut self, n: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, n: &FnDecl) {
self.declare_decl(&n.ident, true, None, true);
n.visit_children_with(self);
}
fn visit_fn_expr(&mut self, n: &FnExpr, _: &dyn Node) {
fn visit_fn_expr(&mut self, n: &FnExpr) {
n.visit_children_with(self);
if let Some(id) = &n.ident {
@ -432,8 +432,8 @@ where
}
}
fn visit_for_in_stmt(&mut self, n: &ForInStmt, _: &dyn Node) {
n.right.visit_with(n, self);
fn visit_for_in_stmt(&mut self, n: &ForInStmt) {
n.right.visit_with(self);
self.with_child(n.span.ctxt, ScopeKind::Block, |child| {
let ctx = Ctx {
@ -441,21 +441,21 @@ where
is_exact_reassignment: true,
..child.ctx
};
n.left.visit_with(n, &mut *child.with_ctx(ctx));
n.left.visit_with(&mut *child.with_ctx(ctx));
n.right.visit_with(n, child);
n.right.visit_with(child);
let ctx = Ctx {
in_loop: true,
in_cond: true,
..child.ctx
};
n.body.visit_with(n, &mut *child.with_ctx(ctx));
n.body.visit_with(&mut *child.with_ctx(ctx));
});
}
fn visit_for_of_stmt(&mut self, n: &ForOfStmt, _: &dyn Node) {
n.right.visit_with(n, self);
fn visit_for_of_stmt(&mut self, n: &ForOfStmt) {
n.right.visit_with(self);
self.with_child(n.span.ctxt, ScopeKind::Block, |child| {
let ctx = Ctx {
@ -463,19 +463,19 @@ where
is_exact_reassignment: true,
..child.ctx
};
n.left.visit_with(n, &mut *child.with_ctx(ctx));
n.left.visit_with(&mut *child.with_ctx(ctx));
let ctx = Ctx {
in_loop: true,
in_cond: true,
..child.ctx
};
n.body.visit_with(n, &mut *child.with_ctx(ctx))
n.body.visit_with(&mut *child.with_ctx(ctx))
});
}
fn visit_for_stmt(&mut self, n: &ForStmt, _: &dyn Node) {
n.init.visit_with(n, self);
fn visit_for_stmt(&mut self, n: &ForStmt) {
n.init.visit_with(self);
let ctx = Ctx {
in_loop: true,
@ -483,14 +483,14 @@ where
..self.ctx
};
n.test.visit_with(n, &mut *self.with_ctx(ctx));
n.update.visit_with(n, &mut *self.with_ctx(ctx));
n.test.visit_with(&mut *self.with_ctx(ctx));
n.update.visit_with(&mut *self.with_ctx(ctx));
n.body.visit_with(n, &mut *self.with_ctx(ctx));
n.body.visit_with(&mut *self.with_ctx(ctx));
}
fn visit_function(&mut self, n: &Function, _: &dyn Node) {
n.decorators.visit_with(n, self);
fn visit_function(&mut self, n: &Function) {
n.decorators.visit_with(self);
let is_standalone = self
.marks
@ -510,7 +510,7 @@ where
self.with_ctx(ctx)
.with_child(n.span.ctxt, ScopeKind::Fn, |child| {
n.params.visit_with(n, child);
n.params.visit_with(child);
match &n.body {
Some(body) => {
@ -523,37 +523,36 @@ where
})
}
fn visit_if_stmt(&mut self, n: &IfStmt, _: &dyn Node) {
fn visit_if_stmt(&mut self, n: &IfStmt) {
let ctx = Ctx {
in_cond: true,
..self.ctx
};
n.test.visit_with(n, self);
n.cons.visit_with(n, &mut *self.with_ctx(ctx));
n.alt.visit_with(n, &mut *self.with_ctx(ctx));
n.test.visit_with(self);
n.cons.visit_with(&mut *self.with_ctx(ctx));
n.alt.visit_with(&mut *self.with_ctx(ctx));
}
fn visit_import_default_specifier(&mut self, n: &ImportDefaultSpecifier, _: &dyn Node) {
fn visit_import_default_specifier(&mut self, n: &ImportDefaultSpecifier) {
self.declare_decl(&n.local, true, None, false);
}
fn visit_import_named_specifier(&mut self, n: &ImportNamedSpecifier, _: &dyn Node) {
fn visit_import_named_specifier(&mut self, n: &ImportNamedSpecifier) {
self.declare_decl(&n.local, true, None, false);
}
fn visit_import_star_as_specifier(&mut self, n: &ImportStarAsSpecifier, _: &dyn Node) {
fn visit_import_star_as_specifier(&mut self, n: &ImportStarAsSpecifier) {
self.declare_decl(&n.local, true, None, false);
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
fn visit_member_expr(&mut self, e: &MemberExpr) {
{
let ctx = Ctx {
is_exact_arg: false,
is_exact_reassignment: false,
..self.ctx
};
e.obj
.visit_with(&Invalid { span: DUMMY_SP }, &mut *self.with_ctx(ctx));
e.obj.visit_with(&mut *self.with_ctx(ctx));
}
if e.computed {
@ -562,8 +561,7 @@ where
is_exact_reassignment: false,
..self.ctx
};
e.prop
.visit_with(&Invalid { span: DUMMY_SP }, &mut *self.with_ctx(ctx));
e.prop.visit_with(&mut *self.with_ctx(ctx));
}
match &e.obj {
@ -591,7 +589,7 @@ where
}
}
fn visit_module(&mut self, n: &Module, _: &dyn Node) {
fn visit_module(&mut self, n: &Module) {
let ctx = Ctx {
skip_standalone: true,
..self.ctx
@ -599,26 +597,26 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx))
}
fn visit_named_export(&mut self, n: &NamedExport, _: &dyn Node) {
fn visit_named_export(&mut self, n: &NamedExport) {
if n.src.is_some() {
return;
}
n.visit_children_with(self);
}
fn visit_new_expr(&mut self, n: &NewExpr, _: &dyn Node) {
fn visit_new_expr(&mut self, n: &NewExpr) {
{
n.callee.visit_with(n, self);
n.callee.visit_with(self);
let ctx = Ctx {
in_call_arg: true,
is_exact_arg: true,
..self.ctx
};
n.args.visit_with(n, &mut *self.with_ctx(ctx));
n.args.visit_with(&mut *self.with_ctx(ctx));
}
}
fn visit_object_pat_prop(&mut self, n: &ObjectPatProp, _: &dyn Node) {
fn visit_object_pat_prop(&mut self, n: &ObjectPatProp) {
n.visit_children_with(self);
match n {
@ -629,22 +627,22 @@ where
}
}
fn visit_param(&mut self, n: &Param, _: &dyn Node) {
fn visit_param(&mut self, n: &Param) {
let ctx = Ctx {
in_pat_of_param: false,
..self.ctx
};
n.decorators.visit_with(n, &mut *self.with_ctx(ctx));
n.decorators.visit_with(&mut *self.with_ctx(ctx));
let ctx = Ctx {
in_pat_of_param: true,
var_decl_kind_of_pat: None,
..self.ctx
};
n.pat.visit_with(n, &mut *self.with_ctx(ctx));
n.pat.visit_with(&mut *self.with_ctx(ctx));
}
fn visit_pat(&mut self, n: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, n: &Pat) {
n.visit_children_with(self);
match n {
@ -653,7 +651,7 @@ where
}
}
fn visit_prop(&mut self, n: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, n: &Prop) {
let ctx = Ctx {
in_update_arg: false,
..self.ctx
@ -668,22 +666,22 @@ where
}
}
fn visit_setter_prop(&mut self, n: &SetterProp, _: &dyn Node) {
fn visit_setter_prop(&mut self, n: &SetterProp) {
self.with_child(n.span.ctxt, ScopeKind::Fn, |a| {
n.key.visit_with(n, a);
n.key.visit_with(a);
{
let ctx = Ctx {
in_pat_of_param: true,
..a.ctx
};
n.param.visit_with(n, &mut *a.with_ctx(ctx));
n.param.visit_with(&mut *a.with_ctx(ctx));
}
n.body.visit_with(n, a);
n.body.visit_with(a);
});
}
fn visit_stmt(&mut self, n: &Stmt, _: &dyn Node) {
fn visit_stmt(&mut self, n: &Stmt) {
let ctx = Ctx {
in_update_arg: false,
..self.ctx
@ -691,7 +689,7 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_stmts(&mut self, stmts: &[Stmt], _: &dyn Node) {
fn visit_stmts(&mut self, stmts: &[Stmt]) {
let mut had_cond = false;
for stmt in stmts {
@ -700,25 +698,25 @@ where
..self.ctx
};
stmt.visit_with(&Invalid { span: DUMMY_SP }, &mut *self.with_ctx(ctx));
stmt.visit_with(&mut *self.with_ctx(ctx));
had_cond |= can_end_conditionally(stmt);
}
}
fn visit_switch_case(&mut self, n: &SwitchCase, _: &dyn Node) {
n.test.visit_with(n, self);
fn visit_switch_case(&mut self, n: &SwitchCase) {
n.test.visit_with(self);
{
let ctx = Ctx {
in_cond: true,
..self.ctx
};
n.cons.visit_with(n, &mut *self.with_ctx(ctx));
n.cons.visit_with(&mut *self.with_ctx(ctx));
}
}
fn visit_try_stmt(&mut self, n: &TryStmt, _: &dyn Node) {
fn visit_try_stmt(&mut self, n: &TryStmt) {
let ctx = Ctx {
in_cond: true,
..self.ctx
@ -727,7 +725,7 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_update_expr(&mut self, n: &UpdateExpr, _: &dyn Node) {
fn visit_update_expr(&mut self, n: &UpdateExpr) {
let ctx = Ctx {
in_update_arg: true,
is_exact_reassignment: true,
@ -736,7 +734,7 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_var_decl(&mut self, n: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, n: &VarDecl) {
let ctx = Ctx {
var_decl_kind_of_pat: Some(n.kind),
..self.ctx
@ -761,7 +759,7 @@ where
}
}
fn visit_var_declarator(&mut self, e: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, e: &VarDeclarator) {
let prevent_inline = match &e.name {
Pat::Ident(BindingIdent {
id:
@ -784,7 +782,7 @@ where
},
..self.ctx
};
e.name.visit_with(e, &mut *self.with_ctx(ctx));
e.name.visit_with(&mut *self.with_ctx(ctx));
}
{
@ -794,11 +792,11 @@ where
..self.ctx
};
e.init.visit_with(e, &mut *self.with_ctx(ctx));
e.init.visit_with(&mut *self.with_ctx(ctx));
}
}
fn visit_while_stmt(&mut self, n: &WhileStmt, _: &dyn Node) {
fn visit_while_stmt(&mut self, n: &WhileStmt) {
let ctx = Ctx {
in_loop: true,
in_cond: true,
@ -807,7 +805,7 @@ where
n.visit_children_with(&mut *self.with_ctx(ctx));
}
fn visit_with_stmt(&mut self, n: &WithStmt, _: &dyn Node) {
fn visit_with_stmt(&mut self, n: &WithStmt) {
self.scope.mark_with_stmt();
n.visit_children_with(self);
}

View File

@ -8,7 +8,7 @@ use crate::{
use swc_common::{util::take::Take, Spanned, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{prepend, undefined, StmtLike};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
/// Methods related to the option `if_return`. All methods are noop if
/// `if_return` is false.
@ -565,7 +565,7 @@ where
N: VisitWith<ReturnFinder>,
{
let mut v = ReturnFinder::default();
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.count
}
@ -577,13 +577,13 @@ pub(super) struct ReturnFinder {
impl Visit for ReturnFinder {
noop_visit_type!();
fn visit_return_stmt(&mut self, n: &ReturnStmt, _: &dyn Node) {
fn visit_return_stmt(&mut self, n: &ReturnStmt) {
n.visit_children_with(self);
self.count += 1;
}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
}
fn always_terminates_with_return_arg(s: &Stmt) -> bool {

View File

@ -1910,7 +1910,7 @@ where
}
if cfg!(feature = "debug") && cfg!(debug_assertions) {
n.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
n.visit_with(&mut AssertValid);
}
}
@ -2023,7 +2023,7 @@ where
self.ctx.in_asm = old_in_asm;
if cfg!(feature = "debug") && cfg!(debug_assertions) {
n.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
n.visit_with(&mut AssertValid);
}
}
@ -2180,7 +2180,7 @@ where
}
if cfg!(feature = "debug") && cfg!(debug_assertions) {
n.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
n.visit_with(&mut AssertValid);
}
}
@ -2370,7 +2370,7 @@ where
}
if cfg!(feature = "debug") && cfg!(debug_assertions) {
s.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
s.visit_with(&mut AssertValid);
}
}
@ -2406,7 +2406,7 @@ where
}
if cfg!(feature = "debug") && cfg!(debug_assertions) {
stmts.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
stmts.visit_with(&mut AssertValid);
}
}

View File

@ -17,7 +17,7 @@ use swc_ecma_ast::*;
use swc_ecma_utils::{
contains_this_expr, ident::IdentLike, undefined, ExprExt, Id, StmtLike, UsageFinder,
};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
use tracing::{span, Level};
/// Methods related to the option `sequences`. All methods are noop if
@ -1268,7 +1268,7 @@ where
target: &*a_id,
in_lhs: false,
};
b.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
b.visit_with(&mut v);
if v.expr_usage != 1 || v.pat_usage != 0 {
tracing::trace!(
"[X] sequences: Aborting merging of an update expression \
@ -1427,7 +1427,7 @@ where
target: &left_id,
in_lhs: false,
};
b.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
b.visit_with(&mut v);
if v.expr_usage != 1 || v.pat_usage != 0 {
tracing::trace!(
"[X] sequences: Aborting because of usage counts ({}{:?}, ref = {}, pat = {})",
@ -1473,7 +1473,7 @@ struct UsageCounter<'a> {
impl Visit for UsageCounter<'_> {
noop_visit_type!();
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
if self.target.sym == i.sym && self.target.span.ctxt == i.span.ctxt {
if self.in_lhs {
self.pat_usage += 1;
@ -1483,25 +1483,25 @@ impl Visit for UsageCounter<'_> {
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
let old = self.in_lhs;
self.in_lhs = false;
e.prop.visit_with(e, self);
e.prop.visit_with(self);
self.in_lhs = old;
}
}
fn visit_pat(&mut self, p: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, p: &Pat) {
let old = self.in_lhs;
self.in_lhs = true;
p.visit_children_with(self);
self.in_lhs = old;
}
fn visit_pat_or_expr(&mut self, p: &PatOrExpr, _: &dyn Node) {
fn visit_pat_or_expr(&mut self, p: &PatOrExpr) {
let old = self.in_lhs;
self.in_lhs = true;
p.visit_children_with(self);

View File

@ -4,7 +4,7 @@ use std::mem::take;
use swc_common::{util::take::Take, EqIgnoreSpan, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, prepend, ExprExt, StmtExt, Type, Value::Known};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
/// Methods related to option `switches`.
impl<M> Optimizer<'_, M>
@ -48,7 +48,7 @@ where
let mut v = BreakFinder {
found_unlabelled_break_for_stmt: false,
};
case.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
case.visit_with(&mut v);
v.found_unlabelled_break_for_stmt
});
if should_preserve_switch {
@ -336,27 +336,27 @@ struct BreakFinder {
impl Visit for BreakFinder {
noop_visit_type!();
fn visit_break_stmt(&mut self, s: &BreakStmt, _: &dyn Node) {
fn visit_break_stmt(&mut self, s: &BreakStmt) {
if s.label.is_none() {
self.found_unlabelled_break_for_stmt = true;
}
}
/// We don't care about breaks in a lop[
fn visit_for_stmt(&mut self, _: &ForStmt, _: &dyn Node) {}
fn visit_for_stmt(&mut self, _: &ForStmt) {}
/// We don't care about breaks in a lop[
fn visit_for_in_stmt(&mut self, _: &ForInStmt, _: &dyn Node) {}
fn visit_for_in_stmt(&mut self, _: &ForInStmt) {}
/// We don't care about breaks in a lop[
fn visit_for_of_stmt(&mut self, _: &ForOfStmt, _: &dyn Node) {}
fn visit_for_of_stmt(&mut self, _: &ForOfStmt) {}
/// We don't care about breaks in a lop[
fn visit_do_while_stmt(&mut self, _: &DoWhileStmt, _: &dyn Node) {}
fn visit_do_while_stmt(&mut self, _: &DoWhileStmt) {}
/// We don't care about breaks in a lop[
fn visit_while_stmt(&mut self, _: &WhileStmt, _: &dyn Node) {}
fn visit_while_stmt(&mut self, _: &WhileStmt) {}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
}

View File

@ -394,7 +394,7 @@ where
self.optimize_arrow_method_prop(p);
if cfg!(feature = "debug") && cfg!(debug_assertions) {
p.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
p.visit_with(&mut AssertValid);
}
}
@ -510,7 +510,7 @@ where
}
if cfg!(feature = "debug") && cfg!(debug_assertions) {
s.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
s.visit_with(&mut AssertValid);
}
}
@ -525,7 +525,7 @@ where
});
if cfg!(feature = "debug") && cfg!(debug_assertions) {
items.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
items.visit_with(&mut AssertValid);
}
}

View File

@ -4,7 +4,7 @@ use swc_common::{util::take::Take, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_utils::{prepend, StmtLike};
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
impl<M> Pure<'_, M>
@ -63,7 +63,7 @@ where
// Check for nested variable declartions.
let mut v = VarWithOutInitCounter::default();
stmts.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
stmts.visit_with(&mut v);
if !need_work && !v.need_work {
return;
}
@ -113,13 +113,13 @@ pub(super) struct VarWithOutInitCounter {
impl Visit for VarWithOutInitCounter {
noop_visit_type!();
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
fn visit_constructor(&mut self, _: &Constructor, _: &dyn Node) {}
fn visit_constructor(&mut self, _: &Constructor) {}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_var_decl(&mut self, v: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, v: &VarDecl) {
v.visit_children_with(self);
if v.kind != VarDeclKind::Var {
@ -148,10 +148,10 @@ impl Visit for VarWithOutInitCounter {
}
}
fn visit_var_decl_or_pat(&mut self, _: &VarDeclOrPat, _: &dyn Node) {}
fn visit_var_decl_or_pat(&mut self, _: &VarDeclOrPat) {}
}
/// Moves all varaible without initializer.
/// Moves all variable without initializer.
pub(super) struct VarMover {
vars: Vec<VarDeclarator>,
var_decl_kind: Option<VarDeclKind>,

View File

@ -1,12 +1,12 @@
use once_cell::sync::Lazy;
use std::{env, process::Command};
use swc_common::{sync::Lrc, SourceMap, SyntaxContext, DUMMY_SP};
use swc_common::{sync::Lrc, SourceMap, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_codegen::{text_writer::JsWriter, Emitter};
use swc_ecma_transforms::{fixer, hygiene};
use swc_ecma_utils::{drop_span, DropSpan};
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, FoldWith, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, FoldWith, Visit, VisitMut, VisitMutWith, VisitWith,
};
pub(crate) struct Debugger {}
@ -74,7 +74,7 @@ pub(crate) fn invoke(module: &Module) {
static ENABLED: Lazy<bool> = Lazy::new(|| env::var("SWC_RUN").unwrap_or_default() == "1");
if cfg!(debug_assertions) {
module.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertValid);
module.visit_with(&mut AssertValid);
}
if !cfg!(feature = "debug") || !*ENABLED {
@ -129,15 +129,15 @@ pub(crate) struct AssertValid;
impl Visit for AssertValid {
noop_visit_type!();
fn visit_invalid(&mut self, _: &Invalid, _: &dyn Node) {
fn visit_invalid(&mut self, _: &Invalid) {
panic!("[SWC_RUN] Invalid node found");
}
fn visit_setter_prop(&mut self, p: &SetterProp, _: &dyn Node) {
p.body.visit_with(p, self);
fn visit_setter_prop(&mut self, p: &SetterProp) {
p.body.visit_with(self);
}
fn visit_tpl(&mut self, l: &Tpl, _: &dyn Node) {
fn visit_tpl(&mut self, l: &Tpl) {
l.visit_children_with(self);
assert_eq!(l.exprs.len() + 1, l.quasis.len());

View File

@ -1,12 +1,12 @@
use crate::marks::Marks;
use swc_common::{
comments::{Comment, CommentKind, Comments},
Mark, Span, SyntaxContext, DUMMY_SP,
Mark, Span, SyntaxContext,
};
use swc_ecma_ast::*;
use swc_ecma_utils::{find_ids, ident::IdentLike, Id};
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
#[cfg(test)]
@ -169,7 +169,7 @@ impl VisitMut for InfoMarker<'_> {
top_level_ctxt: SyntaxContext::empty().apply_mark(self.top_level_mark),
bindings: Default::default(),
};
m.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
m.visit_with(&mut v);
v.bindings
};
@ -217,17 +217,17 @@ impl TopLevelBindingCollector {
impl Visit for TopLevelBindingCollector {
noop_visit_type!();
fn visit_class_decl(&mut self, v: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, v: &ClassDecl) {
self.add(v.ident.to_id());
}
fn visit_fn_decl(&mut self, v: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, v: &FnDecl) {
self.add(v.ident.to_id());
}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_var_decl(&mut self, v: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, v: &VarDecl) {
v.visit_children_with(self);
let ids: Vec<Id> = find_ids(&v.decls);
@ -237,7 +237,7 @@ impl Visit for TopLevelBindingCollector {
}
}
fn is_standalone<N>(n: &mut N, top_level_mark: Mark, external_bingdings: &[Id]) -> bool
fn is_standalone<N>(n: &mut N, top_level_mark: Mark, external_bindings: &[Id]) -> bool
where
N: VisitMutWith<IdentCollector>,
{
@ -273,7 +273,7 @@ where
_ => {}
}
if external_bingdings.contains(&used_id) {
if external_bindings.contains(&used_id) {
if cfg!(feature = "debug") {
tracing::debug!(
"bundle: Due to {}{:?} (top-level), it's not a bundle",

View File

@ -34,7 +34,7 @@
// mark: marks.standalone,
// count: 0,
// };
// m.visit_with(&Invalid { span: DUMMY_SP }, &mut counter);
// m.visit_with( &mut counter);
// counter.count
// };
// eprintln!("Actual: {} modules in bundle", actual);
@ -64,7 +64,7 @@
// }
// impl Visit for MarkCounter {
// fn visit_span(&mut self, span: &Span, _: &dyn Node) {
// fn visit_span(&mut self, span: &Span) {
// if span.has_mark(self.mark) {
// self.count += 1;
// }

View File

@ -19,7 +19,7 @@ where
all: &mut data,
cur: Default::default(),
};
node.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
node.visit_with(&mut v);
data
}
@ -87,33 +87,33 @@ macro_rules! scoped {
impl Visit for VarAnalyzer<'_> {
noop_visit_type!();
fn visit_arrow_expr(&mut self, n: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, n: &ArrowExpr) {
scoped!(self, n);
}
fn visit_block_stmt(&mut self, n: &BlockStmt, _: &dyn Node) {
fn visit_block_stmt(&mut self, n: &BlockStmt) {
scoped!(self, n);
}
fn visit_function(&mut self, n: &Function, _: &dyn Node) {
fn visit_function(&mut self, n: &Function) {
scoped!(self, n);
}
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
tracing::trace!("hygiene/vars: Found {}", i);
self.cur.add(i);
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_prop_name(&mut self, n: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, n: &PropName) {
match n {
PropName::Computed(_) => {
n.visit_children_with(self);

View File

@ -3,7 +3,7 @@ use swc_atoms::JsWord;
use swc_common::collections::{AHashMap, AHashSet};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, Id};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
mod scope;
@ -53,18 +53,18 @@ impl Analyzer {
impl Visit for Analyzer {
noop_visit_type!();
fn visit_arrow_expr(&mut self, e: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, e: &ArrowExpr) {
self.with_scope(|v| {
let old = v.is_pat_decl;
v.is_pat_decl = true;
e.params.visit_with(e, v);
e.params.visit_with(v);
v.is_pat_decl = false;
e.body.visit_with(e, v);
e.body.visit_with(v);
v.is_pat_decl = old;
});
}
fn visit_assign_pat_prop(&mut self, p: &AssignPatProp, _: &dyn Node) {
fn visit_assign_pat_prop(&mut self, p: &AssignPatProp) {
p.visit_children_with(self);
if self.is_pat_decl {
@ -74,29 +74,29 @@ impl Visit for Analyzer {
}
}
fn visit_catch_clause(&mut self, n: &CatchClause, _: &dyn Node) {
fn visit_catch_clause(&mut self, n: &CatchClause) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
n.param.visit_with(n, self);
n.param.visit_with(self);
self.is_pat_decl = false;
n.body.visit_with(n, self);
n.body.visit_with(self);
self.is_pat_decl = old;
}
fn visit_class_decl(&mut self, c: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, c: &ClassDecl) {
self.add_decl(c.ident.to_id());
c.class.visit_with(c, self);
c.class.visit_with(self);
}
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier, _: &dyn Node) {
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier) {
self.add_usage(n.orig.to_id());
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match e {
@ -105,53 +105,53 @@ impl Visit for Analyzer {
}
}
fn visit_fn_decl(&mut self, f: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, f: &FnDecl) {
self.add_decl(f.ident.to_id());
self.with_scope(|v| {
f.function.visit_with(f, v);
f.function.visit_with(v);
})
}
fn visit_fn_expr(&mut self, f: &FnExpr, _: &dyn Node) {
fn visit_fn_expr(&mut self, f: &FnExpr) {
self.with_scope(|v| {
if let Some(id) = &f.ident {
v.add_decl(id.to_id());
}
f.function.visit_with(f, v);
f.function.visit_with(v);
})
}
fn visit_import_default_specifier(&mut self, n: &ImportDefaultSpecifier, _: &dyn Node) {
fn visit_import_default_specifier(&mut self, n: &ImportDefaultSpecifier) {
self.add_decl(n.local.to_id());
}
fn visit_import_named_specifier(&mut self, n: &ImportNamedSpecifier, _: &dyn Node) {
fn visit_import_named_specifier(&mut self, n: &ImportNamedSpecifier) {
self.add_decl(n.local.to_id());
}
fn visit_import_star_as_specifier(&mut self, n: &ImportStarAsSpecifier, _: &dyn Node) {
fn visit_import_star_as_specifier(&mut self, n: &ImportStarAsSpecifier) {
self.add_decl(n.local.to_id());
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e, self);
e.prop.visit_with(self);
}
}
fn visit_method_prop(&mut self, f: &MethodProp, _: &dyn Node) {
f.key.visit_with(f, self);
fn visit_method_prop(&mut self, f: &MethodProp) {
f.key.visit_with(self);
self.with_scope(|v| {
f.function.visit_with(f, v);
f.function.visit_with(v);
})
}
fn visit_named_export(&mut self, n: &NamedExport, _: &dyn Node) {
fn visit_named_export(&mut self, n: &NamedExport) {
if n.src.is_some() {
return;
}
@ -159,19 +159,19 @@ impl Visit for Analyzer {
n.visit_children_with(self);
}
fn visit_param(&mut self, e: &Param, _: &dyn Node) {
fn visit_param(&mut self, e: &Param) {
let old = self.is_pat_decl;
self.is_pat_decl = false;
e.decorators.visit_with(e, self);
e.decorators.visit_with(self);
self.is_pat_decl = true;
e.pat.visit_with(e, self);
e.pat.visit_with(self);
self.is_pat_decl = old;
}
fn visit_pat(&mut self, e: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, e: &Pat) {
e.visit_children_with(self);
match e {
@ -186,7 +186,7 @@ impl Visit for Analyzer {
}
}
fn visit_prop(&mut self, p: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, p: &Prop) {
p.visit_children_with(self);
match p {
@ -195,14 +195,14 @@ impl Visit for Analyzer {
}
}
fn visit_var_declarator(&mut self, v: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, v: &VarDeclarator) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
v.name.visit_with(v, self);
v.name.visit_with(self);
self.is_pat_decl = false;
v.init.visit_with(v, self);
v.init.visit_with(self);
self.is_pat_decl = old;
}

View File

@ -1,8 +1,8 @@
use crate::option::MangleOptions;
use swc_common::{collections::AHashSet, DUMMY_SP};
use swc_common::collections::AHashSet;
use swc_ecma_ast::*;
use swc_ecma_utils::{find_ids, ident::IdentLike, Id};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
pub(super) fn idents_to_preserve<N>(options: MangleOptions, n: &N) -> AHashSet<Id>
where
@ -14,7 +14,7 @@ where
should_preserve: false,
in_top_level: false,
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.preserved
}
pub(super) struct Preserver {
@ -27,19 +27,19 @@ pub(super) struct Preserver {
impl Visit for Preserver {
noop_visit_type!();
fn visit_catch_clause(&mut self, n: &CatchClause, _: &dyn Node) {
fn visit_catch_clause(&mut self, n: &CatchClause) {
let old = self.should_preserve;
if self.options.ie8 && !self.options.top_level {
self.should_preserve = true;
n.param.visit_with(&Invalid { span: DUMMY_SP }, self);
n.param.visit_with(self);
}
self.should_preserve = old;
n.body.visit_with(&Invalid { span: DUMMY_SP }, self);
n.body.visit_with(self);
}
fn visit_class_decl(&mut self, n: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, n: &ClassDecl) {
n.visit_children_with(self);
if (self.in_top_level && !self.options.top_level) || self.options.keep_class_names {
@ -47,7 +47,7 @@ impl Visit for Preserver {
}
}
fn visit_export_decl(&mut self, n: &ExportDecl, _: &dyn Node) {
fn visit_export_decl(&mut self, n: &ExportDecl) {
n.visit_children_with(self);
match &n.decl {
@ -65,7 +65,7 @@ impl Visit for Preserver {
}
}
fn visit_expr(&mut self, n: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, n: &Expr) {
n.visit_children_with(self);
match n {
@ -78,7 +78,7 @@ impl Visit for Preserver {
}
}
fn visit_fn_decl(&mut self, n: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, n: &FnDecl) {
n.visit_children_with(self);
if (self.in_top_level && !self.options.top_level) || self.options.keep_fn_names {
@ -86,7 +86,7 @@ impl Visit for Preserver {
}
}
fn visit_fn_expr(&mut self, n: &FnExpr, _: &dyn Node) {
fn visit_fn_expr(&mut self, n: &FnExpr) {
n.visit_children_with(self);
if self.options.keep_fn_names {
@ -96,21 +96,21 @@ impl Visit for Preserver {
}
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_module_items(&mut self, n: &[ModuleItem], _: &dyn Node) {
fn visit_module_items(&mut self, n: &[ModuleItem]) {
for n in n {
self.in_top_level = true;
n.visit_with(&Invalid { span: DUMMY_SP }, self);
n.visit_with(self);
}
}
fn visit_pat(&mut self, n: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, n: &Pat) {
n.visit_children_with(self);
match n {
@ -123,22 +123,22 @@ impl Visit for Preserver {
}
}
fn visit_stmts(&mut self, n: &[Stmt], _: &dyn Node) {
fn visit_stmts(&mut self, n: &[Stmt]) {
let old_top_level = self.in_top_level;
for n in n {
self.in_top_level = false;
n.visit_with(&Invalid { span: DUMMY_SP }, self);
n.visit_with(self);
}
self.in_top_level = old_top_level;
}
fn visit_var_declarator(&mut self, n: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, n: &VarDeclarator) {
n.visit_children_with(self);
if self.in_top_level && !self.options.top_level {
let old = self.should_preserve;
self.should_preserve = true;
n.name.visit_with(n, self);
n.name.visit_with(self);
self.should_preserve = old;
return;
}
@ -148,7 +148,7 @@ impl Visit for Preserver {
Some(Expr::Fn(..)) | Some(Expr::Arrow(..)) => {
let old = self.should_preserve;
self.should_preserve = true;
n.name.visit_with(n, self);
n.name.visit_with(self);
self.should_preserve = old;
}
_ => {}

View File

@ -1,6 +1,5 @@
use super::{analyzer::Analyzer, preserver::idents_to_preserve};
use crate::{marks::Marks, option::MangleOptions, pass::compute_char_freq::CharFreqInfo};
use swc_common::DUMMY_SP;
use swc_ecma_ast::*;
use swc_ecma_transforms::hygiene::rename;
use swc_ecma_visit::{noop_visit_mut_type, VisitMut, VisitMutWith, VisitWith};
@ -28,7 +27,7 @@ impl VisitMut for Mangler {
scope: Default::default(),
is_pat_decl: Default::default(),
};
m.visit_with(&Invalid { span: DUMMY_SP }, &mut analyzer);
m.visit_with(&mut analyzer);
analyzer.into_rename_map(&preserved)
};
@ -44,7 +43,7 @@ impl VisitMut for Mangler {
scope: Default::default(),
is_pat_decl: Default::default(),
};
s.visit_with(&Invalid { span: DUMMY_SP }, &mut analyzer);
s.visit_with(&mut analyzer);
analyzer.into_rename_map(&preserved)
};

View File

@ -7,7 +7,7 @@ use swc_common::{
};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, Id, ModuleItemLike, StmtLike, Value};
use swc_ecma_visit::{noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Fold, FoldWith, Visit, VisitWith};
pub(crate) mod base54;
pub(crate) mod sort;
@ -210,7 +210,7 @@ where
N: VisitWith<LeapFinder>,
{
let mut v = LeapFinder::default();
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.found_yield
}
@ -222,12 +222,12 @@ pub(crate) struct LeapFinder {
impl Visit for LeapFinder {
noop_visit_type!();
fn visit_yield_expr(&mut self, _: &YieldExpr, _: &dyn Node) {
fn visit_yield_expr(&mut self, _: &YieldExpr) {
self.found_yield = true;
}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
}
/// This method returns true only if `T` is `var`. (Not `const` or `let`)
@ -336,7 +336,7 @@ pub struct DeepThisExprVisitor {
impl Visit for DeepThisExprVisitor {
noop_visit_type!();
fn visit_this_expr(&mut self, _: &ThisExpr, _: &dyn Node) {
fn visit_this_expr(&mut self, _: &ThisExpr) {
self.found = true;
}
}
@ -346,7 +346,7 @@ where
N: VisitWith<DeepThisExprVisitor>,
{
let mut visitor = DeepThisExprVisitor { found: false };
body.visit_with(&Invalid { span: DUMMY_SP } as _, &mut visitor);
body.visit_with(&mut visitor);
visitor.found
}
@ -359,7 +359,7 @@ pub(crate) struct IdentUsageCollector {
impl Visit for IdentUsageCollector {
noop_visit_type!();
fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr, _: &dyn Node) {
fn visit_block_stmt_or_expr(&mut self, n: &BlockStmtOrExpr) {
if self.ignore_nested {
return;
}
@ -367,7 +367,7 @@ impl Visit for IdentUsageCollector {
n.visit_children_with(self);
}
fn visit_constructor(&mut self, n: &Constructor, _: &dyn Node) {
fn visit_constructor(&mut self, n: &Constructor) {
if self.ignore_nested {
return;
}
@ -375,7 +375,7 @@ impl Visit for IdentUsageCollector {
n.visit_children_with(self);
}
fn visit_function(&mut self, n: &Function, _: &dyn Node) {
fn visit_function(&mut self, n: &Function) {
if self.ignore_nested {
return;
}
@ -383,19 +383,19 @@ impl Visit for IdentUsageCollector {
n.visit_children_with(self);
}
fn visit_ident(&mut self, n: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, n: &Ident) {
self.ids.insert(n.to_id());
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_prop_name(&mut self, n: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, n: &PropName) {
match n {
PropName::Computed(..) => {
n.visit_children_with(self);
@ -413,7 +413,7 @@ where
ignore_nested: false,
..Default::default()
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.ids
}
@ -425,7 +425,7 @@ where
ignore_nested: true,
..Default::default()
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.ids
}

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
use super::*;
use swc_common::{Span, Spanned, DUMMY_SP};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_common::{Span, Spanned};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
impl<'a, I: Tokens> Parser<I> {
pub(in crate::parser) fn verify_expr(&mut self, expr: Box<Expr>) -> PResult<Box<Expr>> {
let mut v = Verifier { errors: vec![] };
v.visit_expr(&expr, &Invalid { span: DUMMY_SP } as _);
v.visit_expr(&expr);
for (span, error) in v.errors {
self.emit_err(span, error);
@ -23,11 +23,11 @@ pub(super) struct Verifier {
impl Visit for Verifier {
noop_visit_type!();
fn visit_assign_prop(&mut self, p: &AssignProp, _: &dyn Node) {
fn visit_assign_prop(&mut self, p: &AssignProp) {
self.errors.push((p.span(), SyntaxError::AssignProperty));
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
match *e {
Expr::Fn(..) | Expr::Arrow(..) => {}
_ => e.visit_children_with(self),

View File

@ -3,11 +3,11 @@ use swc_common::{
comments::SingleThreadedComments,
errors::{DiagnosticBuilder, Handler},
input::SourceFileInput,
BytePos, Span, DUMMY_SP,
BytePos, Span,
};
use swc_ecma_ast::*;
use swc_ecma_parser::{lexer::Lexer, EsConfig, Parser, Syntax, TsConfig};
use swc_ecma_visit::{Node, Visit, VisitWith};
use swc_ecma_visit::{Visit, VisitWith};
use testing::{fixture, Tester};
#[fixture("tests/comments/**/input.js")]
@ -61,13 +61,10 @@ fn test(input: PathBuf) {
}
};
module.visit_with(
&Invalid { span: DUMMY_SP },
&mut CommentPrinter {
handler: &handler,
comments,
},
);
module.visit_with(&mut CommentPrinter {
handler: &handler,
comments,
});
Err(())
})
@ -85,7 +82,7 @@ struct CommentPrinter<'a> {
}
impl Visit for CommentPrinter<'_> {
fn visit_span(&mut self, n: &Span, _: &dyn Node) {
fn visit_span(&mut self, n: &Span) {
self.comments.with_leading(n.lo, |comments| {
for c in comments {
DiagnosticBuilder::new(

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
use swc_common::{input::StringInput, FileName, DUMMY_SP};
use swc_common::{input::StringInput, FileName};
use swc_ecma_ast::*;
use swc_ecma_parser::{lexer::Lexer, Parser};
use swc_ecma_visit::{All, Node, VisitAll, VisitWith};
use swc_ecma_visit::{All, VisitAll, VisitWith};
struct Issue1967;
impl VisitAll for Issue1967 {
fn visit_expr(&mut self, _: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, _: &Expr) {
panic!("intended")
}
}
@ -27,12 +27,9 @@ fn issue_1967() {
let m = parser.parse_module().unwrap();
m.visit_with(
&Invalid { span: DUMMY_SP },
&mut All {
visitor: Issue1967 {},
},
);
m.visit_with(&mut All {
visitor: Issue1967 {},
});
Ok(())
})

View File

@ -8,7 +8,7 @@ use indexmap::IndexSet;
use swc_atoms::{js_word, JsWord};
use swc_common::DUMMY_SP;
use swc_ecma_ast::*;
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
mod builtin;
mod data;
@ -125,7 +125,7 @@ impl UsageVisitor {
impl Visit for UsageVisitor {
noop_visit_type!();
fn visit_ident(&mut self, node: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, node: &Ident) {
node.visit_children_with(self);
for (name, builtin) in BUILTIN_TYPES {
@ -135,7 +135,7 @@ impl Visit for UsageVisitor {
}
}
fn visit_var_declarator(&mut self, d: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, d: &VarDeclarator) {
d.visit_children_with(self);
if let Some(ref init) = d.init {
@ -156,7 +156,7 @@ impl Visit for UsageVisitor {
}
}
fn visit_assign_expr(&mut self, e: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, e: &AssignExpr) {
e.visit_children_with(self);
match &e.left {
@ -172,10 +172,10 @@ impl Visit for UsageVisitor {
/// Detects usage of instance properties and static properties.
///
/// - `Array.from`
fn visit_member_expr(&mut self, node: &MemberExpr, _: &dyn Node) {
node.obj.visit_with(node as _, self);
fn visit_member_expr(&mut self, node: &MemberExpr) {
node.obj.visit_with(self);
if node.computed {
node.prop.visit_with(node as _, self);
node.prop.visit_with(self);
}
//enter(path: NodePath) {
// const { node } = path;
@ -294,7 +294,7 @@ impl Visit for UsageVisitor {
///
/// - `arr[Symbol.iterator]()`
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
e.visit_children_with(self);
if match &e.callee {
@ -315,7 +315,7 @@ impl Visit for UsageVisitor {
///
/// - `Symbol.iterator in arr`
fn visit_bin_expr(&mut self, e: &BinExpr, _: &dyn Node) {
fn visit_bin_expr(&mut self, e: &BinExpr) {
e.visit_children_with(self);
match e.op {
@ -326,7 +326,7 @@ impl Visit for UsageVisitor {
///
/// - `yield*`
fn visit_yield_expr(&mut self, e: &YieldExpr, _: &dyn Node) {
fn visit_yield_expr(&mut self, e: &YieldExpr) {
e.visit_children_with(self);
println!("Yield");

View File

@ -15,7 +15,7 @@ use indexmap::IndexSet;
use swc_atoms::{js_word, JsWord};
use swc_common::DUMMY_SP;
use swc_ecma_ast::*;
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
pub(crate) struct UsageVisitor {
shipped_proposals: bool,
@ -148,13 +148,13 @@ impl Visit for UsageVisitor {
noop_visit_type!();
/// `[a, b] = c`
fn visit_array_pat(&mut self, p: &ArrayPat, _: &dyn Node) {
fn visit_array_pat(&mut self, p: &ArrayPat) {
p.visit_children_with(self);
self.add(COMMON_ITERATORS)
}
fn visit_assign_expr(&mut self, e: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, e: &AssignExpr) {
e.visit_children_with(self);
match &e.left {
@ -167,7 +167,7 @@ impl Visit for UsageVisitor {
}
}
fn visit_bin_expr(&mut self, e: &BinExpr, _: &dyn Node) {
fn visit_bin_expr(&mut self, e: &BinExpr) {
e.visit_children_with(self);
match e.op {
@ -181,7 +181,7 @@ impl Visit for UsageVisitor {
}
/// import('something').then(...)
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
e.visit_children_with(self);
if let ExprOrSuper::Expr(expr) = &e.callee {
@ -195,7 +195,7 @@ impl Visit for UsageVisitor {
}
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match e {
@ -205,7 +205,7 @@ impl Visit for UsageVisitor {
}
/// `[...spread]`
fn visit_expr_or_spread(&mut self, e: &ExprOrSpread, _: &dyn Node) {
fn visit_expr_or_spread(&mut self, e: &ExprOrSpread) {
e.visit_children_with(self);
if e.spread.is_some() {
self.add(COMMON_ITERATORS)
@ -213,13 +213,13 @@ impl Visit for UsageVisitor {
}
/// for-of
fn visit_for_of_stmt(&mut self, s: &ForOfStmt, _: &dyn Node) {
fn visit_for_of_stmt(&mut self, s: &ForOfStmt) {
s.visit_children_with(self);
self.add(COMMON_ITERATORS)
}
fn visit_function(&mut self, f: &Function, _: &dyn Node) {
fn visit_function(&mut self, f: &Function) {
f.visit_children_with(self);
if f.is_async {
@ -227,10 +227,10 @@ impl Visit for UsageVisitor {
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e as _, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
// Object.entries
@ -242,7 +242,7 @@ impl Visit for UsageVisitor {
}
}
fn visit_var_declarator(&mut self, d: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, d: &VarDeclarator) {
d.visit_children_with(self);
if let Some(ref init) = d.init {
@ -266,7 +266,7 @@ impl Visit for UsageVisitor {
// TODO: https://github.com/babel/babel/blob/00758308/packages/babel-preset-env/src/polyfills/corejs3/usage-plugin.js#L198-L206
/// `yield*`
fn visit_yield_expr(&mut self, e: &YieldExpr, _: &dyn Node) {
fn visit_yield_expr(&mut self, e: &YieldExpr) {
e.visit_children_with(self);
if e.delegate {

View File

@ -301,14 +301,14 @@ impl Fold for Polyfills {
let mut r = match self.corejs {
Version { major: 2, .. } => {
let mut v = corejs2::UsageVisitor::new(self.targets);
m.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
m.visit_with(&mut v);
v.required
}
Version { major: 3, .. } => {
let mut v =
corejs3::UsageVisitor::new(self.targets, self.shipped_proposals);
m.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
m.visit_with(&mut v);
v.required
}

View File

@ -1,10 +1,8 @@
use swc_common::DUMMY_SP;
use swc_ecma_ast::Invalid;
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
pub(super) fn is_required<T: VisitWith<RegeneratorVisitor>>(node: &T) -> bool {
let mut v = RegeneratorVisitor { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}

View File

@ -6,7 +6,7 @@ use swc_ecma_ast::*;
use swc_ecma_parser::{lexer::Lexer, Parser, StringInput, Syntax};
use swc_ecma_transforms_base::pass::noop;
use swc_ecma_utils::ExprFactory;
use swc_ecma_visit::{FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{FoldWith, Visit, VisitWith};
use test::Bencher;
static SOURCE: &str = include_str!("assets/AjaxObservable.ts");
@ -214,18 +214,18 @@ fn visit_contains_this(b: &mut Bencher) {
impl Visit for Visitor {
/// Don't recurse into fn
fn visit_fn_expr(&mut self, _: &FnExpr, _: &dyn Node) {}
fn visit_fn_expr(&mut self, _: &FnExpr) {}
/// Don't recurse into fn
fn visit_fn_decl(&mut self, _: &FnDecl, _: &dyn Node) {}
fn visit_fn_decl(&mut self, _: &FnDecl) {}
fn visit_this_expr(&mut self, _: &ThisExpr, _: &dyn Node) {
fn visit_this_expr(&mut self, _: &ThisExpr) {
self.found = true;
}
}
let mut visitor = Visitor { found: false };
body.visit_with(&Invalid { span: DUMMY_SP } as _, &mut visitor);
body.visit_with(&mut visitor);
visitor.found
}

View File

@ -4,7 +4,7 @@ use self::{
};
use crate::hygiene::{unique_scope::unique_scope, usage_analyzer::CurScope};
use swc_atoms::JsWord;
use swc_common::{chain, collections::AHashMap, DUMMY_SP};
use swc_common::{chain, collections::AHashMap};
use swc_ecma_ast::*;
use swc_ecma_utils::Id;
use swc_ecma_visit::{as_folder, noop_visit_mut_type, Fold, VisitMut, VisitMutWith, VisitWith};
@ -188,7 +188,7 @@ impl Hygiene {
is_pat_decl: false,
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
}
let ops = data.ops.into_inner();

View File

@ -2,10 +2,10 @@ use super::{ops::Operations, LOG};
use crate::scope::ScopeKind;
use std::{cell::RefCell, mem::take};
use swc_atoms::{js_word, JsWord};
use swc_common::{collections::AHashMap, SyntaxContext, DUMMY_SP};
use swc_common::{collections::AHashMap, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, Id, StmtOrModuleItem};
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
use tracing::{debug, span, trace, Level};
#[derive(Debug, Default)]
@ -307,12 +307,12 @@ impl UsageAnalyzer<'_> {
};
for stmt in stmts {
stmt.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
stmt.visit_with(&mut v);
}
}
for stmt in stmts {
stmt.visit_with(&Invalid { span: DUMMY_SP }, self);
stmt.visit_with(self);
}
}
@ -409,11 +409,11 @@ impl UsageAnalyzer<'_> {
impl Visit for UsageAnalyzer<'_> {
noop_visit_type!();
fn visit_arrow_expr(&mut self, f: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, f: &ArrowExpr) {
self.visit_with_scope(f.span.ctxt, ScopeKind::Fn, |v| {
let old = v.is_pat_decl;
v.is_pat_decl = true;
f.params.visit_with(f, v);
f.params.visit_with(v);
v.is_pat_decl = old;
match &f.body {
@ -422,13 +422,13 @@ impl Visit for UsageAnalyzer<'_> {
body.visit_children_with(v);
}
BlockStmtOrExpr::Expr(body) => {
body.visit_with(f, v);
body.visit_with(v);
}
}
})
}
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp, _: &dyn Node) {
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) {
node.visit_children_with(self);
{
@ -440,28 +440,28 @@ impl Visit for UsageAnalyzer<'_> {
}
}
fn visit_block_stmt(&mut self, f: &BlockStmt, _: &dyn Node) {
fn visit_block_stmt(&mut self, f: &BlockStmt) {
self.visit_with_scope(f.span.ctxt, ScopeKind::Block, |v| f.visit_children_with(v))
}
fn visit_catch_clause(&mut self, c: &CatchClause, _: &dyn Node) {
fn visit_catch_clause(&mut self, c: &CatchClause) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
c.param.visit_with(c, self);
c.param.visit_with(self);
self.is_pat_decl = false;
c.body.visit_with(c, self);
c.body.visit_with(self);
self.is_pat_decl = old;
}
fn visit_class_decl(&mut self, c: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, c: &ClassDecl) {
self.add_decl(c.ident.to_id());
c.visit_children_with(self);
}
fn visit_class_expr(&mut self, c: &ClassExpr, _: &dyn Node) {
fn visit_class_expr(&mut self, c: &ClassExpr) {
self.visit_with_scope(c.class.span.ctxt, ScopeKind::Fn, |v| {
if let Some(i) = &c.ident {
v.add_decl(i.to_id());
@ -471,10 +471,10 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_constructor(&mut self, c: &Constructor, _: &dyn Node) {
fn visit_constructor(&mut self, c: &Constructor) {
self.visit_with_scope(c.span.ctxt, ScopeKind::Fn, |v| {
v.is_pat_decl = true;
c.params.visit_with(c, v);
c.params.visit_with(v);
v.is_pat_decl = false;
match c.body.as_ref() {
@ -486,12 +486,12 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_class_method(&mut self, m: &ClassMethod, _: &dyn Node) {
m.function.decorators.visit_with(m, self);
fn visit_class_method(&mut self, m: &ClassMethod) {
m.function.decorators.visit_with(self);
self.visit_with_scope(m.function.span.ctxt, ScopeKind::Fn, |v| {
v.is_pat_decl = true;
m.function.params.visit_with(m, v);
m.function.params.visit_with(v);
v.is_pat_decl = false;
match m.function.body.as_ref() {
@ -503,15 +503,15 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_export_default_specifier(&mut self, n: &ExportDefaultSpecifier, _: &dyn Node) {
fn visit_export_default_specifier(&mut self, n: &ExportDefaultSpecifier) {
self.add_usage(n.exported.to_id());
}
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier, _: &dyn Node) {
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier) {
self.add_usage(n.orig.to_id());
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match e {
@ -522,14 +522,14 @@ impl Visit for UsageAnalyzer<'_> {
}
}
fn visit_fn_decl(&mut self, f: &FnDecl, _: &dyn Node) {
f.function.decorators.visit_with(f, self);
fn visit_fn_decl(&mut self, f: &FnDecl) {
f.function.decorators.visit_with(self);
self.add_decl(f.ident.to_id());
self.visit_with_scope(f.function.span.ctxt, ScopeKind::Fn, |v| {
v.is_pat_decl = true;
f.function.params.visit_with(f, v);
f.function.params.visit_with(v);
v.is_pat_decl = false;
match f.function.body.as_ref() {
@ -541,12 +541,12 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_fn_expr(&mut self, f: &FnExpr, _: &dyn Node) {
f.function.decorators.visit_with(f, self);
fn visit_fn_expr(&mut self, f: &FnExpr) {
f.function.decorators.visit_with(self);
self.visit_with_scope(f.function.span.ctxt, ScopeKind::Fn, |v| {
v.is_pat_decl = true;
f.function.params.visit_with(f, v);
f.function.params.visit_with(v);
if let Some(i) = &f.ident {
v.add_decl(i.to_id());
@ -562,34 +562,34 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_import_default_specifier(&mut self, s: &ImportDefaultSpecifier, _: &dyn Node) {
fn visit_import_default_specifier(&mut self, s: &ImportDefaultSpecifier) {
self.add_decl(s.local.to_id());
}
fn visit_import_named_specifier(&mut self, s: &ImportNamedSpecifier, _: &dyn Node) {
fn visit_import_named_specifier(&mut self, s: &ImportNamedSpecifier) {
self.add_decl(s.local.to_id());
}
fn visit_import_star_as_specifier(&mut self, s: &ImportStarAsSpecifier, _: &dyn Node) {
fn visit_import_star_as_specifier(&mut self, s: &ImportStarAsSpecifier) {
self.add_decl(s.local.to_id());
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.obj.visit_with(e, self);
e.obj.visit_with(self);
}
}
fn visit_method_prop(&mut self, f: &MethodProp, _: &dyn Node) {
f.key.visit_with(f, self);
fn visit_method_prop(&mut self, f: &MethodProp) {
f.key.visit_with(self);
f.function.decorators.visit_with(f, self);
f.function.decorators.visit_with(self);
self.visit_with_scope(f.function.span.ctxt, ScopeKind::Fn, |v| {
v.is_pat_decl = true;
f.function.params.visit_with(f, v);
f.function.params.visit_with(v);
v.is_pat_decl = false;
match f.function.body.as_ref() {
@ -601,24 +601,24 @@ impl Visit for UsageAnalyzer<'_> {
})
}
fn visit_module(&mut self, m: &Module, _: &dyn Node) {
fn visit_module(&mut self, m: &Module) {
self.visit_with_scope(m.span.ctxt, ScopeKind::Fn, |v| m.visit_children_with(v))
}
fn visit_module_items(&mut self, stmts: &[ModuleItem], _: &dyn Node) {
fn visit_module_items(&mut self, stmts: &[ModuleItem]) {
self.visit_stmt_likes(stmts);
}
fn visit_param(&mut self, p: &Param, _: &dyn Node) {
p.decorators.visit_with(p, self);
fn visit_param(&mut self, p: &Param) {
p.decorators.visit_with(self);
let old = self.is_pat_decl;
self.is_pat_decl = true;
p.pat.visit_with(p, self);
p.pat.visit_with(self);
self.is_pat_decl = old;
}
fn visit_pat(&mut self, p: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, p: &Pat) {
p.visit_children_with(self);
match p {
@ -633,7 +633,7 @@ impl Visit for UsageAnalyzer<'_> {
}
}
fn visit_prop(&mut self, p: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, p: &Prop) {
p.visit_children_with(self);
match p {
@ -644,22 +644,22 @@ impl Visit for UsageAnalyzer<'_> {
}
}
fn visit_script(&mut self, s: &Script, _: &dyn Node) {
fn visit_script(&mut self, s: &Script) {
self.visit_with_scope(s.span.ctxt, ScopeKind::Fn, |v| s.visit_children_with(v))
}
fn visit_stmts(&mut self, stmts: &[Stmt], _: &dyn Node) {
fn visit_stmts(&mut self, stmts: &[Stmt]) {
self.visit_stmt_likes(stmts);
}
fn visit_var_declarator(&mut self, v: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, v: &VarDeclarator) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
v.name.visit_with(v, self);
v.name.visit_with(self);
self.is_pat_decl = false;
v.init.visit_with(v, self);
v.init.visit_with(self);
self.is_pat_decl = old;
}
@ -679,9 +679,9 @@ struct Hoister<'a, 'b> {
impl Visit for Hoister<'_, '_> {
noop_visit_type!();
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp, _: &dyn Node) {
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) {
node.visit_children_with(self);
{
@ -700,16 +700,16 @@ impl Visit for Hoister<'_, '_> {
}
}
fn visit_block_stmt(&mut self, b: &BlockStmt, _: &dyn Node) {
fn visit_block_stmt(&mut self, b: &BlockStmt) {
let old = self.in_block_stmt;
self.in_block_stmt = true;
b.visit_children_with(self);
self.in_block_stmt = old;
}
fn visit_block_stmt_or_expr(&mut self, _: &BlockStmtOrExpr, _: &dyn Node) {}
fn visit_block_stmt_or_expr(&mut self, _: &BlockStmtOrExpr) {}
fn visit_class_decl(&mut self, c: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, c: &ClassDecl) {
c.visit_children_with(self);
if self.in_block_stmt {
@ -719,11 +719,11 @@ impl Visit for Hoister<'_, '_> {
self.inner.add_decl(c.ident.to_id());
}
fn visit_constructor(&mut self, c: &Constructor, _: &dyn Node) {
c.params.visit_with(c, self);
fn visit_constructor(&mut self, c: &Constructor) {
c.params.visit_with(self);
}
fn visit_fn_decl(&mut self, f: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, f: &FnDecl) {
if LOG {
trace!("hoister: Fn decl: `{}`", f.ident);
}
@ -731,11 +731,11 @@ impl Visit for Hoister<'_, '_> {
self.inner.add_decl(f.ident.to_id());
}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_param(&mut self, _: &Param, _: &dyn Node) {}
fn visit_param(&mut self, _: &Param) {}
fn visit_pat(&mut self, p: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, p: &Pat) {
p.visit_children_with(self);
match p {
@ -757,23 +757,23 @@ impl Visit for Hoister<'_, '_> {
}
}
fn visit_var_decl(&mut self, v: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, v: &VarDecl) {
let old = self.var_decl_kind;
self.var_decl_kind = Some(v.kind);
v.decls.visit_with(v, self);
v.decls.visit_with(self);
self.var_decl_kind = old;
}
fn visit_var_declarator(&mut self, v: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, v: &VarDeclarator) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
v.name.visit_with(v, self);
v.name.visit_with(self);
self.is_pat_decl = false;
v.init.visit_with(v, self);
v.init.visit_with(self);
self.is_pat_decl = old;
}

View File

@ -1,4 +1,3 @@
use swc_common::DUMMY_SP;
use swc_ecma_ast::*;
use swc_ecma_visit::{Visit, VisitWith};
@ -12,7 +11,7 @@ where
T: VisitWith<C>,
{
let mut checker = C::default();
n.visit_with(&Invalid { span: DUMMY_SP }, &mut checker);
n.visit_with(&mut checker);
checker.should_handle()
}

View File

@ -1,9 +1,9 @@
use std::path::PathBuf;
use swc_common::{input::SourceFileInput, Mark, SyntaxContext, DUMMY_SP};
use swc_common::{input::SourceFileInput, Mark, SyntaxContext};
use swc_ecma_ast::*;
use swc_ecma_parser::{lexer::Lexer, Parser, Syntax, TsConfig};
use swc_ecma_transforms_base::resolver::ts_resolver;
use swc_ecma_visit::{FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{FoldWith, Visit, VisitWith};
use testing::fixture;
#[fixture("../swc_ecma_parser/tests/typescript/**/*.ts")]
@ -35,7 +35,7 @@ fn no_empty(input: PathBuf) {
let module = module.fold_with(&mut ts_resolver(Mark::fresh(Mark::root())));
module.visit_with(&Invalid { span: DUMMY_SP }, &mut AssertNoEmptyCtxt);
module.visit_with(&mut AssertNoEmptyCtxt);
Ok(())
})
@ -45,17 +45,17 @@ fn no_empty(input: PathBuf) {
struct AssertNoEmptyCtxt;
impl Visit for AssertNoEmptyCtxt {
fn visit_class_prop(&mut self, n: &ClassProp, _: &dyn Node) {
fn visit_class_prop(&mut self, n: &ClassProp) {
if n.computed {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.value.visit_with(n, self);
n.type_ann.visit_with(n, self);
n.decorators.visit_with(n, self);
n.value.visit_with(self);
n.type_ann.visit_with(self);
n.decorators.visit_with(self);
}
fn visit_expr(&mut self, n: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, n: &Expr) {
n.visit_children_with(self);
match n {
@ -68,14 +68,14 @@ impl Visit for AssertNoEmptyCtxt {
}
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_pat(&mut self, n: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, n: &Pat) {
n.visit_children_with(self);
match n {
@ -88,44 +88,44 @@ impl Visit for AssertNoEmptyCtxt {
}
}
fn visit_ts_getter_signature(&mut self, n: &TsGetterSignature, _: &dyn Node) {
fn visit_ts_getter_signature(&mut self, n: &TsGetterSignature) {
if n.computed {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.type_ann.visit_with(n, self);
n.type_ann.visit_with(self);
}
fn visit_ts_method_signature(&mut self, n: &TsMethodSignature, _: &dyn Node) {
fn visit_ts_method_signature(&mut self, n: &TsMethodSignature) {
if n.computed {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.params.visit_with(n, self);
n.type_ann.visit_with(n, self);
n.type_params.visit_with(n, self);
n.params.visit_with(self);
n.type_ann.visit_with(self);
n.type_params.visit_with(self);
}
fn visit_ts_property_signature(&mut self, n: &TsPropertySignature, _: &dyn Node) {
fn visit_ts_property_signature(&mut self, n: &TsPropertySignature) {
if n.computed {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.init.visit_with(n, self);
n.params.visit_with(n, self);
n.type_ann.visit_with(n, self);
n.type_params.visit_with(n, self);
n.init.visit_with(self);
n.params.visit_with(self);
n.type_ann.visit_with(self);
n.type_params.visit_with(self);
}
fn visit_ts_setter_signature(&mut self, n: &TsSetterSignature, _: &dyn Node) {
fn visit_ts_setter_signature(&mut self, n: &TsSetterSignature) {
if n.computed {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.param.visit_with(n, self);
n.param.visit_with(self);
}
fn visit_ts_tuple_element(&mut self, n: &TsTupleElement, _: &dyn Node) {
n.ty.visit_with(n, self);
fn visit_ts_tuple_element(&mut self, n: &TsTupleElement) {
n.ty.visit_with(self);
}
}

View File

@ -9,8 +9,7 @@ use swc_ecma_utils::{
quote_ident, quote_str, undefined, var::VarCollector, ExprFactory, Id, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
///
@ -113,7 +112,7 @@ impl BlockScoping {
{
let mut v = FunctionFinder { found: false };
body_stmt.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
body_stmt.visit_with(&mut v);
if !v.found {
return;
}
@ -607,7 +606,7 @@ where
{
let mut vars = vec![];
let mut v = VarCollector { to: &mut vars };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
vars
}
@ -620,7 +619,7 @@ where
vars: ids,
found: false,
};
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
}
/// In the code below,
@ -638,11 +637,11 @@ struct InfectionFinder<'a> {
impl Visit for InfectionFinder<'_> {
noop_visit_type!();
fn visit_assign_expr(&mut self, node: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, node: &AssignExpr) {
let old = self.found;
self.found = false;
node.right.visit_with(node as _, self);
node.right.visit_with(self);
if self.found {
let ids = find_ids(&node.left);
@ -652,7 +651,7 @@ impl Visit for InfectionFinder<'_> {
self.found = old;
}
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
if self.found {
return;
}
@ -665,23 +664,23 @@ impl Visit for InfectionFinder<'_> {
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
fn visit_member_expr(&mut self, e: &MemberExpr) {
if self.found {
return;
}
e.obj.visit_with(e as _, self);
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
}
fn visit_var_declarator(&mut self, node: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, node: &VarDeclarator) {
let old = self.found;
self.found = false;
node.init.visit_with(node as _, self);
node.init.visit_with(self);
if self.found {
let ids = find_ids(&node.name);
@ -981,36 +980,36 @@ struct FunctionFinder {
impl Visit for FunctionFinder {
noop_visit_type!();
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {
self.found = true;
}
/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_do_while_stmt(&mut self, _: &DoWhileStmt, _: &dyn Node) {}
fn visit_do_while_stmt(&mut self, _: &DoWhileStmt) {}
/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_in_stmt(&mut self, _: &ForInStmt, _: &dyn Node) {}
fn visit_for_in_stmt(&mut self, _: &ForInStmt) {}
/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_of_stmt(&mut self, _: &ForOfStmt, _: &dyn Node) {}
fn visit_for_of_stmt(&mut self, _: &ForOfStmt) {}
/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_for_stmt(&mut self, _: &ForStmt, _: &dyn Node) {}
fn visit_for_stmt(&mut self, _: &ForStmt) {}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {
fn visit_function(&mut self, _: &Function) {
self.found = true
}
/// Do not recurse into nested loop.
///
/// https://github.com/swc-project/swc/issues/2622
fn visit_while_stmt(&mut self, _: &WhileStmt, _: &dyn Node) {}
fn visit_while_stmt(&mut self, _: &WhileStmt) {}
}

View File

@ -5,7 +5,7 @@ use swc_ecma_ast::*;
use swc_ecma_transforms_base::helper;
use swc_ecma_transforms_classes::{fold_only_key, get_prototype_of};
use swc_ecma_utils::{private_ident, quote_ident, ExprFactory};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitWith};
pub(super) struct SuperCallFinder {
mode: Option<SuperFoldingMode>,
@ -36,7 +36,7 @@ impl SuperCallFinder {
mode: None,
in_complex: false,
};
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.mode
}
}
@ -60,7 +60,7 @@ macro_rules! ignore_return {
macro_rules! mark_as_complex {
($name:ident, $T:ty) => {
fn $name(&mut self, node: &$T, _: &dyn Node) {
fn $name(&mut self, node: &$T) {
let old = self.in_complex;
self.in_complex = true;
node.visit_children_with(self);
@ -76,8 +76,8 @@ impl Visit for SuperCallFinder {
mark_as_complex!(visit_if_stmt, IfStmt);
mark_as_complex!(visit_prop_name, PropName);
fn visit_assign_expr(&mut self, node: &AssignExpr, _: &dyn Node) {
node.left.visit_with(node as _, self);
fn visit_assign_expr(&mut self, node: &AssignExpr) {
node.left.visit_with(self);
let old = self.in_complex;
self.in_complex = true;
@ -85,7 +85,7 @@ impl Visit for SuperCallFinder {
self.in_complex = old;
}
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
match e.callee {
ExprOrSuper::Super(..) => match self.mode {
None if !self.in_complex => self.mode = Some(SuperFoldingMode::Var),
@ -103,12 +103,12 @@ impl Visit for SuperCallFinder {
}
/// Don't recurse into class declaration.
fn visit_class(&mut self, _: &Class, _: &dyn Node) {}
fn visit_class(&mut self, _: &Class) {}
/// Don't recurse into function.
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.visit_children_with(self);
match e.obj {

View File

@ -15,7 +15,7 @@ use swc_ecma_utils::{
alias_if_required, default_constructor, prepend, private_ident, prop_name_to_expr, quote_expr,
quote_ident, quote_str, ExprFactory, IsDirective, ModuleItemLike, StmtLike,
};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitWith};
use tracing::debug;
mod constructor;
@ -915,7 +915,7 @@ fn is_always_initialized(body: &[Stmt]) -> bool {
impl Visit for SuperFinder {
noop_visit_type!();
fn visit_expr_or_super(&mut self, node: &ExprOrSuper, _: &dyn Node) {
fn visit_expr_or_super(&mut self, node: &ExprOrSuper) {
match *node {
ExprOrSuper::Super(..) => self.found = true,
_ => node.visit_children_with(self),
@ -941,7 +941,7 @@ fn is_always_initialized(body: &[Stmt]) -> bool {
let mut v = SuperFinder { found: false };
let body = &body[..pos];
v.visit_stmts(body, &Invalid { span: DUMMY_SP });
v.visit_stmts(body);
if v.found {
return false;
@ -976,7 +976,7 @@ struct ClassFinder {
impl Visit for ClassFinder {
noop_visit_type!();
fn visit_class(&mut self, _: &Class, _: &dyn Node) {
fn visit_class(&mut self, _: &Class) {
self.found = true
}
}

View File

@ -4,8 +4,7 @@ use swc_ecma_ast::*;
use swc_ecma_transforms_base::helper;
use swc_ecma_utils::{quote_ident, ExprFactory, StmtLike};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
/// `@babel/plugin-transform-computed-properties`
@ -323,7 +322,7 @@ struct ComplexVisitor {
impl Visit for ComplexVisitor {
noop_visit_type!();
fn visit_prop_name(&mut self, pn: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, pn: &PropName) {
match *pn {
PropName::Computed(..) => self.found = true,
_ => {}
@ -409,7 +408,7 @@ where
N: VisitWith<ShouldWork>,
{
let mut v = ShouldWork { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}
@ -420,7 +419,7 @@ struct ShouldWork {
impl Visit for ShouldWork {
noop_visit_type!();
fn visit_prop_name(&mut self, node: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, node: &PropName) {
match *node {
PropName::Computed(_) => self.found = true,
_ => {}

View File

@ -10,8 +10,7 @@ use swc_ecma_utils::{
prop_name_to_expr, quote_ident, undefined, ExprFactory, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
/// `@babel/plugin-transform-destructuring`
@ -1235,7 +1234,7 @@ struct DestructuringVisitor {
impl Visit for DestructuringVisitor {
noop_visit_type!();
fn visit_pat(&mut self, node: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, node: &Pat) {
node.visit_children_with(self);
match *node {
Pat::Ident(..) => {}

View File

@ -5,7 +5,7 @@ use swc_ecma_ast::*;
use swc_ecma_transforms_base::perf::{should_work, Check};
use swc_ecma_utils::{prepend, private_ident, quote_ident, undefined, ExprFactory};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith,
};
pub fn new_target() -> impl Fold + VisitMut + CompilerPass {
@ -237,7 +237,7 @@ struct ShouldWork {
impl Visit for ShouldWork {
noop_visit_type!();
fn visit_meta_prop_expr(&mut self, n: &MetaPropExpr, _: &dyn Node) {
fn visit_meta_prop_expr(&mut self, n: &MetaPropExpr) {
match n {
MetaPropExpr {
meta:

View File

@ -10,7 +10,7 @@ use swc_ecma_ast::*;
use swc_ecma_utils::{
ident::IdentLike, member_expr, quote_ident, quote_str, undefined, ExprFactory,
};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitWith};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub(super) struct Loc {
@ -1539,7 +1539,7 @@ struct LeapFinder {
macro_rules! leap {
($name:ident,$T:ty) => {
fn $name(&mut self, _: &$T, _: &dyn Node) {
fn $name(&mut self, _: &$T) {
self.found = true;
}
};
@ -1549,9 +1549,9 @@ impl Visit for LeapFinder {
noop_visit_type!();
/// Ignored
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
/// Ignored
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
leap!(visit_yield_expr, YieldExpr);
leap!(visit_break_stmt, BreakStmt);
@ -1565,7 +1565,7 @@ where
T: VisitWith<LeapFinder>,
{
let mut v = LeapFinder { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}

View File

@ -7,7 +7,7 @@ use swc_ecma_ast::*;
use swc_ecma_utils::{
contains_this_expr, prepend, private_ident, quote_ident, quote_str, ExprFactory, StmtLike,
};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitWith};
mod case;
mod hoist;
@ -556,7 +556,7 @@ struct Finder {
impl Finder {
fn find<T: VisitWith<Self>>(node: &T) -> bool {
let mut v = Finder { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}
}
@ -564,7 +564,7 @@ impl Finder {
impl Visit for Finder {
noop_visit_type!();
fn visit_function(&mut self, node: &Function, _: &dyn Node) {
fn visit_function(&mut self, node: &Function) {
if node.is_generator {
self.found = true;
return;

View File

@ -10,8 +10,7 @@ use swc_ecma_utils::{
StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
pub fn spread(c: Config) -> impl Fold + VisitMut {
@ -450,7 +449,7 @@ struct SpreadFinder {
impl Visit for SpreadFinder {
noop_visit_type!();
fn visit_expr_or_spread(&mut self, n: &ExprOrSpread, _: &dyn Node) {
fn visit_expr_or_spread(&mut self, n: &ExprOrSpread) {
n.visit_children_with(self);
self.found |= n.spread.is_some();

View File

@ -9,8 +9,7 @@ use swc_ecma_utils::{
private_ident, quote_ident, ExprFactory, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
/// `@babel/plugin-transform-async-to-generator`
@ -1044,7 +1043,7 @@ struct ShouldWork {
impl Visit for ShouldWork {
noop_visit_type!();
fn visit_function(&mut self, f: &Function, _: &dyn Node) {
fn visit_function(&mut self, f: &Function) {
if f.is_async {
self.found = true;
return;
@ -1052,7 +1051,7 @@ impl Visit for ShouldWork {
f.visit_children_with(self);
}
fn visit_arrow_expr(&mut self, f: &ArrowExpr, _: &dyn Node) {
fn visit_arrow_expr(&mut self, f: &ArrowExpr) {
if f.is_async {
self.found = true;
return;

View File

@ -12,7 +12,7 @@ use swc_ecma_utils::{
ExprFactory, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_fold_type, noop_visit_mut_type, noop_visit_type, Fold, FoldWith, Node, Visit,
as_folder, noop_fold_type, noop_visit_mut_type, noop_visit_type, Fold, FoldWith, Visit,
VisitMut, VisitMutWith, VisitWith,
};
@ -174,7 +174,7 @@ struct RestVisitor {
impl Visit for RestVisitor {
noop_visit_type!();
fn visit_object_pat_prop(&mut self, prop: &ObjectPatProp, _: &dyn Node) {
fn visit_object_pat_prop(&mut self, prop: &ObjectPatProp) {
match *prop {
ObjectPatProp::Rest(..) => self.found = true,
_ => prop.visit_children_with(self),
@ -193,7 +193,7 @@ where
N: VisitWith<RestVisitor>,
{
let mut v = RestVisitor { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}
@ -283,7 +283,7 @@ impl Fold for ObjectRest {
let specifiers = {
let mut found = vec![];
let mut finder = VarCollector { to: &mut found };
var_decl.visit_with(&Invalid { span: DUMMY_SP } as _, &mut finder);
var_decl.visit_with(&mut finder);
found
.into_iter()
.map(|(sym, ctxt)| ExportNamedSpecifier {

View File

@ -6,7 +6,7 @@ use swc_ecma_transforms_base::perf::Check;
use swc_ecma_transforms_macros::fast_path;
use swc_ecma_utils::{alias_if_required, prepend, private_ident, undefined, ExprFactory, StmtLike};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith,
};
pub fn optional_chaining(c: Config) -> impl Fold + VisitMut {
@ -670,7 +670,7 @@ struct ShouldWork {
impl Visit for ShouldWork {
noop_visit_type!();
fn visit_opt_chain_expr(&mut self, _: &OptChainExpr, _: &dyn Node) {
fn visit_opt_chain_expr(&mut self, _: &OptChainExpr) {
self.found = true;
}
}

View File

@ -17,8 +17,7 @@ use swc_ecma_utils::{
private_ident, quote_ident, undefined, ExprFactory, ModuleItemLike, StmtLike,
};
use swc_ecma_visit::{
as_folder, noop_fold_type, noop_visit_type, Fold, FoldWith, Node, Visit, VisitMutWith,
VisitWith,
as_folder, noop_fold_type, noop_visit_type, Fold, FoldWith, Visit, VisitMutWith, VisitWith,
};
mod class_name_tdz;
@ -418,19 +417,13 @@ impl ClassProperties {
}));
if !prop.is_static {
prop.key.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut UsedNameCollector {
used_names: &mut used_key_names,
},
);
prop.key.visit_with(&mut UsedNameCollector {
used_names: &mut used_key_names,
});
prop.value.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut UsedNameCollector {
used_names: &mut used_names,
},
);
prop.value.visit_with(&mut UsedNameCollector {
used_names: &mut used_names,
});
}
let key = match *prop.key {
@ -527,12 +520,9 @@ impl ClassProperties {
// We use `self.mark` for private variables.
prop.key.span.apply_mark(self.mark),
);
prop.value.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut UsedNameCollector {
used_names: &mut used_names,
},
);
prop.value.visit_with(&mut UsedNameCollector {
used_names: &mut used_names,
});
if prop.is_static {
prop.value.visit_mut_with(&mut ThisInStaticFolder {
ident: class_ident.clone(),
@ -636,12 +626,9 @@ impl ClassProperties {
// We use `self.mark` for private variables.
method.key.span.apply_mark(self.mark),
);
method.function.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut UsedNameCollector {
used_names: &mut used_names,
},
);
method.function.visit_with(&mut UsedNameCollector {
used_names: &mut used_names,
});
if should_use_map || !statics.contains(&method.key.id.sym) {
vars.push(VarDeclarator {
@ -835,37 +822,37 @@ struct ShouldWork {
impl Visit for ShouldWork {
noop_visit_type!();
fn visit_ident(&mut self, n: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, n: &Ident) {
if n.optional {
self.found = true;
}
}
fn visit_array_pat(&mut self, n: &ArrayPat, _: &dyn Node) {
fn visit_array_pat(&mut self, n: &ArrayPat) {
if n.optional {
self.found = true;
}
}
fn visit_object_pat(&mut self, n: &ObjectPat, _: &dyn Node) {
fn visit_object_pat(&mut self, n: &ObjectPat) {
if n.optional {
self.found = true;
}
}
fn visit_class_method(&mut self, _: &ClassMethod, _: &dyn Node) {
fn visit_class_method(&mut self, _: &ClassMethod) {
self.found = true;
}
fn visit_class_prop(&mut self, _: &ClassProp, _: &dyn Node) {
fn visit_class_prop(&mut self, _: &ClassProp) {
self.found = true;
}
fn visit_private_prop(&mut self, _: &PrivateProp, _: &dyn Node) {
fn visit_private_prop(&mut self, _: &PrivateProp) {
self.found = true;
}
fn visit_constructor(&mut self, _: &Constructor, _: &dyn Node) {
fn visit_constructor(&mut self, _: &Constructor) {
self.found = true;
}
}

View File

@ -1,6 +1,6 @@
use swc_atoms::JsWord;
use swc_ecma_ast::*;
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
pub(super) struct UsedNameCollector<'a> {
pub used_names: &'a mut Vec<JsWord>,
@ -9,7 +9,7 @@ pub(super) struct UsedNameCollector<'a> {
macro_rules! noop {
($name:ident, $T:path) => {
/// no-op
fn $name(&mut self, _: &$T, _: &dyn Node) {}
fn $name(&mut self, _: &$T) {}
};
}
@ -23,7 +23,7 @@ impl<'a> Visit for UsedNameCollector<'a> {
noop!(visit_method_prop, MethodProp);
noop!(visit_constructor, Constructor);
fn visit_expr(&mut self, expr: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, expr: &Expr) {
match *expr {
Expr::Ident(ref i) => self.used_names.push(i.sym.clone()),
_ => expr.visit_children_with(self),

View File

@ -12,7 +12,7 @@ use swc_ecma_utils::{
default_constructor, ident::IdentLike, prepend, private_ident, quote_ident, ExprFactory, Id,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
/// https://github.com/tc39/proposal-private-fields-in-in
@ -98,7 +98,7 @@ struct ClassData {
/// Name of private statics.
statics: Vec<JsWord>,
consturctor_exprs: Vec<Box<Expr>>,
constructor_exprs: Vec<Box<Expr>>,
names_used_for_brand_checks: AHashSet<JsWord>,
}
@ -162,7 +162,7 @@ impl VisitMut for PrivateInObject {
n.visit_mut_children_with(self);
if !self.cls.consturctor_exprs.is_empty() {
if !self.cls.constructor_exprs.is_empty() {
let has_constructor = n
.body
.iter()
@ -179,7 +179,7 @@ impl VisitMut for PrivateInObject {
ClassMember::Constructor(Constructor {
body: Some(body), ..
}) => {
for expr in take(&mut self.cls.consturctor_exprs) {
for expr in take(&mut self.cls.constructor_exprs) {
body.stmts.push(Stmt::Expr(ExprStmt {
span: DUMMY_SP,
expr,
@ -250,7 +250,7 @@ impl VisitMut for PrivateInObject {
brand_check_names: &mut buf,
ignore_class: false,
};
p.right.visit_with(p, &mut v);
p.right.visit_with(&mut v);
if buf.is_empty() {
p.right.visit_mut_with(self);
@ -348,7 +348,7 @@ impl VisitMut for PrivateInObject {
if is_method {
self.cls
.consturctor_exprs
.constructor_exprs
.push(Box::new(Expr::Call(CallExpr {
span: DUMMY_SP,
callee: var_name
@ -488,7 +488,7 @@ struct ClassAnalyzer<'a> {
impl Visit for ClassAnalyzer<'_> {
noop_visit_type!();
fn visit_bin_expr(&mut self, n: &BinExpr, _: &dyn Node) {
fn visit_bin_expr(&mut self, n: &BinExpr) {
n.visit_children_with(self);
if n.op == op!("in") {
@ -503,7 +503,7 @@ impl Visit for ClassAnalyzer<'_> {
}
/// Noop
fn visit_class(&mut self, n: &Class, _: &dyn Node) {
fn visit_class(&mut self, n: &Class) {
if self.ignore_class {
return;
}

View File

@ -206,17 +206,14 @@ where
let mut scope_ref_mut = self.scope.borrow_mut();
let scope = &mut *scope_ref_mut;
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut scope.declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut scope.declared_vars,
});
let mut found: Vec<Ident> = vec![];
for decl in var.decls {
let mut v = DestructuringFinder { found: &mut found };
decl.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
decl.visit_with(&mut v);
for ident in found.drain(..) {
scope
@ -650,12 +647,9 @@ where
/// - collects all declared variables for let and var.
fn fold_var_decl(&mut self, var: VarDecl) -> VarDecl {
if var.kind != VarDeclKind::Const {
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
});
}
VarDecl {

View File

@ -310,17 +310,14 @@ where
))));
let mut scope = self.scope.borrow_mut();
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut scope.declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut scope.declared_vars,
});
let mut found: Vec<Ident> = vec![];
for decl in var.decls {
let mut v = DestructuringFinder { found: &mut found };
decl.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
decl.visit_with(&mut v);
for ident in found.drain(..) {
scope
@ -768,12 +765,9 @@ where
/// - collects all declared variables for let and var.
fn fold_var_decl(&mut self, var: VarDecl) -> VarDecl {
if var.kind != VarDeclKind::Const {
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
});
}
VarDecl {

View File

@ -1,11 +1,11 @@
use super::util::Scope;
use std::{cell::RefCell, rc::Rc};
use swc_atoms::{js_word, JsWord};
use swc_common::{collections::AHashSet, DUMMY_SP};
use swc_common::collections::AHashSet;
use swc_ecma_ast::*;
use swc_ecma_transforms_base::enable_helper;
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitWith,
};
pub fn import_analyzer(scope: Rc<RefCell<Scope>>) -> impl Fold + VisitMut {
@ -25,7 +25,7 @@ impl VisitMut for ImportAnalyzer {
noop_visit_mut_type!();
fn visit_mut_module(&mut self, module: &mut Module) {
self.visit_module(&*module, &Invalid { span: DUMMY_SP } as _);
self.visit_module(&*module);
for (_, ty) in self.scope.borrow().import_types.iter() {
if *ty {
@ -50,7 +50,7 @@ impl VisitMut for ImportAnalyzer {
impl Visit for ImportAnalyzer {
noop_visit_type!();
fn visit_call_expr(&mut self, n: &CallExpr, _parent: &dyn Node) {
fn visit_call_expr(&mut self, n: &CallExpr) {
n.visit_children_with(self);
let mut scope = self.scope.borrow_mut();
match &n.callee {
@ -76,7 +76,7 @@ impl Visit for ImportAnalyzer {
}
}
fn visit_export_all(&mut self, export: &ExportAll, _parent: &dyn Node) {
fn visit_export_all(&mut self, export: &ExportAll) {
*self
.scope
.borrow_mut()
@ -85,7 +85,7 @@ impl Visit for ImportAnalyzer {
.or_default() = true
}
fn visit_import_decl(&mut self, import: &ImportDecl, _parent: &dyn Node) {
fn visit_import_decl(&mut self, import: &ImportDecl) {
let mut scope = self.scope.borrow_mut();
if import.specifiers.is_empty() {
// import 'foo';
@ -150,7 +150,7 @@ impl Visit for ImportAnalyzer {
}
}
fn visit_named_export(&mut self, export: &NamedExport, _parent: &dyn Node) {
fn visit_named_export(&mut self, export: &NamedExport) {
if export.specifiers.iter().any(|v| match v {
ExportSpecifier::Namespace(..) => true,
_ => false,

View File

@ -216,17 +216,14 @@ where
extra_stmts.push(Stmt::Decl(Decl::Var(var.clone().fold_with(self))));
let scope = &mut *self.scope.borrow_mut();
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut scope.declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut scope.declared_vars,
});
let mut found: Vec<Ident> = vec![];
for decl in var.decls {
let mut v = DestructuringFinder { found: &mut found };
decl.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
decl.visit_with(&mut v);
for ident in found.drain(..) {
scope
@ -792,12 +789,9 @@ where
/// - collects all declared variables for let and var.
fn fold_var_decl(&mut self, var: VarDecl) -> VarDecl {
if var.kind != VarDeclKind::Const {
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
},
);
var.decls.visit_with(&mut VarCollector {
to: &mut self.scope.borrow_mut().declared_vars,
});
}
VarDecl {

View File

@ -648,8 +648,7 @@ impl Scope {
let mut found: Vec<(JsWord, Span)> = vec![];
let mut v = DestructuringFinder { found: &mut found };
expr.left
.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
expr.left.visit_with(&mut v);
if v.found.is_empty() {
return Expr::Assign(AssignExpr {
left: expr.left,

View File

@ -12,7 +12,7 @@ use swc_ecma_utils::{
Hoister, IsEmpty, StmtExt, StmtLike, Value::Known,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
#[cfg(test)]
@ -1623,47 +1623,47 @@ fn check_for_stopper(s: &[Stmt], only_conditional: bool) -> bool {
impl Visit for Visitor {
noop_visit_type!();
fn visit_switch_case(&mut self, node: &SwitchCase, _: &dyn Node) {
fn visit_switch_case(&mut self, node: &SwitchCase) {
let old = self.in_cond;
self.in_cond = true;
node.cons.visit_with(node as _, self);
node.cons.visit_with(self);
self.in_cond = old;
}
fn visit_break_stmt(&mut self, s: &BreakStmt, _: &dyn Node) {
fn visit_break_stmt(&mut self, s: &BreakStmt) {
if self.in_cond && s.label.is_none() {
self.found = true
}
}
fn visit_continue_stmt(&mut self, s: &ContinueStmt, _: &dyn Node) {
fn visit_continue_stmt(&mut self, s: &ContinueStmt) {
if self.in_cond && s.label.is_none() {
self.found = true
}
}
fn visit_return_stmt(&mut self, _: &ReturnStmt, _: &dyn Node) {
fn visit_return_stmt(&mut self, _: &ReturnStmt) {
if self.in_cond {
self.found = true
}
}
fn visit_throw_stmt(&mut self, _: &ThrowStmt, _: &dyn Node) {
fn visit_throw_stmt(&mut self, _: &ThrowStmt) {
if self.in_cond {
self.found = true
}
}
fn visit_class(&mut self, _: &Class, _: &dyn Node) {}
fn visit_class(&mut self, _: &Class) {}
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_if_stmt(&mut self, node: &IfStmt, _: &dyn Node) {
fn visit_if_stmt(&mut self, node: &IfStmt) {
let old = self.in_cond;
self.in_cond = true;
node.cons.visit_with(node as _, self);
node.cons.visit_with(self);
self.in_cond = true;
node.alt.visit_with(node as _, self);
node.alt.visit_with(self);
self.in_cond = old;
}
}
@ -1672,7 +1672,7 @@ fn check_for_stopper(s: &[Stmt], only_conditional: bool) -> bool {
in_cond: !only_conditional,
found: false,
};
v.visit_stmts(s, &Invalid { span: DUMMY_SP } as _);
v.visit_stmts(s);
v.found
}

View File

@ -15,8 +15,7 @@ use swc_ecma_utils::{
collect_decls, ident::IdentLike, ExprExt, Id, IsEmpty, ModuleItemLike, StmtLike, Value,
};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Node, Visit, VisitMut, VisitMutWith,
VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Fold, Visit, VisitMut, VisitMutWith, VisitWith,
};
use tracing::{debug, span, trace, Level};
@ -100,13 +99,13 @@ impl Analyzer<'_> {
impl Visit for Analyzer<'_> {
noop_visit_type!();
fn visit_assign_pat_prop(&mut self, n: &AssignPatProp, _: &dyn Node) {
fn visit_assign_pat_prop(&mut self, n: &AssignPatProp) {
n.visit_children_with(self);
self.add(n.key.to_id(), true);
}
fn visit_class_decl(&mut self, n: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, n: &ClassDecl) {
n.visit_children_with(self);
if !n.class.decorators.is_empty() {
@ -114,7 +113,7 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_class_expr(&mut self, n: &ClassExpr, _: &dyn Node) {
fn visit_class_expr(&mut self, n: &ClassExpr) {
n.visit_children_with(self);
if !n.class.decorators.is_empty() {
@ -124,11 +123,11 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier, _: &dyn Node) {
fn visit_export_named_specifier(&mut self, n: &ExportNamedSpecifier) {
self.add(n.orig.to_id(), false);
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match e {
@ -139,7 +138,7 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_fn_decl(&mut self, n: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, n: &FnDecl) {
let old = self.cur_fn_id.take();
self.cur_fn_id = Some(n.ident.to_id());
n.visit_children_with(self);
@ -150,7 +149,7 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_fn_expr(&mut self, n: &FnExpr, _: &dyn Node) {
fn visit_fn_expr(&mut self, n: &FnExpr) {
n.visit_children_with(self);
if !n.function.decorators.is_empty() {
@ -160,7 +159,7 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_pat(&mut self, p: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, p: &Pat) {
p.visit_children_with(self);
if !self.in_var_decl {
@ -173,7 +172,7 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_prop(&mut self, p: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, p: &Prop) {
p.visit_children_with(self);
match p {
@ -184,14 +183,14 @@ impl Visit for Analyzer<'_> {
}
}
fn visit_var_declarator(&mut self, v: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, v: &VarDeclarator) {
let old = self.in_var_decl;
self.in_var_decl = true;
v.name.visit_with(v, self);
v.name.visit_with(self);
self.in_var_decl = false;
v.init.visit_with(v, self);
v.init.visit_with(self);
self.in_var_decl = old;
}
@ -429,7 +428,7 @@ impl VisitMut for TreeShaker {
in_var_decl: false,
cur_fn_id: Default::default(),
};
m.visit_with(&Invalid { span: DUMMY_SP }, &mut analyzer);
m.visit_with(&mut analyzer);
}
self.data = data.into();
trace!("Used = {:?}", self.data.used_names);

View File

@ -3,13 +3,12 @@ use std::borrow::Cow;
use swc_common::{
pass::{CompilerPass, Repeated},
util::take::Take,
DUMMY_SP,
};
use swc_ecma_ast::*;
use swc_ecma_transforms_base::{pass::RepeatedJsPass, scope::IdentType};
use swc_ecma_utils::{contains_this_expr, find_ids, ident::IdentLike, undefined, Id};
use swc_ecma_visit::{
as_folder, noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
as_folder, noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
mod scope;
@ -129,8 +128,8 @@ impl VisitMut for Inlining<'_> {
scope: &mut self.scope,
};
left.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
e.right.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
left.visit_with(&mut v);
e.right.visit_with(&mut v);
}
_ => {}
@ -149,8 +148,8 @@ impl VisitMut for Inlining<'_> {
scope: &mut self.scope,
};
e.left.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
e.right.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v)
e.left.visit_with(&mut v);
e.right.visit_with(&mut v)
}
}
@ -232,12 +231,9 @@ impl VisitMut for Inlining<'_> {
fn visit_mut_do_while_stmt(&mut self, node: &mut DoWhileStmt) {
{
node.test.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.test.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
node.test.visit_mut_with(self);
@ -387,21 +383,15 @@ impl VisitMut for Inlining<'_> {
node.left.visit_mut_with(self);
{
node.left.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.left.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
{
node.right.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.right.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
node.right.visit_mut_with(self);
@ -413,20 +403,14 @@ impl VisitMut for Inlining<'_> {
node.left.visit_mut_with(self);
{
node.left.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.left.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
{
node.right.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.right.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
node.right.visit_mut_with(self);
@ -437,28 +421,19 @@ impl VisitMut for Inlining<'_> {
node.init.visit_mut_with(self);
{
node.init.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.init.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
{
node.test.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.test.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
{
node.update.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.update.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
node.test.visit_mut_with(self);
@ -538,12 +513,9 @@ impl VisitMut for Inlining<'_> {
}
fn visit_mut_try_stmt(&mut self, node: &mut TryStmt) {
node.block.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.block.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
node.handler.visit_mut_with(self)
}
@ -555,8 +527,7 @@ impl VisitMut for Inlining<'_> {
scope: &mut self.scope,
};
node.arg
.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.arg.visit_with(&mut v);
return;
}
@ -571,7 +542,7 @@ impl VisitMut for Inlining<'_> {
scope: &mut self.scope,
};
node.arg.visit_with(&*node as _, &mut v);
node.arg.visit_with(&mut v);
}
fn visit_mut_var_decl(&mut self, decl: &mut VarDecl) {
@ -730,12 +701,9 @@ impl VisitMut for Inlining<'_> {
fn visit_mut_while_stmt(&mut self, node: &mut WhileStmt) {
{
node.test.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut IdentListVisitor {
scope: &mut self.scope,
},
);
node.test.visit_with(&mut IdentListVisitor {
scope: &mut self.scope,
});
}
node.test.visit_mut_with(self);
@ -786,15 +754,15 @@ struct IdentListVisitor<'a, 'b> {
impl Visit for IdentListVisitor<'_, '_> {
noop_visit_type!();
fn visit_ident(&mut self, node: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, node: &Ident) {
self.scope.add_write(&node.to_id(), true);
}
fn visit_member_expr(&mut self, node: &MemberExpr, _: &dyn Node) {
node.obj.visit_with(node as _, self);
fn visit_member_expr(&mut self, node: &MemberExpr) {
node.obj.visit_with(self);
if node.computed {
node.prop.visit_with(node as _, self);
node.prop.visit_with(self);
}
}
}
@ -807,15 +775,15 @@ struct WriteVisitor<'a, 'b> {
impl Visit for WriteVisitor<'_, '_> {
noop_visit_type!();
fn visit_ident(&mut self, node: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, node: &Ident) {
self.scope.add_write(&node.to_id(), false);
}
fn visit_member_expr(&mut self, node: &MemberExpr, _: &dyn Node) {
node.obj.visit_with(node as _, self);
fn visit_member_expr(&mut self, node: &MemberExpr) {
node.obj.visit_with(self);
if node.computed {
node.prop.visit_with(node as _, self);
node.prop.visit_with(self);
}
}
}

View File

@ -9,7 +9,7 @@ use swc_ecma_utils::{
alias_ident_for, constructor::inject_after_super, default_constructor, prepend, private_ident,
prop_name_to_expr_value, quote_ident, quote_str, undefined, ExprFactory, IdentExt,
};
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith, Visit, VisitWith};
mod legacy;
@ -648,7 +648,7 @@ struct DecoratorFinder {
found: bool,
}
impl Visit for DecoratorFinder {
fn visit_decorator(&mut self, _: &Decorator, _: &dyn Node) {
fn visit_decorator(&mut self, _: &Decorator) {
self.found = true
}
}
@ -658,6 +658,6 @@ where
N: VisitWith<DecoratorFinder>,
{
let mut v = DecoratorFinder { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}

View File

@ -10,7 +10,7 @@ use swc_ecma_utils::{
prop_name_to_expr_value, quote_ident, replace_ident, undefined, ExprFactory, Id,
ModuleItemLike, StmtLike,
};
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_fold_type, Fold, FoldWith, Visit, VisitWith};
mod metadata;
@ -41,7 +41,7 @@ pub(super) fn new(metadata: bool) -> Legacy {
}
impl Visit for Legacy {
fn visit_ts_enum_decl(&mut self, e: &TsEnumDecl, _: &dyn Node) {
fn visit_ts_enum_decl(&mut self, e: &TsEnumDecl) {
let enum_kind = e
.members
.iter()
@ -133,7 +133,7 @@ impl Fold for Legacy {
fn fold_module(&mut self, m: Module) -> Module {
// Collect required information.
// For example, value type of enum affects codegen
m.visit_with(&Invalid { span: DUMMY_SP }, self);
m.visit_with(self);
let mut m = m.fold_children_with(self);

View File

@ -21,7 +21,7 @@ use swc_common::{
};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, private_ident, quote_ident, quote_str, Id};
use swc_ecma_visit::{Fold, FoldWith, Node, Visit};
use swc_ecma_visit::{Fold, FoldWith, Visit};
pub mod options;
use options::RefreshOptions;
@ -71,10 +71,10 @@ fn hook_to_handle_map(hook_fn: Vec<FnWithHook>) -> (AHashMap<Ident, FnWithHook>,
}
(has_ident, ignore)
}
// funtction that use hooks
// function that use hooks
struct FnWithHook {
binding: Option<Ident>, // ident of function
handle: Ident, // varaible to register
handle: Ident, // variable to register
hook: Vec<Hook>,
}
@ -553,7 +553,7 @@ impl<C> Visit for Refresh<C>
where
C: Comments,
{
fn visit_span(&mut self, n: &Span, _: &dyn Node) {
fn visit_span(&mut self, n: &Span) {
if self.should_reset {
return;
}
@ -754,7 +754,7 @@ impl<C: Comments> Fold for Refresh<C> {
return module_items;
}
self.visit_module_items(&module_items, &Invalid { span: DUMMY_SP } as _);
self.visit_module_items(&module_items);
for item in &module_items {
item.collect_ident(&mut self.scope_binding);

View File

@ -15,7 +15,7 @@ use swc_ecma_utils::{
private_ident, quote_ident, replace_ident, var::VarCollector, ExprFactory, Id, ModuleItemLike,
StmtLike,
};
use swc_ecma_visit::{as_folder, Fold, Node, Visit, VisitMut, VisitMutWith, VisitWith};
use swc_ecma_visit::{as_folder, Fold, Visit, VisitMut, VisitMutWith, VisitWith};
/// Value does not contain TsLit::Bool
type EnumValues = AHashMap<Id, TsLit>;
@ -316,10 +316,7 @@ where
Decl::Var(ref var) => {
let mut names = vec![];
var.decls.visit_with(
&Invalid { span: DUMMY_SP } as _,
&mut VarCollector { to: &mut names },
);
var.decls.visit_with(&mut VarCollector { to: &mut names });
for name in names {
self.store(name.0.clone(), name.1, true);
@ -523,7 +520,7 @@ where
// If a computed method name is encountered, dump the other key
// assignments before it in a sequence expression. Note how this
// always preserves the order of key computations. This
// behaviour is taken from TSC output.
// behavior is taken from TSC output.
key_computations.push(name.expr.take());
name.expr = Box::new(Expr::Seq(SeqExpr {
span: name.span,
@ -1416,24 +1413,24 @@ impl<C> Visit for Strip<C>
where
C: Comments,
{
fn visit_assign_pat_prop(&mut self, n: &AssignPatProp, _: &dyn Node) {
fn visit_assign_pat_prop(&mut self, n: &AssignPatProp) {
if !self.in_var_pat {
n.key.visit_with(n, self);
n.key.visit_with(self);
}
n.value.visit_with(n, self);
n.value.visit_with(self);
}
fn visit_assign_prop(&mut self, n: &AssignProp, _: &dyn Node) {
n.value.visit_with(n, self);
fn visit_assign_prop(&mut self, n: &AssignProp) {
n.value.visit_with(self);
}
fn visit_binding_ident(&mut self, n: &BindingIdent, _: &dyn Node) {
fn visit_binding_ident(&mut self, n: &BindingIdent) {
if !self.in_var_pat {
n.visit_children_with(self)
}
}
fn visit_decl(&mut self, n: &Decl, _: &dyn Node) {
fn visit_decl(&mut self, n: &Decl) {
self.handle_decl(n);
let old = self.non_top_level;
@ -1444,39 +1441,39 @@ where
match n {
Decl::Class(class) => {
self.decl_names.insert(class.ident.to_id());
class.class.visit_with(class, self);
class.class.visit_with(self);
}
Decl::Fn(f) => {
self.decl_names.insert(f.ident.to_id());
f.function.visit_with(f, self)
f.function.visit_with(self)
}
Decl::Var(ref var) => {
for decl in &var.decls {
self.in_var_pat = true;
decl.name.visit_with(decl, self);
decl.name.visit_with(self);
self.in_var_pat = false;
decl.init.visit_with(decl, self);
decl.init.visit_with(self);
}
}
Decl::TsEnum(e) => {
e.members.visit_with(e, self);
e.members.visit_with(self);
}
Decl::TsInterface(interface) => {
interface.extends.visit_with(interface, self);
interface.body.visit_with(interface, self);
interface.extends.visit_with(self);
interface.body.visit_with(self);
}
Decl::TsModule(module) => {
module.body.visit_with(module, self);
module.body.visit_with(self);
}
Decl::TsTypeAlias(alias) => {
alias.type_params.visit_with(alias, self);
alias.type_ann.visit_with(alias, self);
alias.type_params.visit_with(self);
alias.type_ann.visit_with(self);
}
}
self.non_top_level = old;
}
fn visit_ident(&mut self, n: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, n: &Ident) {
let entry = self.scope.referenced_idents.entry(n.to_id()).or_default();
if self.is_type_only_export {
entry.has_type = true;
@ -1496,7 +1493,7 @@ where
n.visit_children_with(self);
}
fn visit_import_decl(&mut self, n: &ImportDecl, _: &dyn Node) {
fn visit_import_decl(&mut self, n: &ImportDecl) {
macro_rules! store {
($i:expr) => {{
self.scope
@ -1517,45 +1514,44 @@ where
}
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_module_items(&mut self, n: &[ModuleItem], _: &dyn Node) {
fn visit_module_items(&mut self, n: &[ModuleItem]) {
let old = self.non_top_level;
self.non_top_level = false;
n.iter().for_each(|n| {
n.visit_with(&Invalid { span: DUMMY_SP }, self);
n.visit_with(self);
});
self.non_top_level = old;
}
fn visit_named_export(&mut self, export: &NamedExport, _: &dyn Node) {
fn visit_named_export(&mut self, export: &NamedExport) {
let old = self.is_type_only_export;
self.is_type_only_export = export.type_only;
export.visit_children_with(self);
self.is_type_only_export = old;
}
fn visit_prop_name(&mut self, n: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, n: &PropName) {
match n {
PropName::Computed(e) => e.visit_with(n, self),
PropName::Computed(e) => e.visit_with(self),
_ => {}
}
}
fn visit_stmts(&mut self, n: &[Stmt], _: &dyn Node) {
fn visit_stmts(&mut self, n: &[Stmt]) {
let old = self.non_top_level;
self.non_top_level = true;
n.iter()
.for_each(|n| n.visit_with(&Invalid { span: DUMMY_SP }, self));
n.iter().for_each(|n| n.visit_with(self));
self.non_top_level = old;
}
fn visit_ts_entity_name(&mut self, name: &TsEntityName, _: &dyn Node) {
fn visit_ts_entity_name(&mut self, name: &TsEntityName) {
match *name {
TsEntityName::Ident(ref i) => {
let entry = self.scope.referenced_idents.entry(i.to_id()).or_default();
@ -1567,11 +1563,11 @@ where
}
}
}
TsEntityName::TsQualifiedName(ref q) => q.left.visit_with(&*q, self),
TsEntityName::TsQualifiedName(ref q) => q.left.visit_with(self),
}
}
fn visit_ts_import_equals_decl(&mut self, n: &TsImportEqualsDecl, _: &dyn Node) {
fn visit_ts_import_equals_decl(&mut self, n: &TsImportEqualsDecl) {
match &n.module_ref {
TsModuleRef::TsEntityName(name) => {
let entry = self
@ -2042,7 +2038,7 @@ where
fn visit_mut_module_items(&mut self, items: &mut Vec<ModuleItem>) {
self.visit_mut_stmt_like(items);
items.visit_with(&Invalid { span: DUMMY_SP }, self);
items.visit_with(self);
let mut stmts = Vec::with_capacity(items.len());
for mut item in take(items) {

View File

@ -27,7 +27,7 @@ pub use swc_common::errors::HANDLER;
use swc_common::{collections::AHashSet, Mark, Span, Spanned, SyntaxContext, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_visit::{
noop_visit_mut_type, noop_visit_type, Node, Visit, VisitMut, VisitMutWith, VisitWith,
noop_visit_mut_type, noop_visit_type, Visit, VisitMut, VisitMutWith, VisitWith,
};
use tracing::trace;
use unicode_xid::UnicodeXID;
@ -49,35 +49,35 @@ impl Visit for ThisVisitor {
noop_visit_type!();
/// Don't recurse into constructor
fn visit_constructor(&mut self, _: &Constructor, _: &dyn Node) {}
fn visit_constructor(&mut self, _: &Constructor) {}
/// Don't recurse into fn
fn visit_fn_decl(&mut self, _: &FnDecl, _: &dyn Node) {}
fn visit_fn_decl(&mut self, _: &FnDecl) {}
/// Don't recurse into fn
fn visit_fn_expr(&mut self, _: &FnExpr, _: &dyn Node) {}
fn visit_fn_expr(&mut self, _: &FnExpr) {}
/// Don't recurse into fn
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
/// Don't recurse into fn
fn visit_getter_prop(&mut self, n: &GetterProp, _: &dyn Node) {
n.key.visit_with(n, self);
fn visit_getter_prop(&mut self, n: &GetterProp) {
n.key.visit_with(self);
}
/// Don't recurse into fn
fn visit_method_prop(&mut self, n: &MethodProp, _: &dyn Node) {
n.key.visit_with(n, self);
n.function.visit_with(n, self);
fn visit_method_prop(&mut self, n: &MethodProp) {
n.key.visit_with(self);
n.function.visit_with(self);
}
/// Don't recurse into fn
fn visit_setter_prop(&mut self, n: &SetterProp, _: &dyn Node) {
n.key.visit_with(n, self);
n.param.visit_with(n, self);
fn visit_setter_prop(&mut self, n: &SetterProp) {
n.key.visit_with(self);
n.param.visit_with(self);
}
fn visit_this_expr(&mut self, _: &ThisExpr, _: &dyn Node) {
fn visit_this_expr(&mut self, _: &ThisExpr) {
self.found = true;
}
}
@ -93,7 +93,7 @@ where
N: VisitWith<ThisVisitor>,
{
let mut visitor = ThisVisitor { found: false };
body.visit_with(&Invalid { span: DUMMY_SP } as _, &mut visitor);
body.visit_with(&mut visitor);
visitor.found
}
@ -105,7 +105,7 @@ where
found: false,
ident,
};
body.visit_with(&Invalid { span: DUMMY_SP } as _, &mut visitor);
body.visit_with(&mut visitor);
visitor.found
}
@ -117,7 +117,7 @@ pub struct IdentFinder<'a> {
impl Visit for IdentFinder<'_> {
noop_visit_type!();
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match *e {
@ -136,7 +136,7 @@ where
N: VisitWith<ArgumentsFinder>,
{
let mut visitor = ArgumentsFinder { found: false };
body.visit_with(&Invalid { span: DUMMY_SP } as _, &mut visitor);
body.visit_with(&mut visitor);
visitor.found
}
@ -148,9 +148,9 @@ impl Visit for ArgumentsFinder {
noop_visit_type!();
/// Don't recurse into constructor
fn visit_constructor(&mut self, _: &Constructor, _: &dyn Node) {}
fn visit_constructor(&mut self, _: &Constructor) {}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
e.visit_children_with(self);
match *e {
@ -165,18 +165,18 @@ impl Visit for ArgumentsFinder {
}
/// Don't recurse into fn
fn visit_function(&mut self, _: &Function, _: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
/// Don't recurse into member expression prop if not computed
fn visit_member_expr(&mut self, m: &MemberExpr, _: &dyn Node) {
m.obj.visit_with(m, self);
fn visit_member_expr(&mut self, m: &MemberExpr) {
m.obj.visit_with(self);
match &*m.prop {
Expr::Ident(_) if !m.computed => {}
_ => m.prop.visit_with(m, self),
_ => m.prop.visit_with(self),
}
}
fn visit_prop(&mut self, n: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, n: &Prop) {
n.visit_children_with(self);
match n {
@ -346,7 +346,7 @@ impl<T> IsEmpty for Vec<T> {
/// Extracts hoisted variables
pub fn extract_var_ids<T: VisitWith<Hoister>>(node: &T) -> Vec<Ident> {
let mut v = Hoister { vars: vec![] };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.vars
}
@ -413,17 +413,17 @@ pub struct Hoister {
impl Visit for Hoister {
noop_visit_type!();
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp, _: &dyn Node) {
node.value.visit_with(node, self);
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) {
node.value.visit_with(self);
self.vars.push(node.key.clone());
}
fn visit_assign_expr(&mut self, node: &AssignExpr, _: &dyn Node) {
fn visit_assign_expr(&mut self, node: &AssignExpr) {
node.right.visit_children_with(self);
}
fn visit_pat(&mut self, p: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, p: &Pat) {
p.visit_children_with(self);
match *p {
@ -432,7 +432,7 @@ impl Visit for Hoister {
}
}
fn visit_var_decl(&mut self, v: &VarDecl, _: &dyn Node) {
fn visit_var_decl(&mut self, v: &VarDecl) {
if v.kind != VarDeclKind::Var {
return;
}
@ -1373,7 +1373,7 @@ pub fn to_int32(d: f64) -> i32 {
pub fn has_rest_pat<T: VisitWith<RestPatVisitor>>(node: &T) -> bool {
let mut v = RestPatVisitor { found: false };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}
@ -1384,7 +1384,7 @@ pub struct RestPatVisitor {
impl Visit for RestPatVisitor {
noop_visit_type!();
fn visit_rest_pat(&mut self, _: &RestPat, _: &dyn Node) {
fn visit_rest_pat(&mut self, _: &RestPat) {
self.found = true;
}
}
@ -1407,7 +1407,7 @@ where
cost: 0,
allow_non_json_value,
};
e.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
e.visit_with(&mut v);
(v.is_lit, v.cost)
}
@ -1421,7 +1421,7 @@ pub struct LiteralVisitor {
impl Visit for LiteralVisitor {
noop_visit_type!();
fn visit_array_lit(&mut self, e: &ArrayLit, _: &dyn Node) {
fn visit_array_lit(&mut self, e: &ArrayLit) {
if !self.is_lit {
return;
}
@ -1437,35 +1437,35 @@ impl Visit for LiteralVisitor {
}
}
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _parent: &dyn Node) {
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {
self.is_lit = false
}
fn visit_assign_expr(&mut self, _: &AssignExpr, _parent: &dyn Node) {
fn visit_assign_expr(&mut self, _: &AssignExpr) {
self.is_lit = false;
}
fn visit_await_expr(&mut self, _: &AwaitExpr, _parent: &dyn Node) {
fn visit_await_expr(&mut self, _: &AwaitExpr) {
self.is_lit = false
}
fn visit_bin_expr(&mut self, _: &BinExpr, _parent: &dyn Node) {
fn visit_bin_expr(&mut self, _: &BinExpr) {
self.is_lit = false
}
fn visit_call_expr(&mut self, _: &CallExpr, _parent: &dyn Node) {
fn visit_call_expr(&mut self, _: &CallExpr) {
self.is_lit = false
}
fn visit_class_expr(&mut self, _: &ClassExpr, _parent: &dyn Node) {
fn visit_class_expr(&mut self, _: &ClassExpr) {
self.is_lit = false
}
fn visit_cond_expr(&mut self, _: &CondExpr, _parent: &dyn Node) {
fn visit_cond_expr(&mut self, _: &CondExpr) {
self.is_lit = false;
}
fn visit_expr(&mut self, e: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, e: &Expr) {
if !self.is_lit {
return;
}
@ -1477,61 +1477,61 @@ impl Visit for LiteralVisitor {
}
}
fn visit_fn_expr(&mut self, _: &FnExpr, _parent: &dyn Node) {
fn visit_fn_expr(&mut self, _: &FnExpr) {
self.is_lit = false;
}
fn visit_invalid(&mut self, _: &Invalid, _parent: &dyn Node) {
fn visit_invalid(&mut self, _: &Invalid) {
self.is_lit = false;
}
fn visit_jsx_element(&mut self, _: &JSXElement, _parent: &dyn Node) {
fn visit_jsx_element(&mut self, _: &JSXElement) {
self.is_lit = false
}
fn visit_jsx_empty_expr(&mut self, _: &JSXEmptyExpr, _parent: &dyn Node) {
fn visit_jsx_empty_expr(&mut self, _: &JSXEmptyExpr) {
self.is_lit = false
}
fn visit_jsx_fragment(&mut self, _: &JSXFragment, _parent: &dyn Node) {
fn visit_jsx_fragment(&mut self, _: &JSXFragment) {
self.is_lit = false
}
fn visit_jsx_member_expr(&mut self, _: &JSXMemberExpr, _parent: &dyn Node) {
fn visit_jsx_member_expr(&mut self, _: &JSXMemberExpr) {
self.is_lit = false
}
fn visit_jsx_namespaced_name(&mut self, _: &JSXNamespacedName, _parent: &dyn Node) {
fn visit_jsx_namespaced_name(&mut self, _: &JSXNamespacedName) {
self.is_lit = false
}
fn visit_member_expr(&mut self, _: &MemberExpr, _parent: &dyn Node) {
fn visit_member_expr(&mut self, _: &MemberExpr) {
self.is_lit = false;
}
fn visit_meta_prop_expr(&mut self, _: &MetaPropExpr, _parent: &dyn Node) {
fn visit_meta_prop_expr(&mut self, _: &MetaPropExpr) {
self.is_lit = false
}
fn visit_new_expr(&mut self, _: &NewExpr, _parent: &dyn Node) {
fn visit_new_expr(&mut self, _: &NewExpr) {
self.is_lit = false
}
fn visit_number(&mut self, node: &Number, _: &dyn Node) {
fn visit_number(&mut self, node: &Number) {
if !self.allow_non_json_value && node.value.is_infinite() {
self.is_lit = false;
}
}
fn visit_opt_chain_expr(&mut self, _: &OptChainExpr, _parent: &dyn Node) {
fn visit_opt_chain_expr(&mut self, _: &OptChainExpr) {
self.is_lit = false
}
fn visit_private_name(&mut self, _: &PrivateName, _parent: &dyn Node) {
fn visit_private_name(&mut self, _: &PrivateName) {
self.is_lit = false
}
fn visit_prop(&mut self, p: &Prop, _: &dyn Node) {
fn visit_prop(&mut self, p: &Prop) {
if !self.is_lit {
return;
}
@ -1546,7 +1546,7 @@ impl Visit for LiteralVisitor {
}
}
fn visit_prop_name(&mut self, node: &PropName, _: &dyn Node) {
fn visit_prop_name(&mut self, node: &PropName) {
if !self.is_lit {
return;
}
@ -1569,39 +1569,39 @@ impl Visit for LiteralVisitor {
}
}
fn visit_seq_expr(&mut self, _: &SeqExpr, _parent: &dyn Node) {
fn visit_seq_expr(&mut self, _: &SeqExpr) {
self.is_lit = false
}
fn visit_spread_element(&mut self, _: &SpreadElement, _parent: &dyn Node) {
fn visit_spread_element(&mut self, _: &SpreadElement) {
self.is_lit = false;
}
fn visit_tagged_tpl(&mut self, _: &TaggedTpl, _parent: &dyn Node) {
fn visit_tagged_tpl(&mut self, _: &TaggedTpl) {
self.is_lit = false
}
fn visit_this_expr(&mut self, _: &ThisExpr, _parent: &dyn Node) {
fn visit_this_expr(&mut self, _: &ThisExpr) {
self.is_lit = false;
}
fn visit_ts_const_assertion(&mut self, _: &TsConstAssertion, _parent: &dyn Node) {
fn visit_ts_const_assertion(&mut self, _: &TsConstAssertion) {
self.is_lit = false
}
fn visit_ts_non_null_expr(&mut self, _: &TsNonNullExpr, _parent: &dyn Node) {
fn visit_ts_non_null_expr(&mut self, _: &TsNonNullExpr) {
self.is_lit = false
}
fn visit_unary_expr(&mut self, _: &UnaryExpr, _parent: &dyn Node) {
fn visit_unary_expr(&mut self, _: &UnaryExpr) {
self.is_lit = false;
}
fn visit_update_expr(&mut self, _: &UpdateExpr, _parent: &dyn Node) {
fn visit_update_expr(&mut self, _: &UpdateExpr) {
self.is_lit = false;
}
fn visit_yield_expr(&mut self, _: &YieldExpr, _parent: &dyn Node) {
fn visit_yield_expr(&mut self, _: &YieldExpr) {
self.is_lit = false
}
}
@ -1837,7 +1837,7 @@ where
{
let mut v = DestructuringFinder { found: &mut found };
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
}
found
@ -1847,14 +1847,14 @@ impl<'a, I: IdentLike> Visit for DestructuringFinder<'a, I> {
noop_visit_type!();
/// No-op (we don't care about expressions)
fn visit_expr(&mut self, _: &Expr, _: &dyn Node) {}
fn visit_expr(&mut self, _: &Expr) {}
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
self.found.push(I::from_ident(i));
}
/// No-op (we don't care about expressions)
fn visit_prop_name(&mut self, _: &PropName, _: &dyn Node) {}
fn visit_prop_name(&mut self, _: &PropName) {}
}
pub fn is_valid_ident(s: &JsWord) -> bool {
@ -1897,17 +1897,17 @@ pub struct UsageFinder<'a> {
impl<'a> Visit for UsageFinder<'a> {
noop_visit_type!();
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
if i.span.ctxt == self.ident.span.ctxt && i.sym == self.ident.sym {
self.found = true;
}
}
fn visit_member_expr(&mut self, e: &MemberExpr, _: &dyn Node) {
e.obj.visit_with(e as _, self);
fn visit_member_expr(&mut self, e: &MemberExpr) {
e.obj.visit_with(self);
if e.computed {
e.prop.visit_with(e as _, self);
e.prop.visit_with(self);
}
}
}
@ -1921,7 +1921,7 @@ impl<'a> UsageFinder<'a> {
ident,
found: false,
};
node.visit_with(&Invalid { span: DUMMY_SP } as _, &mut v);
node.visit_with(&mut v);
v.found
}
}
@ -2175,53 +2175,53 @@ where
{
noop_visit_type!();
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp, _: &dyn Node) {
node.value.visit_with(node, self);
fn visit_assign_pat_prop(&mut self, node: &AssignPatProp) {
node.value.visit_with(self);
if self.is_pat_decl {
self.add(&node.key);
}
}
fn visit_class_decl(&mut self, node: &ClassDecl, _: &dyn Node) {
fn visit_class_decl(&mut self, node: &ClassDecl) {
node.visit_children_with(self);
self.add(&node.ident);
}
fn visit_expr(&mut self, node: &Expr, _: &dyn Node) {
fn visit_expr(&mut self, node: &Expr) {
let old = self.is_pat_decl;
self.is_pat_decl = false;
node.visit_children_with(self);
self.is_pat_decl = old;
}
fn visit_fn_decl(&mut self, node: &FnDecl, _: &dyn Node) {
fn visit_fn_decl(&mut self, node: &FnDecl) {
node.visit_children_with(self);
self.add(&node.ident);
}
fn visit_import_default_specifier(&mut self, node: &ImportDefaultSpecifier, _: &dyn Node) {
fn visit_import_default_specifier(&mut self, node: &ImportDefaultSpecifier) {
self.add(&node.local);
}
fn visit_import_named_specifier(&mut self, node: &ImportNamedSpecifier, _: &dyn Node) {
fn visit_import_named_specifier(&mut self, node: &ImportNamedSpecifier) {
self.add(&node.local);
}
fn visit_import_star_as_specifier(&mut self, node: &ImportStarAsSpecifier, _: &dyn Node) {
fn visit_import_star_as_specifier(&mut self, node: &ImportStarAsSpecifier) {
self.add(&node.local);
}
fn visit_member_expr(&mut self, n: &MemberExpr, _: &dyn Node) {
n.obj.visit_with(n, self);
fn visit_member_expr(&mut self, n: &MemberExpr) {
n.obj.visit_with(self);
if n.computed {
n.prop.visit_with(n, self);
n.prop.visit_with(self);
}
}
fn visit_module_items(&mut self, nodes: &[ModuleItem], _: &dyn Node) {
fn visit_module_items(&mut self, nodes: &[ModuleItem]) {
#[cfg(feature = "concurrent")]
if nodes.len() > 16 {
use rayon::prelude::*;
@ -2233,7 +2233,7 @@ where
bindings: Default::default(),
is_pat_decl: self.is_pat_decl,
};
node.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
node.visit_with(&mut v);
v.bindings
})
.reduce(AHashSet::default, |mut a, b| {
@ -2249,14 +2249,14 @@ where
}
}
fn visit_param(&mut self, node: &Param, _: &dyn Node) {
fn visit_param(&mut self, node: &Param) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
node.visit_children_with(self);
self.is_pat_decl = old;
}
fn visit_pat(&mut self, node: &Pat, _: &dyn Node) {
fn visit_pat(&mut self, node: &Pat) {
node.visit_children_with(self);
if self.is_pat_decl {
@ -2267,7 +2267,7 @@ where
}
}
fn visit_stmts(&mut self, nodes: &[Stmt], _: &dyn Node) {
fn visit_stmts(&mut self, nodes: &[Stmt]) {
#[cfg(feature = "concurrent")]
if nodes.len() > 16 {
use rayon::prelude::*;
@ -2279,7 +2279,7 @@ where
bindings: Default::default(),
is_pat_decl: self.is_pat_decl,
};
node.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
node.visit_with(&mut v);
v.bindings
})
.reduce(AHashSet::default, |mut a, b| {
@ -2295,13 +2295,13 @@ where
}
}
fn visit_var_declarator(&mut self, node: &VarDeclarator, _: &dyn Node) {
fn visit_var_declarator(&mut self, node: &VarDeclarator) {
let old = self.is_pat_decl;
self.is_pat_decl = true;
node.name.visit_with(node, self);
node.name.visit_with(self);
self.is_pat_decl = false;
node.init.visit_with(node, self);
node.init.visit_with(self);
self.is_pat_decl = old;
}
}
@ -2317,7 +2317,7 @@ where
bindings: Default::default(),
is_pat_decl: false,
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.bindings
}
@ -2333,7 +2333,7 @@ where
bindings: Default::default(),
is_pat_decl: false,
};
n.visit_with(&Invalid { span: DUMMY_SP }, &mut v);
n.visit_with(&mut v);
v.bindings
}

View File

@ -1,6 +1,6 @@
use crate::Id;
use swc_ecma_ast::*;
use swc_ecma_visit::{noop_visit_type, Node, Visit, VisitWith};
use swc_ecma_visit::{noop_visit_type, Visit, VisitWith};
/// This collects variables bindings while ignoring if it's nested in
/// expression.
@ -11,23 +11,23 @@ pub struct VarCollector<'a> {
impl Visit for VarCollector<'_> {
noop_visit_type!();
fn visit_arrow_expr(&mut self, _: &ArrowExpr, _parent: &dyn Node) {}
fn visit_arrow_expr(&mut self, _: &ArrowExpr) {}
fn visit_constructor(&mut self, _: &Constructor, _parent: &dyn Node) {}
fn visit_constructor(&mut self, _: &Constructor) {}
fn visit_expr(&mut self, _: &Expr, _parent: &dyn Node) {}
fn visit_expr(&mut self, _: &Expr) {}
fn visit_function(&mut self, _: &Function, _parent: &dyn Node) {}
fn visit_function(&mut self, _: &Function) {}
fn visit_key_value_pat_prop(&mut self, node: &KeyValuePatProp, _parent: &dyn Node) {
node.value.visit_with(node, self);
fn visit_key_value_pat_prop(&mut self, node: &KeyValuePatProp) {
node.value.visit_with(self);
}
fn visit_ident(&mut self, i: &Ident, _: &dyn Node) {
fn visit_ident(&mut self, i: &Ident) {
self.to.push((i.sym.clone(), i.span.ctxt()))
}
fn visit_var_declarator(&mut self, node: &VarDeclarator, _: &dyn Node) {
node.name.visit_with(node, self);
fn visit_var_declarator(&mut self, node: &VarDeclarator) {
node.name.visit_with(self);
}
}

View File

@ -3,17 +3,12 @@
pub extern crate swc_ecma_ast;
use num_bigint::BigInt as BigIntValue;
use std::{any::Any, borrow::Cow, fmt::Debug};
use std::{borrow::Cow, fmt::Debug};
use swc_atoms::JsWord;
use swc_common::{pass::CompilerPass, Span, DUMMY_SP};
use swc_ecma_ast::*;
use swc_visit::{define, AndThen, Repeat, Repeated};
/// Visitable nodes.
pub trait Node: Any {}
impl<T: ?Sized> Node for T where T: Any {}
impl<A, B> Fold for AndThen<A, B>
where
A: Fold,
@ -54,14 +49,14 @@ where
A: Visit,
B: Visit,
{
fn visit_module(&mut self, n: &Module, _parent: &dyn Node) {
self.first.visit_module(n, _parent);
self.second.visit_module(n, _parent);
fn visit_module(&mut self, n: &Module) {
self.first.visit_module(n);
self.second.visit_module(n);
}
fn visit_script(&mut self, n: &Script, _parent: &dyn Node) {
self.first.visit_script(n, _parent);
self.second.visit_script(n, _parent);
fn visit_script(&mut self, n: &Script) {
self.first.visit_script(n);
self.second.visit_script(n);
}
}
@ -157,10 +152,10 @@ macro_rules! assert_eq_ignore_span {
}};
}
/// Implemeented for passes which inject varaibles.
/// Implemented for passes which inject variables.
///
/// If a pass depends on other pass which injects variables, this trait can be
/// used to keep the varaibles.
/// used to keep the variables.
pub trait InjectVars {
fn take_vars(&mut self) -> Vec<VarDeclarator>;
}
@ -362,7 +357,7 @@ macro_rules! noop_fold_type {
macro_rules! noop_visit_type {
($name:ident, $N:tt) => {
#[inline]
fn $name(&mut self, _: &$crate::swc_ecma_ast::$N, _: &dyn $crate::Node) {}
fn $name(&mut self, _: &$crate::swc_ecma_ast::$N) {}
};
() => {
noop_visit_type!(visit_accessibility, Accessibility);

View File

@ -1,8 +1,8 @@
use crate::babelify::{Babelify, Context};
use serde::{Deserialize, Serialize};
use swc_common::{comments::Comment, Span};
use swc_ecma_ast::{Invalid, Module, ModuleItem, Program, Script};
use swc_ecma_visit::{Node, Visit, VisitWith};
use swc_ecma_ast::{Module, ModuleItem, Program, Script};
use swc_ecma_visit::{Visit, VisitWith};
use swc_estree_ast::{
flavor::Flavor, BaseNode, File, InterpreterDirective, LineCol, Loc, ModuleDeclaration,
Program as BabelProgram, SrcType, Statement,
@ -95,7 +95,7 @@ impl Babelify for Script {
/// Babel adds a trailing newline to the end of files when parsing, while swc
/// truncates trailing whitespace. In order to get the converted base node to
/// locations to match babel, we immitate the trailing newline for Script and
/// locations to match babel, we imitate the trailing newline for Script and
/// Module nodes.
fn base_with_trailing_newline(span: Span, ctx: &Context) -> BaseNode {
let mut base = ctx.base(span);
@ -172,12 +172,7 @@ fn extract_all_comments(program: &Program, ctx: &Context) -> Vec<Comment> {
comments: ctx.comments.clone(),
collected: Vec::new(),
};
program.visit_with(
&Invalid {
span: swc_common::DUMMY_SP,
},
&mut collector,
);
program.visit_with(&mut collector);
collector.collected
}
@ -187,7 +182,7 @@ struct CommentCollector {
}
impl Visit for CommentCollector {
fn visit_span(&mut self, sp: &Span, _: &dyn Node) {
fn visit_span(&mut self, sp: &Span) {
let mut span_comments: Vec<Comment> = Vec::new();
// Comments must be deduped since it's possible for a single comment to show up
// multiple times since they are not removed from the comments map.

View File

@ -1,11 +1,6 @@
use std::{any::Any, sync::Arc};
use std::sync::Arc;
use swc_visit::define;
/// Visitable nodes.
pub trait Node: Any {}
impl<T: ?Sized> Node for T where T: Any {}
pub struct Item {
pub item: Option<Arc<Item>>,
pub ref_to_enum: Option<Arc<Enum>>,
@ -33,7 +28,7 @@ define!({
struct Panic;
impl Visit for Panic {
fn visit_item(&mut self, _: &Item, _parent: &dyn Node) {
fn visit_item(&mut self, _: &Item) {
panic!("Success")
}
}

View File

@ -128,7 +128,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
// &'_ mut V, Box<V>
let block = match mode {
Mode::Visit | Mode::VisitAll => {
q!(Vars { visit: &name }, ({ (**self).visit(n, _parent) })).parse()
q!(Vars { visit: &name }, ({ (**self).visit(n) })).parse()
}
Mode::Fold | Mode::VisitMut => {
q!(Vars { visit: &name }, ({ (**self).visit(n) })).parse()
@ -157,8 +157,8 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
Vars { visit: &name },
({
match self {
swc_visit::Either::Left(v) => v.visit(n, _parent),
swc_visit::Either::Right(v) => v.visit(n, _parent),
swc_visit::Either::Left(v) => v.visit(n),
swc_visit::Either::Right(v) => v.visit(n),
}
})
)
@ -190,7 +190,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
Vars { visit: &name },
({
if self.enabled {
self.visitor.visit(n, _parent)
self.visitor.visit(n)
}
})
)
@ -230,8 +230,8 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
block: q!(
Vars { visit: &name },
({
self.visitor.visit(n, _parent);
visit(self, n, _parent);
self.visitor.visit(n);
visit(self, n);
})
)
.parse(),
@ -260,7 +260,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
.parse(),
Mode::Visit => q!(Vars { fn_name: &fn_name }, {
{
fn_name(self, n, _parent)
fn_name(self, n)
}
})
.parse(),
@ -324,11 +324,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
},
{
#[allow(unused_variables)]
pub fn fn_name<V: ?Sized + Trait>(
_visitor: &mut V,
n: Type,
_parent: &dyn Node,
) {
pub fn fn_name<V: ?Sized + Trait>(_visitor: &mut V, n: Type) {
default_body
}
}
@ -452,7 +448,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
let trait_decl = match mode {
Mode::Visit => q!({
pub trait VisitWith<V: Visit> {
fn visit_with(&self, _parent: &dyn Node, v: &mut V);
fn visit_with(&self, v: &mut V);
/// Visit children nodes of self with `v`
fn visit_children_with(&self, v: &mut V);
@ -463,20 +459,19 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
V: Visit,
T: 'static + VisitWith<V>,
{
fn visit_with(&self, _parent: &dyn Node, v: &mut V) {
(**self).visit_with(_parent, v)
fn visit_with(&self, v: &mut V) {
(**self).visit_with(v)
}
/// Visit children nodes of self with `v`
fn visit_children_with(&self, v: &mut V) {
let _parent = self as &dyn Node;
(**self).visit_children_with(v)
}
}
}),
Mode::VisitAll => q!({
pub trait VisitAllWith<V: VisitAll> {
fn visit_all_with(&self, _parent: &dyn Node, v: &mut V);
fn visit_all_with(&self, v: &mut V);
/// Visit children nodes of self with `v`
fn visit_all_children_with(&self, v: &mut V);
@ -487,13 +482,12 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
V: VisitAll,
T: 'static + VisitAllWith<V>,
{
fn visit_all_with(&self, _parent: &dyn Node, v: &mut V) {
(**self).visit_all_with(_parent, v)
fn visit_all_with(&self, v: &mut V) {
(**self).visit_all_with(v)
}
/// Visit children nodes of self with `v`
fn visit_all_children_with(&self, v: &mut V) {
let _parent = self as &dyn Node;
(**self).visit_all_children_with(v)
}
}
@ -573,30 +567,62 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
expr,
method_name: &method_name
},
{ method_name(_visitor, expr, _parent) }
{ method_name(_visitor, expr) }
)
.parse()
});
tokens.push_tokens(&q!(
Vars {
Type: ty,
expr,
default_body,
},
{
if let Some(elem_ty) = extract_generic("Vec", ty) {
tokens.push_tokens(&q!(
Vars {
elem_ty,
expr,
default_body,
},
{
impl<V: Visit> VisitWith<V> for [elem_ty] {
fn visit_with(&self, v: &mut V) {
expr
}
fn visit_children_with(&self, _visitor: &mut V) {
default_body
}
}
}
));
tokens.push_tokens(&q!(Vars { Type: ty }, {
impl<V: Visit> VisitWith<V> for Type {
fn visit_with(&self, _parent: &dyn Node, v: &mut V) {
expr
fn visit_with(&self, v: &mut V) {
(**self).visit_with(v)
}
fn visit_children_with(&self, _visitor: &mut V) {
let _parent = self as &dyn Node;
default_body
(**self).visit_children_with(_visitor)
}
}
}
));
}));
} else {
tokens.push_tokens(&q!(
Vars {
Type: ty,
expr,
default_body,
},
{
impl<V: Visit> VisitWith<V> for Type {
fn visit_with(&self, v: &mut V) {
expr
}
fn visit_children_with(&self, _visitor: &mut V) {
default_body
}
}
}
));
}
}
Mode::VisitAll => {
@ -606,7 +632,7 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
expr,
method_name: &method_name
},
{ method_name(_visitor, expr, _parent) }
{ method_name(_visitor, expr,) }
)
.parse()
});
@ -619,14 +645,13 @@ fn make(mode: Mode, stmts: &[Stmt]) -> Quote {
},
{
impl<V: VisitAll> VisitAllWith<V> for Type {
fn visit_all_with(&self, _parent: &dyn Node, v: &mut V) {
fn visit_all_with(&self, v: &mut V) {
let mut all = ::swc_visit::All { visitor: v };
let mut v = &mut all;
expr
}
fn visit_all_children_with(&self, _visitor: &mut V) {
let _parent = self as &dyn Node;
let mut all = ::swc_visit::All { visitor: _visitor };
let mut _visitor = &mut all;
default_body
@ -768,7 +793,7 @@ fn visit_expr(mode: Mode, ty: &Type, visitor: &Expr, expr: Expr) -> Expr {
expr,
visit_name
},
{ visitor.visit_name(expr, _parent as _) }
{ visitor.visit_name(expr) }
)
.parse(),
})
@ -900,16 +925,6 @@ fn method_sig(mode: Mode, ty: &Type) -> Signature {
p.push_value(q!(Vars { Type: ty }, { n: &Type }).parse());
}
}
match mode {
Mode::Fold | Mode::VisitMut => {
// We can not provide parent node because it's child node is
// part of the parent node.
}
Mode::Visit | Mode::VisitAll => {
p.push_punct(def_site());
p.push_value(q!(Vars {}, { _parent: &dyn Node }).parse());
}
}
p
},
@ -1052,13 +1067,6 @@ fn create_method_sig(mode: Mode, ty: &Type) -> Signature {
p.push_value(q!(Vars {}, { &mut self }).parse());
p.push_punct(def_site());
p.push_value(q!(Vars { Type: ty }, { n: Type }).parse());
match mode {
Mode::Fold | Mode::VisitMut => {}
Mode::Visit | Mode::VisitAll => {
p.push_punct(def_site());
p.push_value(q!(Vars {}, { _parent: &dyn Node }).parse());
}
}
p
},
@ -1239,7 +1247,7 @@ fn create_method_body(mode: Mode, ty: &Type) -> Block {
Mode::Visit | Mode::VisitAll => {
let visit = method_name(mode, ty);
return q!(Vars { visit }, ({ _visitor.visit(n, _parent) })).parse();
return q!(Vars { visit }, ({ _visitor.visit(n) })).parse();
}
Mode::VisitMut => {
return Block {
@ -1340,7 +1348,7 @@ fn create_method_body(mode: Mode, ty: &Type) -> Block {
Vars { ident },
({
match n {
Some(n) => _visitor.ident(n, _parent),
Some(n) => _visitor.ident(n),
None => {}
}
})
@ -1403,9 +1411,8 @@ fn create_method_body(mode: Mode, ty: &Type) -> Block {
Mode::Visit | Mode::VisitAll => q!(
Vars { ident },
({
n.iter().for_each(|v| {
_visitor.ident(v.as_ref(), _parent)
})
n.iter()
.for_each(|v| _visitor.ident(v.as_ref()))
})
)
.parse(),
@ -1431,10 +1438,7 @@ fn create_method_body(mode: Mode, ty: &Type) -> Block {
Mode::Visit | Mode::VisitAll => q!(
Vars { ident },
({
n.iter()
.for_each(|v| _visitor.ident(v, _parent))
})
({ n.iter().for_each(|v| _visitor.ident(v,)) })
)
.parse(),
}

View File

@ -8,7 +8,7 @@ use swc_common::{
};
use swc_ecma_ast::*;
use swc_ecma_utils::{ident::IdentLike, Id, IsEmpty, StmtLike, StmtOrModuleItem};
use swc_ecma_visit::{Node, Visit, VisitMut, VisitMutWith, VisitWith};
use swc_ecma_visit::{Visit, VisitMut, VisitMutWith, VisitWith};
use swc_timer::timer;
/// # Usage
@ -70,7 +70,7 @@ struct Analyzer {
}
impl Visit for Analyzer {
fn visit_call_expr(&mut self, e: &CallExpr, _: &dyn Node) {
fn visit_call_expr(&mut self, e: &CallExpr) {
e.visit_children_with(self);
match &e.callee {
@ -159,9 +159,8 @@ impl ScopeData {
let mut analyzer = Analyzer {
amd_requires: AHashSet::default(),
};
for i in items {
i.visit_with(&Invalid { span: DUMMY_SP }, &mut analyzer);
}
items.visit_with(&mut analyzer);
ScopeData {
imported_ids,

View File

@ -35,6 +35,7 @@
"ctxts",
"declarators",
"dedup",
"deduped",
"dejavu",
"delim",
"Delim",
@ -52,6 +53,7 @@
"eddyb",
"elems",
"esbuild",
"esmodule",
"esms",
"esnext",
"estree",
@ -134,7 +136,8 @@
"Unexported",
"Unexporter",
"unimpl",
"untrusted"
"untrusted",
"variadic"
],
"flagWords": [
"actally"