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

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

Issue 2589923002: Add a hardcoded list of methods that need a "Get" prefix. (Closed)
Patch Set: Remove commented-out lines. Created 3 years, 12 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 322 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 333
334 // If the expression can be evaluated at compile time, then it should have a 334 // If the expression can be evaluated at compile time, then it should have a
335 // kFoo style name. Otherwise, not. 335 // kFoo style name. Otherwise, not.
336 return initializer->isEvaluatable(context); 336 return initializer->isEvaluatable(context);
337 } 337 }
338 338
339 AST_MATCHER_P(clang::QualType, hasString, std::string, ExpectedString) { 339 AST_MATCHER_P(clang::QualType, hasString, std::string, ExpectedString) {
340 return ExpectedString == Node.getAsString(); 340 return ExpectedString == Node.getAsString();
341 } 341 }
342 342
343 bool ShouldPrefixMethodName(std::string old_method_name) {
dcheng 2016/12/20 00:42:02 StringRef or const std::string&
Łukasz Anforowicz 2016/12/20 00:58:58 Done - thanks for pointing this out (I initially h
344 // Methods that are named similarily to a type - they should be prefixed
345 // with a "get" prefix.
346 static const char* kConflictingMethods[] = {
347 "animationWorklet",
348 "audioWorklet",
349 "binaryType",
350 "blob",
351 "channelCountMode",
352 "color",
353 "counterDirectives",
354 "document",
355 "emptyChromeClient",
356 "emptyEditorClient",
357 "emptySpellCheckerClient",
358 "entryType",
359 "error",
360 "fileUtilities",
361 "font",
362 "iconURL",
363 "inputMethodController",
364 "inputType",
365 "layout",
366 "layoutBlock",
367 "layoutSize",
368 "length",
369 "lineCap",
370 "lineJoin",
371 "matchedProperties",
372 "name",
373 "navigationType",
374 "node",
375 "outcome",
376 "pagePopup",
377 "paintWorklet",
378 "path",
379 "processingInstruction",
380 "readyState",
381 "screenInfo",
382 "scrollAnimator",
383 "settings",
384 "signalingState",
385 "state",
386 "string",
387 "text",
388 "textAlign",
389 "textBaseline",
390 "theme",
391 "timing",
392 "topLevelBlameContext",
dcheng 2016/12/20 00:42:02 This one looks surprising, as I don't see a type w
Łukasz Anforowicz 2016/12/20 00:58:58 Ack. Please see the error message in my other rep
393 "widget",
394 };
395 for (const auto& conflicting_method : kConflictingMethods) {
396 if (old_method_name == conflicting_method)
397 return true;
398 }
399
400 return false;
401 }
402
343 bool GetNameForDecl(const clang::FunctionDecl& decl, 403 bool GetNameForDecl(const clang::FunctionDecl& decl,
344 clang::ASTContext& context, 404 clang::ASTContext& context,
345 std::string& name) { 405 std::string& name) {
346 name = decl.getName().str(); 406 name = decl.getName().str();
407
408 // Need to call ShouldPrefixMethodName on the *old* name.
409 bool should_prefix_method_name = ShouldPrefixMethodName(name);
410
411 // Calculate the new name.
347 name[0] = clang::toUppercase(name[0]); 412 name[0] = clang::toUppercase(name[0]);
348 413
349 // Given 414 // See if the new name conflicts with a type ~inside~ the return type.
350 // class Foo {}; 415 if (!should_prefix_method_name) {
351 // class DerivedFoo : class Foo; 416 // Given
352 // using Bar = Foo; 417 // class Foo {};
353 // Bar f1(); // <- |Bar| would be matched by hasString("Bar") below. 418 // class DerivedFoo : class Foo;
354 // Bar f2(); // <- |Bar| would be matched by hasName("Foo") below. 419 // using Bar = Foo;
355 // DerivedFoo f3(); // <- |DerivedFoo| matched by isDerivedFrom(...) below. 420 // |type_with_same_name_as_function| would match:
356 // |type_with_same_name_as_function| matcher matches Bar and Foo return types. 421 // Bar bar(); // <- |Bar| would be matched by hasString("Bar") below.
357 auto type_with_same_name_as_function = qualType(anyOf( 422 // Bar foo(); // <- |Bar| would be matched by hasName("Foo") below.
358 // hasString matches the type as spelled (Bar above). 423 // DerivedFoo foo(); // <- |DerivedFoo| matched by isDerivedFrom(...)
359 hasString(name), 424 // // below.
360 // hasDeclaration matches resolved type (Foo or DerivedFoo above). 425 auto type_with_same_name_as_function = qualType(anyOf(
361 hasDeclaration(namedDecl(hasName(name))), 426 // hasString matches the type as spelled (Bar above).
362 hasDeclaration(cxxRecordDecl(isDerivedFrom(namedDecl(hasName(name))))))); 427 hasString(name),
428 // hasDeclaration matches resolved type (Foo or DerivedFoo above).
429 hasDeclaration(namedDecl(hasName(name))),
430 hasDeclaration(
431 cxxRecordDecl(isDerivedFrom(namedDecl(hasName(name)))))));
363 432
364 // |type_containing_same_name_as_function| matcher will match all of the 433 // |type_containing_same_name_as_function| matcher will match all of the
365 // return types below: 434 // return types below:
366 // - Foo foo() // Direct application of |type_with_same_name_as_function|. 435 // - Foo foo() // Direct application of |type_with_same_name_as_function|.
367 // - Foo* foo() // |hasDescendant| traverses references/pointers. 436 // - Foo* foo() // |hasDescendant| traverses references/pointers.
368 // - RefPtr<Foo> foo() // |hasDescendant| traverses template arguments. 437 // - RefPtr<Foo> foo() // |hasDescendant| traverses template arguments.
369 auto type_containing_same_name_as_function = 438 auto type_containing_same_name_as_function =
370 qualType(anyOf(type_with_same_name_as_function, 439 qualType(anyOf(type_with_same_name_as_function,
371 hasDescendant(type_with_same_name_as_function))); 440 hasDescendant(type_with_same_name_as_function)));
372 // https://crbug.com/582312: Prepend "Get" if method name conflicts with 441 // https://crbug.com/582312: Prepend "Get" if method name conflicts with
373 // return type. 442 // return type.
374 auto conflict_matcher = 443 auto conflict_matcher =
375 functionDecl(returns(type_containing_same_name_as_function)); 444 functionDecl(returns(type_containing_same_name_as_function));
376 if (IsMatching(conflict_matcher, decl, context)) 445 if (IsMatching(conflict_matcher, decl, context))
446 should_prefix_method_name = true;
447 }
448
449 if (should_prefix_method_name) {
377 name = "Get" + name; 450 name = "Get" + name;
451 }
378 452
379 return true; 453 return true;
380 } 454 }
381 455
382 bool GetNameForDecl(const clang::EnumConstantDecl& decl, 456 bool GetNameForDecl(const clang::EnumConstantDecl& decl,
383 clang::ASTContext& context, 457 clang::ASTContext& context,
384 std::string& name) { 458 std::string& name) {
385 StringRef original_name = decl.getName(); 459 StringRef original_name = decl.getName();
386 460
387 // If it's already correct leave it alone. 461 // If it's already correct leave it alone.
(...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after
822 new_name = CamelCaseToUnderscoreCase(field_name) + "_"; 896 new_name = CamelCaseToUnderscoreCase(field_name) + "_";
823 return true; 897 return true;
824 } 898 }
825 } 899 }
826 900
827 // |T::myMethod(...)| -> |T::MyMethod(...)|. 901 // |T::myMethod(...)| -> |T::MyMethod(...)|.
828 if ((old_name.find('_') == std::string::npos) && IsCallee(node, context) && 902 if ((old_name.find('_') == std::string::npos) && IsCallee(node, context) &&
829 !IsBlacklistedFunctionOrMethodName(old_name)) { 903 !IsBlacklistedFunctionOrMethodName(old_name)) {
830 new_name = old_name; 904 new_name = old_name;
831 new_name[0] = clang::toUppercase(old_name[0]); 905 new_name[0] = clang::toUppercase(old_name[0]);
906 if (ShouldPrefixMethodName(old_name))
907 new_name = "Get" + new_name;
832 return true; 908 return true;
833 } 909 }
834 910
835 // In the future we can consider more heuristics: 911 // In the future we can consider more heuristics:
836 // - "s_" and "g_" prefixes 912 // - "s_" and "g_" prefixes
837 // - "ALL_CAPS" 913 // - "ALL_CAPS"
838 // - |T::myStaticField| -> |T::kMyStaticField| 914 // - |T::myStaticField| -> |T::kMyStaticField|
839 // (but have to be careful not to rename |value| in WTF/TypeTraits.h?) 915 // (but have to be careful not to rename |value| in WTF/TypeTraits.h?)
840 return false; 916 return false;
841 } 917 }
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 for (const auto& r : replacements) { 1341 for (const auto& r : replacements) {
1266 std::string replacement_text = r.getReplacementText().str(); 1342 std::string replacement_text = r.getReplacementText().str();
1267 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); 1343 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0');
1268 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() 1344 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset()
1269 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; 1345 << ":::" << r.getLength() << ":::" << replacement_text << "\n";
1270 } 1346 }
1271 llvm::outs() << "==== END EDITS ====\n"; 1347 llvm::outs() << "==== END EDITS ====\n";
1272 1348
1273 return 0; 1349 return 0;
1274 } 1350 }
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