// Copyright 2022 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_FUZZERS_TINT_AST_FUZZER_MUTATIONS_CHANGE_BINARY_OPERATOR_H_
#define SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_CHANGE_BINARY_OPERATOR_H_

#include "src/tint/fuzzers/tint_ast_fuzzer/mutation.h"

#include "src/tint/ast/binary_expression.h"
#include "src/tint/program.h"
#include "src/tint/sem/variable.h"

namespace tint {
namespace fuzzers {
namespace ast_fuzzer {

/// @see MutationChangeBinaryOperator::Apply
class MutationChangeBinaryOperator : public Mutation {
 public:
  /// @brief Constructs an instance of this mutation from a protobuf message.
  /// @param message - protobuf message
  explicit MutationChangeBinaryOperator(
      protobufs::MutationChangeBinaryOperator message);

  /// @brief Constructor.
  /// @param binary_expr_id - the id of a binary expression.
  /// @param new_operator - a new binary operator to replace the one used in the
  /// expression.
  MutationChangeBinaryOperator(uint32_t binary_expr_id,
                               ast::BinaryOp new_operator);

  /// @copybrief Mutation::IsApplicable
  ///
  /// The mutation is applicable iff:
  /// - `binary_expr_id` is a valid id of an `ast::BinaryExpression`.
  /// - `new_operator` is type-compatible with the arguments of the binary
  /// expression.
  ///
  /// @copydetails Mutation::IsApplicable
  bool IsApplicable(const tint::Program& program,
                    const NodeIdMap& node_id_map) const override;

  /// @copybrief Mutation::Apply
  ///
  /// Replaces binary operator in the binary expression corresponding to
  /// `binary_expr_id` with `new_operator`.
  ///
  /// @copydetails Mutation::Apply
  void Apply(const NodeIdMap& node_id_map,
             tint::CloneContext* clone_context,
             NodeIdMap* new_node_id_map) const override;

  protobufs::Mutation ToMessage() const override;

  /// @brief Determines whether replacing the operator of a binary expression
  ///     with another operator would preserve well-typedness.
  /// @param program - the program that owns the binary expression.
  /// @param binary_expr - the binary expression being considered for mutation.
  /// @param new_operator - a new binary operator to be checked as a candidate
  ///     replacement for the binary expression's operator.
  /// @return `true` if and only if the replacement would be well-typed.
  static bool CanReplaceBinaryOperator(const Program& program,
                                       const ast::BinaryExpression& binary_expr,
                                       ast::BinaryOp new_operator);

 private:
  protobufs::MutationChangeBinaryOperator message_;
};

}  // namespace ast_fuzzer
}  // namespace fuzzers
}  // namespace tint

#endif  // SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_CHANGE_BINARY_OPERATOR_H_
