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

Side by Side Diff: tools/clang/rewrite_to_chrome_style/RewriteToChromeStyle.cpp

Issue 2256913002: Handling of DependentScopeDeclRefExpr and CXXDependentScopeMemberExpr nodes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@blink-style-new-clang
Patch Set: Rebasing... Created 4 years, 4 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 unified diff | Download patch
« no previous file with comments | « no previous file | tools/clang/rewrite_to_chrome_style/tests/function-templates-expected.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // Changes Blink-style names to Chrome-style names. Currently transforms: 5 // Changes Blink-style names to Chrome-style names. Currently transforms:
6 // fields: 6 // fields:
7 // int m_operationCount => int operation_count_ 7 // int m_operationCount => int operation_count_
8 // variables (including parameters): 8 // variables (including parameters):
9 // int mySuperVariable => int my_super_variable 9 // int mySuperVariable => int my_super_variable
10 // constants: 10 // constants:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 namespace { 48 namespace {
49 49
50 const char kBlinkFieldPrefix[] = "m_"; 50 const char kBlinkFieldPrefix[] = "m_";
51 const char kBlinkStaticMemberPrefix[] = "s_"; 51 const char kBlinkStaticMemberPrefix[] = "s_";
52 const char kGeneratedFileRegex[] = "^gen/|/gen/"; 52 const char kGeneratedFileRegex[] = "^gen/|/gen/";
53 53
54 const clang::ast_matchers::internal:: 54 const clang::ast_matchers::internal::
55 VariadicDynCastAllOfMatcher<clang::Expr, clang::UnresolvedMemberExpr> 55 VariadicDynCastAllOfMatcher<clang::Expr, clang::UnresolvedMemberExpr>
56 unresolvedMemberExpr; 56 unresolvedMemberExpr;
57 57
58 const clang::ast_matchers::internal::
59 VariadicDynCastAllOfMatcher<clang::Expr, clang::DependentScopeDeclRefExpr>
60 dependentScopeDeclRefExpr;
61
62 const clang::ast_matchers::internal::
63 VariadicDynCastAllOfMatcher<clang::Expr, clang::CXXDependentScopeMemberExpr>
64 cxxDependentScopeMemberExpr;
65
58 AST_MATCHER(clang::FunctionDecl, isOverloadedOperator) { 66 AST_MATCHER(clang::FunctionDecl, isOverloadedOperator) {
59 return Node.isOverloadedOperator(); 67 return Node.isOverloadedOperator();
60 } 68 }
61 69
62 AST_MATCHER_P(clang::FunctionTemplateDecl, 70 AST_MATCHER_P(clang::FunctionTemplateDecl,
63 templatedDecl, 71 templatedDecl,
64 clang::ast_matchers::internal::Matcher<clang::FunctionDecl>, 72 clang::ast_matchers::internal::Matcher<clang::FunctionDecl>,
65 InnerMatcher) { 73 InnerMatcher) {
66 return InnerMatcher.matches(*Node.getTemplatedDecl(), Finder, Builder); 74 return InnerMatcher.matches(*Node.getTemplatedDecl(), Finder, Builder);
67 } 75 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 return inner_matcher.matches(decl, finder, builder); 151 return inner_matcher.matches(decl, finder, builder);
144 } 152 }
145 153
146 AST_MATCHER_P(clang::CXXMethodDecl, 154 AST_MATCHER_P(clang::CXXMethodDecl,
147 includeAllOverriddenMethods, 155 includeAllOverriddenMethods,
148 clang::ast_matchers::internal::Matcher<clang::CXXMethodDecl>, 156 clang::ast_matchers::internal::Matcher<clang::CXXMethodDecl>,
149 InnerMatcher) { 157 InnerMatcher) {
150 return MatchAllOverriddenMethods(Node, InnerMatcher, Finder, Builder); 158 return MatchAllOverriddenMethods(Node, InnerMatcher, Finder, Builder);
151 } 159 }
152 160
161 // Matches |x.m| CXXDependentScopeMemberExpr if InnerMatcher matches |x|.
162 AST_MATCHER_P(clang::CXXDependentScopeMemberExpr,
163 hasBaseExpr,
164 clang::ast_matchers::internal::Matcher<clang::Expr>,
165 InnerMatcher) {
166 clang::Expr* base_expr = Node.isImplicitAccess() ? nullptr : Node.getBase();
167 return base_expr && InnerMatcher.matches(*base_expr, Finder, Builder);
168 }
169
170 // Matches |T::m| CXXDependentScopeMemberExpr if InnerMatcher matches |T|.
171 AST_MATCHER_P(
172 clang::CXXDependentScopeMemberExpr,
173 hasDependentQualifier,
174 clang::ast_matchers::internal::Matcher<clang::NestedNameSpecifier>,
175 InnerMatcher) {
176 clang::NestedNameSpecifier* qual = Node.getQualifier();
177 return qual && InnerMatcher.matches(*qual, Finder, Builder);
178 }
179
180 // Matches |T::m| DependentScopeDeclRefExpr if InnerMatcher matches |T|.
181 AST_MATCHER_P(
182 clang::DependentScopeDeclRefExpr,
183 dependentScopeIfQualifier,
184 clang::ast_matchers::internal::Matcher<clang::NestedNameSpecifier>,
185 InnerMatcher) {
186 clang::NestedNameSpecifier* qual = Node.getQualifier();
187 return qual && InnerMatcher.matches(*qual, Finder, Builder);
188 }
189
190 // Matches |const Class<T>&| QualType if InnerMatcher matches |Class<T>|.
191 AST_MATCHER_P(clang::QualType,
192 hasUnderlyingType,
193 clang::ast_matchers::internal::Matcher<clang::Type>,
194 InnerMatcher) {
195 const clang::Type* type = Node.getTypePtrOrNull();
196 return type && InnerMatcher.matches(*type, Finder, Builder);
197 }
198
153 bool IsMethodOverrideOf(const clang::CXXMethodDecl& decl, 199 bool IsMethodOverrideOf(const clang::CXXMethodDecl& decl,
154 const char* class_name) { 200 const char* class_name) {
155 if (decl.getParent()->getQualifiedNameAsString() == class_name) 201 if (decl.getParent()->getQualifiedNameAsString() == class_name)
156 return true; 202 return true;
157 for (auto it = decl.begin_overridden_methods(); 203 for (auto it = decl.begin_overridden_methods();
158 it != decl.end_overridden_methods(); ++it) { 204 it != decl.end_overridden_methods(); ++it) {
159 if (IsMethodOverrideOf(**it, class_name)) 205 if (IsMethodOverrideOf(**it, class_name))
160 return true; 206 return true;
161 } 207 }
162 return false; 208 return false;
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 516
471 template <> 517 template <>
472 struct TargetNodeTraits<clang::DeclRefExpr> { 518 struct TargetNodeTraits<clang::DeclRefExpr> {
473 static clang::SourceLocation GetLoc(const clang::DeclRefExpr& expr) { 519 static clang::SourceLocation GetLoc(const clang::DeclRefExpr& expr) {
474 return expr.getLocation(); 520 return expr.getLocation();
475 } 521 }
476 static const char* GetName() { return "expr"; } 522 static const char* GetName() { return "expr"; }
477 }; 523 };
478 524
479 template <> 525 template <>
526 struct TargetNodeTraits<clang::DependentScopeDeclRefExpr> {
527 static clang::SourceLocation GetLoc(
528 const clang::DependentScopeDeclRefExpr& expr) {
529 return expr.getLocation();
530 }
531 static const char* GetName() { return "expr"; }
532 };
533
534 template <>
535 struct TargetNodeTraits<clang::CXXDependentScopeMemberExpr> {
536 static clang::SourceLocation GetLoc(
537 const clang::CXXDependentScopeMemberExpr& expr) {
538 return expr.getMemberLoc();
539 }
540 static const char* GetName() { return "expr"; }
541 };
542
543 template <>
480 struct TargetNodeTraits<clang::CXXCtorInitializer> { 544 struct TargetNodeTraits<clang::CXXCtorInitializer> {
481 static clang::SourceLocation GetLoc(const clang::CXXCtorInitializer& init) { 545 static clang::SourceLocation GetLoc(const clang::CXXCtorInitializer& init) {
482 assert(init.isWritten()); 546 assert(init.isWritten());
483 return init.getSourceLocation(); 547 return init.getSourceLocation();
484 } 548 }
485 static const char* GetName() { return "initializer"; } 549 static const char* GetName() { return "initializer"; }
486 }; 550 };
487 551
488 template <> 552 template <>
489 struct TargetNodeTraits<clang::UnresolvedLookupExpr> { 553 struct TargetNodeTraits<clang::UnresolvedLookupExpr> {
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
579 return; // If false, the name was not suitable for renaming. 643 return; // If false, the name was not suitable for renaming.
580 llvm::StringRef old_name = decl->getName(); 644 llvm::StringRef old_name = decl->getName();
581 Base::AddReplacement(result, old_name, std::move(new_name)); 645 Base::AddReplacement(result, old_name, std::move(new_name));
582 } 646 }
583 }; 647 };
584 648
585 llvm::StringRef GetCurrentName(const clang::UnresolvedMemberExpr& expr) { 649 llvm::StringRef GetCurrentName(const clang::UnresolvedMemberExpr& expr) {
586 return expr.getMemberName().getAsString(); 650 return expr.getMemberName().getAsString();
587 } 651 }
588 652
653 llvm::StringRef GetCurrentName(const clang::DependentScopeDeclRefExpr& expr) {
654 return expr.getDeclName().getAsString();
655 }
656
657 llvm::StringRef GetCurrentName(const clang::CXXDependentScopeMemberExpr& expr) {
658 return expr.getMember().getAsString();
659 }
660
589 llvm::StringRef GetCurrentName(const clang::NamedDecl& decl) { 661 llvm::StringRef GetCurrentName(const clang::NamedDecl& decl) {
590 return decl.getName(); 662 return decl.getName();
591 } 663 }
592 664
593 bool IsCall(const clang::Expr& expr, clang::ASTContext& context) { 665 bool IsCall(const clang::Expr& expr, clang::ASTContext& context) {
594 auto parents = context.getParents(expr); 666 auto parents = context.getParents(expr);
595 return std::all_of(parents.begin(), parents.end(), 667 return std::all_of(parents.begin(), parents.end(),
596 [](const clang::ast_type_traits::DynTypedNode& parent) { 668 [](const clang::ast_type_traits::DynTypedNode& parent) {
597 return nullptr != parent.get<clang::CallExpr>(); 669 return nullptr != parent.get<clang::CallExpr>();
598 }); 670 });
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 DeclRewriterBase<clang::NamedDecl, clang::UnresolvedMemberExpr>; 761 DeclRewriterBase<clang::NamedDecl, clang::UnresolvedMemberExpr>;
690 762
691 using UnresolvedDependentMemberRewriter = 763 using UnresolvedDependentMemberRewriter =
692 UnresolvedRewriterBase<clang::UnresolvedMemberExpr>; 764 UnresolvedRewriterBase<clang::UnresolvedMemberExpr>;
693 765
694 using UnresolvedUsingValueDeclRewriter = 766 using UnresolvedUsingValueDeclRewriter =
695 UnresolvedRewriterBase<clang::UnresolvedUsingValueDecl>; 767 UnresolvedRewriterBase<clang::UnresolvedUsingValueDecl>;
696 768
697 using UsingDeclRewriter = DeclRewriterBase<clang::UsingDecl, clang::NamedDecl>; 769 using UsingDeclRewriter = DeclRewriterBase<clang::UsingDecl, clang::NamedDecl>;
698 770
771 using DependentScopeDeclRefExprRewriter =
772 UnresolvedRewriterBase<clang::DependentScopeDeclRefExpr>;
773
774 using CXXDependentScopeMemberExprRewriter =
775 UnresolvedRewriterBase<clang::CXXDependentScopeMemberExpr>;
776
699 } // namespace 777 } // namespace
700 778
701 static llvm::cl::extrahelp common_help(CommonOptionsParser::HelpMessage); 779 static llvm::cl::extrahelp common_help(CommonOptionsParser::HelpMessage);
702 780
703 int main(int argc, const char* argv[]) { 781 int main(int argc, const char* argv[]) {
704 // TODO(dcheng): Clang tooling should do this itself. 782 // TODO(dcheng): Clang tooling should do this itself.
705 // http://llvm.org/bugs/show_bug.cgi?id=21627 783 // http://llvm.org/bugs/show_bug.cgi?id=21627
706 llvm::InitializeNativeTarget(); 784 llvm::InitializeNativeTarget();
707 llvm::InitializeNativeTargetAsmParser(); 785 llvm::InitializeNativeTargetAsmParser();
708 llvm::cl::OptionCategory category( 786 llvm::cl::OptionCategory category(
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
988 // using blink::X; 1066 // using blink::X;
989 // matches |using blink::X|. 1067 // matches |using blink::X|.
990 auto using_decl_matcher = id( 1068 auto using_decl_matcher = id(
991 "decl", usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(anyOf( 1069 "decl", usingDecl(hasAnyUsingShadowDecl(hasTargetDecl(anyOf(
992 var_decl_matcher, field_decl_matcher, function_decl_matcher, 1070 var_decl_matcher, field_decl_matcher, function_decl_matcher,
993 method_decl_matcher, function_template_decl_matcher, 1071 method_decl_matcher, function_template_decl_matcher,
994 method_template_decl_matcher, enum_member_decl_matcher))))); 1072 method_template_decl_matcher, enum_member_decl_matcher)))));
995 UsingDeclRewriter using_decl_rewriter(&replacements); 1073 UsingDeclRewriter using_decl_rewriter(&replacements);
996 match_finder.addMatcher(using_decl_matcher, &using_decl_rewriter); 1074 match_finder.addMatcher(using_decl_matcher, &using_decl_rewriter);
997 1075
1076 // Matches any QualType that refers to a blink type:
1077 // - const blink::Foo&
1078 // - blink::Foo*
1079 // - blink::Foo<T>
1080 // - ...
1081 auto blink_qual_type_matcher = qualType(
1082 anyOf(pointsTo(in_blink_namespace), references(in_blink_namespace),
Łukasz Anforowicz 2016/08/25 18:11:13 This strips only 1 layer of indirection, but I don
1083 hasUnderlyingType(anyOf(
1084 enumType(hasDeclaration(in_blink_namespace)),
1085 recordType(hasDeclaration(in_blink_namespace)),
1086 templateSpecializationType(hasDeclaration(in_blink_namespace)),
1087 templateTypeParmType(hasDeclaration(in_blink_namespace)),
1088 typedefType(hasDeclaration(in_blink_namespace))))));
Łukasz Anforowicz 2016/08/25 18:11:13 I don't know how I can avoid listing all the vario
1089
1090 // Template-dependent decl lookup ========
1091 // Given
1092 // template <typename T> void f() { T::foo(); }
1093 // matches |T::foo|.
1094 auto dependent_scope_decl_ref_expr_matcher =
1095 expr(id("expr", dependentScopeDeclRefExpr(dependentScopeIfQualifier(
1096 specifiesType(blink_qual_type_matcher)))));
1097 DependentScopeDeclRefExprRewriter dependent_scope_decl_ref_expr_rewriter(
1098 &replacements);
1099 match_finder.addMatcher(dependent_scope_decl_ref_expr_matcher,
1100 &dependent_scope_decl_ref_expr_rewriter);
1101
1102 // Template-dependent member lookup ========
1103 // Given
1104 // template <typename T>
1105 // class Foo {
1106 // void f() { T::foo(); }
1107 // void g(T x) { x.bar(); }
1108 // };
1109 // matches |T::foo| and |x.bar|.
1110 auto cxx_dependent_scope_member_expr_matcher = expr(
1111 id("expr",
1112 cxxDependentScopeMemberExpr(anyOf(
1113 hasBaseExpr(hasType(blink_qual_type_matcher)),
1114 hasDependentQualifier(specifiesType(blink_qual_type_matcher))))));
1115 CXXDependentScopeMemberExprRewriter cxx_dependent_scope_member_expr_rewriter(
1116 &replacements);
1117 match_finder.addMatcher(cxx_dependent_scope_member_expr_matcher,
1118 &cxx_dependent_scope_member_expr_rewriter);
1119
998 std::unique_ptr<clang::tooling::FrontendActionFactory> factory = 1120 std::unique_ptr<clang::tooling::FrontendActionFactory> factory =
999 clang::tooling::newFrontendActionFactory(&match_finder); 1121 clang::tooling::newFrontendActionFactory(&match_finder);
1000 int result = tool.run(factory.get()); 1122 int result = tool.run(factory.get());
1001 if (result != 0) 1123 if (result != 0)
1002 return result; 1124 return result;
1003 1125
1004 #if defined(_WIN32) 1126 #if defined(_WIN32)
1005 HANDLE lockfd = CreateFile("rewrite-sym.lock", GENERIC_READ, FILE_SHARE_READ, 1127 HANDLE lockfd = CreateFile("rewrite-sym.lock", GENERIC_READ, FILE_SHARE_READ,
1006 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 1128 NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
1007 OVERLAPPED overlapped = {}; 1129 OVERLAPPED overlapped = {};
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1039 for (const auto& r : replacements) { 1161 for (const auto& r : replacements) {
1040 std::string replacement_text = r.getReplacementText().str(); 1162 std::string replacement_text = r.getReplacementText().str();
1041 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); 1163 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0');
1042 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() 1164 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset()
1043 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; 1165 << ":::" << r.getLength() << ":::" << replacement_text << "\n";
1044 } 1166 }
1045 llvm::outs() << "==== END EDITS ====\n"; 1167 llvm::outs() << "==== END EDITS ====\n";
1046 1168
1047 return 0; 1169 return 0;
1048 } 1170 }
OLDNEW
« no previous file with comments | « no previous file | tools/clang/rewrite_to_chrome_style/tests/function-templates-expected.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698