Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 15 additions & 10 deletions clang-tools-extra/clang-doc/BitcodeReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@

#include "BitcodeReader.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/TimeProfiler.h"
#include "llvm/Support/raw_ostream.h"
#include <optional>

namespace clang {
namespace doc {

static llvm::ExitOnError ExitOnErr("clang-doc error: ");

using Record = llvm::SmallVector<uint64_t, 1024>;

// This implements decode for SmallString.
Expand Down Expand Up @@ -716,8 +719,8 @@ llvm::Error addReference(FriendInfo *Friend, Reference &&R, FieldId F) {

template <typename T, typename ChildInfoType>
static void addChild(T I, ChildInfoType &&R) {
llvm::errs() << "invalid child type for info";
exit(1);
ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid child type for info"));
}

// Namespace children:
Expand Down Expand Up @@ -766,8 +769,9 @@ template <> void addChild(BaseRecordInfo *I, FunctionInfo &&R) {
// parameters) or TemplateSpecializationInfo (for the specialization's
// parameters).
template <typename T> static void addTemplateParam(T I, TemplateParamInfo &&P) {
llvm::errs() << "invalid container for template parameter";
exit(1);
ExitOnErr(
llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid container for template parameter"));
}
template <> void addTemplateParam(TemplateInfo *I, TemplateParamInfo &&P) {
I->Params.emplace_back(std::move(P));
Expand All @@ -779,8 +783,8 @@ void addTemplateParam(TemplateSpecializationInfo *I, TemplateParamInfo &&P) {

// Template info. These apply to either records or functions.
template <typename T> static void addTemplate(T I, TemplateInfo &&P) {
llvm::errs() << "invalid container for template info";
exit(1);
ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid container for template info"));
}
template <> void addTemplate(RecordInfo *I, TemplateInfo &&P) {
I->Template.emplace(std::move(P));
Expand All @@ -798,8 +802,9 @@ template <> void addTemplate(FriendInfo *I, TemplateInfo &&P) {
// Template specializations go only into template records.
template <typename T>
static void addTemplateSpecialization(T I, TemplateSpecializationInfo &&TSI) {
llvm::errs() << "invalid container for template specialization info";
exit(1);
ExitOnErr(llvm::createStringError(
llvm::inconvertibleErrorCode(),
"invalid container for template specialization info"));
}
template <>
void addTemplateSpecialization(TemplateInfo *I,
Expand All @@ -808,8 +813,8 @@ void addTemplateSpecialization(TemplateInfo *I,
}

template <typename T> static void addConstraint(T I, ConstraintInfo &&C) {
llvm::errs() << "invalid container for constraint info";
exit(1);
ExitOnErr(llvm::createStringError(llvm::inconvertibleErrorCode(),
"invalid container for constraint info"));
}
template <> void addConstraint(TemplateInfo *I, ConstraintInfo &&C) {
I->Constraints.emplace_back(std::move(C));
Expand Down
4 changes: 3 additions & 1 deletion clang-tools-extra/clang-doc/BitcodeReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ namespace doc {
// Class to read bitstream into an InfoSet collection
class ClangDocBitcodeReader {
public:
ClangDocBitcodeReader(llvm::BitstreamCursor &Stream) : Stream(Stream) {}
ClangDocBitcodeReader(llvm::BitstreamCursor &Stream, DiagnosticsEngine &Diags)
: Stream(Stream), Diags(Diags) {}

// Main entry point, calls readBlock to read each block in the given stream.
llvm::Expected<std::vector<std::unique_ptr<Info>>> readBitcode();
Expand Down Expand Up @@ -72,6 +73,7 @@ class ClangDocBitcodeReader {
llvm::BitstreamCursor &Stream;
std::optional<llvm::BitstreamBlockInfo> BlockInfo;
FieldId CurrentReferenceField;
DiagnosticsEngine &Diags;
};

} // namespace doc
Expand Down
4 changes: 3 additions & 1 deletion clang-tools-extra/clang-doc/BitcodeWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -769,7 +769,9 @@ bool ClangDocBitcodeWriter::dispatchInfoForWrite(Info *I) {
emitBlock(*static_cast<FriendInfo *>(I));
break;
case InfoType::IT_default:
llvm::errs() << "Unexpected info, unable to write.\n";
unsigned ID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
"Unexpected info, unable to write.");
Diags.Report(ID);
return true;
}
return false;
Expand Down
5 changes: 4 additions & 1 deletion clang-tools-extra/clang-doc/BitcodeWriter.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_BITCODEWRITER_H

#include "Representation.h"
#include "clang/Basic/Diagnostic.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Bitstream/BitstreamWriter.h"
#include <vector>
Expand Down Expand Up @@ -175,7 +176,8 @@ enum class FieldId {

class ClangDocBitcodeWriter {
public:
ClangDocBitcodeWriter(llvm::BitstreamWriter &Stream) : Stream(Stream) {
ClangDocBitcodeWriter(llvm::BitstreamWriter &Stream, DiagnosticsEngine &Diags)
: Stream(Stream), Diags(Diags) {
emitHeader();
emitBlockInfoBlock();
emitVersionBlock();
Expand Down Expand Up @@ -260,6 +262,7 @@ class ClangDocBitcodeWriter {
SmallVector<uint32_t, BitCodeConstants::RecordSize> Record;
llvm::BitstreamWriter &Stream;
AbbreviationMap Abbrevs;
DiagnosticsEngine &Diags;
};

} // namespace doc
Expand Down
9 changes: 5 additions & 4 deletions clang-tools-extra/clang-doc/Generators.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -121,10 +121,11 @@ Error MustacheGenerator::generateDocumentation(

auto File = MemoryBuffer::getFile(Path);
if (EC = File.getError(); EC) {
// TODO: Buffer errors to report later, look into using Clang
// diagnostics.
llvm::errs() << "Failed to open file: " << Path << " " << EC.message()
<< '\n';
unsigned ID = CDCtx.Diags.getCustomDiagID(DiagnosticsEngine::Warning,
"Failed to open file: %0 %1");
CDCtx.Diags.Report(ID) << Path << EC.message();
JSONIter.increment(EC);
continue;
}

auto Parsed = json::parse((*File)->getBuffer());
Expand Down
1 change: 1 addition & 0 deletions clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include "Generators.h"
#include "Representation.h"
#include "support/File.h"
#include "clang/Basic/Diagnostic.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/Path.h"

Expand Down
4 changes: 2 additions & 2 deletions clang-tools-extra/clang-doc/Mapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,10 +95,10 @@ bool MapASTVisitor::mapDecl(const T *D, bool IsDefinition) {
// this decl for some reason (e.g. we're only reporting public decls).
if (Child)
CDCtx.ECtx->reportResult(llvm::toHex(llvm::toStringRef(Child->USR)),
serialize::serialize(Child));
serialize::serialize(Child, CDCtx.Diags));
if (Parent)
CDCtx.ECtx->reportResult(llvm::toHex(llvm::toStringRef(Parent->USR)),
serialize::serialize(Parent));
serialize::serialize(Parent, CDCtx.Diags));
}
return true;
}
Expand Down
7 changes: 4 additions & 3 deletions clang-tools-extra/clang-doc/Representation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -481,10 +481,11 @@ ClangDocContext::ClangDocContext(tooling::ExecutionContext *ECtx,
StringRef RepositoryUrl,
StringRef RepositoryLinePrefix, StringRef Base,
std::vector<std::string> UserStylesheets,
clang::DiagnosticsEngine &Diags,
bool FTimeTrace)
: ECtx(ECtx), ProjectName(ProjectName), PublicOnly(PublicOnly),
FTimeTrace(FTimeTrace), OutDirectory(OutDirectory),
UserStylesheets(UserStylesheets), Base(Base) {
: ECtx(ECtx), ProjectName(ProjectName), OutDirectory(OutDirectory),
SourceRoot(std::string(SourceRoot)), UserStylesheets(UserStylesheets),
Base(Base), Diags(Diags), PublicOnly(PublicOnly), FTimeTrace(FTimeTrace) {
llvm::SmallString<128> SourceRootDir(SourceRoot);
if (SourceRoot.empty())
// If no SourceRoot was provided the current path is used as the default
Expand Down
14 changes: 8 additions & 6 deletions clang-tools-extra/clang-doc/Representation.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#define LLVM_CLANG_TOOLS_EXTRA_CLANG_DOC_REPRESENTATION_H

#include "clang/AST/Type.h"
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/Specifiers.h"
#include "clang/Tooling/Execution.h"
#include "llvm/ADT/SmallVector.h"
Expand Down Expand Up @@ -598,17 +599,13 @@ llvm::Expected<std::unique_ptr<Info>>
mergeInfos(std::vector<std::unique_ptr<Info>> &Values);

struct ClangDocContext {
ClangDocContext() = default;
ClangDocContext(tooling::ExecutionContext *ECtx, StringRef ProjectName,
bool PublicOnly, StringRef OutDirectory, StringRef SourceRoot,
StringRef RepositoryUrl, StringRef RepositoryCodeLinePrefix,
StringRef Base, std::vector<std::string> UserStylesheets,
bool FTimeTrace = false);
clang::DiagnosticsEngine &Diags, bool FTimeTrace = false);
tooling::ExecutionContext *ECtx;
std::string ProjectName; // Name of project clang-doc is documenting.
bool PublicOnly; // Indicates if only public declarations are documented.
bool FTimeTrace; // Indicates if ftime trace is turned on
int Granularity; // Granularity of ftime trace
std::string ProjectName; // Name of project clang-doc is documenting.
std::string OutDirectory; // Directory for outputting generated files.
std::string SourceRoot; // Directory where processed files are stored. Links
// to definition locations will only be generated if
Expand All @@ -627,7 +624,12 @@ struct ClangDocContext {
// Maps mustache template types to specific mustache template files.
// Ex. comment-template -> /path/to/comment-template.mustache
llvm::StringMap<std::string> MustacheTemplates;
// A pointer to a DiagnosticsEngine for error reporting.
clang::DiagnosticsEngine &Diags;
Index Idx;
int Granularity; // Granularity of ftime trace
bool PublicOnly; // Indicates if only public declarations are documented.
bool FTimeTrace; // Indicates if ftime trace is turned on
};

} // namespace doc
Expand Down
19 changes: 10 additions & 9 deletions clang-tools-extra/clang-doc/Serialize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -337,28 +337,29 @@ static std::string getSourceCode(const Decl *D, const SourceRange &R) {
.str();
}

template <typename T> static std::string serialize(T &I) {
template <typename T>
static std::string serialize(T &I, DiagnosticsEngine &Diags) {
SmallString<2048> Buffer;
llvm::BitstreamWriter Stream(Buffer);
ClangDocBitcodeWriter Writer(Stream);
ClangDocBitcodeWriter Writer(Stream, Diags);
Writer.emitBlock(I);
return Buffer.str().str();
}

std::string serialize(std::unique_ptr<Info> &I) {
std::string serialize(std::unique_ptr<Info> &I, DiagnosticsEngine &Diags) {
switch (I->IT) {
case InfoType::IT_namespace:
return serialize(*static_cast<NamespaceInfo *>(I.get()));
return serialize(*static_cast<NamespaceInfo *>(I.get()), Diags);
case InfoType::IT_record:
return serialize(*static_cast<RecordInfo *>(I.get()));
return serialize(*static_cast<RecordInfo *>(I.get()), Diags);
case InfoType::IT_enum:
return serialize(*static_cast<EnumInfo *>(I.get()));
return serialize(*static_cast<EnumInfo *>(I.get()), Diags);
case InfoType::IT_function:
return serialize(*static_cast<FunctionInfo *>(I.get()));
return serialize(*static_cast<FunctionInfo *>(I.get()), Diags);
case InfoType::IT_concept:
return serialize(*static_cast<ConceptInfo *>(I.get()));
return serialize(*static_cast<ConceptInfo *>(I.get()), Diags);
case InfoType::IT_variable:
return serialize(*static_cast<VarInfo *>(I.get()));
return serialize(*static_cast<VarInfo *>(I.get()), Diags);
case InfoType::IT_friend:
case InfoType::IT_typedef:
case InfoType::IT_default:
Expand Down
2 changes: 1 addition & 1 deletion clang-tools-extra/clang-doc/Serialize.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ emitInfo(const VarDecl *D, const FullComment *FC, const Location &Loc,
// memory (vs storing USRs directly).
SymbolID hashUSR(llvm::StringRef USR);

std::string serialize(std::unique_ptr<Info> &I);
std::string serialize(std::unique_ptr<Info> &I, DiagnosticsEngine &Diags);

} // namespace serialize
} // namespace doc
Expand Down
Loading
Loading