diff options
Diffstat (limited to 'cli/doc/parser.rs')
-rw-r--r-- | cli/doc/parser.rs | 87 |
1 files changed, 84 insertions, 3 deletions
diff --git a/cli/doc/parser.rs b/cli/doc/parser.rs index e185e5bff..2247c6877 100644 --- a/cli/doc/parser.rs +++ b/cli/doc/parser.rs @@ -2,7 +2,6 @@ use crate::file_fetcher::map_file_extension; use crate::op_error::OpError; use crate::swc_util::AstParser; -use crate::swc_util::SwcDiagnosticBuffer; use swc_common::comments::CommentKind; use swc_common::Span; use swc_ecmascript::ast::Decl; @@ -23,6 +22,7 @@ use super::node; use super::node::ModuleDoc; use super::DocNode; use super::DocNodeKind; +use super::ImportDef; use super::Location; pub trait DocFileLoader { @@ -59,14 +59,18 @@ impl DocParser { &self, file_name: &str, source_code: &str, - ) -> Result<ModuleDoc, SwcDiagnosticBuffer> { + ) -> Result<ModuleDoc, ErrBox> { let media_type = map_file_extension(&PathBuf::from(file_name)); let parse_result = self .ast_parser .parse_module(file_name, media_type, source_code); let module = parse_result?; - let doc_entries = self.get_doc_nodes_for_module_body(module.body.clone()); + let mut doc_entries = + self.get_doc_nodes_for_module_body(module.body.clone()); + let import_doc_entries = + self.get_doc_nodes_for_module_imports(module.body.clone(), file_name)?; + doc_entries.extend(import_doc_entries); let reexports = self.get_reexports_for_module_body(module.body); let module_doc = ModuleDoc { definitions: doc_entries, @@ -138,6 +142,7 @@ impl DocParser { variable_def: None, function_def: None, class_def: None, + import_def: None, }; processed_reexports.push(ns_doc_node); } @@ -193,6 +198,72 @@ impl DocParser { Ok(flattened_docs) } + fn get_doc_nodes_for_module_imports( + &self, + module_body: Vec<swc_ecmascript::ast::ModuleItem>, + referrer: &str, + ) -> Result<Vec<DocNode>, ErrBox> { + let mut imports = vec![]; + + for node in module_body.iter() { + if let swc_ecmascript::ast::ModuleItem::ModuleDecl(module_decl) = node { + if let ModuleDecl::Import(import_decl) = module_decl { + let (js_doc, location) = self.details_for_span(import_decl.span); + for specifier in &import_decl.specifiers { + use swc_ecmascript::ast::ImportSpecifier::*; + + let (name, maybe_imported_name, src) = match specifier { + Named(named_specifier) => ( + named_specifier.local.sym.to_string(), + named_specifier + .imported + .as_ref() + .map(|ident| ident.sym.to_string()) + .or_else(|| Some(named_specifier.local.sym.to_string())), + import_decl.src.value.to_string(), + ), + Default(default_specifier) => ( + default_specifier.local.sym.to_string(), + Some("default".to_string()), + import_decl.src.value.to_string(), + ), + Namespace(namespace_specifier) => ( + namespace_specifier.local.sym.to_string(), + None, + import_decl.src.value.to_string(), + ), + }; + + let resolved_specifier = self.loader.resolve(&src, referrer)?; + let import_def = ImportDef { + src: resolved_specifier.to_string(), + imported: maybe_imported_name, + }; + + let doc_node = DocNode { + kind: DocNodeKind::Import, + name, + location: location.clone(), + js_doc: js_doc.clone(), + import_def: Some(import_def), + class_def: None, + function_def: None, + variable_def: None, + enum_def: None, + type_alias_def: None, + namespace_def: None, + interface_def: None, + }; + + imports.push(doc_node); + } + } + } + } + + Ok(imports) + } + pub fn get_doc_nodes_for_module_exports( &self, module_decl: &ModuleDecl, @@ -225,6 +296,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: None, + import_def: None, } } DefaultDecl::Fn(fn_expr) => { @@ -244,6 +316,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: None, + import_def: None, } } DefaultDecl::TsInterfaceDecl(interface_decl) => { @@ -264,6 +337,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: Some(interface_def), + import_def: None, } } }; @@ -309,6 +383,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: None, + import_def: None, }) } Decl::Fn(fn_decl) => { @@ -330,6 +405,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: None, + import_def: None, }) } Decl::Var(var_decl) => { @@ -350,6 +426,7 @@ impl DocParser { type_alias_def: None, namespace_def: None, interface_def: None, + import_def: None, }) } Decl::TsInterface(ts_interface_decl) => { @@ -374,6 +451,7 @@ impl DocParser { enum_def: None, type_alias_def: None, namespace_def: None, + import_def: None, }) } Decl::TsTypeAlias(ts_type_alias) => { @@ -398,6 +476,7 @@ impl DocParser { class_def: None, enum_def: None, namespace_def: None, + import_def: None, }) } Decl::TsEnum(ts_enum) => { @@ -419,6 +498,7 @@ impl DocParser { function_def: None, class_def: None, namespace_def: None, + import_def: None, }) } Decl::TsModule(ts_module) => { @@ -440,6 +520,7 @@ impl DocParser { variable_def: None, function_def: None, class_def: None, + import_def: None, }) } } |