Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(279)

Unified Diff: tools/clang/value_cleanup/ListValueRewriter.cpp

Issue 2032983002: base::Value cleanup: add simple Clang tool for structured cleanups (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix comments. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/clang/value_cleanup/ListValueRewriter.h ('k') | tools/clang/value_cleanup/ValueCleanup.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/clang/value_cleanup/ListValueRewriter.cpp
diff --git a/tools/clang/value_cleanup/ListValueRewriter.cpp b/tools/clang/value_cleanup/ListValueRewriter.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d6c5cf233688e1de117bfc968c198708e6591e0a
--- /dev/null
+++ b/tools/clang/value_cleanup/ListValueRewriter.cpp
@@ -0,0 +1,191 @@
+// Copyright 2016 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 "ListValueRewriter.h"
+
+#include <assert.h>
+#include <algorithm>
+
+#include "clang/AST/ASTContext.h"
+#include "clang/ASTMatchers/ASTMatchFinder.h"
+#include "clang/ASTMatchers/ASTMatchers.h"
+#include "clang/ASTMatchers/ASTMatchersMacros.h"
+#include "clang/Basic/CharInfo.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Frontend/FrontendActions.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Tooling/Refactoring.h"
+#include "llvm/ADT/STLExtras.h"
+
+using namespace clang::ast_matchers;
+using clang::tooling::Replacement;
+using clang::tooling::Replacements;
+using llvm::StringRef;
+
+ListValueRewriter::AppendCallback::AppendCallback(Replacements* replacements)
+ : replacements_(replacements) {}
+
+void ListValueRewriter::AppendCallback::run(
+ const MatchFinder::MatchResult& result) {
+ // Delete `new base::*Value(' and `)'.
+ auto* newExpr = result.Nodes.getNodeAs<clang::CXXNewExpr>("newExpr");
+ auto* argExpr = result.Nodes.getNodeAs<clang::Expr>("argExpr");
+
+ clang::CharSourceRange pre_arg_range = clang::CharSourceRange::getCharRange(
+ newExpr->getLocStart(), argExpr->getLocStart());
+ replacements_->emplace(*result.SourceManager, pre_arg_range, "");
+
+ clang::CharSourceRange post_arg_range =
+ clang::CharSourceRange::getTokenRange(newExpr->getLocEnd());
+ replacements_->emplace(*result.SourceManager, post_arg_range, "");
+}
+
+ListValueRewriter::AppendBooleanCallback::AppendBooleanCallback(
+ Replacements* replacements)
+ : AppendCallback(replacements) {}
+
+void ListValueRewriter::AppendBooleanCallback::run(
+ const MatchFinder::MatchResult& result) {
+ // Replace 'Append' with 'AppendBoolean'.
+ auto* callExpr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>("callExpr");
+
+ clang::CharSourceRange call_range =
+ clang::CharSourceRange::getTokenRange(callExpr->getExprLoc());
+ replacements_->emplace(*result.SourceManager, call_range, "AppendBoolean");
+
+ AppendCallback::run(result);
+}
+
+ListValueRewriter::AppendIntegerCallback::AppendIntegerCallback(
+ Replacements* replacements)
+ : AppendCallback(replacements) {}
+
+void ListValueRewriter::AppendIntegerCallback::run(
+ const MatchFinder::MatchResult& result) {
+ // Replace 'Append' with 'AppendInteger'.
+ auto* callExpr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>("callExpr");
+
+ clang::CharSourceRange call_range =
+ clang::CharSourceRange::getTokenRange(callExpr->getExprLoc());
+ replacements_->emplace(*result.SourceManager, call_range, "AppendInteger");
+
+ AppendCallback::run(result);
+}
+
+ListValueRewriter::AppendDoubleCallback::AppendDoubleCallback(
+ Replacements* replacements)
+ : AppendCallback(replacements) {}
+
+void ListValueRewriter::AppendDoubleCallback::run(
+ const MatchFinder::MatchResult& result) {
+ // Replace 'Append' with 'AppendDouble'.
+ auto* callExpr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>("callExpr");
+
+ clang::CharSourceRange call_range =
+ clang::CharSourceRange::getTokenRange(callExpr->getExprLoc());
+ replacements_->emplace(*result.SourceManager, call_range, "AppendDouble");
+
+ AppendCallback::run(result);
+}
+
+ListValueRewriter::AppendStringCallback::AppendStringCallback(
+ Replacements* replacements)
+ : AppendCallback(replacements) {}
+
+void ListValueRewriter::AppendStringCallback::run(
+ const MatchFinder::MatchResult& result) {
+ // Replace 'Append' with 'AppendString'.
+ auto* callExpr = result.Nodes.getNodeAs<clang::CXXMemberCallExpr>("callExpr");
+
+ clang::CharSourceRange call_range =
+ clang::CharSourceRange::getTokenRange(callExpr->getExprLoc());
+ replacements_->emplace(*result.SourceManager, call_range, "AppendString");
+
+ AppendCallback::run(result);
+}
+
+ListValueRewriter::ListValueRewriter(Replacements* replacements)
+ : append_boolean_callback_(replacements),
+ append_integer_callback_(replacements),
+ append_double_callback_(replacements),
+ append_string_callback_(replacements) {}
+
+void ListValueRewriter::RegisterMatchers(MatchFinder* match_finder) {
+ auto is_list_append =
+ allOf(callee(cxxMethodDecl(hasName("::base::ListValue::Append"))),
+ argumentCountIs(1));
+
+ // base::ListValue::Append(new base::FundamentalValue(bool))
+ // => base::ListValue::AppendBoolean()
+ match_finder->addMatcher(
+ id("callExpr",
+ cxxMemberCallExpr(
+ is_list_append,
+ hasArgument(
+ 0, ignoringParenImpCasts(id(
+ "newExpr",
+ cxxNewExpr(has(cxxConstructExpr(
+ hasDeclaration(cxxMethodDecl(hasName(
+ "::base::FundamentalValue::FundamentalValue"))),
+ argumentCountIs(1),
+ hasArgument(
+ 0, id("argExpr",
+ expr(hasType(booleanType())))))))))))),
+ &append_boolean_callback_);
+
+ // base::ListValue::Append(new base::FundamentalValue(int))
+ // => base::ListValue::AppendInteger()
+ match_finder->addMatcher(
+ id("callExpr",
+ cxxMemberCallExpr(
+ is_list_append,
+ hasArgument(
+ 0,
+ ignoringParenImpCasts(id(
+ "newExpr",
+ cxxNewExpr(has(cxxConstructExpr(
+ hasDeclaration(cxxMethodDecl(hasName(
+ "::base::FundamentalValue::FundamentalValue"))),
+ argumentCountIs(1),
+ hasArgument(0, id("argExpr",
+ expr(hasType(isInteger()),
+ unless(hasType(
+ booleanType()))))))))))))),
+ &append_integer_callback_);
+
+ // base::ListValue::Append(new base::FundamentalValue(double))
+ // => base::ListValue::AppendDouble()
+ match_finder->addMatcher(
+ id("callExpr",
+ cxxMemberCallExpr(
+ is_list_append,
+ hasArgument(
+ 0, ignoringParenImpCasts(id(
+ "newExpr",
+ cxxNewExpr(has(cxxConstructExpr(
+ hasDeclaration(cxxMethodDecl(hasName(
+ "::base::FundamentalValue::FundamentalValue"))),
+ argumentCountIs(1),
+ hasArgument(
+ 0, id("argExpr",
+ expr(hasType(
+ realFloatingPointType())))))))))))),
+ &append_double_callback_);
+
+ // base::ListValue::Append(new base::StringValue(...))
+ // => base::ListValue::AppendString()
+ match_finder->addMatcher(
+ id("callExpr",
+ cxxMemberCallExpr(
+ is_list_append,
+ hasArgument(
+ 0, ignoringParenImpCasts(id(
+ "newExpr",
+ cxxNewExpr(has(cxxConstructExpr(
+ hasDeclaration(cxxMethodDecl(
+ hasName("::base::StringValue::StringValue"))),
+ argumentCountIs(1),
+ hasArgument(0, id("argExpr", expr())))))))))),
+ &append_string_callback_);
+}
« no previous file with comments | « tools/clang/value_cleanup/ListValueRewriter.h ('k') | tools/clang/value_cleanup/ValueCleanup.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698