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

Unified Diff: tools/gn/visibility.cc

Issue 500423003: Enhance GN diagnostic tools (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: use patterns for gn check Created 6 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/visibility.h ('k') | tools/gn/visibility_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/visibility.cc
diff --git a/tools/gn/visibility.cc b/tools/gn/visibility.cc
index 6fc8fa125dc89eff85c630619acc263d332deb2f..c9dbb874897d5ab2f280c06842edb47b26f802e9 100644
--- a/tools/gn/visibility.cc
+++ b/tools/gn/visibility.cc
@@ -14,38 +14,6 @@
#include "tools/gn/value.h"
#include "tools/gn/variables.h"
-Visibility::VisPattern::VisPattern() : type_(MATCH) {
-}
-
-Visibility::VisPattern::VisPattern(Type type,
- const SourceDir& dir,
- const base::StringPiece& name)
- : type_(type),
- dir_(dir) {
- name.CopyToString(&name_);
-}
-
-Visibility::VisPattern::~VisPattern() {
-}
-
-bool Visibility::VisPattern::Matches(const Label& label) const {
- switch (type_) {
- case MATCH:
- return label.name() == name_ && label.dir() == dir_;
- case DIRECTORY:
- // The directories must match exactly for private visibility.
- return label.dir() == dir_;
- case RECURSIVE_DIRECTORY:
- // Our directory must be a prefix of the input label for recursive
- // private visibility.
- return label.dir().value().compare(0, dir_.value().size(), dir_.value())
- == 0;
- default:
- NOTREACHED();
- return false;
- }
-}
-
Visibility::Visibility() {
}
@@ -60,7 +28,7 @@ bool Visibility::Set(const SourceDir& current_dir,
// Allow a single string to be passed in to make the common case (just one
// pattern) easier to specify.
if (value.type() == Value::STRING) {
- patterns_.push_back(GetPattern(current_dir, value, err));
+ patterns_.push_back(LabelPattern::GetPattern(current_dir, value, err));
return !err->has_error();
}
@@ -70,7 +38,7 @@ bool Visibility::Set(const SourceDir& current_dir,
const std::vector<Value>& list = value.list_value();
for (size_t i = 0; i < list.size(); i++) {
- patterns_.push_back(GetPattern(current_dir, list[i], err));
+ patterns_.push_back(LabelPattern::GetPattern(current_dir, list[i], err));
if (err->has_error())
return false;
}
@@ -80,13 +48,15 @@ bool Visibility::Set(const SourceDir& current_dir,
void Visibility::SetPublic() {
patterns_.clear();
patterns_.push_back(
- VisPattern(VisPattern::RECURSIVE_DIRECTORY, SourceDir(), std::string()));
+ LabelPattern(LabelPattern::RECURSIVE_DIRECTORY, SourceDir(),
+ std::string(), Label()));
}
void Visibility::SetPrivate(const SourceDir& current_dir) {
patterns_.clear();
patterns_.push_back(
- VisPattern(VisPattern::DIRECTORY, current_dir, std::string()));
+ LabelPattern(LabelPattern::DIRECTORY, current_dir, std::string(),
+ Label()));
}
bool Visibility::CanSeeMe(const Label& label) const {
@@ -112,22 +82,8 @@ std::string Visibility::Describe(int indent, bool include_brackets) const {
inner_indent_string += " ";
}
- for (size_t i = 0; i < patterns_.size(); i++) {
- switch (patterns_[i].type()) {
- case VisPattern::MATCH:
- result += inner_indent_string +
- DirectoryWithNoLastSlash(patterns_[i].dir()) + ":" +
- patterns_[i].name() + "\n";
- break;
- case VisPattern::DIRECTORY:
- result += inner_indent_string +
- DirectoryWithNoLastSlash(patterns_[i].dir()) + ":*\n";
- break;
- case VisPattern::RECURSIVE_DIRECTORY:
- result += inner_indent_string + patterns_[i].dir().value() + "*\n";
- break;
- }
- }
+ for (size_t i = 0; i < patterns_.size(); i++)
+ result += inner_indent_string + patterns_[i].Describe() + "\n";
if (include_brackets)
result += outer_indent_string + "]\n";
@@ -135,118 +91,6 @@ std::string Visibility::Describe(int indent, bool include_brackets) const {
}
// static
-Visibility::VisPattern Visibility::GetPattern(const SourceDir& current_dir,
- const Value& value,
- Err* err) {
- if (!value.VerifyTypeIs(Value::STRING, err))
- return VisPattern();
-
- const std::string& str = value.string_value();
- if (str.empty()) {
- *err = Err(value, "Visibility pattern must not be empty.");
- return VisPattern();
- }
-
- // If there's no wildcard, this is specifying an exact label, use the
- // label resolution code to get all the implicit name stuff.
- size_t star = str.find('*');
- if (star == std::string::npos) {
- Label label = Label::Resolve(current_dir, Label(), value, err);
- if (err->has_error())
- return VisPattern();
-
- // There should be no toolchain specified.
- if (!label.toolchain_dir().is_null() || !label.toolchain_name().empty()) {
- *err = Err(value, "Visibility label specified a toolchain.",
- "Visibility names and patterns don't use toolchains, erase the\n"
- "stuff in the ().");
- return VisPattern();
- }
-
- return VisPattern(VisPattern::MATCH, label.dir(), label.name());
- }
-
- // Wildcard case, need to split apart the label to see what it specifies.
- base::StringPiece path;
- base::StringPiece name;
- size_t colon = str.find(':');
- if (colon == std::string::npos) {
- path = base::StringPiece(str);
- } else {
- path = base::StringPiece(&str[0], colon);
- name = base::StringPiece(&str[colon + 1], str.size() - colon - 1);
- }
-
- // The path can have these forms:
- // 1. <empty> (use current dir)
- // 2. <non wildcard stuff> (send through directory resolution)
- // 3. <non wildcard stuff>* (send stuff through dir resolution, note star)
- // 4. * (matches anything)
- SourceDir dir;
- bool has_path_star = false;
- if (path.empty()) {
- // Looks like ":foo".
- dir = current_dir;
- } else if (path[path.size() - 1] == '*') {
- // Case 3 or 4 above.
- has_path_star = true;
-
- // Adjust path to contain everything but the star.
- path = path.substr(0, path.size() - 1);
-
- if (!path.empty() && path[path.size() - 1] != '/') {
- // The input was "foo*" which is invalid.
- *err = Err(value, "'*' must match full directories in visibility.",
- "You did \"foo*\" but visibility doesn't do general pattern\n"
- "matching. Instead, you have to add a slash: \"foo/*\".");
- return VisPattern();
- }
- }
-
- // Resolve the part of the path that's not the wildcard.
- if (!path.empty()) {
- // The non-wildcard stuff better not have a wildcard.
- if (path.find('*') != base::StringPiece::npos) {
- *err = Err(value, "Visibility patterns only support wildcard suffixes.",
- "The visibility pattern contained a '*' that wasn't at tne end.");
- return VisPattern();
- }
-
- // Resolve the non-wildcard stuff.
- dir = current_dir.ResolveRelativeDir(path);
- if (dir.is_null()) {
- *err = Err(value, "Visibility pattern didn't resolve to a dir.",
- "The directory name \"" + path.as_string() + "\" didn't\n"
- "resolve to a directory.");
- return VisPattern();
- }
- }
-
- // Resolve the name. At this point, we're doing wildcard matches so the
- // name should either be empty ("foo/*") or a wildcard ("foo:*");
- if (colon != std::string::npos && name != "*") {
- *err = Err(value, "Invalid visibility pattern.",
- "You seem to be using the wildcard more generally that is supported.\n"
- "Did you mean \"foo:*\" to match everything in the current file, or\n"
- "\"./*\" to recursively match everything in the currend subtree.");
- return VisPattern();
- }
-
- VisPattern::Type type;
- if (has_path_star) {
- // We know there's a wildcard, so if the name is empty it looks like
- // "foo/*".
- type = VisPattern::RECURSIVE_DIRECTORY;
- } else {
- // Everything else should be of the form "foo:*".
- type = VisPattern::DIRECTORY;
- }
-
- // When we're doing wildcard matching, the name is always empty.
- return VisPattern(type, dir, base::StringPiece());
-}
-
-// static
bool Visibility::CheckItemVisibility(const Item* from,
const Item* to,
Err* err) {
« no previous file with comments | « tools/gn/visibility.h ('k') | tools/gn/visibility_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698