// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Handles the rewriting of base::Value::GetType() to base::Value::type().

#ifndef TOOLS_CLANG_VALUE_CLEANUP_VALUE_REWRITER_H_
#define TOOLS_CLANG_VALUE_CLEANUP_VALUE_REWRITER_H_

#include <set>
#include <string>
#include <utility>
#include <vector>

#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Tooling/Refactoring.h"

class ValueRewriter {
 public:
  explicit ValueRewriter(std::set<clang::tooling::Replacement>* replacements);

  void RegisterMatchers(clang::ast_matchers::MatchFinder* match_finder);

 private:
  class ListValueCallback
      : public clang::ast_matchers::MatchFinder::MatchCallback {
   public:
    ListValueCallback(std::string method,
                      std::string replacement,
                      std::set<clang::tooling::Replacement>* replacements);

    void run(
        const clang::ast_matchers::MatchFinder::MatchResult& result) override;

    const std::string& method() const { return method_; }
    const std::string& replacement() const { return replacement_; }

   private:
    const std::string method_;
    const std::string replacement_;
    std::set<clang::tooling::Replacement>* const replacements_;
  };

  std::vector<ListValueCallback> list_value_callbacks_;
};

#endif  // TOOLS_CLANG_VALUE_CLEANUP_VALUE_REWRITER_H_