1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef TOOLS_GN_SUBSTITUTION_PATTERN_H_ 6 #define TOOLS_GN_SUBSTITUTION_PATTERN_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "gn/substitution_type.h" 12 13 class BuildSettings; 14 class Err; 15 class ParseNode; 16 class Value; 17 18 // Represents a string with {{substitution_patterns}} in them. 19 class SubstitutionPattern { 20 public: 21 struct Subrange { 22 Subrange(); 23 explicit Subrange(const Substitution* t, const std::string& l = std::string()); 24 ~Subrange(); 25 26 inline bool operator==(const Subrange& other) const { 27 return type == other.type && literal == other.literal; 28 } 29 30 const Substitution* type; 31 32 // When type_ == LITERAL, this specifies the literal. 33 std::string literal; 34 }; 35 36 SubstitutionPattern(); 37 SubstitutionPattern(const SubstitutionPattern& other); 38 ~SubstitutionPattern(); 39 40 // Parses the given string and fills in the pattern. The pattern must only 41 // be initialized once. On failure, returns false and sets the error. 42 bool Parse(const Value& value, Err* err); 43 bool Parse(const std::string& str, const ParseNode* origin, Err* err); 44 45 // Makes a pattern given a hardcoded string. Will assert if the string is 46 // not a valid pattern. 47 static SubstitutionPattern MakeForTest(const char* str); 48 49 // Returns the pattern as a string with substitutions in them. 50 std::string AsString() const; 51 52 // Sets the bits in the given vector corresponding to the substitutions used 53 // by this pattern. SubstitutionLiteral is ignored. 54 void FillRequiredTypes(SubstitutionBits* bits) const; 55 56 // Checks whether this pattern resolves to something in the output directory 57 // for the given build settings. If not, returns false and fills in the given 58 // error. 59 bool IsInOutputDir(const BuildSettings* build_settings, Err* err) const; 60 61 // Returns a vector listing the substitutions used by this pattern, not 62 // counting SubstitutionLiteral. required_types()63 const std::vector<const Substitution*>& required_types() const { 64 return required_types_; 65 } 66 ranges()67 const std::vector<Subrange>& ranges() const { return ranges_; } empty()68 bool empty() const { return ranges_.empty(); } 69 origin()70 const ParseNode* origin() const { return origin_; } 71 72 private: 73 std::vector<Subrange> ranges_; 74 const ParseNode* origin_; 75 76 std::vector<const Substitution*> required_types_; 77 }; 78 79 #endif // TOOLS_GN_SUBSTITUTION_PATTERN_H_ 80