Improve error reporting when parsing commands

*debug* will contain line and column informations along
with the responsible command name.
This commit is contained in:
Maxime Coste 2014-05-07 20:39:59 +01:00
parent 8546788b43
commit 8356e44ad5
4 changed files with 43 additions and 11 deletions

View File

@ -86,7 +86,6 @@ private:
using TokenList = std::vector<Token>;
using TokenPosList = std::vector<std::pair<ByteCount, ByteCount>>;
bool is_command_separator(char c)
{
@ -356,7 +355,8 @@ CommandManager::find_command(const String& name) const
}
void CommandManager::execute_single_command(CommandParameters params,
Context& context) const
Context& context,
CharCoord pos) const
{
if (params.empty())
return;
@ -366,9 +366,37 @@ void CommandManager::execute_single_command(CommandParameters params,
if (command_it == m_commands.end())
throw command_not_found(params[0]);
ParametersParser parameter_parser(param_view,
command_it->second.param_desc);
command_it->second.command(parameter_parser, context);
try
{
ParametersParser parameter_parser(param_view,
command_it->second.param_desc);
command_it->second.command(parameter_parser, context);
}
catch (runtime_error& error)
{
String info = to_string(pos.line+1) + ":" + to_string(pos.column+1) +
": '" + command_it->first + "' " + error.what();
throw runtime_error(std::move(info));
}
}
static CharCoord find_coord(StringView str, ByteCount offset)
{
CharCoord res;
auto it = str.begin();
auto line_start = it;
while (it != str.end() and offset > 0)
{
if (*it == '\n')
{
line_start = it + 1;
++res.line;
}
++it;
--offset;
}
res.column = utf8::distance(line_start, it);
return res;
}
void CommandManager::execute(StringView command_line,
@ -380,12 +408,16 @@ void CommandManager::execute(StringView command_line,
if (tokens.empty())
return;
CharCoord command_coord;
std::vector<String> params;
for (auto it = tokens.begin(); it != tokens.end(); ++it)
{
if (params.empty())
command_coord = find_coord(command_line, it->begin());
if (it->type() == Token::Type::CommandSeparator)
{
execute_single_command(params, context);
execute_single_command(params, context, command_coord);
params.clear();
}
// Shell expand are retokenized
@ -407,7 +439,7 @@ void CommandManager::execute(StringView command_line,
params.push_back(eval_token(*it, context, shell_params,
env_vars));
}
execute_single_command(params, context);
execute_single_command(params, context, command_coord);
}
CommandInfo CommandManager::command_info(StringView command_line) const

View File

@ -1,6 +1,7 @@
#ifndef command_manager_hh_INCLUDED
#define command_manager_hh_INCLUDED
#include "coord.hh"
#include "completion.hh"
#include "memoryview.hh"
#include "shell_manager.hh"
@ -87,7 +88,7 @@ public:
private:
void execute_single_command(CommandParameters params,
Context& context) const;
Context& context, CharCoord pos) const;
struct CommandDescriptor
{

View File

@ -743,8 +743,7 @@ const CommandDesc source_cmd = {
}
catch (Kakoune::runtime_error& err)
{
write_debug("error while executing commands in file '" + parser[0]
+ "'\n " + err.what());
write_debug(parser[0] + ":" + err.what());
throw;
}
}

View File

@ -367,7 +367,7 @@ int kakoune(const ParametersParser& parser)
}
catch (Kakoune::runtime_error& error)
{
write_debug("error while parsing kakrc: "_str + error.what());
write_debug("error while parsing kakrc:\n "_str + error.what());
}
catch (Kakoune::client_removed&)
{