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

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

Issue 2608443002: Blacklisting renaming of "hash" in case of static methods and functions. (Closed)
Patch Set: Addressed CR feedback + shuffled code around a bit. Created 3 years, 11 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/methods-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 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 if (decl.getParent()->getQualifiedNameAsString() == class_name) 200 if (decl.getParent()->getQualifiedNameAsString() == class_name)
201 return true; 201 return true;
202 for (auto it = decl.begin_overridden_methods(); 202 for (auto it = decl.begin_overridden_methods();
203 it != decl.end_overridden_methods(); ++it) { 203 it != decl.end_overridden_methods(); ++it) {
204 if (IsMethodOverrideOf(**it, class_name)) 204 if (IsMethodOverrideOf(**it, class_name))
205 return true; 205 return true;
206 } 206 }
207 return false; 207 return false;
208 } 208 }
209 209
210 bool IsBlacklistedFunction(const clang::FunctionDecl& decl) { 210 bool IsBlacklistedFunctionName(llvm::StringRef name) {
211 // swap() functions should match the signature of std::swap for ADL tricks. 211 // https://crbug.com/677166: Have to avoid renaming |hash| -> |Hash| to avoid
212 return decl.getName() == "swap"; 212 // colliding with a struct already named |Hash|.
213 return name == "hash";
213 } 214 }
214 215
215 bool IsBlacklistedMethodName(llvm::StringRef name) { 216 bool IsBlacklistedFreeFunctionName(llvm::StringRef name) {
217 // swap() functions should match the signature of std::swap for ADL tricks.
218 return name == "swap";
219 }
220
221 bool IsBlacklistedInstanceMethodName(llvm::StringRef name) {
216 static const char* kBlacklistedNames[] = { 222 static const char* kBlacklistedNames[] = {
217 "hash", 223 // We should avoid renaming the method names listed below, because
218 "lock", "unlock", "try_lock", 224 // 1. They are used in templated code (e.g. in <algorithms>)
219 "begin", "end", "rbegin", "rend", 225 // 2. They (begin+end) are used in range-based for syntax sugar
226 // - for (auto x : foo) { ... } // <- foo.begin() will be called.
227 "begin", "end", "rbegin", "rend", "lock", "unlock", "try_lock",
220 }; 228 };
221 for (const auto& b : kBlacklistedNames) { 229 for (const auto& b : kBlacklistedNames) {
222 if (name == b) 230 if (name == b)
223 return true; 231 return true;
224 } 232 }
225 return false; 233 return false;
226 } 234 }
227 235
236 bool IsBlacklistedFunction(const clang::FunctionDecl& decl) {
237 clang::StringRef name = decl.getName();
238 return IsBlacklistedFunctionName(name) || IsBlacklistedFreeFunctionName(name);
239 }
240
228 bool IsBlacklistedMethod(const clang::CXXMethodDecl& decl) { 241 bool IsBlacklistedMethod(const clang::CXXMethodDecl& decl) {
229 if (decl.isStatic()) 242 clang::StringRef name = decl.getName();
230 return false; 243 if (IsBlacklistedFunctionName(name))
244 return true;
231 245
232 clang::StringRef name = decl.getName(); 246 if (decl.isInstance() && IsBlacklistedInstanceMethodName(name))
233 if (IsBlacklistedMethodName(name)) 247 return true;
dcheng 2016/12/28 18:48:49 I think we can just early return here if it's stat
Łukasz Anforowicz 2016/12/28 18:56:50 Done.
234 return true;
235 248
236 // Subclasses of InspectorAgent will subclass "disable()" from both blink and 249 // Subclasses of InspectorAgent will subclass "disable()" from both blink and
237 // from gen/, which is problematic, but DevTools folks don't want to rename 250 // from gen/, which is problematic, but DevTools folks don't want to rename
238 // it or split this up. So don't rename it at all. 251 // it or split this up. So don't rename it at all.
239 if (name.equals("disable") && 252 if (decl.isInstance() && name.equals("disable") &&
240 IsMethodOverrideOf(decl, "blink::InspectorAgent")) 253 IsMethodOverrideOf(decl, "blink::InspectorAgent"))
241 return true; 254 return true;
242 255
243 return false; 256 return false;
244 } 257 }
245 258
246 AST_MATCHER(clang::FunctionDecl, isBlacklistedFunction) { 259 AST_MATCHER(clang::FunctionDecl, isBlacklistedFunction) {
247 return IsBlacklistedFunction(Node); 260 return IsBlacklistedFunction(Node);
248 } 261 }
249 262
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
845 llvm::StringRef old_name = info->getName(); 858 llvm::StringRef old_name = info->getName();
846 859
847 // Try to guess a new name. 860 // Try to guess a new name.
848 std::string new_name; 861 std::string new_name;
849 if (GuessNameForUnresolvedDependentNode(node, *result.Context, old_name, 862 if (GuessNameForUnresolvedDependentNode(node, *result.Context, old_name,
850 new_name)) 863 new_name))
851 Base::AddReplacement(result, old_name, std::move(new_name)); 864 Base::AddReplacement(result, old_name, std::move(new_name));
852 } 865 }
853 866
854 private: 867 private:
868 static bool IsBlacklistedMethodName(llvm::StringRef name) {
dcheng 2016/12/28 18:48:49 How come this is a static method now?
Łukasz Anforowicz 2016/12/28 18:56:50 This was a free function, but the only caller was/
dcheng 2016/12/28 19:03:38 I think it's just confusing to not have all the si
Łukasz Anforowicz 2016/12/28 19:08:07 Done.
869 return IsBlacklistedFunctionName(name) ||
870 IsBlacklistedInstanceMethodName(name);
871 }
872
855 // This method calculates a new name for nodes that depend on template 873 // This method calculates a new name for nodes that depend on template
856 // parameters (http://en.cppreference.com/w/cpp/language/dependent_name). The 874 // parameters (http://en.cppreference.com/w/cpp/language/dependent_name). The
857 // renaming is based on crude heuristics, because such nodes are not bound to 875 // renaming is based on crude heuristics, because such nodes are not bound to
858 // a specific decl until template instantiation - at the point of rename, one 876 // a specific decl until template instantiation - at the point of rename, one
859 // cannot tell whether the node will eventually resolve to a field / method / 877 // cannot tell whether the node will eventually resolve to a field / method /
860 // constant / etc. 878 // constant / etc.
861 // 879 //
862 // The method returns false if no renaming should be done. 880 // The method returns false if no renaming should be done.
863 // Otherwise the method returns true and sets |new_name|. 881 // Otherwise the method returns true and sets |new_name|.
864 bool GuessNameForUnresolvedDependentNode(const TargetNode& node, 882 bool GuessNameForUnresolvedDependentNode(const TargetNode& node,
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 for (const auto& r : replacements) { 1312 for (const auto& r : replacements) {
1295 std::string replacement_text = r.getReplacementText().str(); 1313 std::string replacement_text = r.getReplacementText().str();
1296 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); 1314 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0');
1297 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() 1315 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset()
1298 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; 1316 << ":::" << r.getLength() << ":::" << replacement_text << "\n";
1299 } 1317 }
1300 llvm::outs() << "==== END EDITS ====\n"; 1318 llvm::outs() << "==== END EDITS ====\n";
1301 1319
1302 return 0; 1320 return 0;
1303 } 1321 }
OLDNEW
« no previous file with comments | « no previous file | tools/clang/rewrite_to_chrome_style/tests/methods-expected.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698