Index: tools/clang/plugins/ChromeClassTester.cpp |
diff --git a/tools/clang/plugins/ChromeClassTester.cpp b/tools/clang/plugins/ChromeClassTester.cpp |
index 48d6a735f272c3db2331e7f21703fedaa265e0a2..931da02f3ff54e352a1cbec4337433abb38e449f 100644 |
--- a/tools/clang/plugins/ChromeClassTester.cpp |
+++ b/tools/clang/plugins/ChromeClassTester.cpp |
@@ -7,26 +7,20 @@ |
#include "ChromeClassTester.h" |
-#include <sys/param.h> |
+#include <algorithm> |
#include "clang/AST/AST.h" |
#include "clang/Basic/FileManager.h" |
#include "clang/Basic/SourceManager.h" |
+#ifdef LLVM_ON_UNIX |
+#include <sys/param.h> |
+#endif |
+ |
using namespace clang; |
namespace { |
-bool starts_with(const std::string& one, const std::string& two) { |
- return one.compare(0, two.size(), two) == 0; |
-} |
- |
-std::string lstrip(const std::string& one, const std::string& two) { |
- if (starts_with(one, two)) |
- return one.substr(two.size()); |
- return one; |
-} |
- |
bool ends_with(const std::string& one, const std::string& two) { |
if (two.size() > one.size()) |
return false; |
@@ -101,14 +95,67 @@ void ChromeClassTester::emitWarning(SourceLocation loc, |
std::string err; |
err = "[chromium-style] "; |
err += raw_error; |
+ // TODO(dcheng): Re-enable -Werror for these diagnostics on Windows once all |
+ // the pre-existing warnings are cleaned up. https://crbug.com/467287 |
DiagnosticIDs::Level level = |
+#if !defined(LLVM_ON_WIN32) |
diagnostic().getWarningsAsErrors() ? |
DiagnosticIDs::Error : |
+#endif |
DiagnosticIDs::Warning; |
unsigned id = diagnostic().getDiagnosticIDs()->getCustomDiagID(level, err); |
DiagnosticBuilder builder = diagnostic().Report(full, id); |
} |
+bool ChromeClassTester::InBannedDirectory(SourceLocation loc) { |
+ if (instance().getSourceManager().isInSystemHeader(loc)) |
+ return true; |
+ |
+ 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; |
+ } |
+ |
+ // 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; |
+ |
+ // Don't complain about autogenerated protobuf files. |
+ if (ends_with(filename, ".pb.h")) { |
+ return true; |
+ } |
+ |
+#if defined(LLVM_ON_UNIX) |
+ // 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; |
+ } |
+#endif |
+ |
+#if defined(LLVM_ON_WIN32) |
+ std::replace(filename.begin(), filename.end(), '\\', '/'); |
+#endif |
+ |
+ for (const std::string& banned_dir : banned_directories_) { |
+ // If any of the banned directories occur as a component in filename, |
+ // this file is rejected. |
+ assert(banned_dir.front() == '/' && "Banned dir must start with '/'"); |
+ assert(banned_dir.back() == '/' && "Banned dir must end with '/'"); |
+ |
+ if (filename.find(banned_dir) != std::string::npos) |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
bool ChromeClassTester::InBannedNamespace(const Decl* record) { |
std::string n = GetNamespace(record); |
if (!n.empty()) { |
@@ -239,47 +286,6 @@ std::string ChromeClassTester::GetNamespaceImpl(const DeclContext* context, |
} |
} |
-bool ChromeClassTester::InBannedDirectory(SourceLocation loc) { |
- 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; |
- } |
- |
- // 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; |
- |
- // 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; |
- } |
- |
- for (size_t i = 0; i < banned_directories_.size(); ++i) { |
- // If any of the banned directories occur as a component in filename, |
- // this file is rejected. |
- const std::string& banned_dir = banned_directories_[i]; |
- assert(banned_dir.front() == '/' && "Banned dir must start with '/'"); |
- assert(banned_dir.back() == '/' && "Banned dir must end with '/'"); |
- |
- if (filename.find(banned_dir) != std::string::npos) |
- return true; |
- } |
- |
- return false; |
-} |
- |
bool ChromeClassTester::IsIgnoredType(const std::string& base_name) { |
return ignored_record_names_.find(base_name) != ignored_record_names_.end(); |
} |