Fix bug where 'else if' does not support functions and redirections

https://github.com/fish-shell/fish-shell/issues/359
This commit is contained in:
ridiculousfish 2012-11-04 17:11:02 -08:00
parent 8c24d49c73
commit 7bb844a778
4 changed files with 17 additions and 6 deletions

View file

@ -1309,11 +1309,13 @@ job_t *parser_t::job_get_from_pid( int pid )
\param j the job to which the process belongs to
\param tok the tokenizer to read options from
\param args the argument list to insert options into
\param args unskip whether we should ignore current_block->skip. Big hack because of our dumb handling of if statements.
*/
void parser_t::parse_job_argument_list( process_t *p,
job_t *j,
tokenizer *tok,
std::vector<completion_t> &args )
std::vector<completion_t> &args,
bool unskip )
{
int is_finished=0;
@ -1401,7 +1403,7 @@ void parser_t::parse_job_argument_list( process_t *p,
{
skip = 1;
}
else if( current_block->skip )
else if( current_block->skip && ! unskip )
{
/*
If this command should be skipped, we do not expand the arguments
@ -1505,7 +1507,7 @@ void parser_t::parse_job_argument_list( process_t *p,
Otherwise, bogus errors may be the result. (Do check
that token is string, though)
*/
if( current_block->skip )
if( current_block->skip && ! unskip )
{
tok_next( tok );
if( tok_last_type( tok ) != TOK_STRING )
@ -1965,7 +1967,7 @@ int parser_t::parse_job( process_t *p,
continue;
}
if( use_function && !current_block->skip )
if( use_function && ( unskip || ! current_block->skip ))
{
bool nxt_forbidden=false;
wcstring forbid;
@ -2267,7 +2269,7 @@ int parser_t::parse_job( process_t *p,
}
else
{
parse_job_argument_list(p, j, tok, args);
parse_job_argument_list(p, j, tok, args, unskip);
}
}

View file

@ -333,7 +333,7 @@ class parser_t {
parser_t(const parser_t&);
parser_t& operator=(const parser_t&);
void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector<completion_t>& );
void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector<completion_t>&, bool );
int parse_job( process_t *p, job_t *j, tokenizer *tok );
void skipped_exec( job_t * j );
void eval_job( tokenizer *tok );

View file

@ -102,3 +102,11 @@ else if not_a_valid_command but it should be OK because a previous branch was ta
else if test ! -n "abc"
echo "epsilon 5.4"
end
# Ensure builtins work
# https://github.com/fish-shell/fish-shell/issues/359
if not echo skip1 > /dev/null
echo "zeta 6.1"
else if echo skip2 > /dev/null
echo "zeta 6.2"
end

View file

@ -24,3 +24,4 @@ yep4.2
delta4.1
delta4.2
epsilon5.2
zeta 6.2