value_extractors.cc revision d3868032626d59662ff73b372b5d584c1d144c53
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
7d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/err.h"
8d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/label.h"
9d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_dir.h"
10d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch#include "tools/gn/source_file.h"
11d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
12d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochnamespace {
13d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
14d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// This extractor rejects files with system-absolute file paths. If we need
15d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch// that in the future, we'll have to add some flag to control this.
16d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeFileConverter {
17d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  RelativeFileConverter(const SourceDir& current_dir_in)
18d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : current_dir(current_dir_in) {}
19d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, SourceFile* out, Err* err) const {
20d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
21d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
22d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    *out = current_dir.ResolveRelativeFile(v.string_value());
23d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (out->is_system_absolute()) {
24d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      *err = Err(v, "System-absolute file path.",
25d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "You can't list a system-absolute file path here. Please include "
26d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "only files in\nthe source tree. Maybe you meant to begin with two "
27d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch          "slashes to indicate an\nabsolute path in the source tree?");
28d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
29d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    }
30d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return true;
31d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
32d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct RelativeDirConverter {
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  RelativeDirConverter(const SourceDir& current_dir_in)
37d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : current_dir(current_dir_in) {}
38d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, SourceDir* out, Err* err) const {
39d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
40d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
41d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    *out = current_dir.ResolveRelativeDir(v.string_value());
42d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return true;
43d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
44d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
45d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
46d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
47d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochstruct LabelResolver {
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  LabelResolver(const SourceDir& current_dir_in,
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                const Label& current_toolchain_in)
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      : current_dir(current_dir_in),
51d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch        current_toolchain(current_toolchain_in) {}
52d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  bool operator()(const Value& v, Label* out, Err* err) const {
53d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!v.VerifyTypeIs(Value::STRING, err))
54d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
55d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    *out = Label::Resolve(current_dir, current_toolchain, v, err);
56d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return !err->has_error();
57d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
58d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const SourceDir& current_dir;
59d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const Label& current_toolchain;
60d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch};
61d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
62d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}  // namespace
63d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
64d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfStringValues(const Value& value,
65d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               std::vector<std::string>* dest,
66d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               Err* err) {
67d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  if (!value.VerifyTypeIs(Value::LIST, err))
68d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    return false;
69d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const std::vector<Value>& input_list = value.list_value();
70d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  dest->reserve(input_list.size());
71d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  for (size_t i = 0; i < input_list.size(); i++) {
72d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    if (!input_list[i].VerifyTypeIs(Value::STRING, err))
73d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch      return false;
74d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch    dest->push_back(input_list[i].string_value());
75d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  }
76d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return true;
77d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
78d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
79d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfRelativeFiles(const Value& value,
80d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                const SourceDir& current_dir,
81d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                std::vector<SourceFile>* files,
82d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                                Err* err) {
83d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, files, err,
84d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            RelativeFileConverter(current_dir));
85d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
86d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
87d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfRelativeDirs(const Value& value,
88d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               const SourceDir& current_dir,
89d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               std::vector<SourceDir>* dest,
90d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                               Err* err) {
91d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, dest, err,
92d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            RelativeDirConverter(current_dir));
93d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
94d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
95d3868032626d59662ff73b372b5d584c1d144c53Ben Murdochbool ExtractListOfLabels(const Value& value,
96d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         const SourceDir& current_dir,
97d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         const Label& current_toolchain,
98d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         std::vector<Label>* dest,
99d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                         Err* err) {
100d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  return ListValueExtractor(value, dest, err,
101d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                            LabelResolver(current_dir, current_toolchain));
102d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch}
103