Home Manual Reference Source Test Repository

src/Doc/TypedefDoc.js

import logger from 'color-logger';
import AbstractDoc from './AbstractDoc.js';
import ParamParser from '../Parser/ParamParser.js';

/**
 * Doc class for virtual comment node of typedef.
 */
export default class TypedefDoc extends AbstractDoc {
  /**
   * apply own tag.
   * @private
   */
  _apply() {
    super._apply();

    this['@typedef']();

    delete this._value.export;
    delete this._value.importPath;
    delete this._value.importStyle;
  }

  /** specify ``typedef`` to kind. */
  ['@_kind']() {
    super['@_kind']();
    if (this._value.kind) return;
    this._value.kind = 'typedef';
  }

  /** set name by using tag. */
  ['@_name']() {
    let tags = this._findAll(['@_name', '@typedef']);
    if (!tags) {
      logger.w(`can not resolve name.`);
      return;
    }

    let name;
    for (let tag of tags) {
      let {tagName, tagValue} = tag;
      if (tagName === '@_name') {
        name = tagValue;
      } else if (tagName === '@typedef') {
        let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(tagValue, true, true, false);
        name = paramName;
      }
    }

    this._value.name = name;
  }

  /** set memberof by using file path. */
  ['@_memberof']() {
    super['@_memberof']();
    if (this._value.memberof) return;

    let memberof;
    let parent = this._node.parent;
    while (parent) {
      if (parent.type === 'ClassDeclaration') {
        memberof = `${this._pathResolver.filePath}~${parent.id.name}`;
        this._value.memberof = memberof;
        return;
      }
      parent = parent.parent;
    }

    this._value.memberof = this._pathResolver.filePath;
  }

  /** for @typedef */
  ['@typedef']() {
    let value = this._findTagValue(['@typedef']);
    if (!value) return;

    let {typeText, paramName, paramDesc} = ParamParser.parseParamValue(value, true, true, false);
    let result = ParamParser.parseParam(typeText, paramName, paramDesc);

    delete result.description;
    delete result.nullable;
    delete result.spread;

    this._value.type = result;
  }
}