mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-05-30 03:01:15 -03:00
Adopt env_scoped_t::snapshot() and remove env_var_snapshot_t
Remove the env_var_snapshot_t class and switch everything to the new snapshot function of env_scoped_t. Fixes #5658. Fixes #5571.
This commit is contained in:
34
src/env.cpp
34
src/env.cpp
@@ -181,7 +181,6 @@ wcstring environment_t::get_pwd_slash() const {
|
|||||||
return pwd;
|
return pwd;
|
||||||
}
|
}
|
||||||
|
|
||||||
null_environment_t::null_environment_t() = default;
|
|
||||||
null_environment_t::~null_environment_t() = default;
|
null_environment_t::~null_environment_t() = default;
|
||||||
maybe_t<env_var_t> null_environment_t::get(const wcstring &key, env_mode_flags_t mode) const {
|
maybe_t<env_var_t> null_environment_t::get(const wcstring &key, env_mode_flags_t mode) const {
|
||||||
UNUSED(key);
|
UNUSED(key);
|
||||||
@@ -1140,39 +1139,6 @@ env_stack_t &env_stack_t::globals() {
|
|||||||
return s_global;
|
return s_global;
|
||||||
}
|
}
|
||||||
|
|
||||||
env_vars_snapshot_t::env_vars_snapshot_t(const environment_t &source, const wchar_t *const *keys) {
|
|
||||||
ASSERT_IS_MAIN_THREAD();
|
|
||||||
wcstring key;
|
|
||||||
for (size_t i = 0; keys[i]; i++) {
|
|
||||||
key.assign(keys[i]);
|
|
||||||
const auto var = source.get(key);
|
|
||||||
if (var) {
|
|
||||||
vars[key] = std::move(*var);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
names = source.get_names(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
env_vars_snapshot_t::~env_vars_snapshot_t() = default;
|
|
||||||
|
|
||||||
maybe_t<env_var_t> env_vars_snapshot_t::get(const wcstring &key, env_mode_flags_t mode) const {
|
|
||||||
UNUSED(mode);
|
|
||||||
auto iter = vars.find(key);
|
|
||||||
if (iter == vars.end()) return none();
|
|
||||||
return iter->second;
|
|
||||||
}
|
|
||||||
|
|
||||||
wcstring_list_t env_vars_snapshot_t::get_names(int flags) const {
|
|
||||||
UNUSED(flags);
|
|
||||||
return names;
|
|
||||||
}
|
|
||||||
|
|
||||||
const wchar_t *const env_vars_snapshot_t::highlighting_keys[] = {
|
|
||||||
L"PATH", L"CDPATH", L"fish_function_path", L"PWD", L"HOME", NULL};
|
|
||||||
|
|
||||||
const wchar_t *const env_vars_snapshot_t::completing_keys[] = {
|
|
||||||
L"PATH", L"CDPATH", L"fish_function_path", L"PWD", L"HOME", NULL};
|
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__CYGWIN__)
|
#if defined(__APPLE__) || defined(__CYGWIN__)
|
||||||
static int check_runtime_path(const char *path) {
|
static int check_runtime_path(const char *path) {
|
||||||
UNUSED(path);
|
UNUSED(path);
|
||||||
|
|||||||
24
src/env.h
24
src/env.h
@@ -186,7 +186,7 @@ class environment_t {
|
|||||||
/// The null environment contains nothing.
|
/// The null environment contains nothing.
|
||||||
class null_environment_t : public environment_t {
|
class null_environment_t : public environment_t {
|
||||||
public:
|
public:
|
||||||
null_environment_t();
|
null_environment_t() = default;
|
||||||
~null_environment_t() override;
|
~null_environment_t() override;
|
||||||
|
|
||||||
maybe_t<env_var_t> get(const wcstring &key, env_mode_flags_t mode = ENV_DEFAULT) const override;
|
maybe_t<env_var_t> get(const wcstring &key, env_mode_flags_t mode = ENV_DEFAULT) const override;
|
||||||
@@ -296,28 +296,6 @@ class env_stack_t final : public env_scoped_t {
|
|||||||
static env_stack_t &globals();
|
static env_stack_t &globals();
|
||||||
};
|
};
|
||||||
|
|
||||||
class env_vars_snapshot_t : public environment_t {
|
|
||||||
std::map<wcstring, env_var_t> vars;
|
|
||||||
wcstring_list_t names;
|
|
||||||
|
|
||||||
public:
|
|
||||||
env_vars_snapshot_t() = default;
|
|
||||||
env_vars_snapshot_t(const env_vars_snapshot_t &) = default;
|
|
||||||
env_vars_snapshot_t &operator=(const env_vars_snapshot_t &) = default;
|
|
||||||
env_vars_snapshot_t(const environment_t &source, const wchar_t *const *keys);
|
|
||||||
~env_vars_snapshot_t() override;
|
|
||||||
|
|
||||||
maybe_t<env_var_t> get(const wcstring &key, env_mode_flags_t mode = ENV_DEFAULT) const override;
|
|
||||||
|
|
||||||
wcstring_list_t get_names(int flags) const override;
|
|
||||||
|
|
||||||
// Vars necessary for highlighting.
|
|
||||||
static const wchar_t *const highlighting_keys[];
|
|
||||||
|
|
||||||
// Vars necessary for completion.
|
|
||||||
static const wchar_t *const completing_keys[];
|
|
||||||
};
|
|
||||||
|
|
||||||
extern int g_fork_count;
|
extern int g_fork_count;
|
||||||
extern bool g_use_posix_spawn;
|
extern bool g_use_posix_spawn;
|
||||||
|
|
||||||
|
|||||||
@@ -2914,7 +2914,7 @@ static void test_autosuggest_suggest_special() {
|
|||||||
|
|
||||||
static void perform_one_autosuggestion_should_ignore_test(const wcstring &command, long line) {
|
static void perform_one_autosuggestion_should_ignore_test(const wcstring &command, long line) {
|
||||||
completion_list_t comps;
|
completion_list_t comps;
|
||||||
complete(command, &comps, COMPLETION_REQUEST_AUTOSUGGESTION, env_vars_snapshot_t{});
|
complete(command, &comps, COMPLETION_REQUEST_AUTOSUGGESTION, null_environment_t{});
|
||||||
do_test(comps.empty());
|
do_test(comps.empty());
|
||||||
if (!comps.empty()) {
|
if (!comps.empty()) {
|
||||||
const wcstring &suggestion = comps.front().completion;
|
const wcstring &suggestion = comps.front().completion;
|
||||||
|
|||||||
@@ -1276,10 +1276,9 @@ void reader_data_t::completion_insert(const wchar_t *val, complete_flags_t flags
|
|||||||
// on a background thread) to determine the autosuggestion
|
// on a background thread) to determine the autosuggestion
|
||||||
static std::function<autosuggestion_result_t(void)> get_autosuggestion_performer(
|
static std::function<autosuggestion_result_t(void)> get_autosuggestion_performer(
|
||||||
const wcstring &search_string, size_t cursor_pos, history_t *history) {
|
const wcstring &search_string, size_t cursor_pos, history_t *history) {
|
||||||
const auto &parser_vars = parser_t::principal_parser().vars();
|
|
||||||
const unsigned int generation_count = read_generation_count();
|
const unsigned int generation_count = read_generation_count();
|
||||||
const wcstring working_directory = parser_vars.get_pwd_slash();
|
auto vars = parser_t::principal_parser().vars().snapshot();
|
||||||
env_vars_snapshot_t vars(parser_vars, env_vars_snapshot_t::completing_keys);
|
const wcstring working_directory = vars->get_pwd_slash();
|
||||||
// TODO: suspicious use of 'history' here
|
// TODO: suspicious use of 'history' here
|
||||||
// This is safe because histories are immortal, but perhaps
|
// This is safe because histories are immortal, but perhaps
|
||||||
// this should use shared_ptr
|
// this should use shared_ptr
|
||||||
@@ -1306,7 +1305,7 @@ static std::function<autosuggestion_result_t(void)> get_autosuggestion_performer
|
|||||||
// Skip items with newlines because they make terrible autosuggestions.
|
// Skip items with newlines because they make terrible autosuggestions.
|
||||||
if (item.str().find('\n') != wcstring::npos) continue;
|
if (item.str().find('\n') != wcstring::npos) continue;
|
||||||
|
|
||||||
if (autosuggest_validate_from_history(item, working_directory, vars)) {
|
if (autosuggest_validate_from_history(item, working_directory, *vars)) {
|
||||||
// The command autosuggestion was handled specially, so we're done.
|
// The command autosuggestion was handled specially, so we're done.
|
||||||
return {searcher.current_string(), search_string};
|
return {searcher.current_string(), search_string};
|
||||||
}
|
}
|
||||||
@@ -1328,7 +1327,7 @@ static std::function<autosuggestion_result_t(void)> get_autosuggestion_performer
|
|||||||
// Try normal completions.
|
// Try normal completions.
|
||||||
completion_request_flags_t complete_flags = COMPLETION_REQUEST_AUTOSUGGESTION;
|
completion_request_flags_t complete_flags = COMPLETION_REQUEST_AUTOSUGGESTION;
|
||||||
std::vector<completion_t> completions;
|
std::vector<completion_t> completions;
|
||||||
complete(search_string, &completions, complete_flags, vars);
|
complete(search_string, &completions, complete_flags, *vars);
|
||||||
completions_sort_and_prioritize(&completions, complete_flags);
|
completions_sort_and_prioritize(&completions, complete_flags);
|
||||||
if (!completions.empty()) {
|
if (!completions.empty()) {
|
||||||
const completion_t &comp = completions.at(0);
|
const completion_t &comp = completions.at(0);
|
||||||
@@ -2041,8 +2040,7 @@ void reader_data_t::highlight_complete(highlight_result_t result) {
|
|||||||
// return a function that performs highlighting. The function may be invoked on a background thread.
|
// return a function that performs highlighting. The function may be invoked on a background thread.
|
||||||
static std::function<highlight_result_t(void)> get_highlight_performer(
|
static std::function<highlight_result_t(void)> get_highlight_performer(
|
||||||
const wcstring &text, long match_highlight_pos, highlight_function_t highlight_func) {
|
const wcstring &text, long match_highlight_pos, highlight_function_t highlight_func) {
|
||||||
env_vars_snapshot_t vars(parser_t::principal_parser().vars(),
|
auto vars = parser_t::principal_parser().vars().snapshot();
|
||||||
env_vars_snapshot_t::highlighting_keys);
|
|
||||||
unsigned int generation_count = read_generation_count();
|
unsigned int generation_count = read_generation_count();
|
||||||
return [=]() -> highlight_result_t {
|
return [=]() -> highlight_result_t {
|
||||||
if (text.empty()) return {};
|
if (text.empty()) return {};
|
||||||
@@ -2052,7 +2050,7 @@ static std::function<highlight_result_t(void)> get_highlight_performer(
|
|||||||
}
|
}
|
||||||
s_thread_generation = generation_count;
|
s_thread_generation = generation_count;
|
||||||
std::vector<highlight_spec_t> colors(text.size(), highlight_spec_t{});
|
std::vector<highlight_spec_t> colors(text.size(), highlight_spec_t{});
|
||||||
highlight_func(text, colors, match_highlight_pos, NULL /* error */, vars);
|
highlight_func(text, colors, match_highlight_pos, NULL /* error */, *vars);
|
||||||
return {std::move(colors), text};
|
return {std::move(colors), text};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user