//===- SourceFile.h - Class to represent a source code file -----*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file was developed by the LLVM research group and is distributed under
// the University of Illinois Open Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the SourceFile class which is used to represent a single
// file of source code in the program, caching data from the file to make access
// efficient.
//
//===----------------------------------------------------------------------===//

#ifndef LLVM_DEBUGGER_SOURCEFILE_H
#define LLVM_DEBUGGER_SOURCEFILE_H

#include "llvm/System/Path.h"
#include "llvm/System/MappedFile.h"
#include <vector>

namespace llvm {
  class GlobalVariable;

  class SourceFile {
    /// Filename - This is the full path of the file that is loaded.
    ///
    sys::Path Filename;

    /// Descriptor - The debugging descriptor for this source file.  If there
    /// are multiple descriptors for the same file, this is just the first one
    /// encountered.
    ///
    const GlobalVariable *Descriptor;

    /// This is the memory mapping for the file so we can gain access to it.
    sys::MappedFile File;

    /// LineOffset - This vector contains a mapping from source line numbers to
    /// their offsets in the file.  This data is computed lazily, the first time
    /// it is asked for.  If there are zero elements allocated in this vector,
    /// then it has not yet been computed.
    mutable std::vector<unsigned> LineOffset;

  public:
    /// SourceFile constructor - Read in the specified source file if it exists,
    /// but do not build the LineOffsets table until it is requested.  This will
    /// NOT throw an exception if the file is not found, if there is an error
    /// reading it, or if the user cancels the operation.  Instead, it will just
    /// be an empty source file.
    SourceFile(const std::string &fn, const GlobalVariable *Desc)
      : Filename(fn), Descriptor(Desc), File(Filename) {
      readFile();
    }
    ~SourceFile() {
      File.unmap();
    }

    /// getDescriptor - Return the debugging decriptor for this source file.
    ///
    const GlobalVariable *getDescriptor() const { return Descriptor; }

    /// getFilename - Return the fully resolved path that this file was loaded
    /// from.
    const std::string &getFilename() const { return Filename.toString(); }

    /// getSourceLine - Given a line number, return the start and end of the
    /// line in the file.  If the line number is invalid, or if the file could
    /// not be loaded, null pointers are returned for the start and end of the
    /// file.  Note that line numbers start with 0, not 1.  This also strips off
    /// any newlines from the end of the line, to ease formatting of the text.
    void getSourceLine(unsigned LineNo, const char *&LineStart,
                       const char *&LineEnd) const;

    /// getNumLines - Return the number of lines the source file contains.
    ///
    unsigned getNumLines() const {
      if (LineOffset.empty()) calculateLineOffsets();
      return LineOffset.size();
    }

  private:
    /// readFile - Load Filename into memory
    ///
    void readFile();

    /// calculateLineOffsets - Compute the LineOffset vector for the current
    /// file.
    void calculateLineOffsets() const;
  };
} // end namespace llvm

#endif
