diff options
-rw-r--r-- | script/core/command/reloadFFIMeta.lua | 56 | ||||
-rw-r--r-- | script/plugins/ffi/cdefRerence.lua | 2 | ||||
-rw-r--r-- | script/plugins/ffi/init.lua | 75 | ||||
-rw-r--r-- | script/provider/provider.lua | 5 | ||||
-rw-r--r-- | test/plugins/ffi/test.lua | 7 |
5 files changed, 75 insertions, 70 deletions
diff --git a/script/core/command/reloadFFIMeta.lua b/script/core/command/reloadFFIMeta.lua new file mode 100644 index 00000000..d00929ad --- /dev/null +++ b/script/core/command/reloadFFIMeta.lua @@ -0,0 +1,56 @@ +local config = require 'config' +local ws = require 'workspace' +local fs = require 'bee.filesystem' +local scope = require 'workspace.scope' +local SDBMHash = require 'SDBMHash' +local searchCode = require 'plugins.ffi.searchCode' +local cdefRerence = require 'plugins.ffi.cdefRerence' +local ffi = require 'plugins.ffi' + +local function createDir(uri) + local dir = scope.getScope(uri).uri or 'default' + local fileDir = fs.path(METAPATH) / ('%08x'):format(SDBMHash():hash(dir)) + if fs.exists(fileDir) then + return fileDir, true + end + fs.create_directories(fileDir) + return fileDir +end + +---@async +return function (uri) + if config.get(uri, 'Lua.runtime.version') ~= 'LuaJIT' then + return + end + + ws.awaitReady(uri) + + local fileDir, exists = createDir(uri) + + local refs = cdefRerence() + if not refs or #refs == 0 then + return + end + + for i, v in ipairs(refs) do + local target_uri = v.uri + local codes = searchCode(refs, target_uri) + if not codes then + return + end + + ffi.build_single(codes, fileDir, target_uri) + end + + if not exists then + local client = require 'client' + client.setConfig { + { + key = 'Lua.workspace.library', + action = 'add', + value = tostring(fileDir), + uri = uri, + } + } + end +end diff --git a/script/plugins/ffi/cdefRerence.lua b/script/plugins/ffi/cdefRerence.lua index 819a0dd1..14643f0f 100644 --- a/script/plugins/ffi/cdefRerence.lua +++ b/script/plugins/ffi/cdefRerence.lua @@ -20,7 +20,7 @@ end return function () local ffi_state for uri in files.eachFile() do - if find(uri, "/ffi.lua", 0, true) then + if find(uri, "ffi.lua", 0, true) and find(uri, "lua-language-server", 0, true) then ffi_state = files.getState(uri) break end diff --git a/script/plugins/ffi/init.lua b/script/plugins/ffi/init.lua index a551973a..e79be759 100644 --- a/script/plugins/ffi/init.lua +++ b/script/plugins/ffi/init.lua @@ -4,9 +4,6 @@ local cdriver = require 'plugins.ffi.c-parser.cdriver' local util = require 'plugins.ffi.c-parser.util' local utility = require 'utility' local SDBMHash = require 'SDBMHash' -local ws = require 'workspace' -local files = require 'files' -local await = require 'await' local config = require 'config' local fs = require 'bee.filesystem' local scope = require 'workspace.scope' @@ -322,70 +319,18 @@ function m.compileCodes(codes) return lines end -local function createDir(uri) - local dir = scope.getScope(uri).uri or 'default' - local fileDir = fs.path(METAPATH) / ('%08x'):format(SDBMHash():hash(dir)) - fs.create_directories(fileDir) - return fileDir -end - -local builder -function m.initBuilder(fileDir) - fileDir = fileDir or createDir() - ---@async - return function (uri) - local refs = cdefRerence() - if not refs or #refs == 0 then - return - end - - local codes = searchCode(refs, uri) - if not codes then - return - end - - local texts = m.compileCodes(codes) - if not texts then - return - end - local hash = ('%08x'):format(SDBMHash():hash(uri)) - local encoding = config.get(nil, 'Lua.runtime.fileEncoding') - local filePath = fileDir / table.concat({ hash, encoding }, '_') - - utility.saveFile(tostring(filePath) .. '.d.lua', table.concat(texts, '\n')) +function m.build_single(codes, fileDir, uri) + local texts = m.compileCodes(codes) + if not texts then + return end -end -files.watch(function (ev, uri) - if ev == 'compiler' or ev == 'update' then - if builder then - await.call(function () ---@async - builder(uri) - end) - end - end -end) + local hash = ('%08x'):format(SDBMHash():hash(uri)) + local encoding = config.get(nil, 'Lua.runtime.fileEncoding') + local filePath = fileDir / table.concat({ hash, encoding }, '_') -ws.watch(function (ev, uri) - if ev == 'startReload' then - if config.get(uri, 'Lua.runtime.version') ~= 'LuaJIT' then - return - end - await.call(function () ---@async - ws.awaitReady(uri) - local fileDir = createDir(uri) - builder = m.initBuilder(fileDir) - local client = require 'client' - client.setConfig { - { - key = 'Lua.workspace.library', - action = 'add', - value = tostring(fileDir), - uri = uri, - } - } - end) - end -end) + utility.saveFile(tostring(filePath) .. '.d.lua', table.concat(texts, '\n')) + return true +end return m diff --git a/script/provider/provider.lua b/script/provider/provider.lua index efa627c3..2ec429d0 100644 --- a/script/provider/provider.lua +++ b/script/provider/provider.lua @@ -982,6 +982,11 @@ m.register 'workspace/executeCommand' { elseif command == 'lua.exportDocument' then local core = require 'core.command.exportDocument' core(params.arguments) + elseif command == 'lua.reloadFFIMeta' then + local core = require 'core.command.reloadFFIMeta' + for _, scp in ipairs(workspace.folders) do + core(scp.uri) + end end end } diff --git a/test/plugins/ffi/test.lua b/test/plugins/ffi/test.lua index 2a232192..68cec156 100644 --- a/test/plugins/ffi/test.lua +++ b/test/plugins/ffi/test.lua @@ -8,16 +8,15 @@ local template = require 'config.template' template['Lua.runtime.version'].default = 'LuaJIT' - ---@async local function TestBuilder() - local builder = require 'plugins.ffi'.initBuilder() + local builder = require 'core.command.reloadFFIMeta' files.setText(TESTURI, [[ local ffi = require 'ffi' ffi.cdef 'void test();' ]]) - - builder(TESTURI) + local uri = ws.getFirstScope().uri + builder(uri) end ---@async |