whole_func_string: function() {
      let location = null;
      const args = Array.prototype.slice.call(arguments);
      args.push(docs);
      if (typeof result.preBuild === "function") {
        result.preBuild(arguments);
      }
      if (self.withPositions || self.withSource) {
        let src = null;
        if (self.withSource) {
          src = parser.lexer._input.substring(start.offset, parser.prev[2]);
        }
        if (self.withPositions) {
          location = new Location(
            src,
            start,
            new Position(parser.prev[0], parser.prev[1], parser.prev[2])
          );
        } else {
          location = new Location(src, null, null);
        }
        // last argument is allways the location
        args.push(location);
      }
      // handle lazy kind definitions
      if (!kind) {
        kind = args.shift();
      }
      // build the object
      const node = self[kind];
      if (typeof node !== "function") {
        throw new Error('Undefined node "' + kind + '"');
      }
      const astNode = Object.create(node.prototype);
      node.apply(astNode, args);
      result.instance = astNode;
      if (result.trailingComments) {
        // buffer of trailingComments
        astNode.trailingComments = result.trailingComments;
      }
      if (typeof result.postBuild === "function") {
        result.postBuild(astNode);
      }
      if (parser.debug) {
        delete AST.stack[result.stackUid];
      }
      return self.resolvePrecedence(astNode, parser);
    }
func_code_string: function() {
      let location = null;
      const args = Array.prototype.slice.call(arguments);
      args.push(docs);
      if (typeof result.preBuild === "function") {
        result.preBuild(arguments);
      }
      if (self.withPositions || self.withSource) {
        let src = null;
        if (self.withSource) {
          src = parser.lexer._input.substring(start.offset, parser.prev[2]);
        }
        if (self.withPositions) {
          location = new Location(
            src,
            start,
            new Position(parser.prev[0], parser.prev[1], parser.prev[2])
          );
        } else {
          location = new Location(src, null, null);
        }
        // last argument is allways the location
        args.push(location);
      }
      // handle lazy kind definitions
      if (!kind) {
        kind = args.shift();
      }
      // build the object
      const node = self[kind];
      if (typeof node !== "function") {
        throw new Error('Undefined node "' + kind + '"');
      }
      const astNode = Object.create(node.prototype);
      node.apply(astNode, args);
      result.instance = astNode;
      if (result.trailingComments) {
        // buffer of trailingComments
        astNode.trailingComments = result.trailingComments;
      }
      if (typeof result.postBuild === "function") {
        result.postBuild(astNode);
      }
      if (parser.debug) {
        delete AST.stack[result.stackUid];
      }
      return self.resolvePrecedence(astNode, parser);
    }
func_documentation_string: returns the node