Chromium Code Reviews| Index: tools/clang/plugins/ChromeClassTester.cpp |
| diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp |
| index dd983bd81410cb1460ec27747ccfa0a7fc2836a7..3831c9a8e57920fc89d4c2c894abab6222c1785f 100644 |
| --- a/tools/clang/plugins/ChromeClassTester.cpp |
| +++ b/tools/clang/plugins/ChromeClassTester.cpp |
| @@ -146,7 +146,8 @@ void ChromeClassTester::HandleTagDeclDefinition(TagDecl* tag) { |
| } |
| } |
| -void ChromeClassTester::emitWarning(SourceLocation loc, const char* raw_error) { |
| +void ChromeClassTester::emitWarning(const SourceLocation& loc, |
|
Nico
2012/04/11 22:27:26
ditto
|
| + const char* raw_error) { |
| FullSourceLoc full(loc, instance().getSourceManager()); |
| std::string err; |
| err = "[chromium-style] "; |
| @@ -159,10 +160,6 @@ void ChromeClassTester::emitWarning(SourceLocation loc, const char* raw_error) { |
| DiagnosticBuilder B = diagnostic().Report(full, id); |
| } |
| -bool ChromeClassTester::InTestingNamespace(const Decl* record) { |
| - return GetNamespace(record).find("testing") != std::string::npos; |
| -} |
| - |
| bool ChromeClassTester::InBannedNamespace(const Decl* record) { |
| std::string n = GetNamespace(record); |
| if (n != "") { |
| @@ -173,12 +170,27 @@ bool ChromeClassTester::InBannedNamespace(const Decl* record) { |
| return false; |
| } |
| +bool ChromeClassTester::InImplementationFile( |
| + const SourceLocation& record_location) { |
| + std::string filename; |
| + if (!GetFilename(record_location, &filename)) { |
| + return false; |
| + } |
| + |
| + if (ends_with(filename, ".cc") || ends_with(filename, ".cpp") || |
| + ends_with(filename, ".mm")) { |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| std::string ChromeClassTester::GetNamespace(const Decl* record) { |
| return GetNamespaceImpl(record->getDeclContext(), ""); |
| } |
| std::string ChromeClassTester::GetNamespaceImpl(const DeclContext* context, |
| - std::string candidate) { |
| + const std::string& candidate) { |
| switch (context->getDeclKind()) { |
| case Decl::TranslationUnit: { |
| return candidate; |
| @@ -200,61 +212,50 @@ std::string ChromeClassTester::GetNamespaceImpl(const DeclContext* context, |
| } |
| } |
| -bool ChromeClassTester::InBannedDirectory(SourceLocation loc) { |
| - const SourceManager &SM = instance_.getSourceManager(); |
| - SourceLocation spelling_location = SM.getSpellingLoc(loc); |
| - PresumedLoc ploc = SM.getPresumedLoc(spelling_location); |
| - std::string buffer_name; |
| - if (ploc.isInvalid()) { |
| - // If we're in an invalid location, we're looking at things that aren't |
| - // actually stated in the source; treat this as a banned location instead |
| - // of going through our full lookup process. |
| +bool ChromeClassTester::InBannedDirectory(const SourceLocation& loc) { |
|
Nico
2012/04/11 22:27:26
ditto
|
| + std::string filename; |
| + if (!GetFilename(loc, &filename)) { |
| + // If the filename cannot be determined, simply treat this as a banned |
| + // location, instead of going through the full lookup process. |
| return true; |
| - } else { |
| - std::string b = ploc.getFilename(); |
| - |
| - // We need to special case scratch space; which is where clang does its |
| - // macro expansion. We explicitly want to allow people to do otherwise bad |
| - // things through macros that were defined due to third party libraries. |
| - if (b == "<scratch space>") |
| - return true; |
| - |
| - // Don't complain about these things in implementation files. |
| - if (ends_with(b, ".cc") || ends_with(b, ".cpp") || ends_with(b, ".mm")) { |
| - return true; |
| - } |
| + } |
| - // Don't complain about autogenerated protobuf files. |
| - if (ends_with(b, ".pb.h")) { |
| - return true; |
| - } |
| + // We need to special case scratch space; which is where clang does its |
| + // macro expansion. We explicitly want to allow people to do otherwise bad |
| + // things through macros that were defined due to third party libraries. |
| + if (filename == "<scratch space>") |
| + return true; |
| - // We need to munge the paths so that they are relative to the repository |
| - // srcroot. We first resolve the symlinktastic relative path and then |
| - // remove our known srcroot from it if needed. |
| - char resolvedPath[MAXPATHLEN]; |
| - if (realpath(b.c_str(), resolvedPath)) { |
| - b = resolvedPath; |
| - } |
| + // Don't complain about autogenerated protobuf files. |
| + if (ends_with(filename, ".pb.h")) { |
| + return true; |
| + } |
| + |
| + // We need to munge the paths so that they are relative to the repository |
| + // srcroot. We first resolve the symlinktastic relative path and then |
| + // remove our known srcroot from it if needed. |
| + char resolvedPath[MAXPATHLEN]; |
| + if (realpath(filename.c_str(), resolvedPath)) { |
| + filename = resolvedPath; |
| + } |
| - // On linux, chrome is often checked out to /usr/local/google. Due to the |
| - // "usr" rule in banned_directories_, all diagnostics would be suppressed |
| - // in that case. As a workaround, strip that prefix. |
| - b = lstrip(b, "/usr/local/google"); |
| - |
| - for (std::vector<std::string>::const_iterator it = |
| - banned_directories_.begin(); |
| - it != banned_directories_.end(); ++it) { |
| - // If we can find any of the banned path components in this path, then |
| - // this file is rejected. |
| - size_t index = b.find(*it); |
| - if (index != std::string::npos) { |
| - bool matches_full_dir_name = index == 0 || b[index - 1] == '/'; |
| - if ((*it)[0] == '/') |
| - matches_full_dir_name = true; |
| - if (matches_full_dir_name) |
| - return true; |
| - } |
| + // On linux, chrome is often checked out to /usr/local/google. Due to the |
| + // "usr" rule in banned_directories_, all diagnostics would be suppressed |
| + // in that case. As a workaround, strip that prefix. |
| + filename = lstrip(filename, "/usr/local/google"); |
| + |
| + for (std::vector<std::string>::const_iterator it = |
| + banned_directories_.begin(); |
| + it != banned_directories_.end(); ++it) { |
| + // If we can find any of the banned path components in this path, then |
| + // this file is rejected. |
| + size_t index = filename.find(*it); |
| + if (index != std::string::npos) { |
| + bool matches_full_dir_name = index == 0 || filename[index - 1] == '/'; |
| + if ((*it)[0] == '/') |
| + matches_full_dir_name = true; |
| + if (matches_full_dir_name) |
| + return true; |
| } |
| } |
| @@ -264,3 +265,18 @@ bool ChromeClassTester::InBannedDirectory(SourceLocation loc) { |
| bool ChromeClassTester::IsIgnoredType(const std::string& base_name) { |
| return ignored_record_names_.find(base_name) != ignored_record_names_.end(); |
| } |
| + |
| +bool ChromeClassTester::GetFilename(const clang::SourceLocation& loc, |
| + std::string* filename) { |
| + const SourceManager& SM = instance_.getSourceManager(); |
|
Nico
2012/04/11 22:27:26
This file tries to follow clang style (it's copied
|
| + SourceLocation spelling_location = SM.getSpellingLoc(loc); |
| + PresumedLoc ploc = SM.getPresumedLoc(spelling_location); |
| + if (ploc.isInvalid()) { |
| + // If we're in an invalid location, we're looking at things that aren't |
| + // actually stated in the source. |
| + return false; |
| + } |
| + |
| + *filename = ploc.getFilename(); |
| + return true; |
| +} |