aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMunif Tanjim <hello@muniftanjim.dev>2022-01-21 17:11:46 +0600
committerChristian Clason <christian.clason@uni-due.de>2022-01-21 16:40:36 +0100
commit8f9d4ada354d7a64e6679b421387e600445316e1 (patch)
tree34becf3a20e630fdc1c55cbbe5595085bcd50cc0
parentfeat(indent): support `@aligned_indent` for python (diff)
downloadnvim-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.md1
-rw-r--r--lua/nvim-treesitter/indent.lua4
-rw-r--r--queries/ecma/indents.scm3
-rw-r--r--tests/indent/ecma/if_else.js13
-rw-r--r--tests/indent/ecma/try_catch.js8
-rw-r--r--tests/indent/javascript_spec.lua46
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)