// Copyright 2020 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef SRC_AST_STATEMENT_H_
#define SRC_AST_STATEMENT_H_

#include <memory>
#include <vector>

#include "src/ast/node.h"

namespace tint {
namespace ast {

class AssignmentStatement;
class BlockStatement;
class BreakStatement;
class CallStatement;
class CaseStatement;
class ContinueStatement;
class DiscardStatement;
class ElseStatement;
class FallthroughStatement;
class IfStatement;
class LoopStatement;
class ReturnStatement;
class SwitchStatement;
class VariableDeclStatement;

/// Base statement class
class Statement : public Node {
 public:
  ~Statement() override;

  /// @returns true if this is an assign statement
  virtual bool IsAssign() const;
  /// @returns true if this is a block statement
  virtual bool IsBlock() const;
  /// @returns true if this is a break statement
  virtual bool IsBreak() const;
  /// @returns true if this is a call statement
  virtual bool IsCall() const;
  /// @returns true if this is a case statement
  virtual bool IsCase() const;
  /// @returns true if this is a continue statement
  virtual bool IsContinue() const;
  /// @returns true if this is a discard statement
  virtual bool IsDiscard() const;
  /// @returns true if this is an else statement
  virtual bool IsElse() const;
  /// @returns true if this is a fallthrough statement
  virtual bool IsFallthrough() const;
  /// @returns true if this is an if statement
  virtual bool IsIf() const;
  /// @returns true if this is a loop statement
  virtual bool IsLoop() const;
  /// @returns true if this is a return statement
  virtual bool IsReturn() const;
  /// @returns true if this is a switch statement
  virtual bool IsSwitch() const;
  /// @returns true if this is an variable statement
  virtual bool IsVariableDecl() const;

  /// @returns the human readable name for the statement type.
  const char* Name() const;

  /// @returns the statement as a const assign statement
  const AssignmentStatement* AsAssign() const;
  /// @returns the statement as a const block statement
  const BlockStatement* AsBlock() const;
  /// @returns the statement as a const break statement
  const BreakStatement* AsBreak() const;
  /// @returns the statement as a const call statement
  const CallStatement* AsCall() const;
  /// @returns the statement as a const case statement
  const CaseStatement* AsCase() const;
  /// @returns the statement as a const continue statement
  const ContinueStatement* AsContinue() const;
  /// @returns the statement as a const discard statement
  const DiscardStatement* AsDiscard() const;
  /// @returns the statement as a const else statement
  const ElseStatement* AsElse() const;
  /// @returns the statement as a const fallthrough statement
  const FallthroughStatement* AsFallthrough() const;
  /// @returns the statement as a const if statement
  const IfStatement* AsIf() const;
  /// @returns the statement as a const loop statement
  const LoopStatement* AsLoop() const;
  /// @returns the statement as a const return statement
  const ReturnStatement* AsReturn() const;
  /// @returns the statement as a const switch statement
  const SwitchStatement* AsSwitch() const;
  /// @returns the statement as a const variable statement
  const VariableDeclStatement* AsVariableDecl() const;

  /// @returns the statement as an assign statement
  AssignmentStatement* AsAssign();
  /// @returns the statement as a block statement
  BlockStatement* AsBlock();
  /// @returns the statement as a break statement
  BreakStatement* AsBreak();
  /// @returns the statement as a call statement
  CallStatement* AsCall();
  /// @returns the statement as a case statement
  CaseStatement* AsCase();
  /// @returns the statement as a continue statement
  ContinueStatement* AsContinue();
  /// @returns the statement as a discard statement
  DiscardStatement* AsDiscard();
  /// @returns the statement as a else statement
  ElseStatement* AsElse();
  /// @returns the statement as a fallthrough statement
  FallthroughStatement* AsFallthrough();
  /// @returns the statement as a if statement
  IfStatement* AsIf();
  /// @returns the statement as a loop statement
  LoopStatement* AsLoop();
  /// @returns the statement as a return statement
  ReturnStatement* AsReturn();
  /// @returns the statement as a switch statement
  SwitchStatement* AsSwitch();
  /// @returns the statement as an variable statement
  VariableDeclStatement* AsVariableDecl();

 protected:
  /// Constructor
  Statement();
  /// Constructor
  /// @param source the source of the expression
  explicit Statement(const Source& source);
  /// Move constructor
  Statement(Statement&&);

 private:
  Statement(const Statement&) = delete;
};

}  // namespace ast
}  // namespace tint

#endif  // SRC_AST_STATEMENT_H_
