diff options
author | Luca Casonato <lucacasonato@yahoo.com> | 2020-04-14 00:28:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-14 00:28:49 +0200 |
commit | c915e4d77d22a964b15b02834dd57f9294a3cc29 (patch) | |
tree | bdf3f43eeaf8756326ee72f3dc381fc261d41cb2 | |
parent | a9923f3f93f8786388d84313666f0fc11113830f (diff) |
fix(doc): Added extends field to interface (#4739)
-rw-r--r-- | cli/doc/class.rs | 6 | ||||
-rw-r--r-- | cli/doc/interface.rs | 10 | ||||
-rw-r--r-- | cli/doc/printer.rs | 22 | ||||
-rw-r--r-- | cli/doc/tests.rs | 18 |
4 files changed, 42 insertions, 14 deletions
diff --git a/cli/doc/class.rs b/cli/doc/class.rs index 3d66a094e..004be9e74 100644 --- a/cli/doc/class.rs +++ b/cli/doc/class.rs @@ -64,7 +64,7 @@ pub struct ClassDef { pub constructors: Vec<ClassConstructorDef>, pub properties: Vec<ClassPropertyDef>, pub methods: Vec<ClassMethodDef>, - pub super_class: Option<String>, + pub extends: Option<String>, pub implements: Vec<String>, pub type_params: Vec<TsTypeParamDef>, } @@ -92,7 +92,7 @@ pub fn get_doc_for_class_decl( let mut methods = vec![]; let mut properties = vec![]; - let super_class: Option<String> = match &class_decl.class.super_class { + let extends: Option<String> = match &class_decl.class.super_class { Some(boxed) => { use crate::swc_ecma_ast::Expr; let expr: &Expr = &**boxed; @@ -217,7 +217,7 @@ pub fn get_doc_for_class_decl( let class_name = class_decl.ident.sym.to_string(); let class_def = ClassDef { is_abstract: class_decl.class.is_abstract, - super_class, + extends, implements, constructors, properties, diff --git a/cli/doc/interface.rs b/cli/doc/interface.rs index 0e4173d18..dd9acc650 100644 --- a/cli/doc/interface.rs +++ b/cli/doc/interface.rs @@ -4,6 +4,7 @@ use serde::Serialize; use super::params::ts_fn_param_to_param_def; use super::parser::DocParser; +use super::ts_type::ts_entity_name_to_name; use super::ts_type::ts_type_ann_to_def; use super::ts_type::TsTypeDef; use super::ts_type_param::maybe_type_param_decl_to_type_param_defs; @@ -49,7 +50,7 @@ pub struct InterfaceCallSignatureDef { #[derive(Debug, Serialize, Clone)] #[serde(rename_all = "camelCase")] pub struct InterfaceDef { - // TODO(bartlomieju): extends + pub extends: Vec<String>, pub methods: Vec<InterfaceMethodDef>, pub properties: Vec<InterfacePropertyDef>, pub call_signatures: Vec<InterfaceCallSignatureDef>, @@ -201,7 +202,14 @@ pub fn get_doc_for_ts_interface_decl( interface_decl.type_params.as_ref(), ); + let extends: Vec<String> = interface_decl + .extends + .iter() + .map(|expr| ts_entity_name_to_name(&expr.expr)) + .collect(); + let interface_def = InterfaceDef { + extends, methods, properties, call_signatures, diff --git a/cli/doc/printer.rs b/cli/doc/printer.rs index 25277a636..7a6b9e731 100644 --- a/cli/doc/printer.rs +++ b/cli/doc/printer.rs @@ -444,11 +444,11 @@ fn format_function_signature(node: &doc::DocNode, indent: i64) -> String { fn format_class_signature(node: &doc::DocNode, indent: i64) -> String { let class_def = node.class_def.clone().unwrap(); - let super_suffix = if let Some(super_class) = class_def.super_class { + let extends_suffix = if let Some(extends) = class_def.extends { format!( " {} {}", colors::magenta("extends".to_string()), - colors::bold(super_class) + colors::bold(extends) ) } else { String::from("") @@ -470,7 +470,7 @@ fn format_class_signature(node: &doc::DocNode, indent: i64) -> String { "{} {}{}{}\n", colors::magenta("class".to_string()), colors::bold(node.name.clone()), - super_suffix, + extends_suffix, implements_suffix, ), indent, @@ -510,11 +510,23 @@ fn format_enum_signature(node: &doc::DocNode, indent: i64) -> String { } fn format_interface_signature(node: &doc::DocNode, indent: i64) -> String { + let interface_def = node.interface_def.clone().unwrap(); + let extends = &interface_def.extends; + let extends_suffix = if !extends.is_empty() { + format!( + " {} {}", + colors::magenta("extends".to_string()), + colors::bold(extends.join(", ")) + ) + } else { + String::from("") + }; add_indent( format!( - "{} {}\n", + "{} {}{}\n", colors::magenta("interface".to_string()), - colors::bold(node.name.clone()) + colors::bold(node.name.clone()), + extends_suffix ), indent, ) diff --git a/cli/doc/tests.rs b/cli/doc/tests.rs index 9a9ac8e02..d87aafcca 100644 --- a/cli/doc/tests.rs +++ b/cli/doc/tests.rs @@ -316,7 +316,7 @@ export class Foobar extends Fizz implements Buzz, Aldrin { "jsDoc": "Class doc", "classDef": { "isAbstract": false, - "superClass": "Fizz", + "extends": "Fizz", "implements": ["Buzz", "Aldrin"], "typeParams": [], "constructors": [ @@ -522,10 +522,16 @@ export class Foobar extends Fizz implements Buzz, Aldrin { #[tokio::test] async fn export_interface() { let source_code = r#" +interface Foo { + foo(): void; +} +interface Bar { + bar(): void; +} /** * Interface js doc */ -export interface Reader { +export interface Reader extends Foo, Bar { /** Read n bytes */ read?(buf: Uint8Array, something: unknown): Promise<number> } @@ -540,17 +546,18 @@ export interface Reader { "name": "Reader", "location": { "filename": "test.ts", - "line": 5, + "line": 11, "col": 0 }, "jsDoc": "Interface js doc", "interfaceDef": { + "extends": ["Foo", "Bar"], "methods": [ { "name": "read", "location": { "filename": "test.ts", - "line": 7, + "line": 13, "col": 4 }, "optional": true, @@ -607,7 +614,7 @@ export interface Reader { assert!( colors::strip_ansi_codes(super::printer::format(entries).as_str()) - .contains("interface Reader") + .contains("interface Reader extends Foo, Bar") ); } @@ -633,6 +640,7 @@ export interface TypedIface<T> { }, "jsDoc": null, "interfaceDef": { + "extends": [], "methods": [ { "name": "something", |