// 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. #include "ValueRewriter.h" #include <utility> using namespace clang::ast_matchers; ValueRewriter::ListValueCallback::ListValueCallback( std::string method, std::string replacement, std::set<clang::tooling::Replacement>* replacements) : method_(std::move(method)), replacement_(std::move(replacement)), replacements_(replacements) {} void ValueRewriter::ListValueCallback::run( const MatchFinder::MatchResult& result) { auto* callExpr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>(method()); clang::CharSourceRange call_range = clang::CharSourceRange::getTokenRange(callExpr->getExprLoc()); replacements_->emplace(*result.SourceManager, call_range, replacement()); } ValueRewriter::ValueRewriter( std::set<clang::tooling::Replacement>* replacements) : list_value_callbacks_({ {"::base::ListValue::Clear", "GetList().clear", replacements}, {"::base::ListValue::GetSize", "GetList().size", replacements}, {"::base::ListValue::empty", "GetList().empty", replacements}, {"::base::ListValue::Reserve", "GetList().reserve", replacements}, {"::base::ListValue::AppendBoolean", "GetList().emplace_back", replacements}, {"::base::ListValue::AppendInteger", "GetList().emplace_back", replacements}, {"::base::ListValue::AppendDouble", "GetList().emplace_back", replacements}, {"::base::ListValue::AppendString", "GetList().emplace_back", replacements}, }) {} void ValueRewriter::RegisterMatchers(MatchFinder* match_finder) { for (auto& callback : list_value_callbacks_) { match_finder->addMatcher( callExpr(callee(functionDecl(hasName(callback.method())))) .bind(callback.method()), &callback); } }