// 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_FUZZERS_TINT_AST_FUZZER_MUTATIONS_WRAP_UNARY_OPERATOR_H_
#define SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_WRAP_UNARY_OPERATOR_H_

#include <vector>

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

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

namespace tint {
namespace fuzzers {
namespace ast_fuzzer {

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

  /// @brief Constructor.
  /// @param expression_id - the id of an expression.
  /// @param fresh_id - a fresh id for the created expression node with
  /// unary operator wrapper.
  /// @param unary_op_wrapper - a `ast::UnaryOp` instance.
  MutationWrapUnaryOperator(uint32_t expression_id,
                            uint32_t fresh_id,
                            ast::UnaryOp unary_op_wrapper);

  /// @copybrief Mutation::IsApplicable
  ///
  /// The mutation is applicable iff:
  /// - `expression_id` must refer to a valid expression that can be wrapped
  ///    with unary operator.
  /// - `fresh_id` must be fresh.
  /// - `unary_op_wrapper` is a unary expression that is valid based on the
  ///   type of the given expression.
  ///
  /// @copydetails Mutation::IsApplicable
  bool IsApplicable(const tint::Program& program,
                    const NodeIdMap& node_id_map) const override;

  /// @copybrief Mutation::Apply
  ///
  /// Wrap an expression in a unary operator that is valid based on
  /// the type of the expression.
  ///
  /// @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;

  /// Return list of unary operator wrappers allowed for the given
  /// expression.
  /// @param expr - an `ast::Expression` instance from node id map.
  /// @return a list of unary operators.
  static std::vector<ast::UnaryOp> GetValidUnaryWrapper(
      const sem::Expression& expr);

 private:
  protobufs::MutationWrapUnaryOperator message_;
};

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

#endif  // SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_WRAP_UNARY_OPERATOR_H_
