summaryrefslogtreecommitdiff
path: root/server/src/matcher
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/matcher')
-rw-r--r--server/src/matcher/find_lib.lua36
-rw-r--r--server/src/matcher/library.lua68
2 files changed, 84 insertions, 20 deletions
diff --git a/server/src/matcher/find_lib.lua b/server/src/matcher/find_lib.lua
index b9efacb2..090859db 100644
--- a/server/src/matcher/find_lib.lua
+++ b/server/src/matcher/find_lib.lua
@@ -28,6 +28,9 @@ local function checkSourceAsLibrary(value, name, showname)
end
local function checkSource(value, libname, lib)
+ if not lib then
+ return
+ end
if not lib.source then
return checkSourceAsGlobal(value, libname)
end
@@ -102,16 +105,39 @@ end
local function findLib(var)
local value = var.value or var
- for libname, lib in pairs(libs) do
- if lib.parent then
+ for libname, info in pairs(libs.global) do
+ local fullKey = checkSource(value, libname, info.lib)
+ if fullKey then
+ return info.lib, fullKey, false
+ end
+ for libname, lib in pairs(info.child) do
+ local fullKey, oo = checkParent(value, libname, lib)
+ if fullKey then
+ return lib, fullKey, oo
+ end
+ end
+ end
+ for libname, info in pairs(libs.library) do
+ local fullKey = checkSource(value, libname, info.lib)
+ if fullKey then
+ return info.lib, fullKey, false
+ end
+ for libname, lib in pairs(info.child) do
local fullKey, oo = checkParent(value, libname, lib)
if fullKey then
return lib, fullKey, oo
end
- else
- local fullKey = checkSource(value, libname, lib)
+ end
+ end
+ for libname, info in pairs(libs.object) do
+ local fullKey = checkSource(value, libname, info.lib)
+ if fullKey then
+ return info.lib, fullKey, false
+ end
+ for libname, lib in pairs(info.child) do
+ local fullKey, oo = checkParent(value, libname, lib)
if fullKey then
- return lib, fullKey, false
+ return lib, fullKey, oo
end
end
end
diff --git a/server/src/matcher/library.lua b/server/src/matcher/library.lua
index 989ac1a4..dbc96af6 100644
--- a/server/src/matcher/library.lua
+++ b/server/src/matcher/library.lua
@@ -48,13 +48,58 @@ local function mergeLocale(libs, locale)
end
end
-local function mergeLibs(target, libs)
+local function mergeSource(alllibs, name, lib)
+ if not lib.source then
+ alllibs.global[name] = { lib = lib, child = {} }
+ return
+ end
+ for _, source in ipairs(lib.source) do
+ local sourceName = source.name or name
+ if source.type == 'global' then
+ alllibs.global[sourceName] = { lib = lib, child = {} }
+ elseif source.type == 'library' then
+ alllibs.library[sourceName] = { lib = lib, child = {} }
+ elseif source.type == 'object' then
+ alllibs.object[sourceName] = { lib = lib, child = {} }
+ end
+ end
+end
+
+local function insert(tbl, name, key, value)
+ if not name or not key then
+ return
+ end
+ if not tbl[name] then
+ tbl[name] = {}
+ end
+ if not tbl[name].child then
+ tbl[name].child = {}
+ end
+ tbl[name].child[key] = value
+end
+
+local function mergeParent(alllibs, name, lib)
+ for _, parent in ipairs(lib.parent) do
+ if parent.type == 'global' then
+ insert(alllibs.global, parent.name, name, lib)
+ elseif parent.type == 'library' then
+ insert(alllibs.library, parent.name, name, lib)
+ elseif parent.type == 'object' then
+ insert(alllibs.object, parent.name, name, lib)
+ end
+ end
+end
+
+local function mergeLibs(alllibs, libs)
if not libs then
return
end
for name, lib in pairs(libs) do
- target.names[#target.names+1] = name
- target.libs[#target.libs+1] = lib
+ if lib.parent then
+ mergeParent(alllibs, name, lib)
+ else
+ mergeSource(alllibs, name, lib)
+ end
end
end
@@ -71,18 +116,11 @@ end
local function init()
local language = require 'language'
- local alllibs = setmetatable({
- names = {},
- libs = {},
- }, {
- __pairs = function (self)
- local i = 0
- return function ()
- i = i + 1
- return self.names[i], self.libs[i]
- end
- end,
- })
+ local alllibs = {
+ global = table.container(),
+ library = table.container(),
+ object = table.container(),
+ }
for path in io.scan(ROOT / 'libs') do
local libs
local buf = io.load(path)