value_extractors.cc revision 3551c9c881056c480085172ff9840cab31610854
1d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// found in the LICENSE file.
4d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
5d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/value_extractors.h"
6d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "tools/gn/build_settings.h"
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/err.h"
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/label.h"
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_dir.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_file.h"
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace {
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// This extractor rejects files with system-absolute file paths. If we need
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// that in the future, we'll have to add some flag to control this.
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeFileConverter {
183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RelativeFileConverter(const BuildSettings* build_settings_in,
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                        const SourceDir& current_dir_in)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : build_settings(build_settings_in),
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        current_dir(current_dir_in) {
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, SourceFile* out, Err* err) const {
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *out = current_dir.ResolveRelativeFile(v.string_value(),
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                           build_settings->root_path_utf8());
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (out->is_system_absolute()) {
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      *err = Err(v, "System-absolute file path.",
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "You can't list a system-absolute file path here. Please include "
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "only files in\nthe source tree. Maybe you meant to begin with two "
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "slashes to indicate an\nabsolute path in the source tree?");
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return true;
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const BuildSettings* build_settings;
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeDirConverter {
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  RelativeDirConverter(const BuildSettings* build_settings_in,
433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                       const SourceDir& current_dir_in)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      : build_settings(build_settings_in),
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)        current_dir(current_dir_in) {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, SourceDir* out, Err* err) const {
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    *out = current_dir.ResolveRelativeDir(v.string_value(),
513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                          build_settings->root_path_utf8());
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return true;
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const BuildSettings* build_settings;
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct LabelResolver {
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  LabelResolver(const SourceDir& current_dir_in,
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                const Label& current_toolchain_in)
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : current_dir(current_dir_in),
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        current_toolchain(current_toolchain_in) {}
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, Label* out, Err* err) const {
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    *out = Label::Resolve(current_dir, current_toolchain, v, err);
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return !err->has_error();
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Label& current_toolchain;
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}  // namespace
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfStringValues(const Value& value,
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               std::vector<std::string>* dest,
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               Err* err) {
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!value.VerifyTypeIs(Value::LIST, err))
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const std::vector<Value>& input_list = value.list_value();
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  dest->reserve(input_list.size());
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (size_t i = 0; i < input_list.size(); i++) {
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!input_list[i].VerifyTypeIs(Value::STRING, err))
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    dest->push_back(input_list[i].string_value());
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return true;
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ExtractListOfRelativeFiles(const BuildSettings* build_settings,
913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                                const Value& value,
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                const SourceDir& current_dir,
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                std::vector<SourceFile>* files,
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                Err* err) {
95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, files, err,
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            RelativeFileConverter(build_settings, current_dir));
97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool ExtractListOfRelativeDirs(const BuildSettings* build_settings,
1003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                               const Value& value,
101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               const SourceDir& current_dir,
102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               std::vector<SourceDir>* dest,
103d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               Err* err) {
104d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, dest, err,
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)                            RelativeDirConverter(build_settings, current_dir));
106d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
107d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
108d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfLabels(const Value& value,
109d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         const SourceDir& current_dir,
110d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         const Label& current_toolchain,
111d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         std::vector<Label>* dest,
112d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         Err* err) {
113d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, dest, err,
114d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            LabelResolver(current_dir, current_toolchain));
115d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
116