_createDoc(node, tags) {
    const result = this._decideType(tags, node);
    const type = result.type;
    node = result.node;

    if (!type) return null;

    if (type === 'Class') {
      this._processedClassNodes.push(node);
    }

    let Clazz;
    /* eslint-disable max-statements-per-line */
    switch (type) {
      case 'Class': Clazz = ClassDoc; break;
      case 'Method': Clazz = MethodDoc; break;
      case 'ClassProperty': Clazz = ClassProperty; break;
      case 'Member': Clazz = MemberDoc; break;
      case 'Function': Clazz = FunctionDoc; break;
      case 'Variable': Clazz = VariableDoc; break;
      case 'Assignment': Clazz = AssignmentDoc; break;
      case 'Typedef': Clazz = TypedefDoc; break;
      case 'External': Clazz = ExternalDoc; break;
      default:
        throw new Error(`unexpected type: ${type}`);
    }

    if (!Clazz) return null;
    if (!node.type) node.type = type;

    return new Clazz(this._ast, node, this._pathResolver, tags);
  }
create Doc.
@param {ASTNode} node - target node.
@param {Tag[]} tags - tags of target node.
@returns {AbstractDoc} created Doc.
@private