//===-- Variable.h ----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#ifndef liblldb_Variable_h_
#define liblldb_Variable_h_

#include <vector>

#include "lldb/lldb-private.h"
#include "lldb/lldb-enumerations.h"
#include "lldb/Core/Mangled.h"
#include "lldb/Core/UserID.h"
#include "lldb/Expression/DWARFExpression.h"
#include "lldb/Symbol/Declaration.h"

namespace lldb_private {

class Variable : public UserID
{
public:
    //------------------------------------------------------------------
    // Constructors and Destructors
    //------------------------------------------------------------------
    Variable (lldb::user_id_t uid,
              const char *name, 
              const char *mangled,   // The mangled variable name for variables in namespaces
              const lldb::SymbolFileTypeSP &symfile_type_sp,
              lldb::ValueType scope,
              SymbolContextScope *owner_scope,
              Declaration* decl,
              const DWARFExpression& location,
              bool external,
              bool artificial);

    virtual
    ~Variable();

    void
    Dump(Stream *s, bool show_context) const;

    bool
    DumpDeclaration (Stream *s, 
                     bool show_fullpaths, 
                     bool show_module);
    
    const Declaration&
    GetDeclaration() const
    {
        return m_declaration;
    }

    const ConstString&
    GetName() const;

    SymbolContextScope *
    GetSymbolContextScope() const
    {
        return m_owner_scope;
    }

    // Since a variable can have a basename "i" and also a mangled 
    // named "_ZN12_GLOBAL__N_11iE" and a demangled mangled name 
    // "(anonymous namespace)::i", this function will allow a generic match
    // function that can be called by commands and expression parsers to make
    // sure we match anything we come across.
    bool
    NameMatches (const ConstString &name) const
    {
        if (m_name == name)
            return true;
        return m_mangled.NameMatches (name);
    }

    bool
    NameMatches (const RegularExpression& regex) const;

    Type *
    GetType();

    lldb::ValueType
    GetScope() const
    {
        return m_scope;
    }

    bool
    IsExternal() const
    {
        return m_external;
    }

    bool
    IsArtificial() const
    {
        return m_artificial;
    }

    DWARFExpression &
    LocationExpression()
    {
        return m_location;
    }

    const DWARFExpression &
    LocationExpression() const
    {
        return m_location;
    }
    
    bool
    DumpLocationForAddress (Stream *s, 
                            const Address &address);

    size_t
    MemorySize() const;

    void
    CalculateSymbolContext (SymbolContext *sc);

    bool
    IsInScope (StackFrame *frame);

    bool
    LocationIsValidForFrame (StackFrame *frame);

    bool
    LocationIsValidForAddress (const Address &address);
    
    bool
    GetLocationIsConstantValueData () const
    {
        return m_loc_is_const_data;
    }
    
    void
    SetLocationIsConstantValueData (bool b)
    {
        m_loc_is_const_data = b;
    }
    
    typedef uint32_t (*GetVariableCallback) (void *baton, 
                                             const char *name,
                                             VariableList &var_list);


    static Error
    GetValuesForVariableExpressionPath (const char *variable_expr_path,
                                        ExecutionContextScope *scope,
                                        GetVariableCallback callback,
                                        void *baton,
                                        VariableList &variable_list,
                                        ValueObjectList &valobj_list);

protected:
    ConstString m_name;                 // The basename of the variable (no namespaces)
    Mangled m_mangled;                  // The mangled name of the variable
    lldb::SymbolFileTypeSP m_symfile_type_sp;   // The type pointer of the variable (int, struct, class, etc)
    lldb::ValueType m_scope;            // global, parameter, local
    SymbolContextScope *m_owner_scope;  // The symbol file scope that this variable was defined in
    Declaration m_declaration;          // Declaration location for this item.
    DWARFExpression m_location;         // The location of this variable that can be fed to DWARFExpression::Evaluate()
    uint8_t m_external:1,               // Visible outside the containing compile unit?
            m_artificial:1,             // Non-zero if the variable is not explicitly declared in source
            m_loc_is_const_data:1;      // The m_location expression contains the constant variable value data, not a DWARF location
private:
    Variable(const Variable& rhs);
    Variable& operator=(const Variable& rhs);
};

} // namespace lldb_private

#endif  // liblldb_Variable_h_
