fix(source): Source giving E484 & parsing error at line 1 for lua files

It's happening because do_source is only expected to return FAIL when it
was unable to open file . But `nlua_exec_file` returns fail for parsing
and execution error too . Those errors are emitted through `nlua_error`.

So now return value of nlua_exec_file is ignored like do_cmdline. It now
only returns fail when it was unable to open file that check is done
before calling nlua_exec_file or do_cmdline. Errors in nlua_exec_file
are still directly emitted through nlua_error like before.
This commit is contained in:
shadmansaleh 2021-06-20 23:07:04 +06:00
parent b4a216f7ed
commit b4ac878026
2 changed files with 27 additions and 2 deletions

View File

@ -3011,15 +3011,15 @@ int do_source(char_u *fname, int check_other, int is_vimrc)
current_sctx.sc_lnum = 0; current_sctx.sc_lnum = 0;
sourcing_lnum = 0; sourcing_lnum = 0;
// Source the file as lua // Source the file as lua
retval = (int)nlua_exec_file((const char *)fname); nlua_exec_file((const char *)fname);
current_sctx = current_sctx_backup; current_sctx = current_sctx_backup;
sourcing_lnum = sourcing_lnum_backup; sourcing_lnum = sourcing_lnum_backup;
} else { } else {
// Call do_cmdline, which will call getsourceline() to get the lines. // Call do_cmdline, which will call getsourceline() to get the lines.
do_cmdline(firstline, getsourceline, (void *)&cookie, do_cmdline(firstline, getsourceline, (void *)&cookie,
DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT); DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
retval = OK;
} }
retval = OK;
if (l_do_profiling == PROF_YES) { if (l_do_profiling == PROF_YES) {
// Get "si" again, "script_items" may have been reallocated. // Get "si" again, "script_items" may have been reallocated.

View File

@ -9,6 +9,8 @@ local feed_command = helpers.feed_command
local write_file = helpers.write_file local write_file = helpers.write_file
local exec = helpers.exec local exec = helpers.exec
local eval = helpers.eval local eval = helpers.eval
local exec_capture = helpers.exec_capture
local neq = helpers.neq
describe(':source', function() describe(':source', function()
before_each(function() before_each(function()
@ -90,4 +92,27 @@ describe(':source', function()
eq(12, eval('g:c')) eq(12, eval('g:c'))
os.remove(test_file) os.remove(test_file)
end) 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) end)