fix(runtime): don't use regexes inside lua require'mod'

Fixes #15147 and fixes #15497. Also sketch "subdir" caching. Currently
this only caches whether an rtp entry has a "lua/" subdir but we could
consider cache other subdirs potentially or even "lua/mybigplugin/"
possibly.

Note: the async_leftpad test doesn't actually fail on master, at least
not deterministically (even when disabling the fast_breakcheck
throttling). It's still useful as a regression test for further changes
and included as such.
This commit is contained in:
Björn Linse
2021-09-28 13:51:26 +02:00
parent f19dc06081
commit ea2023f689
15 changed files with 179 additions and 42 deletions

View File

@@ -328,6 +328,15 @@ describe('startup', function()
eq({9003, '\thowdy'}, exec_lua [[ return { _G.y, _G.z } ]])
end)
it("handles require from &packpath in an async handler", function()
-- NO! you cannot just speed things up by calling async functions during startup!
-- It doesn't make anything actually faster! NOOOO!
pack_clear [[ lua require'async_leftpad'('brrrr', 'async_res') ]]
-- haha, async leftpad go brrrrr
eq('\tbrrrr', exec_lua [[ return _G.async_res ]])
end)
it("handles :packadd during startup", function()
-- control group: opt/bonus is not availabe by default
pack_clear [[

View File

@@ -0,0 +1 @@
return "I am fancy_y.lua"

View File

@@ -0,0 +1 @@
return "I am fancy_z.lua"

View File

@@ -0,0 +1 @@
return "I am fancy_x.lua"

View File

@@ -0,0 +1 @@
return "I am init.lua of fancy_x!"

View File

@@ -0,0 +1,2 @@
return "I am init.lua of fancy_y!"

View File

@@ -0,0 +1,3 @@
return function (val, res)
vim.loop.new_async(function() _G[res] = require'leftpad'(val) end):send()
end

View File

@@ -2255,7 +2255,7 @@ end)
describe('lua: require("mod") from packages', function()
before_each(function()
command('set rtp+=test/functional/fixtures')
command('set rtp+=test/functional/fixtures pp+=test/functional/fixtures')
end)
it('propagates syntax error', function()
@@ -2266,4 +2266,13 @@ describe('lua: require("mod") from packages', function()
matches("unexpected symbol", syntax_error_msg)
end)
it('uses the right order of mod.lua vs mod/init.lua', function()
-- lua/fancy_x.lua takes precedence over lua/fancy_x/init.lua
eq('I am fancy_x.lua', exec_lua [[ return require'fancy_x' ]])
-- but lua/fancy_y/init.lua takes precedence over after/lua/fancy_y.lua
eq('I am init.lua of fancy_y!', exec_lua [[ return require'fancy_y' ]])
-- safety check: after/lua/fancy_z.lua is still loaded
eq('I am fancy_z.lua', exec_lua [[ return require'fancy_z' ]])
end)
end)