// 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 "garnet/bin/zxdb/symbols/function_type.h"

#include "garnet/bin/zxdb/symbols/variable.h"
#include "lib/fxl/logging.h"

namespace zxdb {

FunctionType::FunctionType(LazySymbol return_type,
                           std::vector<LazySymbol> parameters)
    : Type(Symbol::kTagSubroutineType),
      return_type_(std::move(return_type)),
      parameters_(std::move(parameters)) {
  // The byte size is the size of a pointer on the target platform.
  set_byte_size(sizeof(uint64_t));
}

FunctionType::~FunctionType() = default;

const FunctionType* FunctionType::AsFunctionType() const { return this; }

std::string FunctionType::ComputeFullNameForFunctionPtr(
    const std::string& container) const {
  std::string result = ComputeReturnTypeString();
  result.push_back(' ');

  // Name part (*) or (Class::*)
  result.push_back('(');
  if (container.empty()) {
    result.push_back('*');
  } else {
    result += container;
    result += "::*";
  }
  result.push_back(')');

  result += ComputeParameterString();
  return result;
}

std::string FunctionType::ComputeFullName() const {
  // Generally this shouldn't be called because pointers to member functions
  // and pointers to class members both have special case code paths that end
  // up in ComputeFullNameForFunctionPtr(). But in case the user dereferences a
  // function pointer, provide a reasonable name (GDB does something similar).
  return ComputeReturnTypeString() + ComputeParameterString();
}

std::string FunctionType::ComputeReturnTypeString() const {
  std::string result;
  if (return_type_) {
    if (const Type* return_type_ptr = return_type_.Get()->AsType())
      result += return_type_ptr->GetFullName();
    else
      result += "<invalid>";
  } else {
    result += "void";
  }
  return result;
}

std::string FunctionType::ComputeParameterString() const {
  std::string result("(");
  for (size_t i = 0; i < parameters_.size(); i++) {
    if (i > 0)
      result += ", ";

    const Type* param_type = nullptr;
    if (const Variable* param_var = parameters_[i].Get()->AsVariable())
      param_type = param_var->type().Get()->AsType();
    if (param_type)
      result += param_type->GetFullName();
    else
      result += "<invalid>";
  }
  result.push_back(')');
  return result;
}

}  // namespace zxdb
