// 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.

#ifndef SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYMBOL_UTILS_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYMBOL_UTILS_H_

#include <vector>

#include "src/developer/debug/zxdb/symbols/identifier.h"
#include "src/developer/debug/zxdb/symbols/symbol.h"

namespace zxdb {

// This helper function gets the scope for the symbol. This includes class and namespace names and
// will be glbally qualified, but does not include the name of the symbol itself. Use
// Symbol::GetFullName() for that.
Identifier GetSymbolScopePrefix(const Symbol* symbol);

// To make a regular tuple give it a name according to the types you use in parens, e.g. "(u32,
// Point)", to make a tuple struct, give it a word name like "Foo".
fxl::RefPtr<Collection> MakeRustTuple(const std::string& name,
                                      const std::vector<fxl::RefPtr<Type>>& members);

// Makes a type that can hold the raw string bytes of the given length. This always returns a
// C-style string array "char[length]". Rust's "&str" type is actually a structure with a pointer
// which we can't store as a literal in debugger client memory, and users expect an array
// "[char; 3]" to be printed as ['a', 'b', 'c'] instead of a string.
fxl::RefPtr<Type> MakeStringLiteralType(size_t length);

// Matches C-V qualifiers (+restrict) present on the reference type and adds them to the modified
// type.
fxl::RefPtr<Type> AddCVQualifiersToMatch(const Type* reference, fxl::RefPtr<Type> modified);

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_SYMBOLS_SYMBOL_UTILS_H_
