// Copyright 2021 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_TINT_SEM_IF_STATEMENT_H_
#define SRC_TINT_SEM_IF_STATEMENT_H_

#include "src/tint/sem/statement.h"

// Forward declarations
namespace tint::ast {
class IfStatement;
}  // namespace tint::ast
namespace tint::sem {
class Expression;
}  // namespace tint::sem

namespace tint::sem {

/// Holds semantic information about an if statement
class IfStatement final : public Castable<IfStatement, CompoundStatement> {
  public:
    /// Constructor
    /// @param declaration the AST node for this if statement
    /// @param parent the owning statement
    /// @param function the owning function
    IfStatement(const ast::IfStatement* declaration,
                const CompoundStatement* parent,
                const sem::Function* function);

    /// Destructor
    ~IfStatement() override;

    /// @returns the AST node
    const ast::IfStatement* Declaration() const;

    /// @returns the if-statement condition expression
    const Expression* Condition() const { return condition_; }

    /// Sets the if-statement condition expression
    /// @param condition the if condition expression
    void SetCondition(const Expression* condition) { condition_ = condition; }

  private:
    const Expression* condition_ = nullptr;
};

}  // namespace tint::sem

#endif  // SRC_TINT_SEM_IF_STATEMENT_H_
