| 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 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1032 const clang::UnresolvedUsingValueDecl& decl) { | 1032 const clang::UnresolvedUsingValueDecl& decl) { |
| 1033 return decl.getNameInfo().getLoc(); | 1033 return decl.getNameInfo().getLoc(); |
| 1034 } | 1034 } |
| 1035 static const char* GetName() { return "decl"; } | 1035 static const char* GetName() { return "decl"; } |
| 1036 static const char* GetType() { return "UnresolvedUsingValueDecl"; } | 1036 static const char* GetType() { return "UnresolvedUsingValueDecl"; } |
| 1037 }; | 1037 }; |
| 1038 | 1038 |
| 1039 template <typename TargetNode> | 1039 template <typename TargetNode> |
| 1040 class RewriterBase : public MatchFinder::MatchCallback { | 1040 class RewriterBase : public MatchFinder::MatchCallback { |
| 1041 public: | 1041 public: |
| 1042 explicit RewriterBase(std::set<Replacement>* replacements) | 1042 explicit RewriterBase(std::set<Replacement>* replacements, |
| 1043 : replacements_(replacements) {} | 1043 RenameCategory category) |
| 1044 : replacements_(replacements), edit_tracker_(category) {} |
| 1044 | 1045 |
| 1045 const TargetNode& GetTargetNode(const MatchFinder::MatchResult& result) { | 1046 const TargetNode& GetTargetNode(const MatchFinder::MatchResult& result) { |
| 1046 const TargetNode* target_node = result.Nodes.getNodeAs<TargetNode>( | 1047 const TargetNode* target_node = result.Nodes.getNodeAs<TargetNode>( |
| 1047 TargetNodeTraits<TargetNode>::GetName()); | 1048 TargetNodeTraits<TargetNode>::GetName()); |
| 1048 assert(target_node); | 1049 assert(target_node); |
| 1049 return *target_node; | 1050 return *target_node; |
| 1050 } | 1051 } |
| 1051 | 1052 |
| 1052 bool GenerateReplacement(const MatchFinder::MatchResult& result, | 1053 bool GenerateReplacement(const MatchFinder::MatchResult& result, |
| 1053 clang::SourceLocation loc, | 1054 clang::SourceLocation loc, |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1119 return; | 1120 return; |
| 1120 | 1121 |
| 1121 Replacement replacement; | 1122 Replacement replacement; |
| 1122 if (!GenerateReplacement(result, loc, old_name, new_name, &replacement)) | 1123 if (!GenerateReplacement(result, loc, old_name, new_name, &replacement)) |
| 1123 return; | 1124 return; |
| 1124 | 1125 |
| 1125 replacements_->insert(std::move(replacement)); | 1126 replacements_->insert(std::move(replacement)); |
| 1126 edit_tracker_.Add(*result.SourceManager, loc, old_name, new_name); | 1127 edit_tracker_.Add(*result.SourceManager, loc, old_name, new_name); |
| 1127 } | 1128 } |
| 1128 | 1129 |
| 1129 const EditTracker& edit_tracker() const { return edit_tracker_; } | 1130 const EditTracker* edit_tracker() const { return &edit_tracker_; } |
| 1130 | 1131 |
| 1131 private: | 1132 private: |
| 1132 std::set<Replacement>* const replacements_; | 1133 std::set<Replacement>* const replacements_; |
| 1133 EditTracker edit_tracker_; | 1134 EditTracker edit_tracker_; |
| 1134 }; | 1135 }; |
| 1135 | 1136 |
| 1137 template <typename DeclNode> |
| 1138 RenameCategory GetCategory(); |
| 1139 template <> |
| 1140 RenameCategory GetCategory<clang::FieldDecl>() { |
| 1141 return RenameCategory::kField; |
| 1142 } |
| 1143 template <> |
| 1144 RenameCategory GetCategory<clang::VarDecl>() { |
| 1145 return RenameCategory::kVariable; |
| 1146 } |
| 1147 template <> |
| 1148 RenameCategory GetCategory<clang::FunctionDecl>() { |
| 1149 return RenameCategory::kFunction; |
| 1150 } |
| 1151 template <> |
| 1152 RenameCategory GetCategory<clang::CXXMethodDecl>() { |
| 1153 return RenameCategory::kFunction; |
| 1154 } |
| 1155 template <> |
| 1156 RenameCategory GetCategory<clang::EnumConstantDecl>() { |
| 1157 return RenameCategory::kEnumValue; |
| 1158 } |
| 1159 template <> |
| 1160 RenameCategory GetCategory<clang::NamedDecl>() { |
| 1161 return RenameCategory::kUnresolved; |
| 1162 } |
| 1163 template <> |
| 1164 RenameCategory GetCategory<clang::UsingDecl>() { |
| 1165 return RenameCategory::kUnresolved; |
| 1166 } |
| 1167 |
| 1136 template <typename DeclNode, typename TargetNode> | 1168 template <typename DeclNode, typename TargetNode> |
| 1137 class DeclRewriterBase : public RewriterBase<TargetNode> { | 1169 class DeclRewriterBase : public RewriterBase<TargetNode> { |
| 1138 public: | 1170 public: |
| 1139 using Base = RewriterBase<TargetNode>; | 1171 using Base = RewriterBase<TargetNode>; |
| 1140 | 1172 |
| 1141 explicit DeclRewriterBase(std::set<Replacement>* replacements) | 1173 explicit DeclRewriterBase(std::set<Replacement>* replacements) |
| 1142 : Base(replacements) {} | 1174 : Base(replacements, GetCategory<DeclNode>()) {} |
| 1143 | 1175 |
| 1144 void run(const MatchFinder::MatchResult& result) override { | 1176 void run(const MatchFinder::MatchResult& result) override { |
| 1145 const DeclNode* decl = result.Nodes.getNodeAs<DeclNode>("decl"); | 1177 const DeclNode* decl = result.Nodes.getNodeAs<DeclNode>("decl"); |
| 1146 if (!decl->getDeclName().isIdentifier()) | 1178 if (!decl->getDeclName().isIdentifier()) |
| 1147 return; | 1179 return; |
| 1148 | 1180 |
| 1149 assert(decl); | 1181 assert(decl); |
| 1150 llvm::StringRef old_name = decl->getName(); | 1182 llvm::StringRef old_name = decl->getName(); |
| 1151 | 1183 |
| 1152 // Return early if there's no name to be renamed. | 1184 // Return early if there's no name to be renamed. |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1319 // that |using Base::foo| refers to a method. | 1351 // that |using Base::foo| refers to a method. |
| 1320 return true; | 1352 return true; |
| 1321 } | 1353 } |
| 1322 | 1354 |
| 1323 template <typename TargetNode> | 1355 template <typename TargetNode> |
| 1324 class UnresolvedRewriterBase : public RewriterBase<TargetNode> { | 1356 class UnresolvedRewriterBase : public RewriterBase<TargetNode> { |
| 1325 public: | 1357 public: |
| 1326 using Base = RewriterBase<TargetNode>; | 1358 using Base = RewriterBase<TargetNode>; |
| 1327 | 1359 |
| 1328 explicit UnresolvedRewriterBase(std::set<Replacement>* replacements) | 1360 explicit UnresolvedRewriterBase(std::set<Replacement>* replacements) |
| 1329 : RewriterBase<TargetNode>(replacements) {} | 1361 : RewriterBase<TargetNode>(replacements, RenameCategory::kUnresolved) {} |
| 1330 | 1362 |
| 1331 void run(const MatchFinder::MatchResult& result) override { | 1363 void run(const MatchFinder::MatchResult& result) override { |
| 1332 const TargetNode& node = Base::GetTargetNode(result); | 1364 const TargetNode& node = Base::GetTargetNode(result); |
| 1333 | 1365 |
| 1334 clang::DeclarationName decl_name = GetUnresolvedName(node); | 1366 clang::DeclarationName decl_name = GetUnresolvedName(node); |
| 1335 switch (decl_name.getNameKind()) { | 1367 switch (decl_name.getNameKind()) { |
| 1336 // Do not rewrite this: | 1368 // Do not rewrite this: |
| 1337 // return operator T*(); | 1369 // return operator T*(); |
| 1338 // into this: | 1370 // into this: |
| 1339 // return Operator type - parameter - 0 - 0 * T * (); | 1371 // return Operator type - parameter - 0 - 0 * T * (); |
| (...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1837 // Prepare and run the tool. | 1869 // Prepare and run the tool. |
| 1838 SourceFileCallbacks source_file_callbacks(&gmock_member_rewriter); | 1870 SourceFileCallbacks source_file_callbacks(&gmock_member_rewriter); |
| 1839 std::unique_ptr<clang::tooling::FrontendActionFactory> factory = | 1871 std::unique_ptr<clang::tooling::FrontendActionFactory> factory = |
| 1840 clang::tooling::newFrontendActionFactory(&match_finder, | 1872 clang::tooling::newFrontendActionFactory(&match_finder, |
| 1841 &source_file_callbacks); | 1873 &source_file_callbacks); |
| 1842 int result = tool.run(factory.get()); | 1874 int result = tool.run(factory.get()); |
| 1843 if (result != 0) | 1875 if (result != 0) |
| 1844 return result; | 1876 return result; |
| 1845 | 1877 |
| 1846 // Supplemental data for the Blink rename rebase helper. | 1878 // Supplemental data for the Blink rename rebase helper. |
| 1847 // TODO(dcheng): There's a lot of match rewriters missing from this list. | 1879 std::vector<const EditTracker*> all_edit_trackers{ |
| 1880 field_decl_rewriter.edit_tracker(), |
| 1881 var_decl_rewriter.edit_tracker(), |
| 1882 enum_member_decl_rewriter.edit_tracker(), |
| 1883 member_rewriter.edit_tracker(), |
| 1884 decl_ref_rewriter.edit_tracker(), |
| 1885 enum_member_ref_rewriter.edit_tracker(), |
| 1886 member_ref_rewriter.edit_tracker(), |
| 1887 function_decl_rewriter.edit_tracker(), |
| 1888 function_ref_rewriter.edit_tracker(), |
| 1889 method_decl_rewriter.edit_tracker(), |
| 1890 method_ref_rewriter.edit_tracker(), |
| 1891 method_member_rewriter.edit_tracker(), |
| 1892 constructor_initializer_rewriter.edit_tracker(), |
| 1893 unresolved_lookup_rewriter.edit_tracker(), |
| 1894 unresolved_member_rewriter.edit_tracker(), |
| 1895 unresolved_dependent_member_rewriter.edit_tracker(), |
| 1896 unresolved_using_value_decl_rewriter.edit_tracker(), |
| 1897 using_decl_rewriter.edit_tracker(), |
| 1898 dependent_scope_decl_ref_expr_rewriter.edit_tracker(), |
| 1899 cxx_dependent_scope_member_expr_rewriter.edit_tracker(), |
| 1900 gmock_member_rewriter.edit_tracker(), |
| 1901 }; |
| 1848 llvm::outs() << "==== BEGIN TRACKED EDITS ====\n"; | 1902 llvm::outs() << "==== BEGIN TRACKED EDITS ====\n"; |
| 1849 field_decl_rewriter.edit_tracker().SerializeTo("var", llvm::outs()); | 1903 for (const EditTracker* edit_tracker : all_edit_trackers) |
| 1850 var_decl_rewriter.edit_tracker().SerializeTo("var", llvm::outs()); | 1904 edit_tracker->SerializeTo(llvm::outs()); |
| 1851 enum_member_decl_rewriter.edit_tracker().SerializeTo("enu", llvm::outs()); | |
| 1852 function_decl_rewriter.edit_tracker().SerializeTo("fun", llvm::outs()); | |
| 1853 method_decl_rewriter.edit_tracker().SerializeTo("fun", llvm::outs()); | |
| 1854 llvm::outs() << "==== END TRACKED EDITS ====\n"; | 1905 llvm::outs() << "==== END TRACKED EDITS ====\n"; |
| 1855 | 1906 |
| 1856 // Serialization format is documented in tools/clang/scripts/run_tool.py | 1907 // Serialization format is documented in tools/clang/scripts/run_tool.py |
| 1857 llvm::outs() << "==== BEGIN EDITS ====\n"; | 1908 llvm::outs() << "==== BEGIN EDITS ====\n"; |
| 1858 for (const auto& r : replacements) { | 1909 for (const auto& r : replacements) { |
| 1859 std::string replacement_text = r.getReplacementText().str(); | 1910 std::string replacement_text = r.getReplacementText().str(); |
| 1860 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); | 1911 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); |
| 1861 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() | 1912 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() |
| 1862 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; | 1913 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; |
| 1863 } | 1914 } |
| 1864 llvm::outs() << "==== END EDITS ====\n"; | 1915 llvm::outs() << "==== END EDITS ====\n"; |
| 1865 | 1916 |
| 1866 return 0; | 1917 return 0; |
| 1867 } | 1918 } |
| OLD | NEW |