// Copyright 2018 The Fuchsia 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 "src/developer/debug/zxdb/expr/found_name.h"

#include <lib/syslog/cpp/macros.h>

#include "src/developer/debug/zxdb/symbols/collection.h"
#include "src/developer/debug/zxdb/symbols/data_member.h"
#include "src/developer/debug/zxdb/symbols/variable.h"

namespace zxdb {

FoundName::FoundName() = default;

FoundName::FoundName(Kind kind, ParsedIdentifier name) : kind_(kind), name_(std::move(name)) {
  // These are the only kinds that don't require other information.
  FX_DCHECK(kind == kNone || kind == kNamespace || kind == kTemplate);
}

FoundName::FoundName(const Variable* variable) : kind_(kVariable), variable_(RefPtrTo(variable)) {}

FoundName::FoundName(const Function* function) : kind_(kFunction), function_(RefPtrTo(function)) {}

FoundName::FoundName(const Symbol* sym) {
  if (const Function* fn = sym->As<Function>()) {
    kind_ = kFunction;
    function_ = RefPtrTo(fn);
  } else if (const Variable* var = sym->As<Variable>()) {
    kind_ = kVariable;
    variable_ = RefPtrTo(var);
  } else {
    kind_ = kOtherSymbol;
    other_symbol_ = RefPtrTo(sym);
  }
}

FoundName::FoundName(const Variable* object_ptr, FoundMember member)
    : kind_(kMemberVariable), object_ptr_(RefPtrTo(object_ptr)), member_(std::move(member)) {}

FoundName::FoundName(const Variable* object_ptr, InheritancePath path,
                     const DataMember* data_member)
    : kind_(kMemberVariable),
      object_ptr_(RefPtrTo(object_ptr)),
      member_(std::move(path), data_member) {}

FoundName::FoundName(fxl::RefPtr<Type> type) : kind_(kType), type_(std::move(type)) {}

FoundName::~FoundName() = default;

ParsedIdentifier FoundName::GetName() const {
  switch (kind_) {
    case kNone:
      break;
    case kVariable:
      return ToParsedIdentifier(variable_->GetIdentifier());
    case kMemberVariable:
      return ToParsedIdentifier(member_.data_member()->GetIdentifier());
    case kNamespace:
    case kTemplate:
      return name_;
    case kType:
      return ToParsedIdentifier(type_->GetIdentifier());
    case kFunction:
      return ToParsedIdentifier(function_->GetIdentifier());
    case kOtherSymbol:
      return ToParsedIdentifier(other_symbol_->GetIdentifier());
  }
  return ParsedIdentifier();
}

}  // namespace zxdb
