// 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->AsFunction()) {
    kind_ = kFunction;
    function_ = RefPtrTo(fn);
  } else if (const Variable* var = sym->AsVariable()) {
    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
