changeset 27313:748ab01dbdc5 v8.2.4185

patch 8.2.4185: cannot use an import in 'indentexpr' Commit: https://github.com/vim/vim/commit/28e60cc088cadd25afb69ee636f0e2e34233ba4e Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jan 22 20:32:00 2022 +0000 patch 8.2.4185: cannot use an import in 'indentexpr' Problem: Cannot use an import in 'indentexpr'. Solution: Set the script context when evaluating 'indentexpr'
author Bram Moolenaar <Bram@vim.org>
date Sat, 22 Jan 2022 21:45:03 +0100
parents 50468d3041ae
children d42e552e7e05
files src/indent.c src/testdir/test_vim9_import.vim src/version.c
diffstat 3 files changed, 32 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/indent.c
+++ b/src/indent.c
@@ -1829,6 +1829,7 @@ get_expr_indent(void)
     int		save_State;
     int		use_sandbox = was_set_insecurely((char_u *)"indentexpr",
 								   OPT_LOCAL);
+    sctx_T	save_sctx = current_sctx;
 
     // Save and restore cursor position and curswant, in case it was changed
     // via :normal commands
@@ -1839,6 +1840,7 @@ get_expr_indent(void)
     if (use_sandbox)
 	++sandbox;
     ++textwinlock;
+    current_sctx = curbuf->b_p_script_ctx[BV_INDE];
 
     // Need to make a copy, the 'indentexpr' option could be changed while
     // evaluating it.
@@ -1852,6 +1854,7 @@ get_expr_indent(void)
     if (use_sandbox)
 	--sandbox;
     --textwinlock;
+    current_sctx = save_sctx;
 
     // Restore the cursor position so that 'indentexpr' doesn't need to.
     // Pretend to be in Insert mode, allow cursor past end of line for "o"
--- a/src/testdir/test_vim9_import.vim
+++ b/src/testdir/test_vim9_import.vim
@@ -817,6 +817,33 @@ def Test_import_in_includeexpr()
   delete('Xthisfile')
 enddef
 
+def Test_import_in_indentexpr()
+  var lines =<< trim END
+      vim9script
+      export def GetIndent(): number
+        return 5
+      enddef
+  END
+  writefile(lines, 'Xindenter')
+
+  lines =<< trim END
+      vim9script
+      import './Xindenter' as indent
+      set indentexpr=indent.GetIndent()
+      set debug=throw
+  END
+  CheckScriptSuccess(lines)
+
+  new
+  setline(1, 'hello')
+  normal ==
+  assert_equal('     hello', getline(1))
+
+  bwipe!
+  set indentexpr= debug=
+  delete('Xindenter')
+enddef
+
 def Test_export_fails()
   CheckScriptFailure(['export var some = 123'], 'E1042:')
   CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:')
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4185,
+/**/
     4184,
 /**/
     4183,