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

#include "lldb/Symbol/CompilerDeclContext.h"
#include "lldb/Symbol/CompilerDecl.h"
#include "lldb/Symbol/TypeSystem.h"
#include <vector>

using namespace lldb_private;

std::vector<CompilerDecl>
CompilerDeclContext::FindDeclByName (ConstString name, const bool ignore_using_decls)
{
    if (IsValid())
        return m_type_system->DeclContextFindDeclByName(
            m_opaque_decl_ctx, name, ignore_using_decls);
    else
        return std::vector<CompilerDecl>();
}

bool
CompilerDeclContext::IsClang () const
{
    return IsValid() && m_type_system->getKind() == TypeSystem::eKindClang;
}

ConstString
CompilerDeclContext::GetName () const
{
    if (IsValid())
        return m_type_system->DeclContextGetName(m_opaque_decl_ctx);
    else
        return ConstString();
}

ConstString
CompilerDeclContext::GetScopeQualifiedName () const
{
    if (IsValid())
        return m_type_system->DeclContextGetScopeQualifiedName(m_opaque_decl_ctx);
    else
        return ConstString();
}

bool
CompilerDeclContext::IsStructUnionOrClass () const
{
    if (IsValid())
        return m_type_system->DeclContextIsStructUnionOrClass(m_opaque_decl_ctx);
    else
        return false;
}

bool
CompilerDeclContext::IsClassMethod (lldb::LanguageType *language_ptr,
                                    bool *is_instance_method_ptr,
                                    ConstString *language_object_name_ptr)
{
    if (IsValid())
        return m_type_system->DeclContextIsClassMethod (m_opaque_decl_ctx,
                                                        language_ptr,
                                                        is_instance_method_ptr,
                                                        language_object_name_ptr);
    else
        return false;
}

bool
lldb_private::operator == (const lldb_private::CompilerDeclContext &lhs, const lldb_private::CompilerDeclContext &rhs)
{
    return lhs.GetTypeSystem() == rhs.GetTypeSystem() && lhs.GetOpaqueDeclContext() == rhs.GetOpaqueDeclContext();
}


bool
lldb_private::operator != (const lldb_private::CompilerDeclContext &lhs, const lldb_private::CompilerDeclContext &rhs)
{
    return lhs.GetTypeSystem() != rhs.GetTypeSystem() || lhs.GetOpaqueDeclContext() != rhs.GetOpaqueDeclContext();
}
