//===- SourceCoverageViewText.h - A text-based code coverage view ---------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file This file defines the interface to the text-based coverage renderer.
///
//===----------------------------------------------------------------------===//

#ifndef LLVM_COV_SOURCECOVERAGEVIEWTEXT_H
#define LLVM_COV_SOURCECOVERAGEVIEWTEXT_H

#include "SourceCoverageView.h"

namespace llvm {

using namespace coverage;

/// A coverage printer for text output.
class CoveragePrinterText : public CoveragePrinter {
public:
  Expected<OwnedStream> createViewFile(StringRef Path,
                                       bool InToplevel) override;

  void closeViewFile(OwnedStream OS) override;

  Error createIndexFile(ArrayRef<std::string> SourceFiles,
                        const CoverageMapping &Coverage,
                        const CoverageFiltersMatchAll &Filters) override;

  CoveragePrinterText(const CoverageViewOptions &Opts)
      : CoveragePrinter(Opts) {}
};

/// A code coverage view which supports text-based rendering.
class SourceCoverageViewText : public SourceCoverageView {
  void renderViewHeader(raw_ostream &OS) override;

  void renderViewFooter(raw_ostream &OS) override;

  void renderSourceName(raw_ostream &OS, bool WholeFile) override;

  void renderLinePrefix(raw_ostream &OS, unsigned ViewDepth) override;

  void renderLineSuffix(raw_ostream &OS, unsigned ViewDepth) override;

  void renderViewDivider(raw_ostream &OS, unsigned ViewDepth) override;

  void renderLine(raw_ostream &OS, LineRef L, const LineCoverageStats &LCS,
                  unsigned ExpansionCol, unsigned ViewDepth) override;

  void renderExpansionSite(raw_ostream &OS, LineRef L,
                           const LineCoverageStats &LCS, unsigned ExpansionCol,
                           unsigned ViewDepth) override;

  void renderExpansionView(raw_ostream &OS, ExpansionView &ESV,
                           unsigned ViewDepth) override;

  void renderInstantiationView(raw_ostream &OS, InstantiationView &ISV,
                               unsigned ViewDepth) override;

  void renderLineCoverageColumn(raw_ostream &OS,
                                const LineCoverageStats &Line) override;

  void renderLineNumberColumn(raw_ostream &OS, unsigned LineNo) override;

  void renderRegionMarkers(raw_ostream &OS, const LineCoverageStats &Line,
                           unsigned ViewDepth) override;

  void renderTitle(raw_ostream &OS, StringRef Title) override;

  void renderTableHeader(raw_ostream &OS, unsigned FirstUncoveredLineNo,
                         unsigned IndentLevel) override;

public:
  SourceCoverageViewText(StringRef SourceName, const MemoryBuffer &File,
                         const CoverageViewOptions &Options,
                         CoverageData &&CoverageInfo)
      : SourceCoverageView(SourceName, File, Options, std::move(CoverageInfo)) {
  }
};

} // namespace llvm

#endif // LLVM_COV_SOURCECOVERAGEVIEWTEXT_H
