fix handling of line continuation in keywords

This behavior is more consistent with line continuation in strings other
than keywords.

Fixes #2897
This commit is contained in:
Jak Wings 2016-04-08 18:20:21 +08:00 committed by Kurtis Rader
parent 6adc35c636
commit 2d5eaed745
5 changed files with 39 additions and 3 deletions

View file

@ -1254,6 +1254,12 @@ static parse_keyword_t keyword_with_name(const wchar_t *name)
return result; return result;
} }
static bool is_keyword_char(wchar_t c)
{
return (c >= L'a' && c <= L'z') || (c >= L'A' && c <= L'Z') || (c >= L'0' && c <= L'9')
|| c == L'\'' || c == L'"' || c == L'\\' || c == '\n';
}
/* Given a token, returns the keyword it matches, or parse_keyword_none. */ /* Given a token, returns the keyword it matches, or parse_keyword_none. */
static parse_keyword_t keyword_for_token(token_type tok, const wcstring &token) static parse_keyword_t keyword_for_token(token_type tok, const wcstring &token)
{ {
@ -1267,17 +1273,16 @@ static parse_keyword_t keyword_for_token(token_type tok, const wcstring &token)
parse_keyword_t result = parse_keyword_none; parse_keyword_t result = parse_keyword_none;
bool needs_expand = false, all_chars_valid = true; bool needs_expand = false, all_chars_valid = true;
const wchar_t *tok_txt = token.c_str(); const wchar_t *tok_txt = token.c_str();
const wchar_t *chars_allowed_in_keywords = L"abcdefghijklmnopqrstuvwxyz'\"";
for (size_t i=0; tok_txt[i] != L'\0'; i++) for (size_t i=0; tok_txt[i] != L'\0'; i++)
{ {
wchar_t c = tok_txt[i]; wchar_t c = tok_txt[i];
if (! wcschr(chars_allowed_in_keywords, c)) if (! is_keyword_char(c))
{ {
all_chars_valid = false; all_chars_valid = false;
break; break;
} }
// If we encounter a quote, we need expansion // If we encounter a quote, we need expansion
needs_expand = needs_expand || c == L'"' || c == L'\''; needs_expand = needs_expand || c == L'"' || c == L'\'' || c == L'\\';
} }
if (all_chars_valid) if (all_chars_valid)

View file

View file

@ -0,0 +1,25 @@
ech\
o echo
buil\
tin echo builtin echo
true; an\
d echo true
\i\
\U00000066\
true
echo if true
\
\145n\
d\
;
'if'\
true
echo if true
"\
en\
d\
";

View file

@ -0,0 +1,5 @@
echo
builtin echo
true
if true
if true

View file

@ -0,0 +1 @@
0