Skip to content

Commit 2924258

Browse files
authored
refactor(semantic): adding binder for ImportSpecifier replaces the ModuleDeclaration's binder (#2230)
close: #2013
1 parent 3d79d77 commit 2924258

File tree

4 files changed

+65
-1
lines changed

4 files changed

+65
-1
lines changed

crates/oxc_ast/src/ast_kind.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ pub enum AstKind<'a> {
109109
Decorator(&'a Decorator<'a>),
110110

111111
ModuleDeclaration(&'a ModuleDeclaration<'a>),
112+
ImportDeclaration(&'a ImportDeclaration<'a>),
113+
ImportSpecifier(&'a ImportSpecifier),
114+
ImportDefaultSpecifier(&'a ImportDefaultSpecifier),
115+
ImportNamespaceSpecifier(&'a ImportNamespaceSpecifier),
112116

113117
// JSX
114118
// Please make sure to add these to `is_jsx` below.
@@ -422,6 +426,10 @@ impl<'a> GetSpan for AstKind<'a> {
422426
Self::Decorator(x) => x.span,
423427

424428
Self::ModuleDeclaration(x) => x.span(),
429+
Self::ImportDeclaration(x) => x.span,
430+
Self::ImportSpecifier(x) => x.span,
431+
Self::ImportDefaultSpecifier(x) => x.span,
432+
Self::ImportNamespaceSpecifier(x) => x.span,
425433

426434
Self::JSXOpeningElement(x) => x.span,
427435
Self::JSXClosingElement(x) => x.span,
@@ -603,6 +611,10 @@ impl<'a> AstKind<'a> {
603611
Self::Decorator(_) => "Decorator".into(),
604612

605613
Self::ModuleDeclaration(_) => "ModuleDeclaration".into(),
614+
Self::ImportDeclaration(_) => "ImportDeclaration".into(),
615+
Self::ImportSpecifier(_) => "ImportSpecifier".into(),
616+
Self::ImportDefaultSpecifier(_) => "ImportDefaultSpecifier".into(),
617+
Self::ImportNamespaceSpecifier(_) => "ImportNamespaceSpecifier".into(),
606618
Self::JSXOpeningElement(_) => "JSXOpeningElement".into(),
607619
Self::JSXClosingElement(_) => "JSXClosingElement".into(),
608620
Self::JSXElementName(_) => "JSXElementName".into(),

crates/oxc_ast/src/visit.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,13 +1334,16 @@ pub trait Visit<'a>: Sized {
13341334
}
13351335

13361336
fn visit_import_declaration(&mut self, decl: &ImportDeclaration<'a>) {
1337+
let kind = AstKind::ImportDeclaration(self.alloc(decl));
1338+
self.enter_node(kind);
13371339
if let Some(specifiers) = &decl.specifiers {
13381340
for specifier in specifiers {
13391341
self.visit_import_declaration_specifier(specifier);
13401342
}
13411343
}
13421344
self.visit_string_literal(&decl.source);
13431345
// TODO: assertions
1346+
self.leave_node(kind);
13441347
}
13451348

13461349
fn visit_import_declaration_specifier(&mut self, specifier: &ImportDeclarationSpecifier) {
@@ -1358,16 +1361,25 @@ pub trait Visit<'a>: Sized {
13581361
}
13591362

13601363
fn visit_import_specifier(&mut self, specifier: &ImportSpecifier) {
1364+
let kind = AstKind::ImportSpecifier(self.alloc(specifier));
1365+
self.enter_node(kind);
13611366
// TODO: imported
13621367
self.visit_binding_identifier(&specifier.local);
1368+
self.leave_node(kind);
13631369
}
13641370

13651371
fn visit_import_default_specifier(&mut self, specifier: &ImportDefaultSpecifier) {
1372+
let kind = AstKind::ImportDefaultSpecifier(self.alloc(specifier));
1373+
self.enter_node(kind);
13661374
self.visit_binding_identifier(&specifier.local);
1375+
self.leave_node(kind);
13671376
}
13681377

13691378
fn visit_import_name_specifier(&mut self, specifier: &ImportNamespaceSpecifier) {
1379+
let kind = AstKind::ImportNamespaceSpecifier(self.alloc(specifier));
1380+
self.enter_node(kind);
13701381
self.visit_binding_identifier(&specifier.local);
1382+
self.leave_node(kind);
13711383
}
13721384

13731385
fn visit_export_all_declaration(&mut self, _decl: &ExportAllDeclaration<'a>) {}

crates/oxc_ast/src/visit_mut.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1333,13 +1333,16 @@ pub trait VisitMut<'a>: Sized {
13331333
}
13341334

13351335
fn visit_import_declaration(&mut self, decl: &mut ImportDeclaration<'a>) {
1336+
let kind = AstKind::ImportDeclaration(self.alloc(decl));
1337+
self.enter_node(kind);
13361338
if let Some(specifiers) = &mut decl.specifiers {
13371339
for specifier in specifiers.iter_mut() {
13381340
self.visit_import_declaration_specifier(specifier);
13391341
}
13401342
}
1341-
// TODO: source
1343+
self.visit_string_literal(&mut decl.source);
13421344
// TODO: assertions
1345+
self.leave_node(kind);
13431346
}
13441347

13451348
fn visit_import_declaration_specifier(&mut self, specifier: &mut ImportDeclarationSpecifier) {
@@ -1357,16 +1360,25 @@ pub trait VisitMut<'a>: Sized {
13571360
}
13581361

13591362
fn visit_import_specifier(&mut self, specifier: &mut ImportSpecifier) {
1363+
let kind = AstKind::ImportSpecifier(self.alloc(specifier));
1364+
self.enter_node(kind);
13601365
// TODO: imported
13611366
self.visit_binding_identifier(&mut specifier.local);
1367+
self.leave_node(kind);
13621368
}
13631369

13641370
fn visit_import_default_specifier(&mut self, specifier: &mut ImportDefaultSpecifier) {
1371+
let kind = AstKind::ImportDefaultSpecifier(self.alloc(specifier));
1372+
self.enter_node(kind);
13651373
self.visit_binding_identifier(&mut specifier.local);
1374+
self.leave_node(kind);
13661375
}
13671376

13681377
fn visit_import_name_specifier(&mut self, specifier: &mut ImportNamespaceSpecifier) {
1378+
let kind = AstKind::ImportNamespaceSpecifier(self.alloc(specifier));
1379+
self.enter_node(kind);
13691380
self.visit_binding_identifier(&mut specifier.local);
1381+
self.leave_node(kind);
13701382
}
13711383

13721384
fn visit_export_all_declaration(&mut self, _decl: &mut ExportAllDeclaration<'a>) {}

crates/oxc_semantic/src/binder.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,34 @@ impl<'a> Binder for ModuleDeclaration<'a> {
288288
}
289289
}
290290

291+
fn declare_symbol_for_import_specifier(ident: &BindingIdentifier, builder: &mut SemanticBuilder) {
292+
let symbol_id = builder.declare_symbol(
293+
ident.span,
294+
&ident.name,
295+
SymbolFlags::ImportBinding,
296+
SymbolFlags::ImportBindingExcludes,
297+
);
298+
ident.symbol_id.set(Some(symbol_id));
299+
}
300+
301+
impl Binder for ImportSpecifier {
302+
fn bind(&self, builder: &mut SemanticBuilder) {
303+
declare_symbol_for_import_specifier(&self.local, builder);
304+
}
305+
}
306+
307+
impl Binder for ImportDefaultSpecifier {
308+
fn bind(&self, builder: &mut SemanticBuilder) {
309+
declare_symbol_for_import_specifier(&self.local, builder);
310+
}
311+
}
312+
313+
impl Binder for ImportNamespaceSpecifier {
314+
fn bind(&self, builder: &mut SemanticBuilder) {
315+
declare_symbol_for_import_specifier(&self.local, builder);
316+
}
317+
}
318+
291319
impl<'a> Binder for TSTypeAliasDeclaration<'a> {
292320
fn bind(&self, builder: &mut SemanticBuilder) {
293321
let symbol_id = builder.declare_symbol(

0 commit comments

Comments
 (0)