2016-05-01 11:31:02 +08:00
|
|
|
// Prototypes for functions for storing and retrieving function information. These functions also
|
|
|
|
// take care of autoloading functions in the $fish_function_path. Actual function evaluation is
|
|
|
|
// taken care of by the parser and to some degree the builtin handling library.
|
2005-10-04 23:11:39 +08:00
|
|
|
#ifndef FISH_FUNCTION_H
|
|
|
|
#define FISH_FUNCTION_H
|
|
|
|
|
2016-05-01 11:31:02 +08:00
|
|
|
#include <map>
|
2022-08-21 14:14:48 +08:00
|
|
|
#include <memory>
|
|
|
|
#include <string>
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2012-01-14 15:44:18 +08:00
|
|
|
#include "common.h"
|
2018-02-10 13:53:06 +08:00
|
|
|
#include "parse_tree.h"
|
2005-10-04 23:11:39 +08:00
|
|
|
|
2012-01-17 04:10:08 +08:00
|
|
|
class parser_t;
|
|
|
|
|
2020-07-04 02:16:51 +08:00
|
|
|
namespace ast {
|
|
|
|
struct block_statement_t;
|
|
|
|
}
|
|
|
|
|
2018-02-12 08:37:38 +08:00
|
|
|
/// A function's constant properties. These do not change once initialized.
|
|
|
|
struct function_properties_t {
|
|
|
|
/// Parsed source containing the function.
|
|
|
|
parsed_source_ref_t parsed_source;
|
|
|
|
|
2020-01-04 06:40:28 +08:00
|
|
|
/// Node containing the function statement, pointing into parsed_source.
|
|
|
|
/// We store block_statement, not job_list, so that comments attached to the header are
|
|
|
|
/// preserved.
|
2020-07-04 02:16:51 +08:00
|
|
|
const ast::block_statement_t *func_node;
|
2018-02-12 08:37:38 +08:00
|
|
|
|
|
|
|
/// List of all named arguments for this function.
|
|
|
|
wcstring_list_t named_arguments;
|
|
|
|
|
2021-10-22 04:56:32 +08:00
|
|
|
/// Description of the function.
|
|
|
|
wcstring description;
|
|
|
|
|
2019-11-13 01:53:10 +08:00
|
|
|
/// Mapping of all variables that were inherited from the function definition scope to their
|
|
|
|
/// values.
|
|
|
|
std::map<wcstring, wcstring_list_t> inherit_vars;
|
|
|
|
|
2018-02-12 08:37:38 +08:00
|
|
|
/// Set to true if invoking this function shadows the variables of the underlying function.
|
2019-05-05 07:47:27 +08:00
|
|
|
bool shadow_scope{true};
|
2021-10-22 04:10:09 +08:00
|
|
|
|
2021-10-22 04:23:49 +08:00
|
|
|
/// Whether the function was autoloaded.
|
|
|
|
bool is_autoload{false};
|
|
|
|
|
2022-08-14 03:15:23 +08:00
|
|
|
/// The file from which the function was created, or nullptr if not from a file.
|
|
|
|
filename_ref_t definition_file{};
|
2021-10-22 05:28:39 +08:00
|
|
|
|
|
|
|
/// \return the description, localized via _.
|
|
|
|
const wchar_t *localized_description() const;
|
|
|
|
|
|
|
|
/// \return the line number where the definition of the specified function started.
|
|
|
|
int definition_lineno() const;
|
|
|
|
|
|
|
|
/// \return a definition of the function, annotated with properties like event handlers and wrap
|
|
|
|
/// targets. This is to support the 'functions' builtin.
|
|
|
|
/// Note callers must provide the function name, since the function does not know its own name.
|
|
|
|
wcstring annotated_definition(const wcstring &name) const;
|
2018-02-12 08:37:38 +08:00
|
|
|
};
|
|
|
|
|
2019-11-13 01:53:10 +08:00
|
|
|
using function_properties_ref_t = std::shared_ptr<const function_properties_t>;
|
|
|
|
|
2021-10-22 04:23:49 +08:00
|
|
|
/// Add a function. This may mutate \p props to set is_autoload.
|
2021-10-22 04:56:32 +08:00
|
|
|
void function_add(wcstring name, std::shared_ptr<function_properties_t> props);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-05-01 11:31:02 +08:00
|
|
|
/// Remove the function with the specified name.
|
2012-11-19 08:30:30 +08:00
|
|
|
void function_remove(const wcstring &name);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2021-10-22 05:32:35 +08:00
|
|
|
/// \return the properties for a function, or nullptr if none. This does not trigger autoloading.
|
|
|
|
function_properties_ref_t function_get_props(const wcstring &name);
|
2018-02-12 09:21:24 +08:00
|
|
|
|
2021-10-22 05:28:39 +08:00
|
|
|
/// \return the properties for a function, or nullptr if none, perhaps triggering autoloading.
|
|
|
|
function_properties_ref_t function_get_props_autoload(const wcstring &name, parser_t &parser);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2022-06-12 02:34:52 +08:00
|
|
|
/// Try autoloading a function.
|
|
|
|
/// \return true if something new was autoloaded, false if it was already loaded or did not exist.
|
|
|
|
bool function_load(const wcstring &name, parser_t &parser);
|
|
|
|
|
2016-05-01 11:31:02 +08:00
|
|
|
/// Sets the description of the function with the name \c name.
|
2021-10-22 05:28:39 +08:00
|
|
|
/// This triggers autoloading.
|
2019-05-05 11:20:52 +08:00
|
|
|
void function_set_desc(const wcstring &name, const wcstring &desc, parser_t &parser);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2021-10-22 05:28:39 +08:00
|
|
|
/// Returns true if the function named \p cmd exists.
|
2018-02-12 09:21:24 +08:00
|
|
|
/// This may autoload.
|
2021-10-22 05:28:39 +08:00
|
|
|
bool function_exists(const wcstring &cmd, parser_t &parser);
|
2015-10-08 09:59:41 +08:00
|
|
|
|
2021-10-22 05:28:39 +08:00
|
|
|
/// Returns true if the function \p cmd either is loaded, or exists on disk in an autoload
|
|
|
|
/// directory.
|
2021-06-23 03:37:45 +08:00
|
|
|
bool function_exists_no_autoload(const wcstring &cmd);
|
2011-12-27 11:18:46 +08:00
|
|
|
|
2016-05-01 11:31:02 +08:00
|
|
|
/// Returns all function names.
|
|
|
|
///
|
|
|
|
/// \param get_hidden whether to include hidden functions, i.e. ones starting with an underscore.
|
2022-06-16 21:48:46 +08:00
|
|
|
wcstring_list_t function_get_names(bool get_hidden);
|
2005-09-20 21:26:39 +08:00
|
|
|
|
2016-05-01 11:31:02 +08:00
|
|
|
/// Creates a new function using the same definition as the specified function. Returns true if copy
|
|
|
|
/// is successful.
|
2012-11-19 08:30:30 +08:00
|
|
|
bool function_copy(const wcstring &name, const wcstring &new_name);
|
2010-09-08 01:31:05 +08:00
|
|
|
|
2018-02-16 13:58:02 +08:00
|
|
|
/// Observes that fish_function_path has changed.
|
|
|
|
void function_invalidate_path();
|
|
|
|
|
2005-10-04 23:11:39 +08:00
|
|
|
#endif
|