Adopt the new AST in add_pending_with_file_detection

This switches add_pending_with_file_detection from parsing with parse_tree
to the new ast.
This commit is contained in:
ridiculousfish 2020-06-21 16:45:26 -07:00
parent 202fdfa54a
commit 6b24edccf6

View File

@ -1274,38 +1274,33 @@ void history_t::add_pending_with_file_detection(const wcstring &str,
// Find all arguments that look like they could be file paths. // Find all arguments that look like they could be file paths.
bool needs_sync_write = false; bool needs_sync_write = false;
parse_node_tree_t tree; using namespace ast;
parse_tree_from_string(str, parse_flag_none, &tree, nullptr); auto ast = ast_t::parse(str);
path_list_t potential_paths; path_list_t potential_paths;
for (const parse_node_t &node : tree) { for (const node_t &node : ast) {
if (!node.has_source()) { if (const argument_t *arg = node.try_as<argument_t>()) {
continue; wcstring potential_path = arg->source(str);
}
if (node.type == symbol_argument) {
wcstring potential_path = node.get_source(str);
bool unescaped = unescape_string_in_place(&potential_path, UNESCAPE_DEFAULT); bool unescaped = unescape_string_in_place(&potential_path, UNESCAPE_DEFAULT);
if (unescaped && string_could_be_path(potential_path)) { if (unescaped && string_could_be_path(potential_path)) {
potential_paths.push_back(potential_path); potential_paths.push_back(potential_path);
} }
} else if (node.type == symbol_plain_statement) { } else if (const decorated_statement_t *stmt = node.try_as<decorated_statement_t>()) {
// Hack hack hack - if the command is likely to trigger an exit, then don't do // Hack hack hack - if the command is likely to trigger an exit, then don't do
// background file detection, because we won't be able to write it to our history file // background file detection, because we won't be able to write it to our history file
// before we exit. // before we exit.
// Also skip it for 'echo'. This is because echo doesn't take file paths, but also // Also skip it for 'echo'. This is because echo doesn't take file paths, but also
// because the history file test wants to find the commands in the history file // because the history file test wants to find the commands in the history file
// immediately after running them, so it can't tolerate the asynchronous file detection. // immediately after running them, so it can't tolerate the asynchronous file detection.
if (get_decoration({&tree, &node}) == parse_statement_decoration_exec) { if (stmt->decoration() == parse_statement_decoration_exec) {
needs_sync_write = true; needs_sync_write = true;
} }
if (maybe_t<wcstring> command = command_for_plain_statement({&tree, &node}, str)) { wcstring command = stmt->command.source(str);
unescape_string_in_place(&*command, UNESCAPE_DEFAULT); unescape_string_in_place(&command, UNESCAPE_DEFAULT);
if (*command == L"exit" || *command == L"reboot" || *command == L"restart" || if (command == L"exit" || command == L"reboot" || command == L"restart" ||
*command == L"echo") { command == L"echo") {
needs_sync_write = true; needs_sync_write = true;
}
} }
} }
} }