aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/ex_cmds2.c16
-rw-r--r--src/nvim/lua/executor.c10
-rw-r--r--test/functional/ex_cmds/source_spec.lua25
3 files changed, 48 insertions, 3 deletions
diff --git a/src/nvim/ex_cmds2.c b/src/nvim/ex_cmds2.c
index 9abeee47f4..9d500a8ddb 100644
--- a/src/nvim/ex_cmds2.c
+++ b/src/nvim/ex_cmds2.c
@@ -2665,7 +2665,8 @@ static void cmd_source_buffer(const exarg_T *eap)
};
if (curbuf != NULL && curbuf->b_fname
&& path_with_extension((const char *)curbuf->b_fname, "lua")) {
- nlua_source_using_linegetter(get_buffer_line, (void *)&cookie, ":source");
+ nlua_source_using_linegetter(get_buffer_line, (void *)&cookie,
+ ":source (no file)");
} else {
source_using_linegetter((void *)&cookie, get_buffer_line,
":source (no file)");
@@ -3002,14 +3003,23 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
}
if (path_with_extension((const char *)fname, "lua")) {
+ // TODO(shadmansaleh): Properly handle :verbose for lua
+ // For now change currennt_sctx before sourcing lua files
+ // So verbose doesn't say everything was done in line 1 since we don't know
+ const sctx_T current_sctx_backup = current_sctx;
+ const linenr_T sourcing_lnum_backup = sourcing_lnum;
+ current_sctx.sc_lnum = 0;
+ sourcing_lnum = 0;
// Source the file as lua
- retval = (int)nlua_exec_file((const char *)fname);
+ nlua_exec_file((const char *)fname);
+ current_sctx = current_sctx_backup;
+ sourcing_lnum = sourcing_lnum_backup;
} else {
// Call do_cmdline, which will call getsourceline() to get the lines.
do_cmdline(firstline, getsourceline, (void *)&cookie,
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
- retval = OK;
}
+ retval = OK;
if (l_do_profiling == PROF_YES) {
// Get "si" again, "script_items" may have been reallocated.
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index afc387ef38..4d4286354b 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -1164,6 +1164,13 @@ static void nlua_typval_exec(const char *lcmd, size_t lcmd_len,
int nlua_source_using_linegetter(LineGetter fgetline,
void *cookie, char *name)
{
+ const linenr_T save_sourcing_lnum = sourcing_lnum;
+ const sctx_T save_current_sctx = current_sctx;
+ current_sctx.sc_sid = SID_STR;
+ current_sctx.sc_seq = 0;
+ current_sctx.sc_lnum = 0;
+ sourcing_lnum = 0;
+
garray_T ga;
char_u *line = NULL;
@@ -1174,6 +1181,9 @@ int nlua_source_using_linegetter(LineGetter fgetline,
char *code = (char *)ga_concat_strings_sep(&ga, "\n");
size_t len = strlen(code);
nlua_typval_exec(code, len, name, NULL, 0, false, NULL);
+
+ sourcing_lnum = save_sourcing_lnum;
+ current_sctx = save_current_sctx;
ga_clear_strings(&ga);
xfree(code);
return OK;
diff --git a/test/functional/ex_cmds/source_spec.lua b/test/functional/ex_cmds/source_spec.lua
index a03e1ae9ce..37c97f519a 100644
--- a/test/functional/ex_cmds/source_spec.lua
+++ b/test/functional/ex_cmds/source_spec.lua
@@ -9,6 +9,8 @@ local feed_command = helpers.feed_command
local write_file = helpers.write_file
local exec = helpers.exec
local eval = helpers.eval
+local exec_capture = helpers.exec_capture
+local neq = helpers.neq
describe(':source', function()
before_each(function()
@@ -90,4 +92,27 @@ describe(':source', function()
eq(12, eval('g:c'))
os.remove(test_file)
end)
+
+ it("doesn't throw E484 for lua parsing/runtime errors", function()
+ local test_file = 'test.lua'
+
+ -- Does throw E484 for unreadable files
+ local ok, result = pcall(exec_capture, ":source "..test_file ..'noexisting')
+ eq(false, ok)
+ neq(nil, result:find("E484"))
+
+ -- Doesn't throw for parsing error
+ write_file (test_file, "vim.g.c = ")
+ ok, result = pcall(exec_capture, ":source "..test_file)
+ eq(false, ok)
+ eq(nil, result:find("E484"))
+ os.remove(test_file)
+
+ -- Doesn't throw for runtime error
+ write_file (test_file, "error('Cause error anyway :D')")
+ ok, result = pcall(exec_capture, ":source "..test_file)
+ eq(false, ok)
+ eq(nil, result:find("E484"))
+ os.remove(test_file)
+ end)
end)