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