1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_AST_AST_EXPRESSION_REWRITER_H_
6#define V8_AST_AST_EXPRESSION_REWRITER_H_
7
8#include "src/allocation.h"
9#include "src/ast/ast.h"
10#include "src/ast/scopes.h"
11#include "src/type-info.h"
12#include "src/zone/zone.h"
13
14namespace v8 {
15namespace internal {
16
17// A rewriting Visitor over a CompilationInfo's AST that invokes
18// VisitExpression on each expression node.
19
20// This AstVistor is not final, and provides the AstVisitor methods as virtual
21// methods so they can be specialized by subclasses.
22class AstExpressionRewriter : public AstVisitor<AstExpressionRewriter> {
23 public:
24  explicit AstExpressionRewriter(Isolate* isolate) {
25    InitializeAstRewriter(isolate);
26  }
27  explicit AstExpressionRewriter(uintptr_t stack_limit) {
28    InitializeAstRewriter(stack_limit);
29  }
30  virtual ~AstExpressionRewriter() {}
31
32  virtual void VisitDeclarations(Declaration::List* declarations);
33  virtual void VisitStatements(ZoneList<Statement*>* statements);
34  virtual void VisitExpressions(ZoneList<Expression*>* expressions);
35
36  virtual void VisitLiteralProperty(LiteralProperty* property);
37
38 protected:
39  virtual bool RewriteExpression(Expression* expr) = 0;
40
41 private:
42  DEFINE_AST_REWRITER_SUBCLASS_MEMBERS();
43
44#define DECLARE_VISIT(type) virtual void Visit##type(type* node);
45  AST_NODE_LIST(DECLARE_VISIT)
46#undef DECLARE_VISIT
47
48  DISALLOW_COPY_AND_ASSIGN(AstExpressionRewriter);
49};
50
51}  // namespace internal
52}  // namespace v8
53
54#endif  // V8_AST_AST_EXPRESSION_REWRITER_H_
55