From d74d9f2a9bbc8698c6d5b43c464f48a31e5f70a4 Mon Sep 17 00:00:00 2001 From: Felix-Kettnaker Date: Thu, 4 Jun 2026 15:26:30 +0200 Subject: [PATCH] feat: add gdscript preset Add a split/join preset for GDScript (tree-sitter-gdscript): - bracketed nodes: arguments, parameters, array, dictionary, enumerator_list (arrays/dicts/enums keep no inner spaces, matching the GDScript style guide) - redirects: call/attribute_call -> arguments, function_definition/lambda -> parameters, enum_definition -> enumerator_list, and assignment/augmented_assignment/variable_statement/const_statement/ return_statement -> array/dictionary/arguments Includes tests/sample/index.gd plus split/join specs, registers gdscript in configured_langs, and lists it in the README. Co-Authored-By: Claude Opus 4.8 --- README.md | 1 + lua/treesj/langs/gdscript.lua | 48 +++++++++++++ lua/treesj/langs/init.lua | 1 + tests/langs/gdscript/gdscript_join_spec.lua | 71 ++++++++++++++++++++ tests/langs/gdscript/gdscript_split_spec.lua | 71 ++++++++++++++++++++ tests/sample/index.gd | 60 +++++++++++++++++ 6 files changed, 252 insertions(+) create mode 100644 lua/treesj/langs/gdscript.lua create mode 100644 tests/langs/gdscript/gdscript_join_spec.lua create mode 100644 tests/langs/gdscript/gdscript_split_spec.lua create mode 100644 tests/sample/index.gd diff --git a/README.md b/README.md index 82be05d..c48c6bf 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,7 @@ By default, TreeSJ has presets for these languages: - **Terraform**; - **Typst**; - **Qml**; +- **GDScript**; For adding your favorite language, add it to `langs` sections in your configuration. Also, see how [to implement diff --git a/lua/treesj/langs/gdscript.lua b/lua/treesj/langs/gdscript.lua new file mode 100644 index 0000000..4fa7376 --- /dev/null +++ b/lua/treesj/langs/gdscript.lua @@ -0,0 +1,48 @@ +local lang_utils = require('treesj.langs.utils') + +local no_space_in_brackets_list = lang_utils.set_preset_for_list({ + join = { space_in_brackets = false }, +}) +local no_space_in_brackets_dict = lang_utils.set_preset_for_dict({ + join = { space_in_brackets = false }, +}) + +return { + arguments = lang_utils.set_preset_for_args(), + parameters = lang_utils.set_preset_for_args(), + array = no_space_in_brackets_list, + dictionary = no_space_in_brackets_dict, + enumerator_list = no_space_in_brackets_dict, + + call = { + target_nodes = { 'arguments' }, + }, + attribute_call = { + target_nodes = { 'arguments' }, + }, + lambda = { + target_nodes = { 'parameters' }, + }, + function_definition = { + target_nodes = { 'parameters' }, + }, + enum_definition = { + target_nodes = { 'enumerator_list' }, + }, + + assignment = { + target_nodes = { 'array', 'dictionary', 'arguments' }, + }, + augmented_assignment = { + target_nodes = { 'array', 'dictionary', 'arguments' }, + }, + variable_statement = { + target_nodes = { 'array', 'dictionary', 'arguments' }, + }, + const_statement = { + target_nodes = { 'array', 'dictionary', 'arguments' }, + }, + return_statement = { + target_nodes = { 'array', 'dictionary', 'arguments' }, + }, +} diff --git a/lua/treesj/langs/init.lua b/lua/treesj/langs/init.lua index 58c5890..7627116 100644 --- a/lua/treesj/langs/init.lua +++ b/lua/treesj/langs/init.lua @@ -42,6 +42,7 @@ M.configured_langs = { 'typst', 'qml', 'qmljs', + 'gdscript', } M.presets = {} diff --git a/tests/langs/gdscript/gdscript_join_spec.lua b/tests/langs/gdscript/gdscript_join_spec.lua new file mode 100644 index 0000000..aa80073 --- /dev/null +++ b/tests/langs/gdscript/gdscript_join_spec.lua @@ -0,0 +1,71 @@ +local tu = require('tests.utils') + +local PATH = './tests/sample/index.gd' +local LANG = 'gdscript' + +local data_for_join = { + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "array", preset default', + cursor = { 5, 2 }, + expected = { 1, 2 }, + result = { 3, 4 }, + }, + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "dictionary", preset default', + cursor = { 14, 2 }, + expected = { 10, 11 }, + result = { 12, 13 }, + }, + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "enumerator_list" and "enum_definition", preset default', + cursor = { 22, 2 }, + expected = { 18, 19 }, + result = { 20, 21 }, + }, + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "parameters" and "function_definition", preset default', + cursor = { 33, 2 }, + expected = { 27, 29 }, + result = { 31, 33 }, + }, + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "arguments" and "call", preset default', + cursor = { 45, 4 }, + expected = { 39, 40 }, + result = { 43, 44 }, + }, + { + path = PATH, + mode = 'join', + lang = LANG, + desc = 'lang "%s", node "assignment" (array), preset default', + cursor = { 57, 4 }, + expected = { 51, 52 }, + result = { 55, 56 }, + }, +} + +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) diff --git a/tests/langs/gdscript/gdscript_split_spec.lua b/tests/langs/gdscript/gdscript_split_spec.lua new file mode 100644 index 0000000..282cd55 --- /dev/null +++ b/tests/langs/gdscript/gdscript_split_spec.lua @@ -0,0 +1,71 @@ +local tu = require('tests.utils') + +local PATH = './tests/sample/index.gd' +local LANG = 'gdscript' + +local data_for_split = { + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "array", preset default', + cursor = { 2, 11 }, + expected = { 3, 8 }, + result = { 1, 6 }, + }, + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "dictionary", preset default', + cursor = { 11, 11 }, + expected = { 12, 16 }, + result = { 10, 14 }, + }, + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "enumerator_list" and "enum_definition", preset default', + cursor = { 19, 11 }, + expected = { 20, 25 }, + result = { 18, 23 }, + }, + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "parameters" and "function_definition", preset default', + cursor = { 28, 11 }, + expected = { 31, 36 }, + result = { 27, 32 }, + }, + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "arguments" and "call", preset default', + cursor = { 40, 15 }, + expected = { 43, 48 }, + result = { 39, 44 }, + }, + { + path = PATH, + mode = 'split', + lang = LANG, + desc = 'lang "%s", node "assignment" (array), preset default', + cursor = { 52, 2 }, + expected = { 55, 60 }, + result = { 51, 56 }, + }, +} + +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) diff --git a/tests/sample/index.gd b/tests/sample/index.gd new file mode 100644 index 0000000..1f4d584 --- /dev/null +++ b/tests/sample/index.gd @@ -0,0 +1,60 @@ +# RESULT OF JOIN (node "array", preset default) +var arr = [1, 2, 3] +# RESULT OF SPLIT (node "array", preset default) +var arr = [ + 1, + 2, + 3, +] + +# RESULT OF JOIN (node "dictionary", preset default) +var dct = {"one": 1, "two": 2} +# RESULT OF SPLIT (node "dictionary", preset default) +var dct = { + "one": 1, + "two": 2, +} + +# RESULT OF JOIN (node "enumerator_list" and "enum_definition", preset default) +enum Mode {IDLE, RUN, JUMP} +# RESULT OF SPLIT (node "enumerator_list" and "enum_definition", preset default) +enum Mode { + IDLE, + RUN, + JUMP, +} + +# RESULT OF JOIN (node "parameters" and "function_definition", preset default) +func greet(name, times): + print(name, times) + +# RESULT OF SPLIT (node "parameters" and "function_definition", preset default) +func greet( + name, + times +): + print(name, times) + +# RESULT OF JOIN (node "arguments" and "call", preset default) +func use(): + emit_signal("done", a, b) + +# RESULT OF SPLIT (node "arguments" and "call", preset default) +func use(): + emit_signal( + "done", + a, + b + ) + +# RESULT OF JOIN (node "assignment" (array), preset default) +func reassign(): + values = [1, 2, 3] + +# RESULT OF SPLIT (node "assignment" (array), preset default) +func reassign(): + values = [ + 1, + 2, + 3, + ]