diff options
| -rw-r--r-- | src/nvim/api/vim.c | 15 | ||||
| -rw-r--r-- | test/functional/api/vim_spec.lua | 25 | 
2 files changed, 38 insertions, 2 deletions
| diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c index b12c595cb5..8de37e2cf3 100644 --- a/src/nvim/api/vim.c +++ b/src/nvim/api/vim.c @@ -922,6 +922,12 @@ typedef kvec_withinit_t(ExprASTConvStackItem, 16) ExprASTConvStack;  ///                      Must contain exactly one "%.*s".  ///           "arg": String, error message argument.  /// +///         "len": Amount of bytes successfully parsed. With flags equal to "" +///                that should be equal to the length of expr string. +/// +///                @note: “Sucessfully parsed” here means “participated in AST +///                       creation”, not “till the first error”. +///  ///         "ast": actual AST, either nil or a dictionary with the following   ///                keys:  /// @@ -1000,9 +1006,8 @@ Dictionary nvim_parse_expression(String expr, String flags, Boolean highlight,        &pstate, parser_simple_get_line, &plines_p, colors_p);    ExprAST east = viml_pexpr_parse(&pstate, pflags); -  // FIXME add parse_length key    const size_t ret_size = ( -    1  // "ast" +    2  // "ast", "len"      + (size_t)(east.err.msg != NULL)  // "error"      + (size_t)highlight  // "highlight"    ); @@ -1015,6 +1020,12 @@ Dictionary nvim_parse_expression(String expr, String flags, Boolean highlight,      .key = STATIC_CSTR_TO_STRING("ast"),      .value = NIL,    }; +  ret.items[ret.size++] = (KeyValuePair) { +    .key = STATIC_CSTR_TO_STRING("len"), +    .value = INTEGER_OBJ((Integer)(pstate.pos.line == 1 +                                   ? plines[0].size +                                   : pstate.pos.col)), +  };    if (east.err.msg != NULL) {      Dictionary err_dict = {        .items = xmalloc(2 * sizeof(err_dict.items[0])), diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index b904bd2a8f..714b1988fb 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -799,6 +799,9 @@ describe('api', function()        if east_api.ast then          east_api.ast = {simplify_east_api_node(line, east_api.ast)}        end +      if east_api.len == #line then +        east_api.len = nil +      end        return east_api      end      local function simplify_east_hl(line, east_hl) @@ -997,6 +1000,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 2,              err = REMOVE_THIS,              ast = {                'Register(name=a):0:0:@a' @@ -1028,6 +1032,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 6,              err = REMOVE_THIS,              ast = {                'Register(name=a):0:0: @a' @@ -1236,6 +1241,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 3,              err = REMOVE_THIS,              ast = {                'Register(name=a):0:0:@a', @@ -5456,6 +5462,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 3,              err = REMOVE_THIS,              ast = {                'ListLiteral:0:0:[', @@ -7135,6 +7142,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 4,              err = REMOVE_THIS,              ast = {                'Option(scope=0,ident=xxx):0:0:&xxx', @@ -7520,6 +7528,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 1,              err = REMOVE_THIS,              ast = {                'Integer(val=1):0:0:1', @@ -7652,6 +7661,7 @@ describe('api', function()      end)      it('respects highlight argument', function()        eq({ +        len = 1,          ast = {            ivalue = 1,            len = 1, @@ -7660,6 +7670,7 @@ describe('api', function()          },        }, meths.parse_expression('1', '', false))        eq({ +        len = 1,          ast = {            ivalue = 1,            len = 1, @@ -7674,6 +7685,7 @@ describe('api', function()      it('works (KLEE tests)', function()        check_parsing('\0002&A:\000', {          ast = {}, +        len = 0,          err = {            arg = '\0002&A:\0',            msg = 'E15: Expected value, got EOC: %.*s', @@ -7682,6 +7694,7 @@ describe('api', function()        }, {          [2] = {            ast = { +            len = REMOVE_THIS,              ast = {                {                  'Colon:0:4::', @@ -7711,6 +7724,7 @@ describe('api', function()          },          [3] = {            ast = { +            len = 2,              ast = {                'Integer(val=2):0:1:2',              }, @@ -7754,6 +7768,7 @@ describe('api', function()        check_parsing('|"\\U\\', {          --           01234          ast = {}, +        len = 0,          err = {            arg = '|"\\U\\',            msg = 'E15: Expected value, got EOC: %.*s', @@ -7762,6 +7777,7 @@ describe('api', function()        }, {          [2] = {            ast = { +            len = REMOVE_THIS,              ast = {                {                  'Or:0:0:|', @@ -7786,6 +7802,7 @@ describe('api', function()        check_parsing('|"\\e"', {          --           01234          ast = {}, +        len = 0,          err = {            arg = '|"\\e"',            msg = 'E15: Expected value, got EOC: %.*s', @@ -7794,6 +7811,7 @@ describe('api', function()        }, {          [2] = {            ast = { +            len = REMOVE_THIS,              ast = {                {                  'Or:0:0:|', @@ -7818,6 +7836,7 @@ describe('api', function()        check_parsing('|\029', {          --           01          ast = {}, +        len = 0,          err = {            arg = '|\029',            msg = 'E15: Expected value, got EOC: %.*s', @@ -7826,6 +7845,7 @@ describe('api', function()        }, {          [2] = {            ast = { +            len = REMOVE_THIS,              ast = {                {                  'Or:0:0:|', @@ -7892,6 +7912,7 @@ describe('api', function()        }, {          [1] = {            ast = { +            len = 1,              ast = {                'UnknownFigure:0:0:',              }, @@ -7917,6 +7938,7 @@ describe('api', function()              },            },          }, +        len = 2,          err = {            arg = ':?\000\000\000\000\000\000\000',            msg = 'E15: Colon outside of dictionary or ternary operator: %.*s', @@ -7926,6 +7948,9 @@ describe('api', function()          hl('InvalidTernary', '?'),        }, {          [2] = { +          ast = { +            len = REMOVE_THIS, +          },            hl_fs = {              [3] = hl('InvalidSpacing', '\0'),              [4] = hl('InvalidSpacing', '\0'), | 
