aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorConnor Lay (Clay) <connorlay@pm.me>2022-02-12 15:12:05 -0800
committerStephan Seitz <stephan.seitz@fau.de>2022-02-15 19:01:02 +0100
commitb62750e328e9595b34a30db2d03a30f0f983776c (patch)
treec1755f061ed7f1b0e9f461a32b2134619bbb00ee
parentHighlight Gleam bitstrings (diff)
downloadnvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar.gz
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar.bz2
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar.lz
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar.xz
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.tar.zst
nvim-treesitter-b62750e328e9595b34a30db2d03a30f0f983776c.zip
Gleam indentation tests
-rw-r--r--queries/gleam/indents.scm12
-rw-r--r--scripts/minimal_init.lua1
-rw-r--r--tests/indent/gleam/assert.gleam4
-rw-r--r--tests/indent/gleam/binary_expression.gleam4
-rw-r--r--tests/indent/gleam/case.gleam10
-rw-r--r--tests/indent/gleam/constant.gleam2
-rw-r--r--tests/indent/gleam/function.gleam15
-rw-r--r--tests/indent/gleam/import.gleam4
-rw-r--r--tests/indent/gleam/let.gleam4
-rw-r--r--tests/indent/gleam/list.gleam11
-rw-r--r--tests/indent/gleam/pipe.gleam4
-rw-r--r--tests/indent/gleam/todo.gleam5
-rw-r--r--tests/indent/gleam/try.gleam7
-rw-r--r--tests/indent/gleam/tuple.gleam11
-rw-r--r--tests/indent/gleam/type.gleam18
-rw-r--r--tests/indent/gleam_spec.lua127
16 files changed, 239 insertions, 0 deletions
diff --git a/queries/gleam/indents.scm b/queries/gleam/indents.scm
index e795ea09e..e2259b688 100644
--- a/queries/gleam/indents.scm
+++ b/queries/gleam/indents.scm
@@ -1,16 +1,25 @@
; Gleam indents similar to Rust and JavaScript
[
+ (assert)
(case)
(case_clause)
(constant)
(expression_group)
+ (external_function)
(function)
+ (import)
(let)
(list)
+ (public_constant)
+ (public_external_function)
(public_function)
(public_opaque_type_definition)
+ (public_type_alias)
(public_type_definition)
+ (todo)
+ (try)
(tuple)
+ (type_alias)
(type_definition)
] @indent
@@ -19,3 +28,6 @@
"]"
"}"
] @indent_end @branch
+
+; Gleam pipelines are not indented, but other binary expression chains are
+((binary_expression operator: _ @_operator) @indent (#not-eq? @_operator "|>"))
diff --git a/scripts/minimal_init.lua b/scripts/minimal_init.lua
index 1c57ee538..8a6a8506a 100644
--- a/scripts/minimal_init.lua
+++ b/scripts/minimal_init.lua
@@ -3,6 +3,7 @@ vim.cmd [[runtime! plugin/plenary.vim]]
vim.cmd [[runtime! plugin/nvim-treesitter.vim]]
vim.cmd [[au BufRead,BufNewFile *.conf set filetype=hocon]]
+vim.cmd [[au BufRead,BufNewFile *.gleam set filetype=gleam]]
vim.o.swapfile = false
vim.bo.swapfile = false
diff --git a/tests/indent/gleam/assert.gleam b/tests/indent/gleam/assert.gleam
new file mode 100644
index 000000000..2b2114628
--- /dev/null
+++ b/tests/indent/gleam/assert.gleam
@@ -0,0 +1,4 @@
+pub fn main() {
+ assert Ok(i) =
+ parse_int("123")
+}
diff --git a/tests/indent/gleam/binary_expression.gleam b/tests/indent/gleam/binary_expression.gleam
new file mode 100644
index 000000000..6f59bc4f1
--- /dev/null
+++ b/tests/indent/gleam/binary_expression.gleam
@@ -0,0 +1,4 @@
+pub fn main() {
+ True &&
+ False
+}
diff --git a/tests/indent/gleam/case.gleam b/tests/indent/gleam/case.gleam
new file mode 100644
index 000000000..60238ce42
--- /dev/null
+++ b/tests/indent/gleam/case.gleam
@@ -0,0 +1,10 @@
+pub fn main() {
+ case 1 {
+ 1 -> "One"
+ 2 -> {
+ case 2 {
+ 2 -> "Two"
+ }
+ }
+ }
+}
diff --git a/tests/indent/gleam/constant.gleam b/tests/indent/gleam/constant.gleam
new file mode 100644
index 000000000..6a38ba6c8
--- /dev/null
+++ b/tests/indent/gleam/constant.gleam
@@ -0,0 +1,2 @@
+pub const foo =
+ "bar"
diff --git a/tests/indent/gleam/function.gleam b/tests/indent/gleam/function.gleam
new file mode 100644
index 000000000..60c22777d
--- /dev/null
+++ b/tests/indent/gleam/function.gleam
@@ -0,0 +1,15 @@
+import gleam/io
+
+pub fn main() {
+ io.println("Hello from main!")
+}
+
+fn hidden() {
+ io.println("Hello from hidden!")
+}
+
+pub external fn inspect(a) -> a =
+ "Elixir.IO" "inspect"
+
+external fn inspect(a) -> a =
+ "Elixir.IO" "inspect"
diff --git a/tests/indent/gleam/import.gleam b/tests/indent/gleam/import.gleam
new file mode 100644
index 000000000..c334bf995
--- /dev/null
+++ b/tests/indent/gleam/import.gleam
@@ -0,0 +1,4 @@
+import foo.{
+ Bar,
+ baz,
+}
diff --git a/tests/indent/gleam/let.gleam b/tests/indent/gleam/let.gleam
new file mode 100644
index 000000000..532b3f6fe
--- /dev/null
+++ b/tests/indent/gleam/let.gleam
@@ -0,0 +1,4 @@
+pub fn main() {
+ let string =
+ "string"
+}
diff --git a/tests/indent/gleam/list.gleam b/tests/indent/gleam/list.gleam
new file mode 100644
index 000000000..d6da4da34
--- /dev/null
+++ b/tests/indent/gleam/list.gleam
@@ -0,0 +1,11 @@
+pub fn main() {
+ [
+ a,
+ ..[
+ b,
+ ..[
+ c,
+ ]
+ ]
+ ]
+}
diff --git a/tests/indent/gleam/pipe.gleam b/tests/indent/gleam/pipe.gleam
new file mode 100644
index 000000000..8d38bb9c9
--- /dev/null
+++ b/tests/indent/gleam/pipe.gleam
@@ -0,0 +1,4 @@
+pub fn main() {
+ one()
+ |> two()
+}
diff --git a/tests/indent/gleam/todo.gleam b/tests/indent/gleam/todo.gleam
new file mode 100644
index 000000000..407a85aef
--- /dev/null
+++ b/tests/indent/gleam/todo.gleam
@@ -0,0 +1,5 @@
+pub fn main() {
+ todo(
+ "Foo"
+ )
+}
diff --git a/tests/indent/gleam/try.gleam b/tests/indent/gleam/try.gleam
new file mode 100644
index 000000000..b5f6d2cd1
--- /dev/null
+++ b/tests/indent/gleam/try.gleam
@@ -0,0 +1,7 @@
+pub fn main() {
+ try int_a =
+ parse_int(a)
+ try int_b =
+ parse_int(b)
+ Ok(int_a + int_b)
+}
diff --git a/tests/indent/gleam/tuple.gleam b/tests/indent/gleam/tuple.gleam
new file mode 100644
index 000000000..d58303540
--- /dev/null
+++ b/tests/indent/gleam/tuple.gleam
@@ -0,0 +1,11 @@
+pub fn main() {
+ #(
+ a,
+ #(
+ b,
+ #(
+ c
+ )
+ )
+ )
+}
diff --git a/tests/indent/gleam/type.gleam b/tests/indent/gleam/type.gleam
new file mode 100644
index 000000000..bbe75f64f
--- /dev/null
+++ b/tests/indent/gleam/type.gleam
@@ -0,0 +1,18 @@
+pub type Cat {
+ Cat(name: String, cuteness: Int)
+}
+
+type User {
+ LoggedIn(name: String)
+ Guest
+}
+
+pub opaque type Counter {
+ Counter(value: Int)
+}
+
+pub type Headers =
+ List(#(String, String))
+
+type Headers =
+ List(#(String, String))
diff --git a/tests/indent/gleam_spec.lua b/tests/indent/gleam_spec.lua
new file mode 100644
index 000000000..1b3cbd8a9
--- /dev/null
+++ b/tests/indent/gleam_spec.lua
@@ -0,0 +1,127 @@
+local Runner = require("tests.indent.common").Runner
+
+local run = Runner:new(it, "tests/indent/gleam", {
+ tabstop = 2,
+ shiftwidth = 2,
+ softtabstop = 2,
+ expandtab = true,
+})
+
+describe("indent Gleam:", function()
+ describe("whole file:", function()
+ run:whole_file "."
+ end)
+ describe("new line:", function()
+ run:new_line("type.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 2, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 3, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 4, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 5, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 6, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 7, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 8, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 9, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 10, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 11, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 12, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 13, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 14, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 15, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 16, text = "//", indent = 0 })
+ run:new_line("type.gleam", { on_line = 17, text = "//", indent = 2 })
+ run:new_line("type.gleam", { on_line = 18, text = "//", indent = 0 })
+
+ run:new_line("function.gleam", { on_line = 1, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 2, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 3, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 4, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 5, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 6, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 7, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 8, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 9, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 10, text = "//", indent = 0 })
+ run:new_line("function.gleam", { on_line = 11, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 12, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 13, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 14, text = "//", indent = 2 })
+ run:new_line("function.gleam", { on_line = 15, text = "//", indent = 2 })
+
+ run:new_line("list.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("list.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("list.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("list.gleam", { on_line = 4, text = "//", indent = 6 })
+ run:new_line("list.gleam", { on_line = 5, text = "//", indent = 6 })
+ run:new_line("list.gleam", { on_line = 6, text = "//", indent = 8 })
+ run:new_line("list.gleam", { on_line = 7, text = "//", indent = 8 })
+ run:new_line("list.gleam", { on_line = 8, text = "//", indent = 6 })
+ run:new_line("list.gleam", { on_line = 9, text = "//", indent = 4 })
+ run:new_line("list.gleam", { on_line = 10, text = "//", indent = 2 })
+ run:new_line("list.gleam", { on_line = 11, text = "//", indent = 0 })
+
+ run:new_line("tuple.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("tuple.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("tuple.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("tuple.gleam", { on_line = 4, text = "//", indent = 6 })
+ run:new_line("tuple.gleam", { on_line = 5, text = "//", indent = 6 })
+ run:new_line("tuple.gleam", { on_line = 6, text = "//", indent = 8 })
+ run:new_line("tuple.gleam", { on_line = 7, text = "//", indent = 8 })
+ run:new_line("tuple.gleam", { on_line = 8, text = "//", indent = 6 })
+ run:new_line("tuple.gleam", { on_line = 9, text = "//", indent = 4 })
+ run:new_line("tuple.gleam", { on_line = 10, text = "//", indent = 2 })
+ run:new_line("tuple.gleam", { on_line = 11, text = "//", indent = 0 })
+
+ run:new_line("case.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("case.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("case.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("case.gleam", { on_line = 4, text = "//", indent = 6 })
+ run:new_line("case.gleam", { on_line = 5, text = "//", indent = 8 })
+ run:new_line("case.gleam", { on_line = 6, text = "//", indent = 8 })
+ run:new_line("case.gleam", { on_line = 7, text = "//", indent = 6 })
+ run:new_line("case.gleam", { on_line = 8, text = "//", indent = 4 })
+ run:new_line("case.gleam", { on_line = 9, text = "//", indent = 2 })
+ run:new_line("case.gleam", { on_line = 10, text = "//", indent = 0 })
+
+ run:new_line("let.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("let.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("let.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("let.gleam", { on_line = 4, text = "//", indent = 0 })
+
+ run:new_line("pipe.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("pipe.gleam", { on_line = 2, text = "//", indent = 2 })
+ run:new_line("pipe.gleam", { on_line = 3, text = "//", indent = 2 })
+ run:new_line("pipe.gleam", { on_line = 4, text = "//", indent = 0 })
+
+ run:new_line("binary_expression.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("binary_expression.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("binary_expression.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("binary_expression.gleam", { on_line = 4, text = "//", indent = 0 })
+
+ run:new_line("import.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("import.gleam", { on_line = 2, text = "//", indent = 2 })
+ run:new_line("import.gleam", { on_line = 3, text = "//", indent = 2 })
+ run:new_line("import.gleam", { on_line = 4, text = "//", indent = 0 })
+
+ run:new_line("constant.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("constant.gleam", { on_line = 2, text = "//", indent = 2 })
+
+ run:new_line("try.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("try.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("try.gleam", { on_line = 3, text = "//", indent = 2 })
+ run:new_line("try.gleam", { on_line = 4, text = "//", indent = 4 })
+ run:new_line("try.gleam", { on_line = 5, text = "//", indent = 2 })
+ run:new_line("try.gleam", { on_line = 6, text = "//", indent = 2 })
+ run:new_line("try.gleam", { on_line = 7, text = "//", indent = 0 })
+
+ run:new_line("assert.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("assert.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("assert.gleam", { on_line = 3, text = "//", indent = 2 })
+ run:new_line("assert.gleam", { on_line = 4, text = "//", indent = 0 })
+
+ run:new_line("todo.gleam", { on_line = 1, text = "//", indent = 2 })
+ run:new_line("todo.gleam", { on_line = 2, text = "//", indent = 4 })
+ run:new_line("todo.gleam", { on_line = 3, text = "//", indent = 4 })
+ run:new_line("todo.gleam", { on_line = 4, text = "//", indent = 2 })
+ run:new_line("todo.gleam", { on_line = 5, text = "//", indent = 0 })
+ end)
+end)