• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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