diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2020-03-28 19:16:57 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-28 14:16:57 -0400 |
commit | 3fac487461abf055165fe0e2bb962573950277b8 (patch) | |
tree | c0ba09a2049975f9eb8625365e3ba395e67d8b50 /cli/doc/module.rs | |
parent | bced52505f32d6cca4f944bb610a8a26767908a8 (diff) |
feat: Add "deno doc" subcommand (#4500)
Diffstat (limited to 'cli/doc/module.rs')
-rw-r--r-- | cli/doc/module.rs | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/cli/doc/module.rs b/cli/doc/module.rs new file mode 100644 index 000000000..e6c97771a --- /dev/null +++ b/cli/doc/module.rs @@ -0,0 +1,189 @@ +// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. +use swc_common; +use swc_common::Spanned; +use swc_ecma_ast; + +use super::parser::DocParser; +use super::DocNode; +use super::DocNodeKind; + +pub fn get_doc_node_for_export_decl( + doc_parser: &DocParser, + export_decl: &swc_ecma_ast::ExportDecl, +) -> DocNode { + let export_span = export_decl.span(); + use swc_ecma_ast::Decl; + + let js_doc = doc_parser.js_doc_for_span(export_span); + let location = doc_parser + .source_map + .lookup_char_pos(export_span.lo()) + .into(); + + match &export_decl.decl { + Decl::Class(class_decl) => { + let (name, class_def) = + super::class::get_doc_for_class_decl(doc_parser, class_decl); + DocNode { + kind: DocNodeKind::Class, + name, + location, + js_doc, + class_def: Some(class_def), + function_def: None, + variable_def: None, + enum_def: None, + type_alias_def: None, + namespace_def: None, + interface_def: None, + } + } + Decl::Fn(fn_decl) => { + let (name, function_def) = + super::function::get_doc_for_fn_decl(doc_parser, fn_decl); + DocNode { + kind: DocNodeKind::Function, + name, + location, + js_doc, + function_def: Some(function_def), + class_def: None, + variable_def: None, + enum_def: None, + type_alias_def: None, + namespace_def: None, + interface_def: None, + } + } + Decl::Var(var_decl) => { + let (name, var_def) = + super::variable::get_doc_for_var_decl(doc_parser, var_decl); + DocNode { + kind: DocNodeKind::Variable, + name, + location, + js_doc, + variable_def: Some(var_def), + function_def: None, + class_def: None, + enum_def: None, + type_alias_def: None, + namespace_def: None, + interface_def: None, + } + } + Decl::TsInterface(ts_interface_decl) => { + let (name, interface_def) = + super::interface::get_doc_for_ts_interface_decl( + doc_parser, + ts_interface_decl, + ); + DocNode { + kind: DocNodeKind::Interface, + name, + location, + js_doc, + interface_def: Some(interface_def), + variable_def: None, + function_def: None, + class_def: None, + enum_def: None, + type_alias_def: None, + namespace_def: None, + } + } + Decl::TsTypeAlias(ts_type_alias) => { + let (name, type_alias_def) = + super::type_alias::get_doc_for_ts_type_alias_decl( + doc_parser, + ts_type_alias, + ); + DocNode { + kind: DocNodeKind::TypeAlias, + name, + location, + js_doc, + type_alias_def: Some(type_alias_def), + interface_def: None, + variable_def: None, + function_def: None, + class_def: None, + enum_def: None, + namespace_def: None, + } + } + Decl::TsEnum(ts_enum) => { + let (name, enum_def) = + super::r#enum::get_doc_for_ts_enum_decl(doc_parser, ts_enum); + DocNode { + kind: DocNodeKind::Enum, + name, + location, + js_doc, + enum_def: Some(enum_def), + type_alias_def: None, + interface_def: None, + variable_def: None, + function_def: None, + class_def: None, + namespace_def: None, + } + } + Decl::TsModule(ts_module) => { + let (name, namespace_def) = + super::namespace::get_doc_for_ts_module(doc_parser, ts_module); + DocNode { + kind: DocNodeKind::Namespace, + name, + location, + js_doc, + namespace_def: Some(namespace_def), + enum_def: None, + type_alias_def: None, + interface_def: None, + variable_def: None, + function_def: None, + class_def: None, + } + } + } +} + +#[allow(unused)] +pub fn get_doc_nodes_for_named_export( + doc_parser: &DocParser, + named_export: &swc_ecma_ast::NamedExport, +) -> Vec<DocNode> { + let file_name = named_export.src.as_ref().expect("").value.to_string(); + // TODO: resolve specifier + let source_code = + std::fs::read_to_string(&file_name).expect("Failed to read file"); + let doc_nodes = doc_parser + .parse(file_name, source_code) + .expect("Failed to print docs"); + let reexports: Vec<String> = named_export + .specifiers + .iter() + .map(|export_specifier| { + use swc_ecma_ast::ExportSpecifier::*; + + match export_specifier { + Named(named_export_specifier) => { + Some(named_export_specifier.orig.sym.to_string()) + } + // TODO: + Namespace(_) => None, + Default(_) => None, + } + }) + .filter(|s| s.is_some()) + .map(|s| s.unwrap()) + .collect(); + + let reexports_docs: Vec<DocNode> = doc_nodes + .into_iter() + .filter(|doc_node| reexports.contains(&doc_node.name)) + .collect(); + + reexports_docs +} |