// 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_REPLACE_IDENTIFIER_H_
#define SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_REPLACE_IDENTIFIER_H_

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

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

namespace tint {
namespace fuzzers {
namespace ast_fuzzer {

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

  /// @brief Constructor.
  /// @param use_id - the id of a variable user.
  /// @param replacement_id - the id of a variable to replace the `use_id`.
  MutationReplaceIdentifier(uint32_t use_id, uint32_t replacement_id);

  /// @copybrief Mutation::IsApplicable
  ///
  /// The mutation is applicable iff:
  /// - `use_id` is a valid id of an `ast::IdentifierExpression`, that
  ///   references a variable.
  /// - `replacement_id` is a valid id of an `ast::Variable`.
  /// - The identifier expression doesn't reference the variable of a
  ///   `replacement_id`.
  /// - The variable with `replacement_id` is in scope of an identifier
  ///   expression with `use_id`.
  /// - The identifier expression and the variable have the same type.
  ///
  /// @copydetails Mutation::IsApplicable
  bool IsApplicable(const tint::Program& program,
                    const NodeIdMap& node_id_map) const override;

  /// @copybrief Mutation::Apply
  ///
  /// Replaces the use of an identifier expression with `use_id` with a newly
  /// created identifier expression, that references a variable with
  /// `replacement_id`. The newly created identifier expression will have the
  /// same id as the old one (i.e. `use_id`).
  ///
  /// @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;

 private:
  protobufs::MutationReplaceIdentifier message_;
};

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

#endif  // SRC_TINT_FUZZERS_TINT_AST_FUZZER_MUTATIONS_REPLACE_IDENTIFIER_H_
