scummvm/engines/director/lingo/lingodec/codewritervisitor.h
2024-05-17 22:37:33 +02:00

92 lines
4.3 KiB
C++

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
#ifndef LINGODEC_CODEWRITERVISITOR_H
#define LINGODEC_CODEWRITERVISITOR_H
#include "./ast.h"
namespace LingoDec {
class CodeWriterVisitor: public LingoDec::NodeVisitor {
public:
CodeWriterVisitor(bool dotSyntax, bool sum, const Common::String &lineEnding = "\n", const Common::String &indentation = " ")
: _dot(dotSyntax), _sum(sum), _lineEnding(lineEnding), _indentation(indentation) {}
virtual ~CodeWriterVisitor() {}
virtual void visit(const LingoDec::HandlerNode& node) override;
virtual void visit(const LingoDec::ErrorNode& node) override;
virtual void visit(const LingoDec::CommentNode& node) override;
virtual void visit(const LingoDec::NewObjNode& node) override;
virtual void visit(const LingoDec::LiteralNode& node) override;
virtual void visit(const LingoDec::IfStmtNode& node) override;
virtual void visit(const LingoDec::EndCaseNode& node) override;
virtual void visit(const LingoDec::ObjCallNode& node) override;
virtual void visit(const LingoDec::PutStmtNode& node) override;
virtual void visit(const LingoDec::TheExprNode& node) override;
virtual void visit(const LingoDec::BinaryOpNode& node) override;
virtual void visit(const LingoDec::CaseStmtNode& node) override;
virtual void visit(const LingoDec::ExitStmtNode& node) override;
virtual void visit(const LingoDec::TellStmtNode& node) override;
virtual void visit(const LingoDec::WhenStmtNode& node) override;
virtual void visit(const LingoDec::CaseLabelNode& node) override;
virtual void visit(const LingoDec::ChunkExprNode& node) override;
virtual void visit(const LingoDec::InverseOpNode& node) override;
virtual void visit(const LingoDec::ObjCallV4Node& node) override;
virtual void visit(const LingoDec::OtherwiseNode& node) override;
virtual void visit(const LingoDec::MemberExprNode& node) override;
virtual void visit(const LingoDec::ObjPropExprNode& node) override;
virtual void visit(const LingoDec::PlayCmdStmtNode& node) override;
virtual void visit(const LingoDec::ThePropExprNode& node) override;
virtual void visit(const LingoDec::MenuPropExprNode& node) override;
virtual void visit(const LingoDec::SoundCmdStmtNode& node) override;
virtual void visit(const LingoDec::SoundPropExprNode& node) override;
virtual void visit(const LingoDec::AssignmentStmtNode& node) override;
virtual void visit(const LingoDec::ExitRepeatStmtNode& node) override;
virtual void visit(const LingoDec::NextRepeatStmtNode& node) override;
virtual void visit(const LingoDec::ObjBracketExprNode& node) override;
virtual void visit(const LingoDec::SpritePropExprNode& node) override;
virtual void visit(const LingoDec::ChunkDeleteStmtNode& node) override;
virtual void visit(const LingoDec::ChunkHiliteStmtNode& node) override;
virtual void visit(const LingoDec::RepeatWhileStmtNode& node) override;
virtual void visit(const LingoDec::MenuItemPropExprNode& node) override;
virtual void visit(const LingoDec::ObjPropIndexExprNode& node) override;
virtual void visit(const LingoDec::RepeatWithInStmtNode& node) override;
virtual void visit(const LingoDec::RepeatWithToStmtNode& node) override;
virtual void visit(const LingoDec::SpriteWithinExprNode& node) override;
virtual void visit(const LingoDec::LastStringChunkExprNode& node) override;
virtual void visit(const LingoDec::SpriteIntersectsExprNode& node) override;
virtual void visit(const LingoDec::StringChunkCountExprNode& node) override;
virtual void visit(const LingoDec::VarNode& node) override;
virtual void visit(const LingoDec::CallNode& node) override;
virtual void visit(const LingoDec::BlockNode& node) override;
virtual void visit(const LingoDec::NotOpNode& node) override;
size_t lineWidth() const { return _lineWidth; }
void indent();
void unindent();
void writeIndentation();
void write(char c);
void write(const Common::String& s);
void writeLine();
void writeLine(const Common::String& s);
void write(LingoDec::Datum& datum);
public:
Common::String _str;
private:
bool _dot = false;
bool _sum = false;
Common::String _lineEnding;
Common::String _indentation = " ";
bool _indentWritten = false;
int _indent = 0;
size_t _lineWidth = 0;
};
} // namespace LingoDec
#endif // LINGODEC_CODEWRITERVISITOR_H