// 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;
}
