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 #include "gn/substitution_list.h"
6
7 #include <stddef.h>
8 #include <string.h>
9
10 #include "gn/value.h"
11
12 SubstitutionList::SubstitutionList() = default;
13
14 SubstitutionList::SubstitutionList(const SubstitutionList& other) = default;
15
16 SubstitutionList::~SubstitutionList() = default;
17
Parse(const Value & value,Err * err)18 bool SubstitutionList::Parse(const Value& value, Err* err) {
19 if (!value.VerifyTypeIs(Value::LIST, err))
20 return false;
21
22 const std::vector<Value>& input_list = value.list_value();
23 list_.resize(input_list.size());
24 for (size_t i = 0; i < input_list.size(); i++) {
25 if (!list_[i].Parse(input_list[i], err))
26 return false;
27 }
28
29 SubstitutionBits bits;
30 FillRequiredTypes(&bits);
31 bits.FillVector(&required_types_);
32 return true;
33 }
34
Parse(const std::vector<std::string> & values,const ParseNode * origin,Err * err)35 bool SubstitutionList::Parse(const std::vector<std::string>& values,
36 const ParseNode* origin,
37 Err* err) {
38 list_.resize(values.size());
39 for (size_t i = 0; i < values.size(); i++) {
40 if (!list_[i].Parse(values[i], origin, err))
41 return false;
42 }
43
44 SubstitutionBits bits;
45 FillRequiredTypes(&bits);
46 bits.FillVector(&required_types_);
47 return true;
48 }
49
MakeForTest(const char * a,const char * b,const char * c,const char * d)50 SubstitutionList SubstitutionList::MakeForTest(const char* a,
51 const char* b,
52 const char* c,
53 const char* d) {
54 std::vector<std::string> input_strings;
55 input_strings.push_back(a);
56 if (b)
57 input_strings.push_back(b);
58 if (c)
59 input_strings.push_back(c);
60 if (d)
61 input_strings.push_back(d);
62
63 Err err;
64 SubstitutionList result;
65 CHECK(result.Parse(input_strings, nullptr, &err))
66 << err.message() << "\n" << err.help_text();
67 return result;
68 }
69
FillRequiredTypes(SubstitutionBits * bits) const70 void SubstitutionList::FillRequiredTypes(SubstitutionBits* bits) const {
71 for (const auto& item : list_)
72 item.FillRequiredTypes(bits);
73 }
74