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 SubstitutionPattern& operator=(const SubstitutionPattern&) = default; 41 42 // Parses the given string and fills in the pattern. The pattern must only 43 // be initialized once. On failure, returns false and sets the error. 44 bool Parse(const Value& value, Err* err); 45 bool Parse(const std::string& str, const ParseNode* origin, Err* err); 46 47 // Makes a pattern given a hardcoded string. Will assert if the string is 48 // not a valid pattern. 49 static SubstitutionPattern MakeForTest(const char* str); 50 51 // Returns the pattern as a string with substitutions in them. 52 std::string AsString() const; 53 54 // Sets the bits in the given vector corresponding to the substitutions used 55 // by this pattern. SubstitutionLiteral is ignored. 56 void FillRequiredTypes(SubstitutionBits* bits) const; 57 58 // Checks whether this pattern resolves to something in the output directory 59 // for the given build settings. If not, returns false and fills in the given 60 // error. 61 bool IsInOutputDir(const BuildSettings* build_settings, Err* err) const; 62 63 // Returns a vector listing the substitutions used by this pattern, not 64 // counting SubstitutionLiteral. required_types()65 const std::vector<const Substitution*>& required_types() const { 66 return required_types_; 67 } 68 ranges()69 const std::vector<Subrange>& ranges() const { return ranges_; } empty()70 bool empty() const { return ranges_.empty(); } 71 origin()72 const ParseNode* origin() const { return origin_; } 73 74 private: 75 std::vector<Subrange> ranges_; 76 const ParseNode* origin_; 77 78 std::vector<const Substitution*> required_types_; 79 }; 80 81 #endif // TOOLS_GN_SUBSTITUTION_PATTERN_H_ 82