diff options
| author | ruki <[email protected]> | 2023-02-20 22:45:39 +0800 |
|---|---|---|
| committer | ruki <[email protected]> | 2023-02-20 22:45:39 +0800 |
| commit | 1ceae4d5e4b2786c395a705f7c89601e6ef8aedc (patch) | |
| tree | 5e6e6c3c32be1a95d8fe3dcc78544277a21e4b1a | |
| parent | 1c503a56d8cacd94d178715d851244a399c6c664 (diff) | |
check targets in rule
| -rw-r--r-- | xmake/plugins/check/checkers/api/api_checker.lua | 114 | ||||
| -rw-r--r-- | xmake/plugins/check/checkers/api/target/includedirs.lua | 7 | ||||
| -rw-r--r-- | xmake/rules/utils/check_targets/check_targets.lua | 45 |
3 files changed, 108 insertions, 58 deletions
diff --git a/xmake/plugins/check/checkers/api/api_checker.lua b/xmake/plugins/check/checkers/api/api_checker.lua index 60bdeac8c..79e4809bd 100644 --- a/xmake/plugins/check/checkers/api/api_checker.lua +++ b/xmake/plugins/check/checkers/api/api_checker.lua @@ -38,6 +38,25 @@ function _get_most_probable_value(value, valueset) return result end +function _do_show(str, opt) + _g.showed = _g.showed or {} + local showed = _g.showed + local infostr + if str then + infostr = string.format("%s: %s: %s", opt.sourcetips, opt.level_tips, str) + else + infostr = string.format("%s: %s: unknown %s value '%s'", opt.sourcetips, opt.level_tips, opt.apiname, opt.value) + end + if opt.probable_value then + infostr = string.format("%s, it may be '%s'", infostr, opt.probable_value) + end + if not showed[infostr] then + cprint(infostr) + showed[infostr] = true + return true + end +end + -- show result function _show(apiname, value, target, opt) opt = opt or {} @@ -52,40 +71,70 @@ function _show(apiname, value, target, opt) local sourceinfo = target:sourceinfo(apiname, value) or {} local sourcetips = sourceinfo.file or "" if sourceinfo.line then - sourcetips = sourcetips .. ":" .. (sourceinfo.line or -1) .. ": " + sourcetips = sourcetips .. ":" .. (sourceinfo.line or -1) end if #sourcetips == 0 then sourcetips = string.format("target(%s)", target:name()) end - -- do show + -- get level tips local level_tips = "note" if level == "warning" then level_tips = "${color.warning}${text.warning}${clear}" elseif level == "error" then level_tips = "${color.error}${text.error}${clear}" end + + -- get probable value + local probable_value + if opt.valueset then + probable_value = _get_most_probable_value(value, opt.valueset) + end + if apiname:endswith("s") then apiname = apiname:sub(1, #apiname - 1) end - _g.showed = _g.showed or {} - local showed = _g.showed - local infostr - if opt.showstr then - infostr = string.format("%s%s: %s", sourcetips, level_tips, opt.showstr) - else - infostr = string.format("%s%s: unknown %s value '%s'", sourcetips, level_tips, apiname, value) - end - if opt.valueset then - local probable_value = _get_most_probable_value(value, opt.valueset) - if probable_value then - infostr = string.format("%s, it may be '%s'", infostr, probable_value) + + -- do show + return (opt.show or _do_show)(opt.showstr, { + apiname = apiname, + sourcetips = sourcetips, + level_tips = level_tips, + value = value, + probable_value = probable_value}) +end + +-- check target +function _check_target(target, apiname, valueset, level, opt) + local target_valueset = valueset + if type(opt.values) == "function" then + local target_values = opt.values(target) + if target_values then + target_valueset = hashset.from(target_values) end end - if not showed[infostr] then - cprint(infostr) - showed[infostr] = true - return true + local values = target:get(apiname) + for _, value in ipairs(values) do + if opt.check then + local ok, errors = opt.check(target, value) + if not ok then + local reported = _show(apiname, value, target, { + show = opt.show, + showstr = errors, + level = level}) + if reported then + checker.update_stats(level) + end + end + elseif not target_valueset:has(value) then + local reported = _show(apiname, value, target, { + show = opt.show, + valueset = target_valueset, + level = level}) + if reported then + checker.update_stats(level) + end + end end end @@ -99,30 +148,11 @@ function check_targets(apiname, opt) else valueset = hashset.new() end - for _, target in pairs(project.targets()) do - local target_valueset = valueset - if type(opt.values) == "function" then - local target_values = opt.values(target) - if target_values then - target_valueset = hashset.from(target_values) - end - end - local values = target:get(apiname) - for _, value in ipairs(values) do - if opt.check then - local ok, errors = opt.check(target, value) - if not ok then - local reported = _show(apiname, value, target, {showstr = errors, level = level}) - if reported then - checker.update_stats(level) - end - end - elseif not target_valueset:has(value) then - local reported = _show(apiname, value, target, {valueset = target_valueset, level = level}) - if reported then - checker.update_stats(level) - end - end + if opt.target then + _check_target(opt.target, apiname, valueset, level, opt) + else + for _, target in pairs(project.targets()) do + _check_target(target, apiname, valueset, level, opt) end end end diff --git a/xmake/plugins/check/checkers/api/target/includedirs.lua b/xmake/plugins/check/checkers/api/target/includedirs.lua index 5fcafef0f..a78431fef 100644 --- a/xmake/plugins/check/checkers/api/target/includedirs.lua +++ b/xmake/plugins/check/checkers/api/target/includedirs.lua @@ -21,11 +21,12 @@ -- imports import(".api_checker") -function main() - api_checker.check_targets("includedirs", {check = function(target, value) +function main(opt) + opt = opt or {} + api_checker.check_targets("includedirs", table.join(opt, {check = function(target, value) if not os.isdir(value) then return false, string.format("includedir '%s' not found", value) end return true - end}) + end})) end diff --git a/xmake/rules/utils/check_targets/check_targets.lua b/xmake/rules/utils/check_targets/check_targets.lua index a5073cfa0..803466dfa 100644 --- a/xmake/rules/utils/check_targets/check_targets.lua +++ b/xmake/rules/utils/check_targets/check_targets.lua @@ -18,22 +18,41 @@ -- @file check_targets.lua -- --- get values from target -function _get_values_from_target(target, name) - local values = table.wrap(target:get(name)) - table.join2(values, target:get_from_opts(name)) - table.join2(values, target:get_from_pkgs(name)) - return values +import("plugins.check.checker", {rootdir = os.programdir()}) + +function _show(str, opt) + _g.showed = _g.showed or {} + local showed = _g.showed + local infostr + if str then + infostr = string.format("%s${clear}: %s", opt.sourcetips, str) + else + infostr = string.format("%s${clear}: unknown %s value '%s'", opt.sourcetips, opt.apiname, opt.value) + end + if opt.probable_value then + infostr = string.format("%s, it may be '%s'", infostr, opt.probable_value) + end + if not showed[infostr] then + wprint(infostr) + showed[infostr] = true + end end --- main entry function main(target) - for _, name in ipairs({"includedirs", "frameworkdirs", "linkdirs"}) do - for _, value in ipairs(_get_values_from_target(target, name)) do - if not os.isdir(value) then - local sourceinfo = target:sourceinfo(name, value) or {} - wprint("%s:%d: %s '%s' not found in %s(%s)", sourceinfo.file or "", sourceinfo.line or -1, name, value, target:type(), target:name()) - end + + -- get checkers + local checked_checkers = {} + local checkers = checker.checkers() + for name, _ in table.orderpairs(checkers) do + if name:startswith("api.target.") then + table.insert(checked_checkers, name) end end + + -- do checkers + for _, name in ipairs(checked_checkers) do + local info = checkers[name] + import("plugins.check.checkers." .. name, {anonymous = true, rootdir = os.programdir()})({ + target = target, show = _show}) + end end |
