/* GDB variable objects API.
   Copyright (C) 1999-2019 Free Software Foundation, Inc.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#ifndef VAROBJ_H
#define VAROBJ_H 1

#include "symtab.h"
#include "gdbtypes.h"
#include "common/vec.h"
#include "value.h"

/* Enumeration for the format types */
enum varobj_display_formats
  {
    FORMAT_NATURAL,		/* What gdb actually calls 'natural' */
    FORMAT_BINARY,		/* Binary display                    */
    FORMAT_DECIMAL,		/* Decimal display                   */
    FORMAT_HEXADECIMAL,		/* Hex display                       */
    FORMAT_OCTAL,		/* Octal display                     */
    FORMAT_ZHEXADECIMAL		/* Zero padded hexadecimal	     */
  };

enum varobj_type
  {
    USE_SPECIFIED_FRAME,        /* Use the frame passed to varobj_create.  */
    USE_CURRENT_FRAME,          /* Use the current frame.  */
    USE_SELECTED_FRAME          /* Always reevaluate in selected frame.  */
  };

/* Enumerator describing if a variable object is in scope.  */
enum varobj_scope_status
  {
    VAROBJ_IN_SCOPE = 0,        /* Varobj is scope, value available.  */
    VAROBJ_NOT_IN_SCOPE = 1,    /* Varobj is not in scope, value not
				   available, but varobj can become in
				   scope later.  */
    VAROBJ_INVALID = 2,         /* Varobj no longer has any value, and never
				   will.  */
  };

/* String representations of gdb's format codes (defined in varobj.c).  */
extern const char *varobj_format_string[];

/* Struct that describes a variable object instance.  */

struct varobj;

struct varobj_update_result
{
  varobj_update_result (struct varobj *varobj_,
			varobj_scope_status status_ = VAROBJ_IN_SCOPE)
  : varobj (varobj_), status (status_)
  {}

  varobj_update_result (varobj_update_result &&other) = default;

  DISABLE_COPY_AND_ASSIGN (varobj_update_result);

  struct varobj *varobj;
  bool type_changed = false;
  bool children_changed = false;
  bool changed = false;
  enum varobj_scope_status status;
  /* This variable is used internally by varobj_update to indicate if the
     new value of varobj is already computed and installed, or has to
     be yet installed.  Don't use this outside varobj.c.  */
  bool value_installed = false;

  /* This will be non-NULL when new children were added to the varobj.
     It lists the new children (which must necessarily come at the end
     of the child list) added during an update.  The caller is
     responsible for freeing this vector.  */
  std::vector<struct varobj *> newobj;
};

struct varobj_root;
struct varobj_dynamic;

/* Every variable in the system has a structure of this type defined
   for it.  This structure holds all information necessary to manipulate
   a particular object variable.  */
struct varobj
{
  explicit varobj (varobj_root *root_);
  ~varobj ();

  /* Name of the variable for this object.  If this variable is a
     child, then this name will be the child's source name.
     (bar, not foo.bar).  */
  /* NOTE: This is the "expression".  */
  std::string name;

  /* Expression for this child.  Can be used to create a root variable
     corresponding to this child.  */
  std::string path_expr;

  /* The name for this variable's object.  This is here for
     convenience when constructing this object's children.  */
  std::string obj_name;

  /* Index of this variable in its parent or -1.  */
  int index = -1;

  /* The type of this variable.  This can be NULL
     for artificial variable objects -- currently, the "accessibility"
     variable objects in C++.  */
  struct type *type = NULL;

  /* The value of this expression or subexpression.  A NULL value
     indicates there was an error getting this value.
     Invariant: if varobj_value_is_changeable_p (this) is non-zero, 
     the value is either NULL, or not lazy.  */
  value_ref_ptr value;

  /* The number of (immediate) children this variable has.  */
  int num_children = -1;

  /* If this object is a child, this points to its immediate parent.  */
  struct varobj *parent = NULL;

  /* Children of this object.  */
  std::vector<varobj *> children;

  /* Description of the root variable.  Points to root variable for
     children.  */
  struct varobj_root *root;

  /* The format of the output for this object.  */
  enum varobj_display_formats format = FORMAT_NATURAL;

  /* Was this variable updated via a varobj_set_value operation.  */
  bool updated = false;

  /* Last print value.  */
  std::string print_value;

  /* Is this variable frozen.  Frozen variables are never implicitly
     updated by -var-update * 
     or -var-update <direct-or-indirect-parent>.  */
  bool frozen = false;

  /* Is the value of this variable intentionally not fetched?  It is
     not fetched if either the variable is frozen, or any parents is
     frozen.  */
  bool not_fetched = false;

  /* Sub-range of children which the MI consumer has requested.  If
     FROM < 0 or TO < 0, means that all children have been
     requested.  */
  int from = -1;
  int to = -1;

  /* Dynamic part of varobj.  */
  struct varobj_dynamic *dynamic;
};

/* Is the variable X one of our "fake" children?  */
#define CPLUS_FAKE_CHILD(x) \
((x) != NULL && (x)->type == NULL && (x)->value == NULL)

/* The language specific vector */

struct lang_varobj_ops
{
  /* The number of children of PARENT.  */
  int (*number_of_children) (const struct varobj *parent);

  /* The name (expression) of a root varobj.  */
  std::string (*name_of_variable) (const struct varobj *parent);

  /* The name of the INDEX'th child of PARENT.  */
  std::string (*name_of_child) (const struct varobj *parent, int index);

  /* Returns the rooted expression of CHILD, which is a variable
     obtain that has some parent.  */
  std::string (*path_expr_of_child) (const struct varobj *child);

  /* The ``struct value *'' of the INDEX'th child of PARENT.  */
  struct value *(*value_of_child) (const struct varobj *parent, int index);

  /* The type of the INDEX'th child of PARENT.  */
  struct type *(*type_of_child) (const struct varobj *parent, int index);

  /* The current value of VAR.  */
  std::string (*value_of_variable) (const struct varobj *var,
				    enum varobj_display_formats format);

  /* Return true if changes in value of VAR must be detected and
     reported by -var-update.  Return false if -var-update should never
     report changes of such values.  This makes sense for structures
     (since the changes in children values will be reported separately),
     or for artificial objects (like 'public' pseudo-field in C++).

     Return value of false means that gdb need not call value_fetch_lazy
     for the value of this variable object.  */
  bool (*value_is_changeable_p) (const struct varobj *var);

  /* Return true if the type of VAR has mutated.

     VAR's value is still the varobj's previous value, while NEW_VALUE
     is VAR's new value and NEW_TYPE is the var's new type.  NEW_VALUE
     may be NULL indicating that there is no value available (the varobj
     may be out of scope, of may be the child of a null pointer, for
     instance).  NEW_TYPE, on the other hand, must never be NULL.

     This function should also be able to assume that var's number of
     children is set (not < 0).

     Languages where types do not mutate can set this to NULL.  */
  bool (*value_has_mutated) (const struct varobj *var, struct value *new_value,
			     struct type *new_type);

  /* Return true if VAR is a suitable path expression parent.

     For C like languages with anonymous structures and unions an anonymous
     structure or union is not a suitable parent.  */
  bool (*is_path_expr_parent) (const struct varobj *var);
};

extern const struct lang_varobj_ops c_varobj_ops;
extern const struct lang_varobj_ops cplus_varobj_ops;
extern const struct lang_varobj_ops ada_varobj_ops;

#define default_varobj_ops c_varobj_ops
/* API functions */

extern struct varobj *varobj_create (const char *objname,
				     const char *expression, CORE_ADDR frame,
				     enum varobj_type type);

extern std::string varobj_gen_name (void);

extern struct varobj *varobj_get_handle (const char *name);

extern const char *varobj_get_objname (const struct varobj *var);

extern std::string varobj_get_expression (const struct varobj *var);

/* Delete a varobj and all its children if only_children is false, otherwise
   delete only the children.  Return the number of deleted variables.  */

extern int varobj_delete (struct varobj *var, bool only_children);

extern enum varobj_display_formats varobj_set_display_format (
							 struct varobj *var,
					enum varobj_display_formats format);

extern enum varobj_display_formats varobj_get_display_format (
						const struct varobj *var);

extern int varobj_get_thread_id (const struct varobj *var);

extern void varobj_set_frozen (struct varobj *var, bool frozen);

extern bool varobj_get_frozen (const struct varobj *var);

extern void varobj_get_child_range (const struct varobj *var, int *from,
				    int *to);

extern void varobj_set_child_range (struct varobj *var, int from, int to);

extern gdb::unique_xmalloc_ptr<char>
     varobj_get_display_hint (const struct varobj *var);

extern int varobj_get_num_children (struct varobj *var);

/* Return the list of children of VAR.  The returned vector should not
   be modified in any way.  FROM and TO are in/out parameters
   indicating the range of children to return.  If either *FROM or *TO
   is less than zero on entry, then all children will be returned.  On
   return, *FROM and *TO will be updated to indicate the real range
   that was returned.  The resulting VEC will contain at least the
   children from *FROM to just before *TO; it might contain more
   children, depending on whether any more were available.  */
extern const std::vector<varobj *> &
  varobj_list_children (struct varobj *var, int *from, int *to);

extern std::string varobj_get_type (struct varobj *var);

extern struct type *varobj_get_gdb_type (const struct varobj *var);

extern const char *varobj_get_path_expr (const struct varobj *var);

extern const struct language_defn *
  varobj_get_language (const struct varobj *var);

extern int varobj_get_attributes (const struct varobj *var);

extern std::string
  varobj_get_formatted_value (struct varobj *var,
			      enum varobj_display_formats format);

extern std::string varobj_get_value (struct varobj *var);

extern bool varobj_set_value (struct varobj *var, const char *expression);

extern void all_root_varobjs (void (*func) (struct varobj *var, void *data),
			      void *data);

extern std::vector<varobj_update_result>
  varobj_update (struct varobj **varp, bool is_explicit);

extern void varobj_invalidate (void);

extern bool varobj_editable_p (const struct varobj *var);

extern bool varobj_floating_p (const struct varobj *var);

extern void varobj_set_visualizer (struct varobj *var,
				   const char *visualizer);

extern void varobj_enable_pretty_printing (void);

extern bool varobj_has_more (const struct varobj *var, int to);

extern bool varobj_is_dynamic_p (const struct varobj *var);

extern bool varobj_default_value_is_changeable_p (const struct varobj *var);
extern bool varobj_value_is_changeable_p (const struct varobj *var);

extern struct type *varobj_get_value_type (const struct varobj *var);

extern bool varobj_is_anonymous_child (const struct varobj *child);

extern const struct varobj *
  varobj_get_path_expr_parent (const struct varobj *var);

extern std::string
  varobj_value_get_print_value (struct value *value,
				enum varobj_display_formats format,
				const struct varobj *var);

extern void varobj_formatted_print_options (struct value_print_options *opts,
					    enum varobj_display_formats format);

extern void varobj_restrict_range (const std::vector<varobj *> &children,
				   int *from, int *to);

extern bool varobj_default_is_path_expr_parent (const struct varobj *var);

#endif /* VAROBJ_H */
