diff options
author | 2014-01-03 17:42:25 -0800 | |
---|---|---|
committer | 2014-01-03 17:42:25 -0800 | |
commit | bf75731bbe479ced1a1afd3ec088c51fafbb4c12 (patch) | |
tree | 51bfe0c4c8f605b9b2e3caf68d41624bdd29c206 /parse_tree.cpp | |
parent | c8eec109b2621c71ea23bbdf8c3334aeec4aed88 (diff) |
Fix for wrong syntax highlighting in the face of tokenizer errors, e.g.
"echo 'hi"
Diffstat (limited to 'parse_tree.cpp')
-rw-r--r-- | parse_tree.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/parse_tree.cpp b/parse_tree.cpp index 75ecc0da..d3953ca2 100644 --- a/parse_tree.cpp +++ b/parse_tree.cpp @@ -1109,8 +1109,11 @@ bool parse_t::parse_internal(const wcstring &str, parse_tree_flags_t parse_flags { if (parse_flags & parse_flag_continue_after_error) { + /* Hack hack hack. Typically the parse error is due to the first token. However, if it's a tokenizer error, then has_fatal_error was set due to the check above; in that case the second token is what matters. */ + size_t error_token_idx = (queue[1].type == parse_special_type_tokenizer_error ? 1 : 0); + /* Mark a special error token, and then keep going */ - const parse_token_t token = {parse_special_type_parse_error, parse_keyword_none, false, queue[0].source_start, queue[0].source_length}; + const parse_token_t token = {parse_special_type_parse_error, parse_keyword_none, false, queue[error_token_idx].source_start, queue[error_token_idx].source_length}; this->parser->accept_tokens(token, kInvalidToken); this->parser->reset_symbols(); } |