#pragma once
#include "parser/expression/parsed_expression.h"
#include "parser/parsed_statement_visitor.h"
namespace lbug {
namespace parser {
class StatementReadWriteAnalyzer final : public StatementVisitor {
public:
explicit StatementReadWriteAnalyzer(main::ClientContext* context)
: StatementVisitor{}, readOnly{true}, context{context} {}
bool isReadOnly() const { return readOnly; }
private:
void visitCreateSequence(const Statement& ) override { readOnly = false; }
void visitDrop(const Statement& ) override { readOnly = false; }
void visitCreateTable(const Statement& ) override { readOnly = false; }
void visitCreateType(const Statement& ) override { readOnly = false; }
void visitAlter(const Statement& ) override { readOnly = false; }
void visitCopyFrom(const Statement& ) override { readOnly = false; }
void visitStandaloneCall(const Statement& ) override { readOnly = true; }
void visitStandaloneCallFunction(const Statement& ) override { readOnly = false; }
void visitCreateMacro(const Statement& ) override { readOnly = false; }
void visitCreateGraph(const Statement& ) override { readOnly = false; }
void visitExtension(const Statement& ) override;
void visitReadingClause(const ReadingClause* readingClause) override;
void visitWithClause(const WithClause* withClause) override;
void visitReturnClause(const ReturnClause* returnClause) override;
void visitUpdatingClause(const UpdatingClause* ) override {
readOnly = false;
}
void visitExtensionClause(const Statement& ) override { readOnly = false; }
bool isExprReadOnly(const ParsedExpression* expr);
private:
bool readOnly;
main::ClientContext* context;
};
} }