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