text: // 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() {
  }
  
  
  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;
  }
  