OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 // This file defines a bunch of recurring problems in the Chromium C++ code. | 5 // This file defines a bunch of recurring problems in the Chromium C++ code. |
6 // | 6 // |
7 // Checks that are implemented: | 7 // Checks that are implemented: |
8 // - Constructors/Destructors should not be inlined if they are of a complex | 8 // - Constructors/Destructors should not be inlined if they are of a complex |
9 // class type. | 9 // class type. |
10 // - Missing "virtual" keywords on methods that should be virtual. | 10 // - Missing "virtual" keywords on methods that should be virtual. |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
68 if (const TypedefType* typedefed = dyn_cast<TypedefType>(type)) | 68 if (const TypedefType* typedefed = dyn_cast<TypedefType>(type)) |
69 return UnwrapType(typedefed->desugar().getTypePtr()); | 69 return UnwrapType(typedefed->desugar().getTypePtr()); |
70 return type; | 70 return type; |
71 } | 71 } |
72 | 72 |
73 // Searches for constructs that we know we don't want in the Chromium code base. | 73 // Searches for constructs that we know we don't want in the Chromium code base. |
74 class FindBadConstructsConsumer : public ChromeClassTester { | 74 class FindBadConstructsConsumer : public ChromeClassTester { |
75 public: | 75 public: |
76 FindBadConstructsConsumer(CompilerInstance& instance, | 76 FindBadConstructsConsumer(CompilerInstance& instance, |
77 bool check_base_classes, | 77 bool check_base_classes, |
78 bool check_virtuals_in_implementations) | 78 bool check_virtuals_in_implementations, |
79 : ChromeClassTester(instance), | 79 bool check_url_directory) |
80 : ChromeClassTester(instance, check_url_directory), | |
80 check_base_classes_(check_base_classes), | 81 check_base_classes_(check_base_classes), |
81 check_virtuals_in_implementations_(check_virtuals_in_implementations) { | 82 check_virtuals_in_implementations_(check_virtuals_in_implementations), |
83 check_url_directory_(check_url_directory) { | |
Nico
2013/04/16 15:31:11
Do you need this part? You're already passing this
| |
82 // Register warning/error messages. | 84 // Register warning/error messages. |
83 diag_method_requires_override_ = diagnostic().getCustomDiagID( | 85 diag_method_requires_override_ = diagnostic().getCustomDiagID( |
84 getErrorLevel(), kMethodRequiresOverride); | 86 getErrorLevel(), kMethodRequiresOverride); |
85 diag_method_requires_virtual_ = diagnostic().getCustomDiagID( | 87 diag_method_requires_virtual_ = diagnostic().getCustomDiagID( |
86 getErrorLevel(), kMethodRequiresVirtual); | 88 getErrorLevel(), kMethodRequiresVirtual); |
87 diag_no_explicit_dtor_ = diagnostic().getCustomDiagID( | 89 diag_no_explicit_dtor_ = diagnostic().getCustomDiagID( |
88 getErrorLevel(), kNoExplicitDtor); | 90 getErrorLevel(), kNoExplicitDtor); |
89 diag_public_dtor_ = diagnostic().getCustomDiagID( | 91 diag_public_dtor_ = diagnostic().getCustomDiagID( |
90 getErrorLevel(), kPublicDtor); | 92 getErrorLevel(), kPublicDtor); |
91 diag_protected_non_virtual_dtor_ = diagnostic().getCustomDiagID( | 93 diag_protected_non_virtual_dtor_ = diagnostic().getCustomDiagID( |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
612 PrintInheritanceChain(*it); | 614 PrintInheritanceChain(*it); |
613 } | 615 } |
614 } | 616 } |
615 } | 617 } |
616 }; | 618 }; |
617 | 619 |
618 class FindBadConstructsAction : public PluginASTAction { | 620 class FindBadConstructsAction : public PluginASTAction { |
619 public: | 621 public: |
620 FindBadConstructsAction() | 622 FindBadConstructsAction() |
621 : check_base_classes_(false), | 623 : check_base_classes_(false), |
622 check_virtuals_in_implementations_(true) { | 624 check_virtuals_in_implementations_(true), |
625 check_url_directory_(false) { | |
623 } | 626 } |
624 | 627 |
625 protected: | 628 protected: |
626 // Overridden from PluginASTAction: | 629 // Overridden from PluginASTAction: |
627 virtual ASTConsumer* CreateASTConsumer(CompilerInstance& instance, | 630 virtual ASTConsumer* CreateASTConsumer(CompilerInstance& instance, |
628 llvm::StringRef ref) { | 631 llvm::StringRef ref) { |
629 return new FindBadConstructsConsumer( | 632 return new FindBadConstructsConsumer( |
630 instance, check_base_classes_, check_virtuals_in_implementations_); | 633 instance, check_base_classes_, check_virtuals_in_implementations_, |
634 check_url_directory_); | |
631 } | 635 } |
632 | 636 |
633 virtual bool ParseArgs(const CompilerInstance& instance, | 637 virtual bool ParseArgs(const CompilerInstance& instance, |
634 const std::vector<std::string>& args) { | 638 const std::vector<std::string>& args) { |
635 bool parsed = true; | 639 bool parsed = true; |
636 | 640 |
637 for (size_t i = 0; i < args.size() && parsed; ++i) { | 641 for (size_t i = 0; i < args.size() && parsed; ++i) { |
638 if (args[i] == "skip-virtuals-in-implementations") { | 642 if (args[i] == "skip-virtuals-in-implementations") { |
639 // TODO(rsleevi): Remove this once http://crbug.com/115047 is fixed. | 643 // TODO(rsleevi): Remove this once http://crbug.com/115047 is fixed. |
640 check_virtuals_in_implementations_ = false; | 644 check_virtuals_in_implementations_ = false; |
641 } else if (args[i] == "check-base-classes") { | 645 } else if (args[i] == "check-base-classes") { |
642 // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed. | 646 // TODO(rsleevi): Remove this once http://crbug.com/123295 is fixed. |
643 check_base_classes_ = true; | 647 check_base_classes_ = true; |
648 } else if (args[i] == "check-url-directory") { | |
649 // TODO(tfarina): Remove this once http://crbug.com/229660 is fixed. | |
650 check_url_directory_ = true; | |
644 } else { | 651 } else { |
645 parsed = false; | 652 parsed = false; |
646 llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n"; | 653 llvm::errs() << "Unknown clang plugin argument: " << args[i] << "\n"; |
647 } | 654 } |
648 } | 655 } |
649 | 656 |
650 return parsed; | 657 return parsed; |
651 } | 658 } |
652 | 659 |
653 private: | 660 private: |
654 bool check_base_classes_; | 661 bool check_base_classes_; |
655 bool check_virtuals_in_implementations_; | 662 bool check_virtuals_in_implementations_; |
663 bool check_url_directory_; | |
656 }; | 664 }; |
657 | 665 |
658 } // namespace | 666 } // namespace |
659 | 667 |
660 static FrontendPluginRegistry::Add<FindBadConstructsAction> | 668 static FrontendPluginRegistry::Add<FindBadConstructsAction> |
661 X("find-bad-constructs", "Finds bad C++ constructs"); | 669 X("find-bad-constructs", "Finds bad C++ constructs"); |
OLD | NEW |