mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-13 05:28:49 +00:00
enhance fish_indent to normalize keywords
Fish keywords can be quoted and split across lines. Prior to this change `fish_indent` would retain such odd, obfuscated, formatting. This change results in all keywords being converted to their canonical form. This required fixing a bug: the keyword member of parse_node_t wasn't being populated. This hadn't been noticed prior to now because it wasn't used. Fixes #2921
This commit is contained in:
parent
7ad6a90ea2
commit
59f0261dba
5 changed files with 45 additions and 7 deletions
|
@ -102,10 +102,10 @@ static void dump_node(indent_t node_indent, const parse_node_t &node, const wcst
|
||||||
nextc_str[1] = L'c';
|
nextc_str[1] = L'c';
|
||||||
nextc_str[2] = nextc + '@';
|
nextc_str[2] = nextc + '@';
|
||||||
}
|
}
|
||||||
fwprintf(stderr, L"{off %4d, len %4d, indent %2u, %ls} [%ls|%ls|%ls]\n",
|
fwprintf(stderr, L"{off %4d, len %4d, indent %2u, kw %ls, %ls} [%ls|%ls|%ls]\n",
|
||||||
node.source_start, node.source_length, node_indent,
|
node.source_start, node.source_length, node_indent,
|
||||||
parser_token_types[node.type], prevc_str, source.substr(node.source_start,
|
keyword_description(node.keyword).c_str(), parser_token_types[node.type],
|
||||||
node.source_length).c_str(), nextc_str);
|
prevc_str, source.substr(node.source_start, node.source_length).c_str(), nextc_str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void prettify_node_recursive(const wcstring &source, const parse_node_tree_t &tree,
|
static void prettify_node_recursive(const wcstring &source, const parse_node_tree_t &tree,
|
||||||
|
@ -153,7 +153,13 @@ static void prettify_node_recursive(const wcstring &source, const parse_node_tre
|
||||||
else if ((node_type >= FIRST_PARSE_TOKEN_TYPE && node_type <= LAST_PARSE_TOKEN_TYPE) ||
|
else if ((node_type >= FIRST_PARSE_TOKEN_TYPE && node_type <= LAST_PARSE_TOKEN_TYPE) ||
|
||||||
node_type == parse_special_type_parse_error)
|
node_type == parse_special_type_parse_error)
|
||||||
{
|
{
|
||||||
if (node.has_source())
|
if (node.keyword != parse_keyword_none)
|
||||||
|
{
|
||||||
|
append_whitespace(node_indent, do_indent, *has_new_line, out_result);
|
||||||
|
out_result->append(keyword_description(node.keyword));
|
||||||
|
*has_new_line = false;
|
||||||
|
}
|
||||||
|
else if (node.has_source())
|
||||||
{
|
{
|
||||||
// Some type representing a particular token.
|
// Some type representing a particular token.
|
||||||
if (prev_node_type != parse_token_type_redirection)
|
if (prev_node_type != parse_token_type_redirection)
|
||||||
|
|
|
@ -73,6 +73,7 @@ enum parse_token_type_t
|
||||||
parse_special_type_parse_error,
|
parse_special_type_parse_error,
|
||||||
parse_special_type_tokenizer_error,
|
parse_special_type_tokenizer_error,
|
||||||
parse_special_type_comment,
|
parse_special_type_comment,
|
||||||
|
LAST_TOKEN_TYPE = parse_special_type_comment,
|
||||||
|
|
||||||
FIRST_TERMINAL_TYPE = parse_token_type_string,
|
FIRST_TERMINAL_TYPE = parse_token_type_string,
|
||||||
LAST_TERMINAL_TYPE = parse_token_type_terminate,
|
LAST_TERMINAL_TYPE = parse_token_type_terminate,
|
||||||
|
@ -85,7 +86,11 @@ enum parse_token_type_t
|
||||||
// Array of strings corresponding to the enums above instantiated in parse_tree.cpp.
|
// Array of strings corresponding to the enums above instantiated in parse_tree.cpp.
|
||||||
extern const wchar_t * const parser_token_types[];
|
extern const wchar_t * const parser_token_types[];
|
||||||
|
|
||||||
/* These must be maintained in sorted order (except for none, which isn't a keyword). This enables us to do binary search. */
|
// These must be maintained in sorted order (except for none, which isn't a keyword). This enables
|
||||||
|
// us to do binary search.
|
||||||
|
//
|
||||||
|
// IMPORTANT: If the following enum is modified you must update the corresponding keyword_map array
|
||||||
|
// in parse_tree.cpp.
|
||||||
enum parse_keyword_t
|
enum parse_keyword_t
|
||||||
{
|
{
|
||||||
parse_keyword_none,
|
parse_keyword_none,
|
||||||
|
|
|
@ -1078,9 +1078,11 @@ bool parse_ll_t::top_node_handle_terminal_types(parse_token_t token)
|
||||||
|
|
||||||
if (matched)
|
if (matched)
|
||||||
{
|
{
|
||||||
// Success. Tell the node that it matched this token, and what its source range is
|
// Success. Tell the node that it matched this token, and what its source range is in
|
||||||
// In the parse phase, we only set source ranges for terminal types. We propagate ranges to parent nodes afterwards.
|
// the parse phase, we only set source ranges for terminal types. We propagate ranges to
|
||||||
|
// parent nodes afterwards.
|
||||||
parse_node_t &node = node_for_top_symbol();
|
parse_node_t &node = node_for_top_symbol();
|
||||||
|
node.keyword = token.keyword;
|
||||||
node.source_start = token.source_start;
|
node.source_start = token.source_start;
|
||||||
node.source_length = token.source_length;
|
node.source_length = token.source_length;
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,3 +89,18 @@ echo \nTest redir formatting
|
||||||
echo -n '
|
echo -n '
|
||||||
echo < stdin >>appended yes 2>&1 no > stdout maybe 2>& 4 | cat 2>| cat
|
echo < stdin >>appended yes 2>&1 no > stdout maybe 2>& 4 | cat 2>| cat
|
||||||
' | ../test/root/bin/fish_indent
|
' | ../test/root/bin/fish_indent
|
||||||
|
|
||||||
|
echo \nTest normalization of keywords
|
||||||
|
# issue 2921
|
||||||
|
echo -n '
|
||||||
|
i\
|
||||||
|
f true
|
||||||
|
echo yes
|
||||||
|
en\
|
||||||
|
d
|
||||||
|
|
||||||
|
"whil\
|
||||||
|
e" true
|
||||||
|
"builtin" yes
|
||||||
|
en"d"
|
||||||
|
' | ../test/root/bin/fish_indent
|
||||||
|
|
|
@ -95,3 +95,13 @@ end
|
||||||
Test redir formatting
|
Test redir formatting
|
||||||
|
|
||||||
echo <stdin >>appended yes 2>&1 no >stdout maybe 2>&4 | cat 2>| cat
|
echo <stdin >>appended yes 2>&1 no >stdout maybe 2>&4 | cat 2>| cat
|
||||||
|
|
||||||
|
Test normalization of keywords
|
||||||
|
|
||||||
|
if true
|
||||||
|
echo yes
|
||||||
|
end
|
||||||
|
|
||||||
|
while true
|
||||||
|
builtin yes
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in a new issue