diff options
| author | Munif Tanjim <hello@muniftanjim.dev> | 2022-01-21 17:11:46 +0600 |
|---|---|---|
| committer | Christian Clason <christian.clason@uni-due.de> | 2022-01-21 16:40:36 +0100 |
| commit | 8f9d4ada354d7a64e6679b421387e600445316e1 (patch) | |
| tree | 34becf3a20e630fdc1c55cbbe5595085bcd50cc0 | |
| parent | feat(indent): support `@aligned_indent` for python (diff) | |
| download | nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar.gz nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar.bz2 nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar.lz nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar.xz nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.tar.zst nvim-treesitter-8f9d4ada354d7a64e6679b421387e600445316e1.zip | |
feat(indent): ecma - support try_catch and if_else
| -rw-r--r-- | CONTRIBUTING.md | 1 | ||||
| -rw-r--r-- | lua/nvim-treesitter/indent.lua | 4 | ||||
| -rw-r--r-- | queries/ecma/indents.scm | 3 | ||||
| -rw-r--r-- | tests/indent/ecma/if_else.js | 13 | ||||
| -rw-r--r-- | tests/indent/ecma/try_catch.js | 8 | ||||
| -rw-r--r-- | tests/indent/javascript_spec.lua | 46 |
6 files changed, 75 insertions, 0 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41ff549a5..6b40f6e3e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -270,6 +270,7 @@ the node describing the language and `@content` to describe the injection region ``` @indent ; Indent children when matching this node +@indent_end ; Marks the end of indented block @aligned_indent ; Behaves like python aligned/hanging indent @dedent ; Dedent children when matching this node @branch ; Dedent itself when matching this node diff --git a/lua/nvim-treesitter/indent.lua b/lua/nvim-treesitter/indent.lua index 92dab1587..eca649b23 100644 --- a/lua/nvim-treesitter/indent.lua +++ b/lua/nvim-treesitter/indent.lua @@ -31,6 +31,7 @@ local get_indents = tsutils.memoize_by_buf_tick(function(bufnr, root, lang) local map = { auto = {}, indent = {}, + indent_end = {}, dedent = {}, branch = {}, ignore = {}, @@ -70,6 +71,9 @@ function M.get_indent(lnum) if is_empty_line then local prevlnum = vim.fn.prevnonblank(lnum) node = get_last_node_at_line(root, prevlnum) + if q.indent_end[node:id()] then + node = get_first_node_at_line(root, lnum) + end else node = get_first_node_at_line(root, lnum) end diff --git a/queries/ecma/indents.scm b/queries/ecma/indents.scm index 9fdcc4f67..6b8f0ff0d 100644 --- a/queries/ecma/indents.scm +++ b/queries/ecma/indents.scm @@ -16,6 +16,9 @@ (switch_case) ] @indent + +(statement_block "}" @indent_end) + [ (arguments (object)) "(" diff --git a/tests/indent/ecma/if_else.js b/tests/indent/ecma/if_else.js new file mode 100644 index 000000000..4f971c8fc --- /dev/null +++ b/tests/indent/ecma/if_else.js @@ -0,0 +1,13 @@ +if (cond1) { + do_1() + + if (cond1a) { + do_1a() + } else { + do_1_fallback() + } +} else if (cond2) { + do_2() +} else { + do_fallback() +} diff --git a/tests/indent/ecma/try_catch.js b/tests/indent/ecma/try_catch.js new file mode 100644 index 000000000..b5e9f85cc --- /dev/null +++ b/tests/indent/ecma/try_catch.js @@ -0,0 +1,8 @@ +try { + throw Error() +} catch (err) { + throw error +} finally { + console.log("42") +} + diff --git a/tests/indent/javascript_spec.lua b/tests/indent/javascript_spec.lua new file mode 100644 index 000000000..889e59fdb --- /dev/null +++ b/tests/indent/javascript_spec.lua @@ -0,0 +1,46 @@ +local Runner = require("tests.indent.common").Runner +-- local XFAIL = require("tests.indent.common").XFAIL + +local run = Runner:new(it, "tests/indent", { + tabstop = 2, + shiftwidth = 2, + softtabstop = 0, + expandtab = true, + filetype = "javascript", +}) + +describe("indent JavaScript:", function() + describe("whole file:", function() + run:whole_file({ "ecma/" }, { + expected_failures = {}, + }) + end) + + describe("new line:", function() + for _, info in ipairs { + { 1, 2 }, + { 2, 2 }, + { 3, 2 }, + { 4, 2 }, + { 5, 2 }, + { 6, 2 }, + { 7, 0 }, + } do + run:new_line("ecma/try_catch.js", { on_line = info[1], text = "hello()", indent = info[2] }) + end + + for _, info in ipairs { + { 1, 2 }, + { 2, 2 }, + { 3, 2 }, + { 5, 4 }, + { 6, 4 }, + { 8, 2 }, + { 9, 2 }, + { 12, 2 }, + { 13, 0 }, + } do + run:new_line("ecma/if_else.js", { on_line = info[1], text = "hello()", indent = info[2] }) + end + end) +end) |
