-
-
Notifications
You must be signed in to change notification settings - Fork 60
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(julia): Add julia support (#185)
Add support for julia function and structs + test cases included. Closes #184 --------- Co-authored-by: josephsdavid <josephsd@smu.edu> Co-authored-by: Daniel Mathiot <d.danymat@gmail.com>
- Loading branch information
1 parent
e52d88e
commit 7545cdc
Showing
7 changed files
with
597 additions
and
11 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,230 @@ | ||
local nodes_utils = require("neogen.utilities.nodes") | ||
local extractors = require("neogen.utilities.extractors") | ||
local template = require("neogen.template") | ||
local i = require("neogen.types.template").item | ||
|
||
local parent = { | ||
func = { "function_definition" }, | ||
class = { "struct_definition" }, | ||
} | ||
|
||
--- Extract data for typed parameters | ||
---@param nodes | ||
---@param results | ||
---@return | ||
local function process_typed_parameters(nodes, results) | ||
if nodes["typed_expression"] then | ||
results["typed_parameters"] = {} | ||
for _, n in pairs(nodes["typed_expression"]) do | ||
local type_subtree = { | ||
{ position = 1, extract = true, as = i.Parameter }, | ||
{ position = 2, extract = true, as = i.Type }, | ||
} | ||
local typed_parameters = nodes_utils:matching_nodes_from(n, type_subtree) | ||
typed_parameters = extractors:extract_from_matched(typed_parameters) | ||
table.insert(results["typed_parameters"], typed_parameters) | ||
end | ||
end | ||
return results | ||
end | ||
|
||
return { | ||
-- Search for these nodes | ||
parent = parent, | ||
|
||
-- Traverse down these nodes and extract the information as necessary | ||
data = { | ||
class = { | ||
|
||
["struct_definition"] = { | ||
["0"] = { | ||
extract = function(node) | ||
local results = {} | ||
|
||
local tree = { | ||
-- Get the name of the struct | ||
{ | ||
retrieve = "first", | ||
node_type = "identifier", | ||
extract = true, | ||
as = "name", | ||
}, | ||
-- Get type parameters | ||
{ | ||
retrieve = "first", | ||
recursive = true, | ||
node_type = "type_parameter_list", | ||
subtree = { | ||
{ | ||
retrieve = "all", | ||
node_type = "identifier", | ||
extract = true, | ||
as = "type_params", | ||
}, | ||
}, | ||
}, | ||
-- Fields | ||
{ | ||
retrieve = "all", | ||
node_type = "typed_expression", | ||
extract = true, | ||
}, | ||
} | ||
local nodes = nodes_utils:matching_nodes_from(node, tree) | ||
results = process_typed_parameters(nodes, results) | ||
local res = extractors:extract_from_matched(nodes) | ||
|
||
local signature = res.name[1] | ||
if res.type_params then | ||
signature = signature .. "{" .. table.concat(res.type_params, ", ") .. "}" | ||
end | ||
|
||
results.signature = { signature } | ||
results[i.HasParameter] = (res.typed_expression or res.identifier) and { true } or nil | ||
results[i.Type] = res.type | ||
results[i.Parameter] = res.identifier or nil | ||
|
||
return results | ||
end, | ||
}, | ||
}, | ||
}, | ||
func = { | ||
|
||
["function_definition"] = { | ||
|
||
["0"] = { | ||
extract = function(node) | ||
local results = {} | ||
|
||
local tree = { | ||
{ | ||
retrieve = "first", | ||
node_type = "signature", | ||
recursive = true, | ||
subtree = { | ||
{ | ||
retrieve = "first", | ||
node_type = "call_expression", | ||
recursive = true, | ||
subtree = { | ||
-- Get the name of the function | ||
{ | ||
position = 1, | ||
node_type = "identifier", | ||
extract = true, | ||
as = "f_name", | ||
}, | ||
-- ... this considers cases like 'Base.add(...)' | ||
{ | ||
position = 1, | ||
node_type = "field_expression", | ||
extract = true, | ||
as = "f_name", | ||
}, | ||
}, | ||
}, | ||
{ | ||
retrieve = "first", | ||
node_type = "argument_list", | ||
recursive = true, | ||
subtree = { | ||
{ | ||
retrieve = "all", | ||
as = "param_list", | ||
extract = true, | ||
}, | ||
}, | ||
}, | ||
}, | ||
}, | ||
{ | ||
retrieve = "first", | ||
node_type = "argument_list", | ||
recursive = true, | ||
subtree = { | ||
-- Parameters without type definition | ||
{ | ||
retrieve = "all", | ||
node_type = "identifier", | ||
extract = true, | ||
}, | ||
-- Typed parameters | ||
{ | ||
retrieve = "all", | ||
node_type = "typed_expression", | ||
extract = true, | ||
}, | ||
-- Optional parameters | ||
{ | ||
retrieve = "all", | ||
node_type = "named_argument", | ||
subtree = { | ||
{ retrieve = "all", node_type = "typed_expression", extract = true }, | ||
}, | ||
}, | ||
{ | ||
retrieve = "all", | ||
node_type = "named_argument", | ||
subtree = { { retrieve = "all", node_type = "identifier", extract = true } }, | ||
}, | ||
-- Splat parameters | ||
{ | ||
retrieve = "all", | ||
node_type = "splat_expression", | ||
subtree = { { retrieve = "all", node_type = "identifier", extract = true } }, | ||
}, | ||
}, | ||
}, | ||
{ | ||
retrieve = "first", | ||
node_type = "block", | ||
subtree = { | ||
{ | ||
retrieve = "all", | ||
node_type = "return_statement", | ||
recursive = true, | ||
extract = true, | ||
}, | ||
}, | ||
}, | ||
} | ||
local nodes = nodes_utils:matching_nodes_from(node, tree) | ||
|
||
-- Add table with {params, types} | ||
results = process_typed_parameters(nodes, results) | ||
|
||
local res = extractors:extract_from_matched(nodes) | ||
-- Make the signature | ||
local signature | ||
if res.param_list then | ||
signature = res.f_name[1] .. "(" .. table.concat(res.param_list, ", ") .. ")" | ||
else | ||
signature = res.f_name[1] .. "()" | ||
end | ||
|
||
results[i.HasParameter] = (res.typed_expression or res.identifier) and { true } or nil | ||
results[i.Type] = res.type | ||
results.signature = { signature } | ||
results.params = res.params | ||
results[i.Parameter] = res.identifier | ||
results[i.Return] = res.return_statement | ||
results[i.ReturnTypeHint] = res[i.ReturnTypeHint] | ||
results[i.HasReturn] = (res.return_statement or res.anonymous_return or res[i.ReturnTypeHint]) and | ||
{ true } | ||
or nil | ||
|
||
return results | ||
end, | ||
}, | ||
}, | ||
}, | ||
}, | ||
|
||
-- Use default granulator and generator | ||
locator = nil, | ||
granulator = nil, | ||
generator = nil, | ||
|
||
template = template:add_default_annotation("julia"), | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
local i = require("neogen.types.template").item | ||
|
||
return { | ||
{ nil, '""" $1 """', { no_results = true, type = { "func" } } }, | ||
{ nil, '""" $1 """', { no_results = true, type = { "class" } } }, | ||
{ nil, '"""' }, | ||
{ "signature", " %s" }, | ||
-- { nil, "" }, | ||
{ nil, "" }, | ||
{ nil, "$1" }, | ||
{ nil, "" }, | ||
{ i.HasParameter, "# Arguments", { type = { "func" } } }, | ||
{ i.HasParameter, "# Fields", { type = { "class" } } }, | ||
{ | ||
i.Parameter, | ||
"- `%s`: $1", | ||
{ required = "parameters", type = { "class" } }, | ||
}, | ||
{ | ||
{ i.Parameter, i.Type }, | ||
"- `%s::%s`: $1", | ||
{ required = "typed_parameters", type = { "func" } }, | ||
}, | ||
{ | ||
{ i.Parameter, i.Type }, | ||
"- `%s::%s`: $1", | ||
{ required = "typed_parameters", type = { "class" } }, | ||
}, | ||
{ | ||
i.Parameter, | ||
"- `%s`: $1", | ||
{ required = "parameters", type = { "func" } }, | ||
}, | ||
|
||
{ nil, '"""' }, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.