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