diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2014-02-27 06:41:58 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2014-02-27 06:44:14 +0000 |
| commit | aceee75ed943b284fd905c7c522566fb314431e4 (patch) | |
| tree | b6e2bb23f960faf918c4b68e10e0589ab1e2a0d6 /src/command_manager.cc | |
| parent | b0c290689091e27f177b3f50a748ec7fe3540375 (diff) | |
Tolerate invalid %...{} when completing
Diffstat (limited to 'src/command_manager.cc')
| -rw-r--r-- | src/command_manager.cc | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc index 377089e3..0f0b700c 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -137,6 +137,7 @@ String get_until_delimiter(const String& base, ByteCount& pos, return base.substr(start, pos - start); } +template<bool throw_on_invalid> Token::Type token_type(const String& type_name) { if (type_name == "") @@ -147,8 +148,10 @@ Token::Type token_type(const String& type_name) return Token::Type::RegisterExpand; else if (type_name == "opt") return Token::Type::OptionExpand; - else + else if (throw_on_invalid) throw unknown_expand{type_name}; + else + return Token::Type::Raw; } void skip_blanks_and_comments(const String& base, ByteCount& pos) @@ -204,7 +207,7 @@ TokenList parse(const String& line) if (throw_on_unterminated and pos == length) throw parse_error{"expected a string delimiter after '%" + type_name + "'"}; - Token::Type type = token_type(type_name); + Token::Type type = token_type<throw_on_unterminated>(type_name); static const std::unordered_map<char, char> matching_delimiters = { { '(', ')' }, { '[', ']' }, { '{', '}' }, { '<', '>' } }; |
