Skip to content

Commit

Permalink
Merge branch 'add-julia-support' into update_tests_run
Browse files Browse the repository at this point in the history
  • Loading branch information
danymat committed Jul 28, 2024
2 parents 201d7d6 + 51f345c commit e8bf7d6
Show file tree
Hide file tree
Showing 4 changed files with 576 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ There is a list of supported languages and fields, with their annotation style
| java | [Javadoc](https://docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javadoc.html#documentationcomments) (`"javadoc`) | `func`, `class` |
| javascript | [JSDoc](https://jsdoc.app) (`"jsdoc"`) | `func`, `class`, `type`, `file` |
| javascriptreact | [JSDoc](https://jsdoc.app) (`"jsdoc"`) | `func`, `class`, `type`, `file` |
| julia | | `func`, `class` |
| kotlin | [KDoc](https://kotlinlang.org/docs/kotlin-doc.html) (`"kdoc"`) | `func`, `class` |
| lua | [Emmylua](https://emmylua.github.io/) (`"emmylua"`)<br> [Ldoc](https://stevedonovan.github.io/ldoc/manual/doc.md.html) (`"ldoc"`) | `func`, `class`, `type`, `file` |
| php | [Php-doc](https://docs.phpdoc.org/3.0/guide/references/phpdoc/index.html) (`"phpdoc"`) | `func`, `type`, `class` |
Expand Down
231 changes: 231 additions & 0 deletions lua/neogen/configurations/julia.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,231 @@
local ts_utils = require("nvim-treesitter.ts_utils")
local nodes_utils = require("neogen.utilities.nodes")
local extractors = require("neogen.utilities.extractors")
local locator = require("neogen.locators.default")
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"),
}
36 changes: 36 additions & 0 deletions lua/neogen/templates/julia.lua
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, '"""' },
}
Loading

0 comments on commit e8bf7d6

Please sign in to comment.