|  | // 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_SUBSTITUTION_PATTERN_H_ | 
|  | #define TOOLS_GN_SUBSTITUTION_PATTERN_H_ | 
|  |  | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "tools/gn/substitution_type.h" | 
|  |  | 
|  | class BuildSettings; | 
|  | class Err; | 
|  | class ParseNode; | 
|  | class Value; | 
|  |  | 
|  | // Represents a string with {{substitution_patterns}} in them. | 
|  | class SubstitutionPattern { | 
|  | public: | 
|  | struct Subrange { | 
|  | Subrange(); | 
|  | explicit Subrange(SubstitutionType t, const std::string& l = std::string()); | 
|  | ~Subrange(); | 
|  |  | 
|  | inline bool operator==(const Subrange& other) const { | 
|  | return type == other.type && literal == other.literal; | 
|  | } | 
|  |  | 
|  | SubstitutionType type; | 
|  |  | 
|  | // When type_ == LITERAL, this specifies the literal. | 
|  | std::string literal; | 
|  | }; | 
|  |  | 
|  | SubstitutionPattern(); | 
|  | SubstitutionPattern(const SubstitutionPattern& other); | 
|  | ~SubstitutionPattern(); | 
|  |  | 
|  | // Parses the given string and fills in the pattern. The pattern must only | 
|  | // be initialized once. On failure, returns false and sets the error. | 
|  | bool Parse(const Value& value, Err* err); | 
|  | bool Parse(const std::string& str, const ParseNode* origin, Err* err); | 
|  |  | 
|  | // Makes a pattern given a hardcoded string. Will assert if the string is | 
|  | // not a valid pattern. | 
|  | static SubstitutionPattern MakeForTest(const char* str); | 
|  |  | 
|  | // Returns the pattern as a string with substitutions in them. | 
|  | std::string AsString() const; | 
|  |  | 
|  | // Sets the bits in the given vector corresponding to the substitutions used | 
|  | // by this pattern. SUBSTITUTION_LITERAL is ignored. | 
|  | void FillRequiredTypes(SubstitutionBits* bits) const; | 
|  |  | 
|  | // Checks whether this pattern resolves to something in the output directory | 
|  | // for the given build settings. If not, returns false and fills in the given | 
|  | // error. | 
|  | bool IsInOutputDir(const BuildSettings* build_settings, Err* err) const; | 
|  |  | 
|  | // Returns a vector listing the substitutions used by this pattern, not | 
|  | // counting SUBSTITUTION_LITERAL. | 
|  | const std::vector<SubstitutionType>& required_types() const { | 
|  | return required_types_; | 
|  | } | 
|  |  | 
|  | const std::vector<Subrange>& ranges() const { return ranges_; } | 
|  | bool empty() const { return ranges_.empty(); } | 
|  |  | 
|  | private: | 
|  | std::vector<Subrange> ranges_; | 
|  | const ParseNode* origin_; | 
|  |  | 
|  | std::vector<SubstitutionType> required_types_; | 
|  | }; | 
|  |  | 
|  | #endif  // TOOLS_GN_SUBSTITUTION_PATTERN_H_ |