#include #include #include using std::string; using std::vector; using std::stringstream; class FormatVisitor : public BaseVisitor { private: vector result; stringstream str; public: void Visit(const BaseNode* node) override { node->Visit(this); }; void Visit(const ClassDeclarationNode* node) override { string shift = str.str(); str << "class " << node->ClassName() << " {"; result.push_back(str.str()); str.str(""); const vector& pub = node->PublicFields(); size_t len = pub.size(); if (len > 0) { str << shift << " public:"; result.push_back(str.str()); str.str(""); for (int i = 0; i < len; ++i) { str << " " << shift; Visit(pub[i]); str << ";"; result.push_back(str.str()); str.str(""); } } const vector& prot = node->ProtectedFields(); len = prot.size(); if (len > 0) { result.push_back(str.str()); str.str(""); str << shift << " protected:"; result.push_back(str.str()); str.str(""); for (int i = 0; i < len; ++i) { str << " " << shift; Visit(prot[i]); str << ";"; result.push_back(str.str()); str.str(""); } } const vector& priv = node->PrivateFields(); len = priv.size(); if (len > 0) { result.push_back(str.str()); str.str(""); str << shift << " private:"; result.push_back(str.str()); str.str(""); for (int i = 0; i < len; ++i) { str << " " << shift; Visit(priv[i]); str << ";"; result.push_back(str.str()); str.str(""); } } str << shift << "}"; }; void Visit(const VarDeclarationNode* node) override { str << node->TypeName() << " " << node->VarName(); }; void Visit(const MethodDeclarationNode* node) override { str << node->ReturnTypeName() << " " << node->MethodName() << "("; const vector& arguments = node->Arguments(); size_t arguments_length = arguments.size(); if (arguments_length > 0) { for (int i = 0; i < arguments_length - 1; ++i) { Visit(arguments[i]); str << ", "; } Visit(arguments[arguments_length - 1]); } str << ")"; } const vector& GetFormattedCode() { str << ";"; result.push_back(str.str()); return result; } };