Skip to content

Commit

Permalink
feat: support julia (#178)
Browse files Browse the repository at this point in the history
* feat: add samples for julia

* feat: add few julia's nodes

* feat: julia matrix_expression

* refactor: remove duplicate sample nodes

* feat: open_tuple and tuple_expression

* feat: using nodes

* chore: add tests for julia

* docs: update readme
  • Loading branch information
Wansmer authored Jan 21, 2025
1 parent ec234a9 commit 1680d6a
Show file tree
Hide file tree
Showing 6 changed files with 379 additions and 0 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ By default, TreeSJ has presets for these languages:
- **Elixir**;
- **Haskell**;
- **Zig**;
- **Julia**;

For adding your favorite language, add it to `langs` sections in your
configuration. Also, see how [to implement
Expand Down
1 change: 1 addition & 0 deletions lua/treesj/langs/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ M.configured_langs = {
'elixir',
'haskell',
'zig',
'julia',
}

M.presets = {}
Expand Down
75 changes: 75 additions & 0 deletions lua/treesj/langs/julia.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
local lang_utils = require('treesj.langs.utils')

local using = {
both = {
space_in_brackets = true,
omit = {
lang_utils.helpers.by_index(1),
lang_utils.helpers.by_index(2),
',',
},
},
split = {
last_indent = 'inner',
},
}

return {
argument_list = lang_utils.set_preset_for_args({
split = { last_separator = true },
}),
vector_expression = lang_utils.set_preset_for_list({
join = { space_in_brackets = false },
}),
matrix_expression = lang_utils.set_preset_for_statement({
join = {
space_in_brackets = false,
no_insert_if = { lang_utils.helpers.if_penultimate },
},
split = {
format_tree = function(tsj)
tsj:remove_child(';')
end,
},
}),
tuple_expression = lang_utils.set_preset_for_list({
join = {
space_in_brackets = false,
format_tree = function(tsj)
if
tsj:tsnode():parent():type() == 'assignment'
-- Check if the tuple_expression is the left side in the assignment
and tsj:tsnode():parent():child(0):equal(tsj:tsnode())
then
tsj:remove_child({ '(', ')' })
tsj:update_preset({ space_in_brackets = true }, 'join')
end
end,
},
}),
comprehension_expression = lang_utils.set_preset_for_list({
both = {
separator = '',
},
join = {
space_in_brackets = false,
},
}),
call_expression = { target_nodes = { 'argument_list' } },
using_statement = using,
selected_import = using,
open_tuple = lang_utils.set_preset_for_args({
split = {
last_separator = true,
format_tree = function(tsj)
tsj:create_child({ text = '(' }, 1)
tsj:create_child({ text = ')' }, #tsj:children() + 1)
local penult = tsj:child(-2)
penult:update_text(penult:text() .. ',')
end,
},
join = {
disable = true,
},
}),
}
107 changes: 107 additions & 0 deletions tests/langs/julia/join_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
local tu = require('tests.utils')

local PATH = './tests/sample/index.jl'
local LANG = 'julia'

local data_for_join = {
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "argument_list", preset default',
cursor = { 4, 16 },
expected = { 1, 2 },
result = { 3, 4 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "vector_expression", preset default',
cursor = { 14, 3 },
expected = { 10, 11 },
result = { 12, 13 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "matrix_expression", preset default',
cursor = { 23, 6 },
expected = { 19, 20 },
result = { 21, 22 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "tuple_expression", preset default',
cursor = { 30, 6 },
expected = { 27, 28 },
result = { 29, 30 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "argument_list" in "function_definition", preset default',
cursor = { 43, 21 },
expected = { 36, 41 },
result = { 42, 47 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "comprehension_expression", preset default',
cursor = { 55, 5 },
expected = { 51, 52 },
result = { 53, 54 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "call_expression", preset default',
cursor = { 62, 12 },
expected = { 59, 60 },
result = { 61, 62 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "using_statement", preset default',
cursor = { 71, 12 },
expected = { 66, 67 },
result = { 68, 69 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "selected_import", preset default',
cursor = { 78, 3 },
expected = { 73, 74 },
result = { 75, 76 },
},
{
path = PATH,
mode = 'join',
lang = LANG,
desc = 'lang "%s", node "tuple_expression" as left side of assignment, preset default',
cursor = { 86, 4 },
expected = { 81, 82 },
result = { 83, 84 },
},
}

local treesj = require('treesj')
local opts = {}
treesj.setup(opts)

describe('TreeSJ JOIN:', function()
for _, value in ipairs(data_for_join) do
tu._test_format(value, treesj)
end
end)
107 changes: 107 additions & 0 deletions tests/langs/julia/split_spec.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
local tu = require('tests.utils')

local PATH = './tests/sample/index.jl'
local LANG = 'julia'

local data_for_split = {
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "argument_list", preset default',
cursor = { 2, 33 },
expected = { 3, 8 },
result = { 1, 6 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "vector_expression", preset default',
cursor = { 11, 20 },
expected = { 12, 17 },
result = { 10, 15 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "matrix_expression", preset default',
cursor = { 20, 25 },
expected = { 21, 25 },
result = { 19, 23 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "tuple_expression", preset default',
cursor = { 28, 11 },
expected = { 29, 34 },
result = { 27, 32 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "argument_list" in "function_definition", preset default',
cursor = { 37, 24 },
expected = { 42, 49 },
result = { 36, 43 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "comprehension_expression", preset default',
cursor = { 52, 24 },
expected = { 53, 57 },
result = { 51, 55 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "call_expression", preset default',
cursor = { 60, 12 },
expected = { 61, 64 },
result = { 59, 62 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "using_statement", preset default',
cursor = { 67, 24 },
expected = { 68, 71 },
result = { 66, 69 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "selected_import", preset default',
cursor = { 74, 24 },
expected = { 75, 79 },
result = { 73, 77 },
},
{
path = PATH,
mode = 'split',
lang = LANG,
desc = 'lang "%s", node "open_tuple", preset default',
cursor = { 82, 6 },
expected = { 83, 88 },
result = { 81, 86 },
},
}

local treesj = require('treesj')
local opts = {}
treesj.setup(opts)

describe('TreeSJ SPLIT:', function()
for _, value in ipairs(data_for_split) do
tu._test_format(value, treesj)
end
end)
88 changes: 88 additions & 0 deletions tests/sample/index.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# RESULT OF JOIN (node "argument_list", preset default)
filled_dict = Dict("one" => 1, "two" => 2, "three" => 3)
# RESULT OF SPLIT (node "argument_list", preset default)
filled_dict = Dict(
"one" => 1,
"two" => 2,
"three" => 3,
)

# RESULT OF JOIN (node "vector_expression", preset default)
other_arr = [4, 5, 6]
# RESULT OF SPLIT (node "vector_expression", preset default)
other_arr = [
4,
5,
6,
]

# RESULT OF JOIN (node "matrix_expression", preset default)
other_arr = [1 2 3; 4 5 6]
# RESULT OF SPLIT (node "matrix_expression", preset default)
other_arr = [
1 2 3
4 5 6
]

# RESULT OF JOIN (node "tuple_expression", preset default)
tup = (1, 2, 3)
# RESULT OF SPLIT (node "tuple_expression", preset default)
tup = (
1,
2,
3,
)

# RESULT OF JOIN (node "argument_list" and "function_definition", preset default)
function create_adder(x, b)
adder(y) = x + y
return adder
end

# RESULT OF SPLIT (node "argument_list" and "function_definition", preset default)
function create_adder(
x,
b,
)
adder(y) = x + y
return adder
end

# RESULT OF JOIN (node "comprehension_expression", preset default)
comp_arr = [i^2 for i in 1:5]
# RESULT OF SPLIT (node "comprehension_expression", preset default)
comp_arr = [
i^2
for i in 1:5
]

# RESULT OF JOIN (node "argument_list" in "call_expression", preset default)
result = sum([1, 2, 3])
# RESULT OF SPLIT (node "argument_list" in "call_expression", preset default)
result = sum(
[1, 2, 3],
)

# RESULT OF JOIN (node "using_statement", preset default)
using Statistics, Lasso, ProjectRoot
# RESULT OF SPLIT (node "using_statement", preset default)
using Statistics,
Lasso,
ProjectRoot

# RESULT OF JOIN (node "selected_import" and "using_statement", preset default)
using Statistics: mean, median, std
# RESULT OF SPLIT (node "selected_import" and "using_statement", preset default)
using Statistics:
mean,
median,
std

# RESULT OF JOIN (node "open_tuple" and "assignment", preset default)
t1, t2, t3 = (1, 2, 3)
# RESULT OF SPLIT (node "tuple_expression" and "assignment", preset default)
(
t1,
t2,
t3,
) = (1, 2, 3)

0 comments on commit 1680d6a

Please sign in to comment.