diff options
author | David Adam <zanchey@ucc.gu.uwa.edu.au> | 2015-07-26 10:20:13 +0800 |
---|---|---|
committer | David Adam <zanchey@ucc.gu.uwa.edu.au> | 2015-07-26 10:20:13 +0800 |
commit | 3929e9de0e69666b37df87347d5ce15663e81347 (patch) | |
tree | b2701c439c0260840ce1c68beaebf7de1178cc53 /src/function.h | |
parent | 793e1afa084982dac92c4fe19e50c25e326a79c2 (diff) | |
parent | f4d1657c22c81a7720a91026f915b80d2d6aa6e8 (diff) |
Merge branch 'master' into iwyu
Diffstat (limited to 'src/function.h')
-rw-r--r-- | src/function.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/function.h b/src/function.h new file mode 100644 index 00000000..cd3f6f5a --- /dev/null +++ b/src/function.h @@ -0,0 +1,188 @@ +/** \file function.h + + 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 <vector> +#include <map> + +#include "common.h" +#include "event.h" +#include "env.h" + +class parser_t; + +/** + Structure describing a function. This is used by the parser to + store data on a function while parsing it. It is not used + internally to store functions, the function_internal_data_t + structure is used for that purpose. Parhaps these two should be + merged. + */ +struct function_data_t +{ + /** + Name of function + */ + wcstring name; + /** + Description of function + */ + wcstring description; + /** + Function definition + */ + const wchar_t *definition; + /** + List of all event handlers for this function + */ + std::vector<event_t> events; + /** + List of all named arguments for this function + */ + wcstring_list_t named_arguments; + /** + List of all variables that are inherited from the function definition scope. + The variable values are snapshotted when function_add() is called. + */ + wcstring_list_t inherit_vars; + /** + Set to non-zero if invoking this function shadows the variables + of the underlying function. + */ + int shadows; +}; + +class function_info_t +{ +public: + /** Constructs relevant information from the function_data */ + function_info_t(const function_data_t &data, const wchar_t *filename, int def_offset, bool autoload); + + /** Used by function_copy */ + function_info_t(const function_info_t &data, const wchar_t *filename, int def_offset, bool autoload); + + /** Function definition */ + const wcstring definition; + + /** Function description. Only the description may be changed after the function is created. */ + wcstring description; + + /** File where this function was defined (intern'd string) */ + const wchar_t * const definition_file; + + /** Line where definition started */ + const int definition_offset; + + /** List of all named arguments for this function */ + const wcstring_list_t named_arguments; + + /** Mapping of all variables that were inherited from the function definition scope to their values */ + const std::map<wcstring,env_var_t> inherit_vars; + + /** Flag for specifying that this function was automatically loaded */ + const bool is_autoload; + + /** Set to true if invoking this function shadows the variables of the underlying function. */ + const bool shadows; +}; + + +/** + Initialize function data +*/ +void function_init(); + +/** Add a function. definition_line_offset is the line number of the function's definition within its source file */ +void function_add(const function_data_t &data, const parser_t &parser, int definition_line_offset = 0); + +/** + Remove the function with the specified name. +*/ +void function_remove(const wcstring &name); + +/** + Returns by reference the definition of the function with the name \c name. + Returns true if successful, false if no function with the given name exists. +*/ +bool function_get_definition(const wcstring &name, wcstring *out_definition); + +/** + Returns by reference the description of the function with the name \c name. + Returns true if the function exists and has a nonempty description, false if it does not. +*/ +bool function_get_desc(const wcstring &name, wcstring *out_desc); + +/** + Sets the description of the function with the name \c name. +*/ +void function_set_desc(const wcstring &name, const wcstring &desc); + +/** + Returns true if the function with the name name exists. +*/ +int function_exists(const wcstring &name); + +/** + Returns true if the function with the name name exists, without triggering autoload. +*/ +int function_exists_no_autoload(const wcstring &name, const env_vars_snapshot_t &vars); + +/** + 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(int get_hidden); + +/** + Returns tha absolute path of the file where the specified function + was defined. Returns 0 if the file was defined on the commandline. + + This function does not autoload functions, it will only work on + functions that have already been defined. + + This returns an intern'd string. +*/ +const wchar_t *function_get_definition_file(const wcstring &name); + +/** + Returns the linenumber where the definition of the specified + function started. + + This function does not autoload functions, it will only work on + functions that have already been defined. +*/ +int function_get_definition_offset(const wcstring &name); + +/** + Returns a list of all named arguments of the specified function. +*/ +wcstring_list_t function_get_named_arguments(const wcstring &name); + +/** + Returns a mapping of all variables of the specified function that were inherited + from the scope of the function definition to their values. + */ +std::map<wcstring,env_var_t> function_get_inherit_vars(const wcstring &name); + +/** + 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); + + +/** + Returns whether this function shadows variables of the underlying function +*/ +int function_get_shadows(const wcstring &name); + +#endif |