@@ -139,26 +139,17 @@ class ASTNode {
139139 InvertSection,
140140 };
141141
142- ASTNode (llvm::StringMap<AstPtr> &Partials, llvm::StringMap<Lambda> &Lambdas,
143- llvm::StringMap<SectionLambda> &SectionLambdas, EscapeMap &Escapes)
144- : Partials(Partials), Lambdas(Lambdas), SectionLambdas(SectionLambdas),
145- Escapes (Escapes), Ty(Type::Root), Parent(nullptr ),
146- ParentContext(nullptr ) {}
142+ ASTNode (MustacheContext &Ctx)
143+ : Ctx(Ctx), Ty(Type::Root), Parent(nullptr ), ParentContext(nullptr ) {}
147144
148- ASTNode (std::string Body, ASTNode *Parent, llvm::StringMap<AstPtr> &Partials,
149- llvm::StringMap<Lambda> &Lambdas,
150- llvm::StringMap<SectionLambda> &SectionLambdas, EscapeMap &Escapes)
151- : Partials(Partials), Lambdas(Lambdas), SectionLambdas(SectionLambdas),
152- Escapes(Escapes), Ty(Type::Text), Body(std::move(Body)), Parent(Parent),
145+ ASTNode (MustacheContext &Ctx, std::string Body, ASTNode *Parent)
146+ : Ctx(Ctx), Ty(Type::Text), Body(std::move(Body)), Parent(Parent),
153147 ParentContext (nullptr ) {}
154148
155149 // Constructor for Section/InvertSection/Variable/UnescapeVariable Nodes
156- ASTNode (Type Ty, Accessor Accessor, ASTNode *Parent,
157- llvm::StringMap<AstPtr> &Partials, llvm::StringMap<Lambda> &Lambdas,
158- llvm::StringMap<SectionLambda> &SectionLambdas, EscapeMap &Escapes)
159- : Partials(Partials), Lambdas(Lambdas), SectionLambdas(SectionLambdas),
160- Escapes(Escapes), Ty(Ty), Parent(Parent),
161- AccessorValue(std::move(Accessor)), ParentContext(nullptr ) {}
150+ ASTNode (MustacheContext &Ctx, Type Ty, Accessor Accessor, ASTNode *Parent)
151+ : Ctx(Ctx), Ty(Ty), Parent(Parent), AccessorValue(std::move(Accessor)),
152+ ParentContext(nullptr ) {}
162153
163154 void addChild (AstPtr Child) { Children.emplace_back (std::move (Child)); };
164155
@@ -190,10 +181,7 @@ class ASTNode {
190181 void renderSection (const json::Value &CurrentCtx, raw_ostream &OS);
191182 void renderInvertSection (const json::Value &CurrentCtx, raw_ostream &OS);
192183
193- StringMap<AstPtr> &Partials;
194- StringMap<Lambda> &Lambdas;
195- StringMap<SectionLambda> &SectionLambdas;
196- EscapeMap &Escapes;
184+ MustacheContext &Ctx;
197185 Type Ty;
198186 size_t Indentation = 0 ;
199187 std::string RawBody;
@@ -206,29 +194,18 @@ class ASTNode {
206194};
207195
208196// A wrapper for arena allocator for ASTNodes
209- static AstPtr createRootNode (llvm::StringMap<AstPtr> &Partials,
210- llvm::StringMap<Lambda> &Lambdas,
211- llvm::StringMap<SectionLambda> &SectionLambdas,
212- EscapeMap &Escapes) {
213- return std::make_unique<ASTNode>(Partials, Lambdas, SectionLambdas, Escapes);
197+ static AstPtr createRootNode (MustacheContext &Ctx) {
198+ return std::make_unique<ASTNode>(Ctx);
214199}
215200
216- static AstPtr createNode (ASTNode::Type T, Accessor A, ASTNode *Parent,
217- llvm::StringMap<AstPtr> &Partials,
218- llvm::StringMap<Lambda> &Lambdas,
219- llvm::StringMap<SectionLambda> &SectionLambdas,
220- EscapeMap &Escapes) {
221- return std::make_unique<ASTNode>(T, std::move (A), Parent, Partials, Lambdas,
222- SectionLambdas, Escapes);
201+ static AstPtr createNode (MustacheContext &Ctx, ASTNode::Type T, Accessor A,
202+ ASTNode *Parent) {
203+ return std::make_unique<ASTNode>(Ctx, T, std::move (A), Parent);
223204}
224205
225- static AstPtr createTextNode (std::string Body, ASTNode *Parent,
226- llvm::StringMap<AstPtr> &Partials,
227- llvm::StringMap<Lambda> &Lambdas,
228- llvm::StringMap<SectionLambda> &SectionLambdas,
229- EscapeMap &Escapes) {
230- return std::make_unique<ASTNode>(std::move (Body), Parent, Partials, Lambdas,
231- SectionLambdas, Escapes);
206+ static AstPtr createTextNode (MustacheContext &Ctx, std::string Body,
207+ ASTNode *Parent) {
208+ return std::make_unique<ASTNode>(Ctx, std::move (Body), Parent);
232209}
233210
234211// Function to check if there is meaningful text behind.
@@ -545,39 +522,26 @@ class AddIndentationStringStream : public raw_ostream {
545522
546523class Parser {
547524public:
548- Parser (StringRef TemplateStr) : TemplateStr(TemplateStr) {}
525+ Parser (StringRef TemplateStr, MustacheContext &Ctx)
526+ : Ctx(Ctx), TemplateStr(TemplateStr) {}
549527
550- AstPtr parse (llvm::StringMap<AstPtr> &Partials,
551- llvm::StringMap<Lambda> &Lambdas,
552- llvm::StringMap<SectionLambda> &SectionLambdas,
553- EscapeMap &Escapes);
528+ AstPtr parse ();
554529
555530private:
556- void parseMustache (ASTNode *Parent, llvm::StringMap<AstPtr> &Partials,
557- llvm::StringMap<Lambda> &Lambdas,
558- llvm::StringMap<SectionLambda> &SectionLambdas,
559- EscapeMap &Escapes);
560-
561- void parseSection (ASTNode *Parent, ASTNode::Type Ty, const Accessor &A,
562- llvm::StringMap<AstPtr> &Partials,
563- llvm::StringMap<Lambda> &Lambdas,
564- llvm::StringMap<SectionLambda> &SectionLambdas,
565- EscapeMap &Escapes);
531+ void parseMustache (ASTNode *Parent);
532+ void parseSection (ASTNode *Parent, ASTNode::Type Ty, const Accessor &A);
566533
534+ MustacheContext &Ctx;
567535 SmallVector<Token> Tokens;
568536 size_t CurrentPtr;
569537 StringRef TemplateStr;
570538};
571539
572- void Parser::parseSection (ASTNode *Parent, ASTNode::Type Ty, const Accessor &A,
573- llvm::StringMap<AstPtr> &Partials,
574- llvm::StringMap<Lambda> &Lambdas,
575- llvm::StringMap<SectionLambda> &SectionLambdas,
576- EscapeMap &Escapes) {
577- AstPtr CurrentNode =
578- createNode (Ty, A, Parent, Partials, Lambdas, SectionLambdas, Escapes);
540+ void Parser::parseSection (ASTNode *Parent, ASTNode::Type Ty,
541+ const Accessor &A) {
542+ AstPtr CurrentNode = createNode (Ctx, Ty, A, Parent);
579543 size_t Start = CurrentPtr;
580- parseMustache (CurrentNode.get (), Partials, Lambdas, SectionLambdas, Escapes );
544+ parseMustache (CurrentNode.get ());
581545 const size_t End = CurrentPtr - 1 ;
582546 std::string RawBody;
583547 for (std::size_t I = Start; I < End; I++)
@@ -586,21 +550,15 @@ void Parser::parseSection(ASTNode *Parent, ASTNode::Type Ty, const Accessor &A,
586550 Parent->addChild (std::move (CurrentNode));
587551}
588552
589- AstPtr Parser::parse (llvm::StringMap<AstPtr> &Partials,
590- llvm::StringMap<Lambda> &Lambdas,
591- llvm::StringMap<SectionLambda> &SectionLambdas,
592- EscapeMap &Escapes) {
553+ AstPtr Parser::parse () {
593554 Tokens = tokenize (TemplateStr);
594555 CurrentPtr = 0 ;
595- AstPtr RootNode = createRootNode (Partials, Lambdas, SectionLambdas, Escapes );
596- parseMustache (RootNode.get (), Partials, Lambdas, SectionLambdas, Escapes );
556+ AstPtr RootNode = createRootNode (Ctx );
557+ parseMustache (RootNode.get ());
597558 return RootNode;
598559}
599560
600- void Parser::parseMustache (ASTNode *Parent, llvm::StringMap<AstPtr> &Partials,
601- llvm::StringMap<Lambda> &Lambdas,
602- llvm::StringMap<SectionLambda> &SectionLambdas,
603- EscapeMap &Escapes) {
561+ void Parser::parseMustache (ASTNode *Parent) {
604562
605563 while (CurrentPtr < Tokens.size ()) {
606564 Token CurrentToken = Tokens[CurrentPtr];
@@ -610,38 +568,34 @@ void Parser::parseMustache(ASTNode *Parent, llvm::StringMap<AstPtr> &Partials,
610568
611569 switch (CurrentToken.getType ()) {
612570 case Token::Type::Text: {
613- CurrentNode = createTextNode ( std::move (CurrentToken. TokenBody ), Parent,
614- Partials, Lambdas, SectionLambdas, Escapes );
571+ CurrentNode =
572+ createTextNode (Ctx, std::move (CurrentToken. TokenBody ), Parent );
615573 Parent->addChild (std::move (CurrentNode));
616574 break ;
617575 }
618576 case Token::Type::Variable: {
619- CurrentNode = createNode (ASTNode::Variable, std::move (A), Parent,
620- Partials, Lambdas, SectionLambdas, Escapes);
577+ CurrentNode = createNode (Ctx, ASTNode::Variable, std::move (A), Parent);
621578 Parent->addChild (std::move (CurrentNode));
622579 break ;
623580 }
624581 case Token::Type::UnescapeVariable: {
625- CurrentNode = createNode (ASTNode::UnescapeVariable, std::move (A), Parent,
626- Partials, Lambdas, SectionLambdas, Escapes );
582+ CurrentNode =
583+ createNode (Ctx, ASTNode::UnescapeVariable, std::move (A), Parent );
627584 Parent->addChild (std::move (CurrentNode));
628585 break ;
629586 }
630587 case Token::Type::Partial: {
631- CurrentNode = createNode (ASTNode::Partial, std::move (A), Parent, Partials,
632- Lambdas, SectionLambdas, Escapes);
588+ CurrentNode = createNode (Ctx, ASTNode::Partial, std::move (A), Parent);
633589 CurrentNode->setIndentation (CurrentToken.getIndentation ());
634590 Parent->addChild (std::move (CurrentNode));
635591 break ;
636592 }
637593 case Token::Type::SectionOpen: {
638- parseSection (Parent, ASTNode::Section, A, Partials, Lambdas,
639- SectionLambdas, Escapes);
594+ parseSection (Parent, ASTNode::Section, A);
640595 break ;
641596 }
642597 case Token::Type::InvertSectionOpen: {
643- parseSection (Parent, ASTNode::InvertSection, A, Partials, Lambdas,
644- SectionLambdas, Escapes);
598+ parseSection (Parent, ASTNode::InvertSection, A);
645599 break ;
646600 }
647601 case Token::Type::Comment:
@@ -691,34 +645,34 @@ void ASTNode::renderRoot(const json::Value &CurrentCtx, raw_ostream &OS) {
691645void ASTNode::renderText (raw_ostream &OS) { OS << Body; }
692646
693647void ASTNode::renderPartial (const json::Value &CurrentCtx, raw_ostream &OS) {
694- auto Partial = Partials.find (AccessorValue[0 ]);
695- if (Partial != Partials.end ())
648+ auto Partial = Ctx. Partials .find (AccessorValue[0 ]);
649+ if (Partial != Ctx. Partials .end ())
696650 renderPartial (CurrentCtx, OS, Partial->getValue ().get ());
697651}
698652
699653void ASTNode::renderVariable (const json::Value &CurrentCtx, raw_ostream &OS) {
700- auto Lambda = Lambdas.find (AccessorValue[0 ]);
701- if (Lambda != Lambdas.end ()) {
654+ auto Lambda = Ctx. Lambdas .find (AccessorValue[0 ]);
655+ if (Lambda != Ctx. Lambdas .end ()) {
702656 renderLambdas (CurrentCtx, OS, Lambda->getValue ());
703657 } else if (const json::Value *ContextPtr = findContext ()) {
704- EscapeStringStream ES (OS, Escapes);
658+ EscapeStringStream ES (OS, Ctx. Escapes );
705659 toMustacheString (*ContextPtr, ES);
706660 }
707661}
708662
709663void ASTNode::renderUnescapeVariable (const json::Value &CurrentCtx,
710664 raw_ostream &OS) {
711- auto Lambda = Lambdas.find (AccessorValue[0 ]);
712- if (Lambda != Lambdas.end ()) {
665+ auto Lambda = Ctx. Lambdas .find (AccessorValue[0 ]);
666+ if (Lambda != Ctx. Lambdas .end ()) {
713667 renderLambdas (CurrentCtx, OS, Lambda->getValue ());
714668 } else if (const json::Value *ContextPtr = findContext ()) {
715669 toMustacheString (*ContextPtr, OS);
716670 }
717671}
718672
719673void ASTNode::renderSection (const json::Value &CurrentCtx, raw_ostream &OS) {
720- auto SectionLambda = SectionLambdas.find (AccessorValue[0 ]);
721- if (SectionLambda != SectionLambdas.end ()) {
674+ auto SectionLambda = Ctx. SectionLambdas .find (AccessorValue[0 ]);
675+ if (SectionLambda != Ctx. SectionLambdas .end ()) {
722676 renderSectionLambdas (CurrentCtx, OS, SectionLambda->getValue ());
723677 return ;
724678 }
@@ -737,7 +691,7 @@ void ASTNode::renderSection(const json::Value &CurrentCtx, raw_ostream &OS) {
737691
738692void ASTNode::renderInvertSection (const json::Value &CurrentCtx,
739693 raw_ostream &OS) {
740- bool IsLambda = SectionLambdas.contains (AccessorValue[0 ]);
694+ bool IsLambda = Ctx. SectionLambdas .contains (AccessorValue[0 ]);
741695 const json::Value *ContextPtr = findContext ();
742696 if (isContextFalsey (ContextPtr) && !IsLambda) {
743697 renderChild (CurrentCtx, OS);
@@ -833,10 +787,10 @@ void ASTNode::renderLambdas(const json::Value &Contexts, llvm::raw_ostream &OS,
833787 std::string LambdaStr;
834788 raw_string_ostream Output (LambdaStr);
835789 toMustacheString (LambdaResult, Output);
836- Parser P = Parser (LambdaStr);
837- AstPtr LambdaNode = P.parse (Partials, Lambdas, SectionLambdas, Escapes );
790+ Parser P (LambdaStr, Ctx );
791+ AstPtr LambdaNode = P.parse ();
838792
839- EscapeStringStream ES (OS, Escapes);
793+ EscapeStringStream ES (OS, Ctx. Escapes );
840794 if (Ty == Variable) {
841795 LambdaNode->render (Contexts, ES);
842796 return ;
@@ -852,8 +806,8 @@ void ASTNode::renderSectionLambdas(const json::Value &Contexts,
852806 std::string LambdaStr;
853807 raw_string_ostream Output (LambdaStr);
854808 toMustacheString (Return, Output);
855- Parser P = Parser (LambdaStr);
856- AstPtr LambdaNode = P.parse (Partials, Lambdas, SectionLambdas, Escapes );
809+ Parser P (LambdaStr, Ctx );
810+ AstPtr LambdaNode = P.parse ();
857811 LambdaNode->render (Contexts, OS);
858812}
859813
@@ -862,22 +816,26 @@ void Template::render(const json::Value &Data, llvm::raw_ostream &OS) {
862816}
863817
864818void Template::registerPartial (std::string Name, std::string Partial) {
865- Parser P = Parser (Partial);
866- AstPtr PartialTree = P.parse (Partials, Lambdas, SectionLambdas, Escapes );
867- Partials.insert (std::make_pair (Name, std::move (PartialTree)));
819+ Parser P (Partial, Ctx );
820+ AstPtr PartialTree = P.parse ();
821+ Ctx. Partials .insert (std::make_pair (Name, std::move (PartialTree)));
868822}
869823
870- void Template::registerLambda (std::string Name, Lambda L) { Lambdas[Name] = L; }
824+ void Template::registerLambda (std::string Name, Lambda L) {
825+ Ctx.Lambdas [Name] = L;
826+ }
871827
872828void Template::registerLambda (std::string Name, SectionLambda L) {
873- SectionLambdas[Name] = L;
829+ Ctx. SectionLambdas [Name] = L;
874830}
875831
876- void Template::overrideEscapeCharacters (EscapeMap E) { Escapes = std::move (E); }
832+ void Template::overrideEscapeCharacters (EscapeMap E) {
833+ Ctx.Escapes = std::move (E);
834+ }
877835
878836Template::Template (StringRef TemplateStr) {
879- Parser P = Parser (TemplateStr);
880- Tree = P.parse (Partials, Lambdas, SectionLambdas, Escapes );
837+ Parser P (TemplateStr, Ctx );
838+ Tree = P.parse ();
881839 // The default behavior is to escape html entities.
882840 const EscapeMap HtmlEntities = {{' &' , " &" },
883841 {' <' , " <" },
@@ -888,18 +846,13 @@ Template::Template(StringRef TemplateStr) {
888846}
889847
890848Template::Template (Template &&Other) noexcept
891- : Partials(std::move(Other.Partials)), Lambdas(std::move(Other.Lambdas)),
892- SectionLambdas(std::move(Other.SectionLambdas)),
893- Escapes(std::move(Other.Escapes)), Tree(std::move(Other.Tree)) {}
849+ : Ctx(std::move(Other.Ctx)), Tree(std::move(Other.Tree)) {}
894850
895851Template::~Template () = default ;
896852
897853Template &Template::operator =(Template &&Other) noexcept {
898854 if (this != &Other) {
899- Partials = std::move (Other.Partials );
900- Lambdas = std::move (Other.Lambdas );
901- SectionLambdas = std::move (Other.SectionLambdas );
902- Escapes = std::move (Other.Escapes );
855+ Ctx = std::move (Other.Ctx );
903856 Tree = std::move (Other.Tree );
904857 Other.Tree = nullptr ;
905858 }
0 commit comments