1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
use serde::Serialize;

use crate::ts_type::ts_type_ann_to_def;
use crate::ts_type::TsTypeDef;

#[derive(Debug, Serialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct VariableDef {
  pub ts_type: Option<TsTypeDef>,
  pub kind: swc_ecmascript::ast::VarDeclKind,
}

// TODO: change this function to return Vec<(String, VariableDef)> as single
// var declaration can have multiple declarators
pub fn get_doc_for_var_decl(
  var_decl: &swc_ecmascript::ast::VarDecl,
) -> (String, VariableDef) {
  assert!(!var_decl.decls.is_empty());
  let var_declarator = var_decl.decls.get(0).unwrap();
  let var_name = match &var_declarator.name {
    swc_ecmascript::ast::Pat::Ident(ident) => ident.sym.to_string(),
    _ => "<TODO>".to_string(),
  };

  let maybe_ts_type = match &var_declarator.name {
    swc_ecmascript::ast::Pat::Ident(ident) => {
      ident.type_ann.as_ref().map(|rt| ts_type_ann_to_def(rt))
    }
    _ => None,
  };

  let variable_def = VariableDef {
    ts_type: maybe_ts_type,
    kind: var_decl.kind,
  };

  (var_name, variable_def)
}