//===- CoverageExporterJson.h - Code coverage JSON exporter ---------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This class implements a code coverage exporter for JSON format.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_COV_COVERAGEEXPORTERJSON_H
#define LLVM_COV_COVERAGEEXPORTERJSON_H
#include "CoverageExporter.h"
#include <stack>
namespace llvm {
class CoverageExporterJson : public CoverageExporter {
/// States that the JSON rendering machine can be in.
enum JsonState { None, NonEmptyElement, EmptyElement };
/// Tracks state of the JSON output.
std::stack<JsonState> State;
/// Emit a serialized scalar.
void emitSerialized(const int64_t Value);
/// Emit a serialized string.
void emitSerialized(const std::string &Value);
/// Emit a comma if there is a previous element to delimit.
void emitComma();
/// Emit a starting dictionary/object character.
void emitDictStart();
/// Emit a dictionary/object key but no value.
void emitDictKey(const std::string &Key);
/// Emit a dictionary/object key/value pair.
template <typename V>
void emitDictElement(const std::string &Key, const V &Value) {
emitComma();
emitSerialized(Key);
OS << ":";
emitSerialized(Value);
}
/// Emit a closing dictionary/object character.
void emitDictEnd();
/// Emit a starting array character.
void emitArrayStart();
/// Emit an array element.
template <typename V> void emitArrayElement(const V &Value) {
emitComma();
emitSerialized(Value);
}
/// emit a closing array character.
void emitArrayEnd();
/// Render an array of all the given functions.
void renderFunctions(
const iterator_range<coverage::FunctionRecordIterator> &Functions);
/// Render an array of all the source files, also pass back a Summary.
void renderFiles(ArrayRef<std::string> SourceFiles,
ArrayRef<FileCoverageSummary> FileReports);
/// Render a single file.
void renderFile(const std::string &Filename,
const FileCoverageSummary &FileReport);
/// Render summary for a single file.
void renderFileCoverage(const coverage::CoverageData &FileCoverage,
const FileCoverageSummary &FileReport);
/// Render a CoverageSegment.
void renderSegment(const coverage::CoverageSegment &Segment);
/// Render an ExpansionRecord.
void renderExpansion(const coverage::ExpansionRecord &Expansion);
/// Render a list of CountedRegions.
void renderRegions(ArrayRef<coverage::CountedRegion> Regions);
/// Render a single CountedRegion.
void renderRegion(const coverage::CountedRegion &Region);
/// Render a FileCoverageSummary.
void renderSummary(const FileCoverageSummary &Summary);
public:
CoverageExporterJson(const coverage::CoverageMapping &CoverageMapping,
const CoverageViewOptions &Options, raw_ostream &OS);
/// Render the CoverageMapping object.
void renderRoot(const CoverageFilters &IgnoreFilenameFilters) override;
/// Render the CoverageMapping object for specified source files.
void renderRoot(const std::vector<std::string> &SourceFiles) override;
};
} // end namespace llvm
#endif // LLVM_COV_COVERAGEEXPORTERJSON_H