mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Clean up some error messages. Don't show the line in the error message
if it's the first line and we're interactive, since then it's obvious
This commit is contained in:
parent
0e421ea31d
commit
3e9153d955
6 changed files with 23 additions and 28 deletions
|
@ -188,14 +188,13 @@ typedef unsigned int parser_test_error_bits_t;
|
||||||
*/
|
*/
|
||||||
#define INVALID_CASE_ERR_MSG _( L"'case' builtin not inside of switch block")
|
#define INVALID_CASE_ERR_MSG _( L"'case' builtin not inside of switch block")
|
||||||
|
|
||||||
/**
|
/** Error when using break outside of loop */
|
||||||
Error when using loop control builtins (break or continue) outside of loop
|
#define INVALID_BREAK_ERR_MSG _( L"break command while not inside of loop" )
|
||||||
*/
|
|
||||||
#define INVALID_LOOP_ERR_MSG _( L"Loop control command while not inside of loop" )
|
|
||||||
|
|
||||||
/**
|
/** Error when using continue outside of loop */
|
||||||
Error when using return builtin outside of function definition
|
#define INVALID_CONTINUE_ERR_MSG _( L"continue command while not inside of loop" )
|
||||||
*/
|
|
||||||
|
/** Error when using return builtin outside of function definition */
|
||||||
#define INVALID_RETURN_ERR_MSG _( L"'return' builtin command outside of function definition" )
|
#define INVALID_RETURN_ERR_MSG _( L"'return' builtin command outside of function definition" )
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,10 +12,10 @@ static bool production_is_empty(const production_t *production)
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns a string description of this parse error */
|
/** Returns a string description of this parse error */
|
||||||
wcstring parse_error_t::describe(const wcstring &src) const
|
wcstring parse_error_t::describe(const wcstring &src, bool skip_caret) const
|
||||||
{
|
{
|
||||||
wcstring result = text;
|
wcstring result = text;
|
||||||
if (source_start < src.size() && source_start + source_length <= src.size())
|
if (! skip_caret && source_start < src.size() && source_start + source_length <= src.size())
|
||||||
{
|
{
|
||||||
// Locate the beginning of this line of source
|
// Locate the beginning of this line of source
|
||||||
size_t line_start = 0;
|
size_t line_start = 0;
|
||||||
|
|
|
@ -33,8 +33,8 @@ struct parse_error_t
|
||||||
size_t source_start;
|
size_t source_start;
|
||||||
size_t source_length;
|
size_t source_length;
|
||||||
|
|
||||||
/** Return a string describing the error, suitable for presentation to the user */
|
/** Return a string describing the error, suitable for presentation to the user. If skip_caret is false, the offending line with a caret is printed as well */
|
||||||
wcstring describe(const wcstring &src) const;
|
wcstring describe(const wcstring &src, bool skip_caret = false) const;
|
||||||
};
|
};
|
||||||
typedef std::vector<parse_error_t> parse_error_list_t;
|
typedef std::vector<parse_error_t> parse_error_list_t;
|
||||||
|
|
||||||
|
|
|
@ -1099,7 +1099,7 @@ parser_test_error_bits_t parse_util_detect_errors(const wcstring &buff_src, pars
|
||||||
|
|
||||||
if (! found_loop && ! first_argument_is_help(node_tree, node, buff_src))
|
if (! found_loop && ! first_argument_is_help(node_tree, node, buff_src))
|
||||||
{
|
{
|
||||||
errored = append_syntax_error(&parse_errors, node, INVALID_LOOP_ERR_MSG);
|
errored = append_syntax_error(&parse_errors, node, (command == L"break" ? INVALID_BREAK_ERR_MSG : INVALID_CONTINUE_ERR_MSG));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2922,10 +2922,13 @@ void parser_t::get_backtrace(const wcstring &src, const parse_error_list_t &erro
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
append_format(*output, L"fish: %ls:", _(L"Error:"));
|
output->append(L"fish: ");
|
||||||
}
|
}
|
||||||
|
|
||||||
output->append(err.describe(src));
|
// Don't include the caret if we're interactive, this is the first line of text, and our source is at its beginning, because then it's obvious
|
||||||
|
bool skip_caret = (get_is_interactive() && which_line == 1 && err.source_start == 0);
|
||||||
|
|
||||||
|
output->append(err.describe(src, skip_caret));
|
||||||
output->push_back(L'\n');
|
output->push_back(L'\n');
|
||||||
|
|
||||||
this->stack_trace(current_block, *output);
|
this->stack_trace(current_block, *output);
|
||||||
|
|
21
reader.cpp
21
reader.cpp
|
@ -2478,22 +2478,15 @@ int reader_shell_test(const wchar_t *b)
|
||||||
|
|
||||||
if (res & PARSER_TEST_ERROR)
|
if (res & PARSER_TEST_ERROR)
|
||||||
{
|
{
|
||||||
const int tmp[1] = {0};
|
|
||||||
const int tmp2[1] = {0};
|
|
||||||
const wcstring empty;
|
|
||||||
|
|
||||||
s_write(&data->screen,
|
|
||||||
empty,
|
|
||||||
empty,
|
|
||||||
empty,
|
|
||||||
0,
|
|
||||||
tmp,
|
|
||||||
tmp2,
|
|
||||||
0);
|
|
||||||
|
|
||||||
wcstring sb;
|
wcstring sb;
|
||||||
parser_t::principal_parser().get_backtrace(bstr, errors, &sb);
|
parser_t::principal_parser().get_backtrace(bstr, errors, &sb);
|
||||||
fwprintf(stderr, L"%ls", sb.c_str());
|
|
||||||
|
// ensure we end with a newline. Also add an initial newline, because it's likely the user just hit enter and so there's junk on the current line
|
||||||
|
if (! string_suffixes_string(L"\n", sb))
|
||||||
|
{
|
||||||
|
sb.push_back(L'\n');
|
||||||
|
}
|
||||||
|
fwprintf(stderr, L"\n%ls", sb.c_str());
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue