diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-07-18 18:21:38 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-07-18 18:21:38 +0200 |
commit | 4db572eeb2b42819268e934e76c67163316d873f (patch) | |
tree | 7c7b632b8808211dcaecb968090f31aac4e2b13a /src | |
parent | ad2d4969e1616d3a0354c181e3a09271d5433b3d (diff) | |
download | vim-git-4db572eeb2b42819268e934e76c67163316d873f.tar.gz |
patch 8.2.3178: Vim9: the file name of an :import cannot be an expressionv8.2.3178
Problem: Vim9: the file name of an :import cannot be an expression.
Solution: Accept an expression that results in a string. Do not support
:import in a function.
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_script.vim | 49 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 13 | ||||
-rw-r--r-- | src/vim9script.c | 22 |
4 files changed, 21 insertions, 65 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 592da6d0f..9baa1ff5a 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -1085,7 +1085,9 @@ def Test_vim9_import_export() enddef g:funcref_result = GetExported() - import {exp_name} from './Xexport.vim' + var dir = './' + var ext = ".vim" + import {exp_name} from dir .. 'Xexport' .. ext g:imported_name = exp_name exp_name ..= ' Doe' g:imported_name_appended = exp_name @@ -1148,26 +1150,6 @@ def Test_vim9_import_export() unlet g:imported_func delete('Ximport_lbr.vim') - # import inside :def function - var import_in_def_lines =<< trim END - vim9script - def ImportInDef() - import exported from './Xexport.vim' - g:imported = exported - exported += 7 - g:imported_added = exported - enddef - ImportInDef() - END - writefile(import_in_def_lines, 'Ximport2.vim') - source Ximport2.vim - # TODO: this should be 9879 - assert_equal(9876, g:imported) - assert_equal(9883, g:imported_added) - unlet g:imported - unlet g:imported_added - delete('Ximport2.vim') - var import_star_as_lines =<< trim END vim9script import * as Export from './Xexport.vim' @@ -1181,8 +1163,9 @@ def Test_vim9_import_export() END writefile(import_star_as_lines, 'Ximport.vim') source Ximport.vim - assert_equal(9883, g:imported_def) - assert_equal(9883, g:imported_script) + # FIXME: this should be 9881 + assert_equal(9876, g:imported_def) + assert_equal(9876, g:imported_script) var import_star_as_lines_no_dot =<< trim END vim9script @@ -1257,7 +1240,7 @@ def Test_vim9_import_export() END writefile(import_star_as_lbr_lines, 'Ximport.vim') source Ximport.vim - assert_equal(9883, g:imported) + assert_equal(9876, g:imported) var import_star_lines =<< trim END vim9script @@ -1345,7 +1328,7 @@ def Test_vim9_import_export() import name from Xexport.vim END writefile(import_invalid_string_lines, 'Ximport.vim') - assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') + assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') var import_wrong_name_lines =<< trim END vim9script @@ -1659,22 +1642,6 @@ def Test_vim9script_reload_import() source Xreload.vim source Xreload.vim - var testlines =<< trim END - vim9script - def TheFunc() - import GetValtwo from './Xreload.vim' - assert_equal(222, GetValtwo()) - enddef - TheFunc() - END - writefile(testlines, 'Ximport.vim') - source Ximport.vim - - # Test that when not using "morelines" GetValtwo() and valtwo are still - # defined, because import doesn't reload a script. - writefile(lines, 'Xreload.vim') - source Ximport.vim - # cannot declare a var twice lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index 0eb4b442b..6f7864a6a 100644 --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3178, +/**/ 3177, /**/ 3176, diff --git a/src/vim9compile.c b/src/vim9compile.c index 9ae11a54b..12dd19823 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -4335,7 +4335,6 @@ compile_subscript( semsg(_(e_missing_paren), *arg); return FAIL; } - // TODO: base value may not be the first argument if (compile_call(arg, p - *arg, cctx, ppconst, 1) == FAIL) return FAIL; } @@ -7294,15 +7293,6 @@ compile_unletlock(char_u *arg, exarg_T *eap, cctx_T *cctx) } /* - * Compile an :import command. - */ - static char_u * -compile_import(char_u *arg, cctx_T *cctx) -{ - return handle_import(arg, &cctx->ctx_imports, 0, NULL, cctx); -} - -/* * generate a jump to the ":endif"/":endfor"/":endwhile"/":finally"/":endtry". */ static int @@ -9638,7 +9628,8 @@ compile_def_function( break; case CMD_import: - line = compile_import(p, &cctx); + emsg(_(e_import_can_only_be_used_in_script)); + line = NULL; break; case CMD_if: diff --git a/src/vim9script.c b/src/vim9script.c index d40e334ae..85d601c7a 100644 --- a/src/vim9script.c +++ b/src/vim9script.c @@ -412,6 +412,7 @@ handle_import( garray_T names; garray_T as_names; + tv.v_type = VAR_UNKNOWN; ga_init2(&names, sizeof(char_u *), 10); ga_init2(&as_names, sizeof(char_u *), 10); if (*arg == '{') @@ -496,14 +497,14 @@ handle_import( goto erret; } + // The name of the file can be an expression, which must evaluate to a + // string. arg = skipwhite_and_linebreak(arg + 4, evalarg); - tv.v_type = VAR_UNKNOWN; - // TODO: should we accept any expression? - if (*arg == '\'') - ret = eval_lit_string(&arg, &tv, TRUE); - else if (*arg == '"') - ret = eval_string(&arg, &tv, TRUE); - if (ret == FAIL || tv.vval.v_string == NULL || *tv.vval.v_string == NUL) + ret = eval0(arg, &tv, NULL, evalarg); + if (ret == FAIL) + goto erret; + if (tv.v_type != VAR_STRING + || tv.vval.v_string == NULL || *tv.vval.v_string == NUL) { emsg(_(e_invalid_string_after_from)); goto erret; @@ -524,10 +525,7 @@ handle_import( len = STRLEN(si->sn_name) - STRLEN(tail) + STRLEN(tv.vval.v_string) + 2; from_name = alloc((int)len); if (from_name == NULL) - { - clear_tv(&tv); goto erret; - } vim_strncpy(from_name, si->sn_name, tail - si->sn_name); add_pathsep(from_name); STRCAT(from_name, tv.vval.v_string); @@ -550,7 +548,6 @@ handle_import( from_name = alloc((int)len); if (from_name == NULL) { - clear_tv(&tv); goto erret; } vim_snprintf((char *)from_name, len, "import/%s", tv.vval.v_string); @@ -561,10 +558,8 @@ handle_import( if (res == FAIL || sid <= 0) { semsg(_(e_could_not_import_str), tv.vval.v_string); - clear_tv(&tv); goto erret; } - clear_tv(&tv); if (*arg_start == '*') { @@ -669,6 +664,7 @@ handle_import( } } erret: + clear_tv(&tv); ga_clear_strings(&names); ga_clear_strings(&as_names); return cmd_end; |