// 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_EXPR_RESOLVE_PTR_REF_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_RESOLVE_PTR_REF_H_

#include "lib/fit/function.h"
#include "src/developer/debug/zxdb/expr/eval_callback.h"
#include "src/developer/debug/zxdb/expr/expr_value.h"
#include "src/lib/fxl/memory/ref_ptr.h"

namespace zxdb {

class Err;
class EvalContext;
class Type;

// Creates an ExprValue of the given type from the data at the given address. Issues the callback on
// completion. The type can be null (it will immediately call the callback with an error).
//
// It's assumed the type is already concrete (so it has a size). This will not do any fancy stuff
// like casting to a derived type. It is a low-level function that just fetches the requested
// memory.
void ResolvePointer(const fxl::RefPtr<EvalContext>& eval_context, uint64_t address,
                    fxl::RefPtr<Type> type, EvalCallback cb);

// Similar to the above but the pointer and type comes from the given ExprValue, which is assumed to
// be a pointer type. If it's not a pointer type, the callback will be issued with an error.
//
// This will automatically cast to a derived type if the EvalContext requests it, so the resulting
// object may be a different type or from a different address than the input pointer value.
void ResolvePointer(const fxl::RefPtr<EvalContext>& eval_context, const ExprValue& pointer,
                    EvalCallback cb);

// Ensures that the value is not a reference type (rvalue or regular). The result will be an
// ExprValue passed to the callback that has any reference types stripped.
//
// If the input ExprValue does not have a reference type, calls the callback immediately (from
// within the calling function's stack frame) with the input.
//
// If the value is a reference type, it will be resolved and the value will be the value of the
// referenced data.
void EnsureResolveReference(const fxl::RefPtr<EvalContext>& eval_context, ExprValue value,
                            EvalCallback cb);

// Verifies that |input| type is a pointer and fills the pointed-to type into |*pointed_to|. In
// other cases, returns an error. The input type can be null (which will produce an error) or
// non-concrete (const, forward definition, etc.) so the caller doesn't have to check.
//
// The returned type may not necessarily be concrete (need to preserve, const, etc.).
//
// This function currently assumes that the caller wants to do something with the type so the
// pointed-to type can not be "void". This means that "void*" will issue an error. If this
// capability is needed in the future, probably we want to add an enum parameter to control whether
// this is OK (forcing all callers to check for null is probably not a good idea).
Err GetPointedToType(const fxl::RefPtr<EvalContext>& eval_context, const Type* input,
                     fxl::RefPtr<Type>* pointed_to);

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_RESOLVE_PTR_REF_H_
