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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions clang-tools-extra/clang-doc/HTMLMustacheGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,18 +46,22 @@ class MustacheHTMLGenerator : public Generator {
const ClangDocContext &CDCtx) override;
};

class MustacheTemplateFile : public Template {
class MustacheTemplateFile {
BumpPtrAllocator Allocator;
StringSaver Saver;
MustacheContext Ctx;
Template T;
std::unique_ptr<MemoryBuffer> Buffer;

public:
static Expected<std::unique_ptr<MustacheTemplateFile>>
createMustacheFile(StringRef FileName) {
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrError =
MemoryBuffer::getFile(FileName);
if (auto EC = BufferOrError.getError())
return createFileOpenError(FileName, EC);

std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrError.get());
StringRef FileContent = Buffer->getBuffer();
return std::make_unique<MustacheTemplateFile>(FileContent);
return std::make_unique<MustacheTemplateFile>(
std::move(BufferOrError.get()));
}

Error registerPartialFile(StringRef Name, StringRef FileName) {
Expand All @@ -68,11 +72,15 @@ class MustacheTemplateFile : public Template {

std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrError.get());
StringRef FileContent = Buffer->getBuffer();
registerPartial(Name.str(), FileContent.str());
T.registerPartial(Name.str(), FileContent.str());
return Error::success();
}

MustacheTemplateFile(StringRef TemplateStr) : Template(TemplateStr) {}
void render(json::Value &V, raw_ostream &OS) { T.render(V, OS); }

MustacheTemplateFile(std::unique_ptr<MemoryBuffer> &&B)
: Saver(Allocator), Ctx(Allocator, Saver), T(B->getBuffer(), Ctx),
Buffer(std::move(B)) {}
};

static std::unique_ptr<MustacheTemplateFile> NamespaceTemplate = nullptr;
Expand Down
15 changes: 11 additions & 4 deletions llvm/include/llvm/Support/Mustache.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@

#include "Error.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/ilist.h"
#include "llvm/ADT/ilist_node.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/JSON.h"
Expand All @@ -84,10 +86,15 @@ using Lambda = std::function<llvm::json::Value()>;
using SectionLambda = std::function<llvm::json::Value(std::string)>;

class ASTNode;
using AstPtr = std::unique_ptr<ASTNode>;
using AstPtr = ASTNode *;
using EscapeMap = DenseMap<char, std::string>;
using ASTNodeList = iplist<ASTNode>;

struct MustacheContext {
MustacheContext(BumpPtrAllocator &Allocator, StringSaver &Saver)
: Allocator(Allocator), Saver(Saver) {}
BumpPtrAllocator &Allocator;
StringSaver &Saver;
StringMap<AstPtr> Partials;
StringMap<Lambda> Lambdas;
StringMap<SectionLambda> SectionLambdas;
Expand All @@ -98,7 +105,7 @@ struct MustacheContext {
// and Lambdas that are registered with it.
class Template {
public:
LLVM_ABI Template(StringRef TemplateStr);
LLVM_ABI Template(StringRef TemplateStr, MustacheContext &Ctx);

Template(const Template &) = delete;

Expand All @@ -110,7 +117,7 @@ class Template {
// type.
LLVM_ABI ~Template();

LLVM_ABI Template &operator=(Template &&Other) noexcept;
Template &operator=(Template &&) = delete;

LLVM_ABI void render(const llvm::json::Value &Data, llvm::raw_ostream &OS);

Expand All @@ -126,7 +133,7 @@ class Template {
LLVM_ABI void overrideEscapeCharacters(DenseMap<char, std::string> Escapes);

private:
MustacheContext Ctx;
MustacheContext &Ctx;
AstPtr Tree;
};
} // namespace llvm::mustache
Expand Down
Loading
Loading