Chromium Code Reviews| 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 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 330 // isEvaluable(). | 330 // isEvaluable(). |
| 331 if (initializer->isInstantiationDependent()) | 331 if (initializer->isInstantiationDependent()) |
| 332 return false; | 332 return false; |
| 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 bool GetNameForDecl(const clang::FunctionDecl& decl, | 339 bool GetNameForDecl(const clang::FunctionDecl& decl, |
| 340 const clang::ASTContext& context, | 340 clang::ASTContext& context, |
|
Łukasz Anforowicz
2016/08/24 18:09:49
|match| function call below takes a non-const ASTC
| |
| 341 std::string& name) { | 341 std::string& name) { |
| 342 name = decl.getName().str(); | 342 name = decl.getName().str(); |
| 343 name[0] = clang::toUppercase(name[0]); | 343 name[0] = clang::toUppercase(name[0]); |
| 344 | |
| 345 // https://crbug.com/582312: Prepend "Get" if method name conflicts with type. | |
| 346 auto base_matcher = | |
| 347 hasCanonicalType(hasDeclaration(namedDecl(hasName(name)))); | |
|
dcheng
2016/08/25 17:36:00
Can we just pull the return type out of the Functi
Łukasz Anforowicz
2016/08/25 18:30:40
Thanks - done. I didn't know about getBaseTypeIde
| |
| 348 auto conflict_matcher = qualType( | |
| 349 anyOf(pointsTo(base_matcher), references(base_matcher), base_matcher)); | |
| 350 if (!match(conflict_matcher, decl.getReturnType(), context).empty()) | |
| 351 name = "Get" + name; | |
| 352 | |
| 344 return true; | 353 return true; |
| 345 } | 354 } |
| 346 | 355 |
| 347 bool GetNameForDecl(const clang::EnumConstantDecl& decl, | 356 bool GetNameForDecl(const clang::EnumConstantDecl& decl, |
| 348 const clang::ASTContext& context, | 357 clang::ASTContext& context, |
|
Łukasz Anforowicz
2016/08/24 18:09:49
Best to be consistent here (i.e. use non-const in
| |
| 349 std::string& name) { | 358 std::string& name) { |
| 350 StringRef original_name = decl.getName(); | 359 StringRef original_name = decl.getName(); |
| 351 | 360 |
| 352 // If it's already correct leave it alone. | 361 // If it's already correct leave it alone. |
| 353 if (original_name.size() >= 2 && original_name[0] == 'k' && | 362 if (original_name.size() >= 2 && original_name[0] == 'k' && |
| 354 clang::isUppercase(original_name[1])) | 363 clang::isUppercase(original_name[1])) |
| 355 return false; | 364 return false; |
| 356 | 365 |
| 357 bool is_shouty = true; | 366 bool is_shouty = true; |
| 358 for (char c : original_name) { | 367 for (char c : original_name) { |
| 359 if (!clang::isUppercase(c) && !clang::isDigit(c) && c != '_') { | 368 if (!clang::isUppercase(c) && !clang::isDigit(c) && c != '_') { |
| 360 is_shouty = false; | 369 is_shouty = false; |
| 361 break; | 370 break; |
| 362 } | 371 } |
| 363 } | 372 } |
| 364 | 373 |
| 365 if (is_shouty) | 374 if (is_shouty) |
| 366 return false; | 375 return false; |
| 367 | 376 |
| 368 name = 'k'; // k prefix on enum values. | 377 name = 'k'; // k prefix on enum values. |
| 369 name += original_name; | 378 name += original_name; |
| 370 name[1] = clang::toUppercase(name[1]); | 379 name[1] = clang::toUppercase(name[1]); |
| 371 return true; | 380 return true; |
| 372 } | 381 } |
| 373 | 382 |
| 374 bool GetNameForDecl(const clang::FieldDecl& decl, | 383 bool GetNameForDecl(const clang::FieldDecl& decl, |
| 375 const clang::ASTContext& context, | 384 clang::ASTContext& context, |
| 376 std::string& name) { | 385 std::string& name) { |
| 377 StringRef original_name = decl.getName(); | 386 StringRef original_name = decl.getName(); |
| 378 bool member_prefix = original_name.startswith(kBlinkFieldPrefix); | 387 bool member_prefix = original_name.startswith(kBlinkFieldPrefix); |
| 379 | 388 |
| 380 StringRef rename_part = !member_prefix | 389 StringRef rename_part = !member_prefix |
| 381 ? original_name | 390 ? original_name |
| 382 : original_name.substr(strlen(kBlinkFieldPrefix)); | 391 : original_name.substr(strlen(kBlinkFieldPrefix)); |
| 383 name = CamelCaseToUnderscoreCase(rename_part); | 392 name = CamelCaseToUnderscoreCase(rename_part); |
| 384 | 393 |
| 385 // Assume that prefix of m_ was intentional and always replace it with a | 394 // Assume that prefix of m_ was intentional and always replace it with a |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 396 clang::isUppercase(original_name[1])) | 405 clang::isUppercase(original_name[1])) |
| 397 return false; | 406 return false; |
| 398 | 407 |
| 399 name = 'k'; | 408 name = 'k'; |
| 400 name.append(original_name.data(), original_name.size()); | 409 name.append(original_name.data(), original_name.size()); |
| 401 name[1] = clang::toUppercase(name[1]); | 410 name[1] = clang::toUppercase(name[1]); |
| 402 return true; | 411 return true; |
| 403 } | 412 } |
| 404 | 413 |
| 405 bool GetNameForDecl(const clang::VarDecl& decl, | 414 bool GetNameForDecl(const clang::VarDecl& decl, |
| 406 const clang::ASTContext& context, | 415 clang::ASTContext& context, |
| 407 std::string& name) { | 416 std::string& name) { |
| 408 StringRef original_name = decl.getName(); | 417 StringRef original_name = decl.getName(); |
| 409 | 418 |
| 410 // Nothing to do for unnamed parameters. | 419 // Nothing to do for unnamed parameters. |
| 411 if (clang::isa<clang::ParmVarDecl>(decl)) { | 420 if (clang::isa<clang::ParmVarDecl>(decl)) { |
| 412 if (original_name.empty()) | 421 if (original_name.empty()) |
| 413 return false; | 422 return false; |
| 414 | 423 |
| 415 // Check if |decl| really covers text of |original_name|. This might not be | 424 // Check if |decl| really covers text of |original_name|. This might not be |
| 416 // true when specializing a templatized class that had an unnamed parameter | 425 // true when specializing a templatized class that had an unnamed parameter |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 459 // Static members end with _ just like other members, but constants should | 468 // Static members end with _ just like other members, but constants should |
| 460 // not. | 469 // not. |
| 461 if (!is_const && decl.isStaticDataMember()) { | 470 if (!is_const && decl.isStaticDataMember()) { |
| 462 name += '_'; | 471 name += '_'; |
| 463 } | 472 } |
| 464 | 473 |
| 465 return true; | 474 return true; |
| 466 } | 475 } |
| 467 | 476 |
| 468 bool GetNameForDecl(const clang::FunctionTemplateDecl& decl, | 477 bool GetNameForDecl(const clang::FunctionTemplateDecl& decl, |
| 469 const clang::ASTContext& context, | 478 clang::ASTContext& context, |
| 470 std::string& name) { | 479 std::string& name) { |
| 471 clang::FunctionDecl* templated_function = decl.getTemplatedDecl(); | 480 clang::FunctionDecl* templated_function = decl.getTemplatedDecl(); |
| 472 return GetNameForDecl(*templated_function, context, name); | 481 return GetNameForDecl(*templated_function, context, name); |
| 473 } | 482 } |
| 474 | 483 |
| 475 bool GetNameForDecl(const clang::NamedDecl& decl, | 484 bool GetNameForDecl(const clang::NamedDecl& decl, |
| 476 const clang::ASTContext& context, | 485 clang::ASTContext& context, |
| 477 std::string& name) { | 486 std::string& name) { |
| 478 if (auto* function = clang::dyn_cast<clang::FunctionDecl>(&decl)) | 487 if (auto* function = clang::dyn_cast<clang::FunctionDecl>(&decl)) |
| 479 return GetNameForDecl(*function, context, name); | 488 return GetNameForDecl(*function, context, name); |
| 480 if (auto* var = clang::dyn_cast<clang::VarDecl>(&decl)) | 489 if (auto* var = clang::dyn_cast<clang::VarDecl>(&decl)) |
| 481 return GetNameForDecl(*var, context, name); | 490 return GetNameForDecl(*var, context, name); |
| 482 if (auto* field = clang::dyn_cast<clang::FieldDecl>(&decl)) | 491 if (auto* field = clang::dyn_cast<clang::FieldDecl>(&decl)) |
| 483 return GetNameForDecl(*field, context, name); | 492 return GetNameForDecl(*field, context, name); |
| 484 if (auto* function_template = | 493 if (auto* function_template = |
| 485 clang::dyn_cast<clang::FunctionTemplateDecl>(&decl)) | 494 clang::dyn_cast<clang::FunctionTemplateDecl>(&decl)) |
| 486 return GetNameForDecl(*function_template, context, name); | 495 return GetNameForDecl(*function_template, context, name); |
| 487 if (auto* enumc = clang::dyn_cast<clang::EnumConstantDecl>(&decl)) | 496 if (auto* enumc = clang::dyn_cast<clang::EnumConstantDecl>(&decl)) |
| 488 return GetNameForDecl(*enumc, context, name); | 497 return GetNameForDecl(*enumc, context, name); |
| 489 | 498 |
| 490 return false; | 499 return false; |
| 491 } | 500 } |
| 492 | 501 |
| 493 bool GetNameForDecl(const clang::UsingDecl& decl, | 502 bool GetNameForDecl(const clang::UsingDecl& decl, |
| 494 const clang::ASTContext& context, | 503 clang::ASTContext& context, |
| 495 std::string& name) { | 504 std::string& name) { |
| 496 assert(decl.shadow_size() > 0); | 505 assert(decl.shadow_size() > 0); |
| 497 | 506 |
| 498 // If a using declaration's targeted declaration is a set of overloaded | 507 // If a using declaration's targeted declaration is a set of overloaded |
| 499 // functions, it can introduce multiple shadowed declarations. Just using the | 508 // functions, it can introduce multiple shadowed declarations. Just using the |
| 500 // first one is OK, since overloaded functions have the same name, by | 509 // first one is OK, since overloaded functions have the same name, by |
| 501 // definition. | 510 // definition. |
| 502 return GetNameForDecl(*decl.shadow_begin()->getTargetDecl(), context, name); | 511 return GetNameForDecl(*decl.shadow_begin()->getTargetDecl(), context, name); |
| 503 } | 512 } |
| 504 | 513 |
| (...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1172 for (const auto& r : replacements) { | 1181 for (const auto& r : replacements) { |
| 1173 std::string replacement_text = r.getReplacementText().str(); | 1182 std::string replacement_text = r.getReplacementText().str(); |
| 1174 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); | 1183 std::replace(replacement_text.begin(), replacement_text.end(), '\n', '\0'); |
| 1175 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() | 1184 llvm::outs() << "r:::" << r.getFilePath() << ":::" << r.getOffset() |
| 1176 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; | 1185 << ":::" << r.getLength() << ":::" << replacement_text << "\n"; |
| 1177 } | 1186 } |
| 1178 llvm::outs() << "==== END EDITS ====\n"; | 1187 llvm::outs() << "==== END EDITS ====\n"; |
| 1179 | 1188 |
| 1180 return 0; | 1189 return 0; |
| 1181 } | 1190 } |
| OLD | NEW |