mirror of
https://github.com/neovim/neovim.git
synced 2025-09-20 02:08:17 +00:00
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.
This commit is contained in:
@@ -186,6 +186,7 @@ LexExprToken viml_pexpr_next_token(ParserState *const pstate, const int flags)
|
|||||||
ret.data.num.is_float = false;
|
ret.data.num.is_float = false;
|
||||||
CHARREG(kExprLexNumber, ascii_isdigit);
|
CHARREG(kExprLexNumber, ascii_isdigit);
|
||||||
if (flags & kELFlagAllowFloat) {
|
if (flags & kELFlagAllowFloat) {
|
||||||
|
const LexExprToken non_float_ret = ret;
|
||||||
if (pline.size > ret.len + 1
|
if (pline.size > ret.len + 1
|
||||||
&& pline.data[ret.len] == '.'
|
&& pline.data[ret.len] == '.'
|
||||||
&& ascii_isdigit(pline.data[ret.len + 1])) {
|
&& 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);
|
CHARREG(kExprLexNumber, ascii_isdigit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (pline.size > ret.len
|
||||||
|
&& (pline.data[ret.len] == '.'
|
||||||
|
|| ASCII_ISALPHA(pline.data[ret.len]))) {
|
||||||
|
ret = non_float_ret;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -264,6 +264,15 @@ describe('Expressions lexer', function()
|
|||||||
simple_test({''}, 'EOC', 0, {error='start.col >= #pstr'})
|
simple_test({''}, 'EOC', 0, {error='start.col >= #pstr'})
|
||||||
simple_test({'2.'}, 'Number', 1, {data={is_float=false}, str='2'})
|
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.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
|
end
|
||||||
|
|
||||||
local function regular_scope_tests()
|
local function regular_scope_tests()
|
||||||
@@ -296,12 +305,6 @@ describe('Expressions lexer', function()
|
|||||||
|
|
||||||
local function regular_number_tests()
|
local function regular_number_tests()
|
||||||
simple_test({'2.0'}, 'Number', 1, {data={is_float=false}, str='2'})
|
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.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'})
|
||||||
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()
|
regular_is_tests()
|
||||||
|
|
||||||
simple_test({'2.0'}, 'Number', 3, {data={is_float=true}, str='2.0'})
|
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.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'})
|
||||||
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'})
|
||||||
|
Reference in New Issue
Block a user