mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-14 14:03:58 +00:00
bfa83470d4
This concerns what happens if the user types e.g. `grep --i` and grep or its completions have not yet been loaded. Previously we would "bounce to the main thread" from within the autosuggestion thread to load grep's completions. However under concurrent execution, this may deadlock as the main thread is waiting for something else. In the new implementation, complete simply records the commands that it would autoload, and returns them back to the caller, where the caller can decide how to handle them. In general iothread_perform_on_main risks deadlock under concurrent execution and we should try to get rid of it. There should be no user-visible change from this fix.
105 lines
3.9 KiB
C++
105 lines
3.9 KiB
C++
// 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.
|
|
#ifndef FISH_FUNCTION_H
|
|
#define FISH_FUNCTION_H
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include "common.h"
|
|
#include "env.h"
|
|
#include "event.h"
|
|
#include "parse_tree.h"
|
|
|
|
class parser_t;
|
|
|
|
namespace ast {
|
|
struct block_statement_t;
|
|
}
|
|
|
|
/// 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;
|
|
|
|
/// 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.
|
|
const ast::block_statement_t *func_node;
|
|
|
|
/// List of all named arguments for this function.
|
|
wcstring_list_t named_arguments;
|
|
|
|
/// Description of the function.
|
|
wcstring description;
|
|
|
|
/// Mapping of all variables that were inherited from the function definition scope to their
|
|
/// values.
|
|
std::map<wcstring, wcstring_list_t> inherit_vars;
|
|
|
|
/// Set to true if invoking this function shadows the variables of the underlying function.
|
|
bool shadow_scope{true};
|
|
|
|
/// Whether the function was autoloaded.
|
|
bool is_autoload{false};
|
|
|
|
/// The file from which the function was created (intern'd string), or nullptr if not from a
|
|
/// file.
|
|
const wchar_t *definition_file{};
|
|
|
|
/// \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;
|
|
};
|
|
|
|
using function_properties_ref_t = std::shared_ptr<const function_properties_t>;
|
|
|
|
/// Add a function. This may mutate \p props to set is_autoload.
|
|
void function_add(wcstring name, std::shared_ptr<function_properties_t> props);
|
|
|
|
/// Remove the function with the specified name.
|
|
void function_remove(const wcstring &name);
|
|
|
|
/// \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);
|
|
|
|
/// \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);
|
|
|
|
/// 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);
|
|
|
|
/// Sets the description of the function with the name \c name.
|
|
/// This triggers autoloading.
|
|
void function_set_desc(const wcstring &name, const wcstring &desc, parser_t &parser);
|
|
|
|
/// Returns true if the function named \p cmd exists.
|
|
/// This may autoload.
|
|
bool function_exists(const wcstring &cmd, parser_t &parser);
|
|
|
|
/// Returns true if the function \p cmd either is loaded, or exists on disk in an autoload
|
|
/// directory.
|
|
bool function_exists_no_autoload(const wcstring &cmd);
|
|
|
|
/// Returns all function names.
|
|
///
|
|
/// \param get_hidden whether to include hidden functions, i.e. ones starting with an underscore.
|
|
wcstring_list_t function_get_names(bool get_hidden);
|
|
|
|
/// Creates a new function using the same definition as the specified function. Returns true if copy
|
|
/// is successful.
|
|
bool function_copy(const wcstring &name, const wcstring &new_name);
|
|
|
|
/// Observes that fish_function_path has changed.
|
|
void function_invalidate_path();
|
|
|
|
#endif
|