// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/v8.h"

#include "src/ast/ast-expression-visitor.h"

#include "src/ast/ast.h"
#include "src/ast/scopes.h"
#include "src/codegen.h"

namespace v8 {
namespace internal {

AstExpressionVisitor::AstExpressionVisitor(Isolate* isolate, Expression* root)
    : AstTraversalVisitor(isolate), root_(root) {}

AstExpressionVisitor::AstExpressionVisitor(uintptr_t stack_limit,
                                           Expression* root)
    : AstTraversalVisitor(stack_limit), root_(root) {}

void AstExpressionVisitor::Run() { Visit(root_); }

void AstExpressionVisitor::VisitFunctionLiteral(FunctionLiteral* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitFunctionLiteral(expr);
}

void AstExpressionVisitor::VisitNativeFunctionLiteral(
    NativeFunctionLiteral* expr) {
  AstTraversalVisitor::VisitNativeFunctionLiteral(expr);
}

void AstExpressionVisitor::VisitDoExpression(DoExpression* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitDoExpression(expr);
}

void AstExpressionVisitor::VisitConditional(Conditional* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitConditional(expr);
}

void AstExpressionVisitor::VisitVariableProxy(VariableProxy* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitVariableProxy(expr);
}

void AstExpressionVisitor::VisitLiteral(Literal* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitLiteral(expr);
}

void AstExpressionVisitor::VisitRegExpLiteral(RegExpLiteral* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitRegExpLiteral(expr);
}

void AstExpressionVisitor::VisitObjectLiteral(ObjectLiteral* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitObjectLiteral(expr);
}

void AstExpressionVisitor::VisitArrayLiteral(ArrayLiteral* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitArrayLiteral(expr);
}

void AstExpressionVisitor::VisitAssignment(Assignment* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitAssignment(expr);
}

void AstExpressionVisitor::VisitYield(Yield* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitYield(expr);
}

void AstExpressionVisitor::VisitThrow(Throw* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitThrow(expr);
}

void AstExpressionVisitor::VisitProperty(Property* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitProperty(expr);
}

void AstExpressionVisitor::VisitCall(Call* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitCall(expr);
}

void AstExpressionVisitor::VisitCallNew(CallNew* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitCallNew(expr);
}

void AstExpressionVisitor::VisitCallRuntime(CallRuntime* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitCallRuntime(expr);
}

void AstExpressionVisitor::VisitUnaryOperation(UnaryOperation* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitUnaryOperation(expr);
}

void AstExpressionVisitor::VisitCountOperation(CountOperation* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitCountOperation(expr);
}

void AstExpressionVisitor::VisitBinaryOperation(BinaryOperation* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitBinaryOperation(expr);
}

void AstExpressionVisitor::VisitCompareOperation(CompareOperation* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitCompareOperation(expr);
}

void AstExpressionVisitor::VisitThisFunction(ThisFunction* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitThisFunction(expr);
}

void AstExpressionVisitor::VisitClassLiteral(ClassLiteral* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitClassLiteral(expr);
}

void AstExpressionVisitor::VisitSpread(Spread* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitSpread(expr);
}

void AstExpressionVisitor::VisitSuperPropertyReference(
    SuperPropertyReference* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitSuperPropertyReference(expr);
}

void AstExpressionVisitor::VisitSuperCallReference(SuperCallReference* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitSuperCallReference(expr);
}

void AstExpressionVisitor::VisitCaseClause(CaseClause* expr) {
  AstTraversalVisitor::VisitCaseClause(expr);
}

void AstExpressionVisitor::VisitEmptyParentheses(EmptyParentheses* expr) {
  AstTraversalVisitor::VisitEmptyParentheses(expr);
}

void AstExpressionVisitor::VisitRewritableExpression(
    RewritableExpression* expr) {
  VisitExpression(expr);
  AstTraversalVisitor::VisitRewritableExpression(expr);
}


}  // namespace internal
}  // namespace v8