feat(Visitors): implement type_coercion
This commit is contained in:
parent
a26dce4e08
commit
0016e55cb7
|
@ -59,10 +59,21 @@ local function create_node(token: Node.Token, name: string): Node
|
||||||
end
|
end
|
||||||
|
|
||||||
local function iter_children(node: Node): function(): integer, Node
|
local function iter_children(node: Node): function(): integer, Node
|
||||||
|
if node.children == nil then
|
||||||
|
return function(): integer, Node end
|
||||||
|
end
|
||||||
return ipairs(node.children)
|
return ipairs(node.children)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function in_order_visitor(node: Node, visitor: function(Node))
|
||||||
|
for _, child in iter_children(node) do
|
||||||
|
in_order_visitor(child, visitor)
|
||||||
|
end
|
||||||
|
visitor(node)
|
||||||
|
end
|
||||||
|
|
||||||
return {
|
return {
|
||||||
create_node = create_node,
|
create_node = create_node,
|
||||||
iter_children = iter_children,
|
iter_children = iter_children,
|
||||||
|
in_order_visitor = in_order_visitor,
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ if os.getenv("LOCAL_LUA_DEBUGGER_VSCODE") == "1" then
|
||||||
require("lldebugger").start()
|
require("lldebugger").start()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local ast = require "ast"
|
||||||
local crawler = require "crawler"
|
local crawler = require "crawler"
|
||||||
local filesystem = require "filesystem"
|
local filesystem = require "filesystem"
|
||||||
local printer = require "printer"
|
local printer = require "printer"
|
||||||
|
@ -10,9 +11,11 @@ local logger = require "logger"
|
||||||
local Map = require "pl.Map"
|
local Map = require "pl.Map"
|
||||||
local Module_Doc = require "entity.Module_Doc"
|
local Module_Doc = require "entity.Module_Doc"
|
||||||
local Module_Info = require "entity.Module_Info"
|
local Module_Info = require "entity.Module_Info"
|
||||||
|
local type Node = require "types.Node"
|
||||||
local property = require "property"
|
local property = require "property"
|
||||||
local scraper = require "scraper"
|
local scraper = require "scraper"
|
||||||
local stringx = require "pl.stringx"
|
local stringx = require "pl.stringx"
|
||||||
|
local type_coercion = require "visitors.type_coercion"
|
||||||
local utils = require "utils"
|
local utils = require "utils"
|
||||||
|
|
||||||
local log = logger.log("main")
|
local log = logger.log("main")
|
||||||
|
@ -150,6 +153,10 @@ local module_ast, other_nodes = scraper.module_doc.get_doc_from_page(
|
||||||
"awful.tag"
|
"awful.tag"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ast.in_order_visitor(module_ast, function(node: Node)
|
||||||
|
type_coercion.visit(node)
|
||||||
|
end)
|
||||||
|
|
||||||
log:info(logger.message_with_metadata("Finished", {
|
log:info(logger.message_with_metadata("Finished", {
|
||||||
module_ast = module_ast,
|
module_ast = module_ast,
|
||||||
other_nodes = other_nodes,
|
other_nodes = other_nodes,
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
local type Node = require("types.Node")
|
||||||
|
|
||||||
|
local record Visitor
|
||||||
|
visit: function(Node)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Visitor
|
|
@ -0,0 +1,66 @@
|
||||||
|
local type Node = require("types.Node")
|
||||||
|
local type Visitor = require("types.Visitor")
|
||||||
|
|
||||||
|
-- Special types I don't want to deal with for now
|
||||||
|
local gears_shape_function = "function(cr: any, width: integer, height: integer)"
|
||||||
|
|
||||||
|
local coercion_map <const>: { string : string } = {
|
||||||
|
awesome = "awesome",
|
||||||
|
Awesome = "awesome",
|
||||||
|
bool = "boolean",
|
||||||
|
client = "Client",
|
||||||
|
["gears.shape"] = gears_shape_function,
|
||||||
|
["gears.surface"] = "Surface",
|
||||||
|
image = "Image",
|
||||||
|
int = "integer",
|
||||||
|
screen = "Screen",
|
||||||
|
shape = gears_shape_function,
|
||||||
|
surface = "Surface",
|
||||||
|
tag = "Tag",
|
||||||
|
["wibox.widget"] = "Widget",
|
||||||
|
widget = "Widget",
|
||||||
|
}
|
||||||
|
|
||||||
|
local function coerce_type(t: string): string
|
||||||
|
return coercion_map[t] or t
|
||||||
|
end
|
||||||
|
|
||||||
|
local function coerce_node(node: Node)
|
||||||
|
if not node.types then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, t in ipairs(node.types) do
|
||||||
|
node.types[i] = coerce_type(t)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function coerce_function_parameters(node: Node)
|
||||||
|
if not node.parameters then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, parameter in ipairs(node.parameters) do
|
||||||
|
coerce_node(parameter)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function coerce_function_returns(node: Node)
|
||||||
|
if not node.return_types then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
for i, ret in ipairs(node.return_types) do
|
||||||
|
node.return_types[i] = coerce_type(ret)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local type Type_Coercion = Visitor
|
||||||
|
|
||||||
|
function Type_Coercion.visit(node: Node)
|
||||||
|
coerce_node(node)
|
||||||
|
coerce_function_parameters(node)
|
||||||
|
coerce_function_returns(node)
|
||||||
|
end
|
||||||
|
|
||||||
|
return Type_Coercion
|
Loading…
Reference in New Issue