#pragma once #include #include #include "../../src/language/ast/types.hpp" #include "../../src/language/ast/deserializer.hpp" namespace lsp::language::ast { class DebugPrinter : public ASTVisitor { public: explicit DebugPrinter(std::ostream& os = std::cout, int indent_size = 2) : os_(os), indent_size_(indent_size), current_indent_(0) {} void Print(const ASTNode* node); void PrintStatements(const std::vector& statements); void PrintParseResult(const ParseResult& result); void VisitUnitDefinition(UnitDefinition& node) override; void VisitClassDefinition(ClassDefinition& node) override; void VisitClassMember(ClassMember& node) override; void VisitMethodDeclaration(MethodDeclaration& node) override; void VisitPropertyDeclaration(PropertyDeclaration& node) override; void VisitExternalMethodDefinition(ExternalMethodDefinition& node) override; void VisitIdentifier(Identifier& node) override; void VisitLiteral(Literal& node) override; void VisitBinaryExpression(BinaryExpression& node) override; void VisitComparisonExpression(ComparisonExpression& node) override; void VisitUnaryExpression(UnaryExpression& node) override; void VisitTernaryExpression(TernaryExpression& node) override; void VisitCallExpression(CallExpression& node) override; void VisitAttributeExpression(AttributeExpression& node) override; void VisitSubscriptExpression(SubscriptExpression& node) override; void VisitArrayExpression(ArrayExpression& node) override; void VisitAnonymousFunctionExpression(AnonymousFunctionExpression& node) override; void VisitPrefixIncrementExpression(PrefixIncrementExpression& node) override; void VisitPrefixDecrementExpression(PrefixDecrementExpression& node) override; void VisitPostfixIncrementExpression(PostfixIncrementExpression& node) override; void VisitPostfixDecrementExpression(PostfixDecrementExpression& node) override; void VisitFunctionPointerExpression(FunctionPointerExpression& node) override; void VisitAssignmentExpression(AssignmentExpression& node) override; void VisitExpressionStatement(ExpressionStatement& node) override; void VisitVarStatement(VarStatement& node) override; void VisitStaticStatement(StaticStatement& node) override; void VisitGlobalStatement(GlobalStatement& node) override; void VisitConstStatement(ConstStatement& node) override; void VisitAssignmentStatement(AssignmentStatement& node) override; void VisitBlockStatement(BlockStatement& node) override; void VisitIfStatement(IfStatement& node) override; void VisitForInStatement(ForInStatement& node) override; void VisitForToStatement(ForToStatement& node) override; void VisitWhileStatement(WhileStatement& node) override; void VisitRepeatStatement(RepeatStatement& node) override; void VisitCaseStatement(CaseStatement& node) override; void VisitTryStatement(TryStatement& node) override; void VisitBreakStatement(BreakStatement& node) override; void VisitContinueStatement(ContinueStatement& node) override; void VisitReturnStatement(ReturnStatement& node) override; void VisitUsesStatement(UsesStatement& node) override; void VisitFunctionDefinition(FunctionDefinition& node) override; void VisitFunctionDeclaration(FunctionDeclaration& node) override; void VisitVarDeclaration(VarDeclaration& node) override; void VisitStaticDeclaration(StaticDeclaration& node) override; void VisitGlobalDeclaration(GlobalDeclaration& node) override; void VisitFieldDeclaration(FieldDeclaration& node) override; void VisitUnpackPattern(UnpackPattern& node) override; void VisitTSSQLExpression(TSSQLExpression& node) override; private: std::ostream& os_; int indent_size_; int current_indent_; void IncreaseIndent() { current_indent_ += indent_size_; } void DecreaseIndent() { current_indent_ -= indent_size_; } void PrintIndent(); std::string GetIndent() const; void PrintLocation(const Location& loc); void PrintNodeHeader(const std::string& type_name, const Location& loc); void PrintExpression(const Expression* expr); void PrintSignature(const Signature& sig); void PrintParameter(const Parameter& param); void PrintLeftHandSide(const LeftHandSide& lhs); void PrintOperator(BinaryOperator op); void PrintOperator(UnaryOperator op); void PrintOperator(AssignmentOperator op); void PrintLiteralKind(LiteralKind kind); void PrintAccessModifier(AccessModifier modifier); void PrintMethodModifier(MethodModifier modifier); void PrintReferenceModifier(ReferenceModifier modifier); void PrintError(const ParseError& error); }; std::string DebugString(const ASTNode* node); std::string DebugString(const ParseResult& result); void DebugPrint(const ASTNode* node); void DebugPrint(const ParseResult& result); }