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 "tools/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 Subrange(SubstitutionType 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 SubstitutionType type; 31 32 // When type_ == LITERAL, this specifies the literal. 33 std::string literal; 34 }; 35 36 SubstitutionPattern(); 37 ~SubstitutionPattern(); 38 39 // Parses the given string and fills in the pattern. The pattern must only 40 // be initialized once. On failure, returns false and sets the error. 41 bool Parse(const Value& value, Err* err); 42 bool Parse(const std::string& str, const ParseNode* origin, Err* err); 43 44 // Makes a pattern given a hardcoded string. Will assert if the string is 45 // not a valid pattern. 46 static SubstitutionPattern MakeForTest(const char* str); 47 48 // Returns the pattern as a string with substitutions in them. 49 std::string AsString() const; 50 51 // Sets the bits in the given vector corresponding to the substitutions used 52 // by this pattern. SUBSTITUTION_LITERAL is ignored. 53 void FillRequiredTypes(SubstitutionBits* bits) const; 54 55 // Checks whether this pattern resolves to something in the output directory 56 // for the given build settings. If not, returns false and fills in the given 57 // error. 58 bool IsInOutputDir(const BuildSettings* build_settings, 59 Err* err) const; 60 61 // Returns a vector listing the substitutions used by this pattern, not 62 // counting SUBSTITUTION_LITERAL. required_types()63 const std::vector<SubstitutionType>& 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 70 private: 71 std::vector<Subrange> ranges_; 72 const ParseNode* origin_; 73 74 std::vector<SubstitutionType> required_types_; 75 }; 76 77 #endif // TOOLS_GN_SUBSTITUTION_PATTERN_H_ 78