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

#include "ClangPersistentVariables.h"

#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Core/Value.h"

#include "clang/AST/Decl.h"

#include "llvm/ADT/StringMap.h"

using namespace lldb;
using namespace lldb_private;

ClangPersistentVariables::ClangPersistentVariables () :
    lldb_private::PersistentExpressionState(LLVMCastKind::eKindClang),
    m_next_persistent_variable_id (0)
{
}

ExpressionVariableSP
ClangPersistentVariables::CreatePersistentVariable (const lldb::ValueObjectSP &valobj_sp)
{
    return AddNewlyConstructedVariable(new ClangExpressionVariable(valobj_sp));
}

ExpressionVariableSP
ClangPersistentVariables::CreatePersistentVariable (ExecutionContextScope *exe_scope, 
                                                    const ConstString &name, 
                                                    const CompilerType& compiler_type,
                                                    lldb::ByteOrder byte_order, 
                                                    uint32_t addr_byte_size)
{
    return AddNewlyConstructedVariable(new ClangExpressionVariable(exe_scope, name, compiler_type, byte_order, addr_byte_size));
}

void
ClangPersistentVariables::RemovePersistentVariable (lldb::ExpressionVariableSP variable)
{
    RemoveVariable(variable);
    
    const char *name = variable->GetName().AsCString();
    
    if (*name != '$')
        return;
    name++;
    
    if (strtoul(name, NULL, 0) == m_next_persistent_variable_id - 1)
        m_next_persistent_variable_id--;
}

ConstString
ClangPersistentVariables::GetNextPersistentVariableName ()
{
    char name_cstr[256];
    ::snprintf (name_cstr, sizeof(name_cstr), "$%u", m_next_persistent_variable_id++);
    ConstString name(name_cstr);
    return name;
}

void
ClangPersistentVariables::RegisterPersistentDecl (const ConstString &name,
                                                  clang::NamedDecl *decl)
{
    m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(name.GetCString(), decl));
    
    if (clang::EnumDecl *enum_decl = llvm::dyn_cast<clang::EnumDecl>(decl))
    {
        for (clang::EnumConstantDecl *enumerator_decl : enum_decl->enumerators())
        {
            m_persistent_decls.insert(std::pair<const char*, clang::NamedDecl*>(ConstString(enumerator_decl->getNameAsString()).GetCString(), enumerator_decl));
        }
    }
}

clang::NamedDecl *
ClangPersistentVariables::GetPersistentDecl (const ConstString &name)
{
    PersistentDeclMap::const_iterator i = m_persistent_decls.find(name.GetCString());
    
    if (i == m_persistent_decls.end())
        return NULL;
    else
        return i->second;
}
