| // Copyright 2014 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef TOOLS_GN_LABEL_PATTERN_H_ | 
 | #define TOOLS_GN_LABEL_PATTERN_H_ | 
 |  | 
 | #include "base/strings/string_piece.h" | 
 | #include "tools/gn/label.h" | 
 | #include "tools/gn/source_dir.h" | 
 |  | 
 | class Err; | 
 | class Value; | 
 |  | 
 | extern const char kLabelPattern_Help[]; | 
 |  | 
 | // A label pattern is a simple pattern that matches labels. It is used for | 
 | // specifying visibility and other times when multiple targets need to be | 
 | // referenced. | 
 | class LabelPattern { | 
 |  public: | 
 |   enum Type { | 
 |     MATCH = 1,           // Exact match for a given target. | 
 |     DIRECTORY,           // Only targets in the file in the given directory. | 
 |     RECURSIVE_DIRECTORY  // The given directory and any subdir. | 
 |                          // (also indicates "public" when dir is empty). | 
 |   }; | 
 |  | 
 |   LabelPattern(); | 
 |   LabelPattern(Type type, | 
 |                const SourceDir& dir, | 
 |                const base::StringPiece& name, | 
 |                const Label& toolchain_label); | 
 |   LabelPattern(const LabelPattern& other); | 
 |   ~LabelPattern(); | 
 |  | 
 |   // Converts the given input string to a pattern. This does special stuff | 
 |   // to treat the pattern as a label. Sets the error on failure. | 
 |   static LabelPattern GetPattern(const SourceDir& current_dir, | 
 |                                  const Value& value, | 
 |                                  Err* err); | 
 |  | 
 |   // Returns true if the given input string might match more than one thing. | 
 |   static bool HasWildcard(const std::string& str); | 
 |  | 
 |   // Returns true if this pattern matches the given label. | 
 |   bool Matches(const Label& label) const; | 
 |  | 
 |   // Returns true if any of the patterns in the vector match the label. | 
 |   static bool VectorMatches(const std::vector<LabelPattern>& patterns, | 
 |                             const Label& label); | 
 |  | 
 |   // Returns a string representation of this pattern. | 
 |   std::string Describe() const; | 
 |  | 
 |   Type type() const { return type_; } | 
 |  | 
 |   const SourceDir& dir() const { return dir_; } | 
 |   const std::string& name() const { return name_; } | 
 |  | 
 |   const Label& toolchain() const { return toolchain_; } | 
 |   void set_toolchain(const Label& tc) { toolchain_ = tc; } | 
 |  | 
 |  private: | 
 |   // If nonempty, specifies the toolchain to use. If empty, this will match | 
 |   // all toolchains. This is independent of the match type. | 
 |   Label toolchain_; | 
 |  | 
 |   Type type_; | 
 |  | 
 |   // Used when type_ == PRIVATE and PRIVATE_RECURSIVE. This specifies the | 
 |   // directory that to which the pattern is private to. | 
 |   SourceDir dir_; | 
 |  | 
 |   // Empty name means match everything. Otherwise the name must match | 
 |   // exactly. | 
 |   std::string name_; | 
 | }; | 
 |  | 
 | #endif  // TOOLS_GN_LABEL_PATTERN_H_ |