feat(visitor): add `node_fixer`
This commit is contained in:
parent
e7b938a074
commit
59b173f774
|
@ -13,6 +13,7 @@ local Map <const> = require("pl.Map")
|
||||||
local Module_Info <const> = require("awesomewmdtl.entity.Module_Info")
|
local Module_Info <const> = require("awesomewmdtl.entity.Module_Info")
|
||||||
local module_dependencies <const> = require("awesomewmdtl.visitors.module_dependencies")
|
local module_dependencies <const> = require("awesomewmdtl.visitors.module_dependencies")
|
||||||
local type Node = require("awesomewmdtl.types.Node")
|
local type Node = require("awesomewmdtl.types.Node")
|
||||||
|
local node_fixer <const> = require("awesomewmdtl.visitors.node_fixer")
|
||||||
local property <const> = require("awesomewmdtl.property")
|
local property <const> = require("awesomewmdtl.property")
|
||||||
local scraper <const> = require("awesomewmdtl.scraper")
|
local scraper <const> = require("awesomewmdtl.scraper")
|
||||||
local stringx <const> = require("pl.stringx")
|
local stringx <const> = require("pl.stringx")
|
||||||
|
@ -130,6 +131,9 @@ end
|
||||||
|
|
||||||
-- Run the visitors
|
-- Run the visitors
|
||||||
for _,root in dag.iter_modules(module_dag) do
|
for _,root in dag.iter_modules(module_dag) do
|
||||||
|
ast.in_order_visitor(root, function(node: Node)
|
||||||
|
node_fixer.visit(node, root)
|
||||||
|
end)
|
||||||
ast.in_order_visitor(root, function(node: Node)
|
ast.in_order_visitor(root, function(node: Node)
|
||||||
type_mapping.visit(node)
|
type_mapping.visit(node)
|
||||||
end)
|
end)
|
||||||
|
|
|
@ -18,8 +18,8 @@ local record Property
|
||||||
end
|
end
|
||||||
|
|
||||||
local property: Property = {
|
local property: Property = {
|
||||||
base_url = "https://awesomewm.org/apidoc",
|
-- base_url = "https://awesomewm.org/apidoc",
|
||||||
-- base_url = "file:///usr/share/doc/awesome/doc",
|
base_url = "file:///usr/share/doc/awesome/doc",
|
||||||
index_uri = "/index.html",
|
index_uri = "/index.html",
|
||||||
out_directory = "generated",
|
out_directory = "generated",
|
||||||
capi_modules = {
|
capi_modules = {
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
local type Node = require("awesomewmdtl.types.Node")
|
||||||
|
|
||||||
|
-- Teal doesn't have a `keyof` operator yet, so we have to do this manually.
|
||||||
|
-- Some keys shouldn't be changed, so we don't include them here.
|
||||||
|
local enum Node_Key
|
||||||
|
"token"
|
||||||
|
"name"
|
||||||
|
-- "children"
|
||||||
|
"types"
|
||||||
|
"parameters"
|
||||||
|
"return_types"
|
||||||
|
-- "module_path"
|
||||||
|
-- "dependencies"
|
||||||
|
-- "global"
|
||||||
|
end
|
||||||
|
-- Teal can't define nested Map types yet, so we have to define a type for the nested map.
|
||||||
|
local type New_Node = { Node_Key : any }
|
||||||
|
local type New_Node_By_Name = { string : New_Node }
|
||||||
|
|
||||||
|
-- This is a map of module paths to a map of node names to a map of node keys to new values.
|
||||||
|
-- This is used to fix nodes where Teal doesn't have a proper way to handle them.
|
||||||
|
|
||||||
|
-- EVERYTHING IN HERE IS TEMPORARY AND SHOULD BE REMOVED WHEN TEAL SUPPORTS IT.
|
||||||
|
-- EVERYTHING IN HERE IS TEMPORARY AND SHOULD BE REMOVED WHEN TEAL SUPPORTS IT.
|
||||||
|
-- EVERYTHING IN HERE IS TEMPORARY AND SHOULD BE REMOVED WHEN TEAL SUPPORTS IT.
|
||||||
|
|
||||||
|
local node_fixer <const>: { string : New_Node_By_Name } = {
|
||||||
|
["gears.surface"] = {
|
||||||
|
["apply_shape_bounding"] = {
|
||||||
|
parameters = {
|
||||||
|
{ token = "variable", name = "draw", types = { "any" } },
|
||||||
|
{ token = "variable", name = "shape", types = { "Gears_Shape_Function" } },
|
||||||
|
{ token = "variable", name = "...", types = { "any" } },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
local record Node_Fixer
|
||||||
|
visit: function(node: Node, mod: Node)
|
||||||
|
end
|
||||||
|
|
||||||
|
function Node_Fixer.visit(node: Node, mod: Node)
|
||||||
|
if not (node_fixer[mod.module_path] and node_fixer[mod.module_path][node.name]) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for k, v in pairs(node_fixer[mod.module_path][node.name] as { string : any }) do
|
||||||
|
-- Teal can't index `node` with our k,v
|
||||||
|
local n <const> = node as { string : any }
|
||||||
|
n[k] = v
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return Node_Fixer
|
Loading…
Reference in New Issue