//===-- AddressResolverFileLine.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/Core/AddressResolverFileLine.h"

// Project includes
#include "lldb/Core/Log.h"
#include "lldb/Core/StreamString.h"
#include "lldb/lldb-private-log.h"

using namespace lldb;
using namespace lldb_private;

//----------------------------------------------------------------------
// AddressResolverFileLine:
//----------------------------------------------------------------------
AddressResolverFileLine::AddressResolverFileLine
(
    const FileSpec &file_spec,
    uint32_t line_no,
    bool check_inlines
) :
    AddressResolver (),
    m_file_spec (file_spec),
    m_line_number (line_no),
    m_inlines (check_inlines)
{
}

AddressResolverFileLine::~AddressResolverFileLine ()
{
}

Searcher::CallbackReturn
AddressResolverFileLine::SearchCallback
(
    SearchFilter &filter,
    SymbolContext &context,
    Address *addr,
    bool containing
)
{
    SymbolContextList sc_list;
    uint32_t sc_list_size;
    CompileUnit *cu = context.comp_unit;

    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));

    sc_list_size = cu->ResolveSymbolContext (m_file_spec, m_line_number, m_inlines, false, eSymbolContextEverything,
                                             sc_list);
    for (uint32_t i = 0; i < sc_list_size; i++)
    {
        SymbolContext sc;
        if (sc_list.GetContextAtIndex(i, sc))
        {
            Address line_start = sc.line_entry.range.GetBaseAddress();
            addr_t byte_size = sc.line_entry.range.GetByteSize();
            if (line_start.IsValid())
            {
                AddressRange new_range (line_start, byte_size);
                m_address_ranges.push_back (new_range);
                if (log)
                {
                    StreamString s;
                    //new_bp_loc->GetDescription (&s, lldb::eDescriptionLevelVerbose);
                    //log->Printf ("Added address: %s\n", s.GetData());
                }
            }
            else
            {
                if (log)
                  log->Printf ("error: Unable to resolve address at file address 0x%llx for %s:%d\n",
                               line_start.GetFileAddress(),
                               m_file_spec.GetFilename().AsCString("<Unknown>"),
                               m_line_number);
            }
        }
    }
    return Searcher::eCallbackReturnContinue;
}

Searcher::Depth
AddressResolverFileLine::GetDepth()
{
    return Searcher::eDepthCompUnit;
}

void
AddressResolverFileLine::GetDescription (Stream *s)
{
    s->Printf ("File and line address - file: \"%s\" line: %u", m_file_spec.GetFilename().AsCString(), m_line_number);
}


