diff --git a/README.md b/README.md index 82be05d..8b7d82e 100644 --- a/README.md +++ b/README.md @@ -206,6 +206,7 @@ By default, TreeSJ has presets for these languages: - **Rust**; - **R**; - **C/C++**; +- **C#**; - **Nix**; - **Kotlin**; - **Bash**; diff --git a/doc/treesj.txt b/doc/treesj.txt index 3d07eb1..f306a55 100644 --- a/doc/treesj.txt +++ b/doc/treesj.txt @@ -212,6 +212,7 @@ By default, TreeSJ has presets for these languages: - **Rust**; - **R**; - **C/C++**; +- **C#**; - **Nix**; - **Kotlin**; - **Bash**; diff --git a/lua/treesj/langs/c_sharp.lua b/lua/treesj/langs/c_sharp.lua new file mode 100644 index 0000000..f09e5be --- /dev/null +++ b/lua/treesj/langs/c_sharp.lua @@ -0,0 +1,83 @@ +local lang_utils = require('treesj.langs.utils') + +local args = lang_utils.set_preset_for_args() +local list_no_space = lang_utils.set_preset_for_list({ + join = { + space_in_brackets = false, + }, +}) +local list_space = lang_utils.set_preset_for_list() +local statement = lang_utils.set_preset_for_statement() +local target_args = { target_nodes = { 'argument_list' } } +local target_block = { target_nodes = { 'block' } } +local target_creation = { + target_nodes = { 'argument_list', 'initializer_expression' }, +} +local target_param_list = { target_nodes = { 'parameter_list' } } +local type_args = lang_utils.set_preset_for_args({ + both = { + last_separator = false, + }, +}) + +return { + accessor_list = statement, + argument_list = args, + attribute = { + target_nodes = { 'attribute_argument_list' }, + }, + attribute_argument_list = args, + attribute_list = list_no_space, + block = statement, + bracketed_argument_list = args, + bracketed_parameter_list = args, + catch_clause = target_block, + checked_statement = target_block, + collection_expression = list_no_space, + constructor_declaration = target_param_list, + constructor_initializer = target_args, + conversion_operator_declaration = target_param_list, + delegate_declaration = target_param_list, + do_statement = target_block, + element_access_expression = { + target_nodes = { 'bracketed_argument_list' }, + }, + element_binding_expression = args, + enum_declaration = { + target_nodes = { 'enum_member_declaration_list' }, + }, + enum_member_declaration_list = list_space, + finally_clause = target_block, + fixed_statement = target_block, + for_statement = target_block, + foreach_statement = target_block, + if_statement = target_block, + implicit_object_creation_expression = target_creation, + indexer_declaration = { + target_nodes = { 'bracketed_parameter_list' }, + }, + initializer_expression = list_space, + invocation_expression = target_args, + list_pattern = list_no_space, + local_function_statement = target_param_list, + lock_statement = target_block, + method_declaration = target_param_list, + object_creation_expression = target_creation, + operator_declaration = target_param_list, + parameter_list = args, + property_pattern_clause = list_space, + switch_expression = lang_utils.set_preset_for_list({ + both = { + -- don't format the thing being evaluated or the `switch` keyword + shrink_node = { from = '{', to = '}' }, + }, + }), + try_statement = target_block, + tuple_expression = args, + tuple_type = args, + type_argument_list = type_args, + type_parameter_list = type_args, + unsafe_statement = target_block, + using_statement = target_block, + while_statement = target_block, +} diff --git a/lua/treesj/langs/init.lua b/lua/treesj/langs/init.lua index 58c5890..6d8f9f5 100644 --- a/lua/treesj/langs/init.lua +++ b/lua/treesj/langs/init.lua @@ -26,6 +26,7 @@ M.configured_langs = { 'r', 'cpp', 'c', + 'c_sharp', 'toml', 'yaml', 'nix', diff --git a/tests/langs/c_sharp/join_spec.lua b/tests/langs/c_sharp/join_spec.lua new file mode 100644 index 0000000..1ca93fa --- /dev/null +++ b/tests/langs/c_sharp/join_spec.lua @@ -0,0 +1,405 @@ +local tu = require('tests.utils') + +local PATH = './tests/sample/index.cs' +local LANG = 'c_sharp' +local MODE = 'join' + +local data = { + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "attribute_list", preset default', + cursor = { 11, 0 }, + expected = { 6, 8 }, + result = { 10, 12 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "attribute", preset default', + cursor = { 22, 1 }, + expected = { 17, 19 }, + result = { 21, 23 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "type_parameter_list", preset default', + cursor = { 33, 2 }, + expected = { 28, 29 }, + result = { 31, 32 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "enum_member_declaration_list", preset default', + cursor = { 42, 2 }, + expected = { 37, 38 }, + result = { 40, 41 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "enum_declaration", preset default', + cursor = { 51, 0 }, + expected = { 47, 48 }, + result = { 50, 51 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "delegate_declaration", preset default', + cursor = { 61, 13 }, + expected = { 57, 58 }, + result = { 60, 61 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "constructor_declaration", preset default', + cursor = { 72, 9 }, + expected = { 68, 69 }, + result = { 71, 72 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "method_declaration", preset default', + cursor = { 82, 14 }, + expected = { 78, 79 }, + result = { 81, 82 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "accessor_list", preset default', + cursor = { 93, 4 }, + expected = { 88, 89 }, + result = { 91, 92 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "bracketed_parameter_list", preset default', + cursor = { 101, 17 }, + expected = { 97, 98 }, + result = { 100, 101 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "block", preset default', + cursor = { 110, 26 }, + expected = { 106, 107 }, + result = { 109, 110 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "indexer_declaration", preset default', + cursor = { 119, 13 }, + expected = { 115, 116 }, + result = { 118, 119 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "operator_declaration", preset default', + cursor = { 128, 24 }, + expected = { 124, 125 }, + result = { 127, 128 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "conversion_operator_declaration", preset default', + cursor = { 137, 16 }, + expected = { 133, 134 }, + result = { 136, 137 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "constructor_initializer", preset default', + cursor = { 145, 37 }, + expected = { 141, 142 }, + result = { 144, 145 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "tuple_type", preset default', + cursor = { 156, 4 }, + expected = { 151, 152 }, + result = { 154, 155 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "invocation_expression", preset default', + cursor = { 175, 4 }, + expected = { 171, 172 }, + result = { 174, 175 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "object_creation_expression", preset default', + cursor = { 184, 16 }, + expected = { 180, 181 }, + result = { 183, 184 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "implicit_object_creation_expression", preset default', + cursor = { 193, 18 }, + expected = { 189, 190 }, + result = { 192, 193 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "type_argument_list", preset default', + cursor = { 203, 6 }, + expected = { 198, 199 }, + result = { 201, 202 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "initializer_expression", preset default', + cursor = { 212, 6 }, + expected = { 207, 208 }, + result = { 210, 211 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "collection_expression", preset default', + cursor = { 222, 6 }, + expected = { 217, 218 }, + result = { 220, 221 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "element_binding_expression", preset default', + cursor = { 232, 6 }, + expected = { 227, 228 }, + result = { 230, 231 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "bracketed_argument_list", preset default', + cursor = { 241, 6 }, + expected = { 236, 237 }, + result = { 239, 240 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "element_access_expression", preset default', + cursor = { 249, 15 }, + expected = { 245, 246 }, + result = { 248, 249 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "tuple_expression", preset default', + cursor = { 259, 6 }, + expected = { 254, 255 }, + result = { 257, 258 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "switch_expression", preset default', + cursor = { 267, 21 }, + expected = { 263, 264 }, + result = { 266, 267 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "list_pattern", preset default', + cursor = { 277, 6 }, + expected = { 272, 273 }, + result = { 275, 276 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "property_pattern_clause", preset default', + cursor = { 287, 6 }, + expected = { 282, 283 }, + result = { 285, 286 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "if_statement", preset default', + cursor = { 295, 4 }, + expected = { 291, 292 }, + result = { 294, 295 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "while_statement", preset default', + cursor = { 304, 4 }, + expected = { 300, 301 }, + result = { 303, 304 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "do_statement", preset default', + cursor = { 313, 4 }, + expected = { 309, 310 }, + result = { 312, 313 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "for_statement", preset default', + cursor = { 322, 4 }, + expected = { 318, 319 }, + result = { 321, 322 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "foreach_statement", preset default', + cursor = { 331, 4 }, + expected = { 327, 328 }, + result = { 330, 331 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "using_statement", preset default', + cursor = { 340, 4 }, + expected = { 336, 337 }, + result = { 339, 340 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "lock_statement", preset default', + cursor = { 349, 4 }, + expected = { 345, 346 }, + result = { 348, 349 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "checked_statement", preset default', + cursor = { 358, 4 }, + expected = { 354, 355 }, + result = { 357, 358 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "unsafe_statement", preset default', + cursor = { 367, 4 }, + expected = { 363, 364 }, + result = { 366, 367 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "fixed_statement", preset default', + cursor = { 376, 4 }, + expected = { 372, 373 }, + result = { 375, 376 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "try_statement", preset default', + cursor = { 385, 4 }, + expected = { 381, 382 }, + result = { 384, 385 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "catch_clause", preset default', + cursor = { 393, 22 }, + expected = { 389, 390 }, + result = { 392, 393 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "finally_clause", preset default', + cursor = { 401, 62 }, + expected = { 397, 398 }, + result = { 400, 401 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "local_function_statement", preset default', + cursor = { 409, 9 }, + expected = { 405, 406 }, + result = { 408, 409 }, + }, +} + +local treesj = require('treesj') +local opts = {} +treesj.setup(opts) + +describe('TreeSJ ' .. MODE:upper() .. ':', function() + for _, value in ipairs(data) do + tu._test_format(value, treesj) + end +end) diff --git a/tests/langs/c_sharp/split_spec.lua b/tests/langs/c_sharp/split_spec.lua new file mode 100644 index 0000000..9c85980 --- /dev/null +++ b/tests/langs/c_sharp/split_spec.lua @@ -0,0 +1,405 @@ +local tu = require('tests.utils') + +local PATH = './tests/sample/index.cs' +local LANG = 'c_sharp' +local MODE = 'split' + +local data = { + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "attribute_list", preset default', + cursor = { 7, 0 }, + expected = { 10, 15 }, + result = { 6, 11 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "attribute", preset default', + cursor = { 18, 1 }, + expected = { 21, 26 }, + result = { 17, 22 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "type_parameter_list", preset default', + cursor = { 29, 11 }, + expected = { 31, 35 }, + result = { 28, 32 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "enum_member_declaration_list", preset default', + cursor = { 38, 12 }, + expected = { 40, 45 }, + result = { 37, 42 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "enum_declaration", preset default', + cursor = { 48, 0 }, + expected = { 50, 55 }, + result = { 47, 52 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "delegate_declaration", preset default', + cursor = { 58, 13 }, + expected = { 60, 64 }, + result = { 57, 61 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "constructor_declaration", preset default', + cursor = { 69, 9 }, + expected = { 71, 76 }, + result = { 68, 73 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "method_declaration", preset default', + cursor = { 79, 14 }, + expected = { 81, 86 }, + result = { 78, 83 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "accessor_list", preset default', + cursor = { 89, 23 }, + expected = { 91, 95 }, + result = { 88, 92 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "bracketed_parameter_list", preset default', + cursor = { 98, 17 }, + expected = { 100, 104 }, + result = { 97, 101 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "block", preset default', + cursor = { 107, 26 }, + expected = { 109, 113 }, + result = { 106, 110 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "indexer_declaration", preset default', + cursor = { 116, 13 }, + expected = { 118, 122 }, + result = { 115, 119 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "operator_declaration", preset default', + cursor = { 125, 24 }, + expected = { 127, 131 }, + result = { 124, 128 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "conversion_operator_declaration", preset default', + cursor = { 134, 16 }, + expected = { 136, 139 }, + result = { 133, 136 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "constructor_initializer", preset default', + cursor = { 142, 37 }, + expected = { 144, 149 }, + result = { 141, 146 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "tuple_type", preset default', + cursor = { 152, 10 }, + expected = { 154, 158 }, + result = { 151, 155 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "invocation_expression", preset default', + cursor = { 172, 4 }, + expected = { 174, 178 }, + result = { 171, 175 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "object_creation_expression", preset default', + cursor = { 181, 16 }, + expected = { 183, 187 }, + result = { 180, 184 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "implicit_object_creation_expression", preset default', + cursor = { 190, 18 }, + expected = { 192, 196 }, + result = { 189, 193 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "type_argument_list", preset default', + cursor = { 199, 31 }, + expected = { 201, 205 }, + result = { 198, 202 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "initializer_expression", preset default', + cursor = { 208, 33 }, + expected = { 210, 215 }, + result = { 207, 212 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "collection_expression", preset default', + cursor = { 218, 20 }, + expected = { 220, 225 }, + result = { 217, 222 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "element_binding_expression", preset default', + cursor = { 228, 21 }, + expected = { 230, 234 }, + result = { 227, 231 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "bracketed_argument_list", preset default', + cursor = { 237, 20 }, + expected = { 239, 243 }, + result = { 236, 240 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "element_access_expression", preset default', + cursor = { 246, 15 }, + expected = { 248, 252 }, + result = { 245, 249 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "tuple_expression", preset default', + cursor = { 255, 16 }, + expected = { 257, 261 }, + result = { 254, 258 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "switch_expression", preset default', + cursor = { 264, 21 }, + expected = { 266, 270 }, + result = { 263, 267 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "list_pattern", preset default', + cursor = { 273, 18 }, + expected = { 275, 280 }, + result = { 272, 277 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "property_pattern_clause", preset default', + cursor = { 283, 18 }, + expected = { 285, 289 }, + result = { 282, 286 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "if_statement", preset default', + cursor = { 292, 4 }, + expected = { 294, 298 }, + result = { 291, 295 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "while_statement", preset default', + cursor = { 301, 4 }, + expected = { 303, 307 }, + result = { 300, 304 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "do_statement", preset default', + cursor = { 310, 4 }, + expected = { 312, 316 }, + result = { 309, 313 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "for_statement", preset default', + cursor = { 319, 4 }, + expected = { 321, 325 }, + result = { 318, 322 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "foreach_statement", preset default', + cursor = { 328, 4 }, + expected = { 330, 334 }, + result = { 327, 331 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "using_statement", preset default', + cursor = { 337, 4 }, + expected = { 339, 343 }, + result = { 336, 340 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "lock_statement", preset default', + cursor = { 346, 4 }, + expected = { 348, 352 }, + result = { 345, 349 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "checked_statement", preset default', + cursor = { 355, 4 }, + expected = { 357, 361 }, + result = { 354, 358 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "unsafe_statement", preset default', + cursor = { 364, 4 }, + expected = { 366, 370 }, + result = { 363, 367 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "fixed_statement", preset default', + cursor = { 373, 4 }, + expected = { 375, 379 }, + result = { 372, 376 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "try_statement", preset default', + cursor = { 382, 4 }, + expected = { 384, 387 }, + result = { 381, 384 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "catch_clause", preset default', + cursor = { 390, 22 }, + expected = { 392, 395 }, + result = { 389, 392 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "finally_clause", preset default', + cursor = { 398, 62 }, + expected = { 400, 403 }, + result = { 397, 400 }, + }, + { + path = PATH, + mode = MODE, + lang = LANG, + desc = 'lang "%s", node "local_function_statement", preset default', + cursor = { 406, 9 }, + expected = { 408, 413 }, + result = { 405, 410 }, + }, +} + +local treesj = require('treesj') +local opts = {} +treesj.setup(opts) + +describe('TreeSJ ' .. MODE:upper() .. ':', function() + for _, value in ipairs(data) do + tu._test_format(value, treesj) + end +end) diff --git a/tests/minimal.lua b/tests/minimal.lua index 4a7eafe..076bff3 100644 --- a/tests/minimal.lua +++ b/tests/minimal.lua @@ -56,3 +56,5 @@ require('nvim-treesitter').setup({ require('nvim-treesitter') .install(require('treesj.langs').configured_langs) :wait(20000) -- waiting for parsers to be installed. If some tests will completely fail, try increasing this number + +vim.treesitter.language.register('c_sharp', 'cs') diff --git a/tests/sample/index.cs b/tests/sample/index.cs new file mode 100644 index 0000000..21c0a82 --- /dev/null +++ b/tests/sample/index.cs @@ -0,0 +1,415 @@ +// Code examples based on https://learnxinyminutes.com/docs/csharp/ + +using System; +using System.Collections.Generic; + +// RESULT OF JOIN (node "attribute_list", preset default) +[Serializable, Obsolete("Use Frame instead")] +class Frame { } + +// RESULT OF SPLIT (node "attribute_list", preset default) +[ + Serializable, + Obsolete("Use Frame instead"), +] +class Frame { } + +// RESULT OF JOIN (node "attribute", preset default) +[Obsolete("Use Wheel instead", true)] +class Wheel { } + +// RESULT OF SPLIT (node "attribute", preset default) +[Obsolete( + "Use Wheel instead", + true +)] +class Wheel { } + +// RESULT OF JOIN (node "type_parameter_list", preset default) +class Pair { } + +// RESULT OF SPLIT (node "type_parameter_list", preset default) +class Pair< + TFirst, + TSecond +> { } + +// RESULT OF JOIN (node "enum_member_declaration_list", preset default) +enum Gear { Low, Mid, High } + +// RESULT OF SPLIT (node "enum_member_declaration_list", preset default) +enum Gear { + Low, + Mid, + High, +} + +// RESULT OF JOIN (node "enum_declaration", preset default) +enum Gear { Low, Mid, High } + +// RESULT OF SPLIT (node "enum_declaration", preset default) +enum Gear { + Low, + Mid, + High, +} + +// RESULT OF JOIN (node "delegate_declaration", preset default) +delegate int Shift(int gear, bool force); + +// RESULT OF SPLIT (node "delegate_declaration", preset default) +delegate int Shift( + int gear, + bool force +); + +class Bicycle +{ + // RESULT OF JOIN (node "constructor_declaration", preset default) + public Bicycle(int startCadence, int startSpeed, string name) { } + + // RESULT OF SPLIT (node "constructor_declaration", preset default) + public Bicycle( + int startCadence, + int startSpeed, + string name + ) { } + + // RESULT OF JOIN (node "method_declaration", preset default) + public void SpeedUp(int increment, bool logChange, string reason) { } + + // RESULT OF SPLIT (node "method_declaration", preset default) + public void SpeedUp( + int increment, + bool logChange, + string reason + ) { } + + // RESULT OF JOIN (node "accessor_list", preset default) + public int Cadence { get; set; } + + // RESULT OF SPLIT (node "accessor_list", preset default) + public int Cadence { + get; + set; + } + + // RESULT OF JOIN (node "bracketed_parameter_list", preset default) + public int this[int row, int column] { get => 0; } + + // RESULT OF SPLIT (node "bracketed_parameter_list", preset default) + public int this[ + int row, + int column + ] { get => 0; } + + // RESULT OF JOIN (node "block", preset default) + public int GetCadence() { Report(); return Cadence; } + + // RESULT OF SPLIT (node "block", preset default) + public int GetCadence() { + Report(); + return Cadence; + } + + // RESULT OF JOIN (node "indexer_declaration", preset default) + public int this[int row, int column] => 0; + + // RESULT OF SPLIT (node "indexer_declaration", preset default) + public int this[ + int row, + int column + ] => 0; + + // RESULT OF JOIN (node "operator_declaration", preset default) + public static Bicycle operator +(Bicycle one, Bicycle two) => one; + + // RESULT OF SPLIT (node "operator_declaration", preset default) + public static Bicycle operator +( + Bicycle one, + Bicycle two + ) => one; + + // RESULT OF JOIN (node "conversion_operator_declaration", preset default) + public static explicit operator int(Bicycle bike) => 0; + + // RESULT OF SPLIT (node "conversion_operator_declaration", preset default) + public static explicit operator int( + Bicycle bike + ) => 0; + + // RESULT OF JOIN (node "constructor_initializer", preset default) + public Bicycle(int startCadence) : this(startCadence, 0, "bike") { } + + // RESULT OF SPLIT (node "constructor_initializer", preset default) + public Bicycle(int startCadence) : this( + startCadence, + 0, + "bike" + ) { } + + // RESULT OF JOIN (node "tuple_type", preset default) + public (int gear, string name) Describe() => (1, "low"); + + // RESULT OF SPLIT (node "tuple_type", preset default) + public ( + int gear, + string name + ) Describe() => (1, "low"); + + public void Ride() + { + var grid = new int[3, 3]; + var row = 1; + var column = 2; + var items = new List(); + var gate = new object(); + var gear = 1; + var radius = 2; + var pressure = 3; + + // RESULT OF JOIN (node "invocation_expression", preset default) + Console.WriteLine("pi = {0:F5}", Math.PI); + + // RESULT OF SPLIT (node "invocation_expression", preset default) + Console.WriteLine( + "pi = {0:F5}", + Math.PI + ); + + // RESULT OF JOIN (node "object_creation_expression", preset default) + var wheel = new Wheel(radius, pressure); + + // RESULT OF SPLIT (node "object_creation_expression", preset default) + var wheel = new Wheel( + radius, + pressure + ); + + // RESULT OF JOIN (node "implicit_object_creation_expression", preset default) + Wheel spare = new(radius, pressure); + + // RESULT OF SPLIT (node "implicit_object_creation_expression", preset default) + Wheel spare = new( + radius, + pressure + ); + + // RESULT OF JOIN (node "type_argument_list", preset default) + var gears = new Dictionary(); + + // RESULT OF SPLIT (node "type_argument_list", preset default) + var gears = new Dictionary< + string, + int + >(); + + // RESULT OF JOIN (node "initializer_expression", preset default) + var ratios = new List { 1, 2, 3 }; + + // RESULT OF SPLIT (node "initializer_expression", preset default) + var ratios = new List { + 1, + 2, + 3, + }; + + // RESULT OF JOIN (node "collection_expression", preset default) + int[] values = [1, 2, 3]; + + // RESULT OF SPLIT (node "collection_expression", preset default) + int[] values = [ + 1, + 2, + 3, + ]; + + // RESULT OF JOIN (node "element_binding_expression", preset default) + var cell = grid?[row, column]; + + // RESULT OF SPLIT (node "element_binding_expression", preset default) + var cell = grid?[ + row, + column + ]; + + // RESULT OF JOIN (node "bracketed_argument_list", preset default) + var slot = grid[row, column]; + + // RESULT OF SPLIT (node "bracketed_argument_list", preset default) + var slot = grid[ + row, + column + ]; + + // RESULT OF JOIN (node "element_access_expression", preset default) + var slot = grid[row, column]; + + // RESULT OF SPLIT (node "element_access_expression", preset default) + var slot = grid[ + row, + column + ]; + + // RESULT OF JOIN (node "tuple_expression", preset default) + var gear = (1, "low"); + + // RESULT OF SPLIT (node "tuple_expression", preset default) + var gear = ( + 1, + "low" + ); + + // RESULT OF JOIN (node "switch_expression", preset default) + var label = gear switch { 1 => "low", _ => "high" }; + + // RESULT OF SPLIT (node "switch_expression", preset default) + var label = gear switch { + 1 => "low", + _ => "high", + }; + + // RESULT OF JOIN (node "list_pattern", preset default) + if (items is [1, 2, 3]) { Report(); } + + // RESULT OF SPLIT (node "list_pattern", preset default) + if (items is [ + 1, + 2, + 3, + ]) { Report(); } + + // RESULT OF JOIN (node "property_pattern_clause", preset default) + if (this is { Cadence: 1, Speed: 2 }) { Report(); } + + // RESULT OF SPLIT (node "property_pattern_clause", preset default) + if (this is { + Cadence: 1, + Speed: 2, + }) { Report(); } + + // RESULT OF JOIN (node "if_statement", preset default) + if (Cadence > 0) { Report(); Stop(); } + + // RESULT OF SPLIT (node "if_statement", preset default) + if (Cadence > 0) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "while_statement", preset default) + while (Cadence > 0) { Report(); Stop(); } + + // RESULT OF SPLIT (node "while_statement", preset default) + while (Cadence > 0) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "do_statement", preset default) + do { Report(); Stop(); } while (Cadence > 0); + + // RESULT OF SPLIT (node "do_statement", preset default) + do { + Report(); + Stop(); + } while (Cadence > 0); + + // RESULT OF JOIN (node "for_statement", preset default) + for (int index = 0; index < 3; index++) { Report(); Stop(); } + + // RESULT OF SPLIT (node "for_statement", preset default) + for (int index = 0; index < 3; index++) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "foreach_statement", preset default) + foreach (var item in items) { Report(); Stop(); } + + // RESULT OF SPLIT (node "foreach_statement", preset default) + foreach (var item in items) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "using_statement", preset default) + using (var file = Open()) { Report(); Stop(); } + + // RESULT OF SPLIT (node "using_statement", preset default) + using (var file = Open()) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "lock_statement", preset default) + lock (gate) { Report(); Stop(); } + + // RESULT OF SPLIT (node "lock_statement", preset default) + lock (gate) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "checked_statement", preset default) + checked { Report(); Stop(); } + + // RESULT OF SPLIT (node "checked_statement", preset default) + checked { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "unsafe_statement", preset default) + unsafe { Report(); Stop(); } + + // RESULT OF SPLIT (node "unsafe_statement", preset default) + unsafe { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "fixed_statement", preset default) + fixed (int* pin = &row) { Report(); Stop(); } + + // RESULT OF SPLIT (node "fixed_statement", preset default) + fixed (int* pin = &row) { + Report(); + Stop(); + } + + // RESULT OF JOIN (node "try_statement", preset default) + try { Report(); } catch (Exception error) { Log(error); } finally { Stop(); } + + // RESULT OF SPLIT (node "try_statement", preset default) + try { + Report(); + } catch (Exception error) { Log(error); } finally { Stop(); } + + // RESULT OF JOIN (node "catch_clause", preset default) + try { Report(); } catch (Exception error) { Log(error); } finally { Stop(); } + + // RESULT OF SPLIT (node "catch_clause", preset default) + try { Report(); } catch (Exception error) { + Log(error); + } finally { Stop(); } + + // RESULT OF JOIN (node "finally_clause", preset default) + try { Report(); } catch (Exception error) { Log(error); } finally { Stop(); } + + // RESULT OF SPLIT (node "finally_clause", preset default) + try { Report(); } catch (Exception error) { Log(error); } finally { + Stop(); + } + + // RESULT OF JOIN (node "local_function_statement", preset default) + void Shift(int gear, bool force, string reason) { } + + // RESULT OF SPLIT (node "local_function_statement", preset default) + void Shift( + int gear, + bool force, + string reason + ) { } + } +}