| // Copyright 2016 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/parse_node_value_adapter.h" |
| |
| #include "tools/gn/parse_tree.h" |
| #include "tools/gn/scope.h" |
| |
| ParseNodeValueAdapter::ParseNodeValueAdapter() : ref_(nullptr) {} |
| |
| ParseNodeValueAdapter::~ParseNodeValueAdapter() = default; |
| |
| bool ParseNodeValueAdapter::Init(Scope* scope, |
| const ParseNode* node, |
| Err* err) { |
| const IdentifierNode* identifier = node->AsIdentifier(); |
| if (identifier) { |
| ref_ = scope->GetValue(identifier->value().value(), true); |
| if (!ref_) { |
| identifier->MakeErrorDescribing("Undefined identifier"); |
| return false; |
| } |
| return true; |
| } |
| |
| temporary_ = node->Execute(scope, err); |
| return !err->has_error(); |
| } |
| |
| bool ParseNodeValueAdapter::InitForType(Scope* scope, |
| const ParseNode* node, |
| Value::Type type, |
| Err* err) { |
| if (!Init(scope, node, err)) |
| return false; |
| if (get().VerifyTypeIs(type, err)) |
| return true; |
| |
| // Fix up the error range (see class comment in the header file) to be the |
| // identifier node rather than the original value. |
| *err = Err(node, err->message(), err->help_text()); |
| return false; |
| } |