// 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_EXPR_H_
#define SRC_DEVELOPER_DEBUG_ZXDB_EXPR_EXPR_H_

#include <optional>

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

namespace zxdb {

class Err;
class EvalContext;

// Main entrypoint to evaluate an expression. This will parse the input, execute the result with the
// given context, and call the callback when complete.
//
// If follow_references is set, expressions that result in a reference will have the value of the
// referenced data computed. This is useful when the caller wants the result value of an expression
// but doesn't care about the exact type.
//
// The callback may get issued asynchronously in the future or it may get called synchronously in a
// reentrant fashion from this function.
void EvalExpression(const std::string& input, const fxl::RefPtr<EvalContext>& context,
                    bool follow_references, EvalCallback cb);

// Like EvalExpressions but evaluates a sequence of expressions, issuing the callback when they're
// all complete. The size order of the results in the callback vector will correspond to the inputs.
void EvalExpressions(const std::vector<std::string>& inputs,
                     const fxl::RefPtr<EvalContext>& context, bool follow_references,
                     fit::callback<void(std::vector<ErrOrValue>)> cb);

// Determines the memory location that the given value refers to. It is used by the frontend to get
// the address of what the user meant when they typed an expression.
//
// If the result has a type with a known size, that size will be put into *size. Otherwise it will
// be untouched (for example, raw numbers will be converted to pointers that have no intrinsic
// size).
//
// TODO(bug 44074) support non-pointer values and take their address implicitly.
Err ValueToAddressAndSize(const fxl::RefPtr<EvalContext>& context, const ExprValue& value,
                          uint64_t* address, std::optional<uint32_t>* size);

}  // namespace zxdb

#endif  // SRC_DEVELOPER_DEBUG_ZXDB_EXPR_EXPR_H_
