|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "tools/gn/scope_per_file_provider.h" | 
|  |  | 
|  | #include <memory> | 
|  |  | 
|  | #include "tools/gn/filesystem_utils.h" | 
|  | #include "tools/gn/settings.h" | 
|  | #include "tools/gn/source_file.h" | 
|  | #include "tools/gn/value.h" | 
|  | #include "tools/gn/variables.h" | 
|  |  | 
|  | ScopePerFileProvider::ScopePerFileProvider(Scope* scope, | 
|  | bool allow_target_vars) | 
|  | : ProgrammaticProvider(scope), | 
|  | allow_target_vars_(allow_target_vars) { | 
|  | } | 
|  |  | 
|  | ScopePerFileProvider::~ScopePerFileProvider() = default; | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetProgrammaticValue( | 
|  | const base::StringPiece& ident) { | 
|  | if (ident == variables::kCurrentToolchain) | 
|  | return GetCurrentToolchain(); | 
|  | if (ident == variables::kDefaultToolchain) | 
|  | return GetDefaultToolchain(); | 
|  | if (ident == variables::kPythonPath) | 
|  | return GetPythonPath(); | 
|  |  | 
|  | if (ident == variables::kRootBuildDir) | 
|  | return GetRootBuildDir(); | 
|  | if (ident == variables::kRootGenDir) | 
|  | return GetRootGenDir(); | 
|  | if (ident == variables::kRootOutDir) | 
|  | return GetRootOutDir(); | 
|  |  | 
|  | if (allow_target_vars_) { | 
|  | if (ident == variables::kTargetGenDir) | 
|  | return GetTargetGenDir(); | 
|  | if (ident == variables::kTargetOutDir) | 
|  | return GetTargetOutDir(); | 
|  | } | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetCurrentToolchain() { | 
|  | if (!current_toolchain_) { | 
|  | current_toolchain_ = std::make_unique<Value>( | 
|  | nullptr, | 
|  | scope_->settings()->toolchain_label().GetUserVisibleName(false)); | 
|  | } | 
|  | return current_toolchain_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetDefaultToolchain() { | 
|  | if (!default_toolchain_) { | 
|  | default_toolchain_ = std::make_unique<Value>( | 
|  | nullptr, | 
|  | scope_->settings()->default_toolchain_label().GetUserVisibleName( | 
|  | false)); | 
|  | } | 
|  | return default_toolchain_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetPythonPath() { | 
|  | if (!python_path_) { | 
|  | python_path_ = std::make_unique<Value>( | 
|  | nullptr, | 
|  | FilePathToUTF8(scope_->settings()->build_settings()->python_path())); | 
|  | } | 
|  | return python_path_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetRootBuildDir() { | 
|  | if (!root_build_dir_) { | 
|  | root_build_dir_ = std::make_unique<Value>( | 
|  | nullptr, DirectoryWithNoLastSlash( | 
|  | scope_->settings()->build_settings()->build_dir())); | 
|  | } | 
|  | return root_build_dir_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetRootGenDir() { | 
|  | if (!root_gen_dir_) { | 
|  | root_gen_dir_ = std::make_unique<Value>( | 
|  | nullptr, DirectoryWithNoLastSlash(GetBuildDirAsSourceDir( | 
|  | BuildDirContext(scope_), BuildDirType::GEN))); | 
|  | } | 
|  | return root_gen_dir_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetRootOutDir() { | 
|  | if (!root_out_dir_) { | 
|  | root_out_dir_ = std::make_unique<Value>( | 
|  | nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir( | 
|  | scope_, BuildDirType::TOOLCHAIN_ROOT))); | 
|  | } | 
|  | return root_out_dir_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetTargetGenDir() { | 
|  | if (!target_gen_dir_) { | 
|  | target_gen_dir_ = std::make_unique<Value>( | 
|  | nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir( | 
|  | scope_, BuildDirType::GEN))); | 
|  | } | 
|  | return target_gen_dir_.get(); | 
|  | } | 
|  |  | 
|  | const Value* ScopePerFileProvider::GetTargetOutDir() { | 
|  | if (!target_out_dir_) { | 
|  | target_out_dir_ = std::make_unique<Value>( | 
|  | nullptr, DirectoryWithNoLastSlash(GetScopeCurrentBuildDirAsSourceDir( | 
|  | scope_, BuildDirType::OBJ))); | 
|  | } | 
|  | return target_out_dir_.get(); | 
|  | } |