| 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) {
|
|
|