OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 } |
OLD | NEW |