diff options
author | ZyX <kp-pav@yandex.ru> | 2017-10-03 00:39:40 +0300 |
---|---|---|
committer | ZyX <kp-pav@yandex.ru> | 2017-10-15 19:13:50 +0300 |
commit | 0bc4e2237960712426da3774c1430f5874c49aea (patch) | |
tree | da09c83263afd905f6167f9a957b298b0bdd6cfe | |
parent | 6168e1127c1c80a3810854649b0776146545043b (diff) | |
download | rneovim-0bc4e2237960712426da3774c1430f5874c49aea.tar.gz rneovim-0bc4e2237960712426da3774c1430f5874c49aea.tar.bz2 rneovim-0bc4e2237960712426da3774c1430f5874c49aea.zip |
viml/parser/expressions: Forbid dot or alpha characters after a float
This is basically what Vim already does, in addition to forbidding floats should
there be a concat immediately before it.
-rw-r--r-- | src/nvim/viml/parser/expressions.c | 6 | ||||
-rw-r--r-- | test/unit/viml/expressions/lexer_spec.lua | 21 |
2 files changed, 15 insertions, 12 deletions
diff --git a/src/nvim/viml/parser/expressions.c b/src/nvim/viml/parser/expressions.c index 8e6f991e03..8c95d1db14 100644 --- a/src/nvim/viml/parser/expressions.c +++ b/src/nvim/viml/parser/expressions.c @@ -186,6 +186,7 @@ LexExprToken viml_pexpr_next_token(ParserState *const pstate, const int flags) ret.data.num.is_float = false; CHARREG(kExprLexNumber, ascii_isdigit); if (flags & kELFlagAllowFloat) { + const LexExprToken non_float_ret = ret; if (pline.size > ret.len + 1 && pline.data[ret.len] == '.' && ascii_isdigit(pline.data[ret.len + 1])) { @@ -207,6 +208,11 @@ LexExprToken viml_pexpr_next_token(ParserState *const pstate, const int flags) CHARREG(kExprLexNumber, ascii_isdigit); } } + if (pline.size > ret.len + && (pline.data[ret.len] == '.' + || ASCII_ISALPHA(pline.data[ret.len]))) { + ret = non_float_ret; + } } break; } diff --git a/test/unit/viml/expressions/lexer_spec.lua b/test/unit/viml/expressions/lexer_spec.lua index d201d54526..bd8045632e 100644 --- a/test/unit/viml/expressions/lexer_spec.lua +++ b/test/unit/viml/expressions/lexer_spec.lua @@ -264,6 +264,15 @@ describe('Expressions lexer', function() simple_test({''}, 'EOC', 0, {error='start.col >= #pstr'}) simple_test({'2.'}, 'Number', 1, {data={is_float=false}, str='2'}) simple_test({'2.x'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.2.'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0x'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e+'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e-'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e+x'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e-x'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e+1a'}, 'Number', 1, {data={is_float=false}, str='2'}) + simple_test({'2.0e-1a'}, 'Number', 1, {data={is_float=false}, str='2'}) end local function regular_scope_tests() @@ -296,12 +305,6 @@ describe('Expressions lexer', function() local function regular_number_tests() simple_test({'2.0'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0x'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0e'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0e+'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0e-'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0e+x'}, 'Number', 1, {data={is_float=false}, str='2'}) - simple_test({'2.0e-x'}, 'Number', 1, {data={is_float=false}, str='2'}) simple_test({'2.0e5'}, 'Number', 1, {data={is_float=false}, str='2'}) simple_test({'2.0e+5'}, 'Number', 1, {data={is_float=false}, str='2'}) simple_test({'2.0e-5'}, 'Number', 1, {data={is_float=false}, str='2'}) @@ -350,12 +353,6 @@ describe('Expressions lexer', function() regular_is_tests() simple_test({'2.0'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0x'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0e'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0e+'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0e-'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0e+x'}, 'Number', 3, {data={is_float=true}, str='2.0'}) - simple_test({'2.0e-x'}, 'Number', 3, {data={is_float=true}, str='2.0'}) simple_test({'2.0e5'}, 'Number', 5, {data={is_float=true}, str='2.0e5'}) simple_test({'2.0e+5'}, 'Number', 6, {data={is_float=true}, str='2.0e+5'}) simple_test({'2.0e-5'}, 'Number', 6, {data={is_float=true}, str='2.0e-5'}) |