diff --git a/runtime/queries/bash/indents.scm b/runtime/queries/bash/indents.scm index 7dbf46c5..e4a4deb1 100644 --- a/runtime/queries/bash/indents.scm +++ b/runtime/queries/bash/indents.scm @@ -4,9 +4,15 @@ (for_statement) (while_statement) (case_statement) + (case_item) (pipeline) ] @indent [ "}" + "fi" + "elif" + "else" + "done" + "esac" ] @outdent diff --git a/runtime/queries/perl/indents.scm b/runtime/queries/perl/indents.scm index 03318243..d89ef270 100644 --- a/runtime/queries/perl/indents.scm +++ b/runtime/queries/perl/indents.scm @@ -1,10 +1,8 @@ [ (block) - (conditional_statement) (loop_statement) (cstyle_for_statement) (for_statement) - (elsif) (array_element_expression) (hash_element_expression) (coderef_call_expression) diff --git a/runtime/queries/toml/indents.scm b/runtime/queries/toml/indents.scm new file mode 100644 index 00000000..ae38fd07 --- /dev/null +++ b/runtime/queries/toml/indents.scm @@ -0,0 +1,11 @@ +; TOML keeps table/array-of-table bodies flat (keys at column 0), so only +; multi-line value arrays and inline tables indent; their closers dedent. +[ + (array) + (inline_table) +] @indent + +[ + "]" + "}" +] @outdent diff --git a/runtime/queries/xml/indents.scm b/runtime/queries/xml/indents.scm index d756debb..52326ce2 100644 --- a/runtime/queries/xml/indents.scm +++ b/runtime/queries/xml/indents.scm @@ -1 +1,2 @@ (element) @indent +(end_tag) @outdent diff --git a/tests/indent/bash.sh b/tests/indent/bash.sh new file mode 100644 index 00000000..4ff0f6ab --- /dev/null +++ b/tests/indent/bash.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +greet() { + local name="$1" + echo "hello, $name" +} + +if [ -d "$HOME" ]; then + echo "home exists" +elif [ -f /etc/passwd ]; then + echo "passwd" +else + echo "neither" +fi + +for f in a b c; do + echo "$f" +done + +while read -r line; do + echo "$line" +done + +case "$1" in + start) + echo "starting" + ;; + *) + echo "usage" + ;; +esac diff --git a/tests/indent/cairo.cairo b/tests/indent/cairo.cairo new file mode 100644 index 00000000..11f60d91 --- /dev/null +++ b/tests/indent/cairo.cairo @@ -0,0 +1,12 @@ +fn add(a: u64, b: u64) -> u64 { + let sum = a + b; + match sum { + 0 => 0, + _ => sum, + } +} + +struct Point { + x: u64, + y: u64, +} diff --git a/tests/indent/clojure.clj b/tests/indent/clojure.clj index ab897767..1e9193c6 100644 --- a/tests/indent/clojure.clj +++ b/tests/indent/clojure.clj @@ -1,2 +1,12 @@ (defn process [items] (reduce + 0 items)) + +(let [a 1 + b 2] + (+ a b)) + +(loop [i 0] + (recur (inc i))) + +(println "first" + "aligned-to-first") diff --git a/tests/indent/cpon.cpon b/tests/indent/cpon.cpon new file mode 100644 index 00000000..5b73ed6c --- /dev/null +++ b/tests/indent/cpon.cpon @@ -0,0 +1,10 @@ +{ + "name": "helix", + "nested": { + "enabled": true + }, + "list": [ + 1, + 2 + ] +} diff --git a/tests/indent/hocon.conf b/tests/indent/hocon.conf new file mode 100644 index 00000000..5fa5db12 --- /dev/null +++ b/tests/indent/hocon.conf @@ -0,0 +1,18 @@ +app { + name = "helix" + server { + host = "localhost" + ports = [ + 80, + 443 + ] + } + list = [ + { + id = 1 + }, + { + id = 2 + } + ] +} diff --git a/tests/indent/json.json b/tests/indent/json.json new file mode 100644 index 00000000..b561108e --- /dev/null +++ b/tests/indent/json.json @@ -0,0 +1,37 @@ +{ + "name": "helix", + "version": 1, + "nested": { + "enabled": true, + "deep": { + "value": null + } + }, + "list": [ + 1, + 2, + 3 + ], + "objects": [ + { + "id": 1, + "tags": [ + "a", + "b" + ] + }, + { + "id": 2 + } + ], + "matrix": [ + [ + 1, + 2 + ], + [ + 3, + 4 + ] + ] +} diff --git a/tests/indent/json5.json5 b/tests/indent/json5.json5 index b0f61c96..95eb89b7 100644 --- a/tests/indent/json5.json5 +++ b/tests/indent/json5.json5 @@ -1,10 +1,37 @@ { + // unquoted keys, trailing commas, comments name: "test", + version: 1.0, nested: { value: 1, + deeper: { + flag: true, + }, }, list: [ 1, 2, ], + objects: [ + { + id: 1, + tags: [ + "a", + "b", + ], + }, + { + id: 2, + }, + ], + matrix: [ + [ + 1, + 2, + ], + [ + 3, + 4, + ], + ], } diff --git a/tests/indent/jsonc.jsonc b/tests/indent/jsonc.jsonc new file mode 100644 index 00000000..9e31da20 --- /dev/null +++ b/tests/indent/jsonc.jsonc @@ -0,0 +1,20 @@ +{ + // a line comment + "name": "helix", + "build": { + "target": "release", + /* an inline block comment */ + "flags": [ + "-O2", + "-g" + ] + }, + "servers": [ + { + "name": "rust-analyzer", + "config": { + "checkOnSave": true + } + } + ] +} diff --git a/tests/indent/latex.tex b/tests/indent/latex.tex new file mode 100644 index 00000000..fa950554 --- /dev/null +++ b/tests/indent/latex.tex @@ -0,0 +1,9 @@ +\documentclass{article} +\begin{document} + \section{Intro} + Some text. + \begin{itemize} + \item one + \item two + \end{itemize} +\end{document} diff --git a/tests/indent/make.mk b/tests/indent/make.mk new file mode 100644 index 00000000..92b47a3c --- /dev/null +++ b/tests/indent/make.mk @@ -0,0 +1,7 @@ +CC = gcc + +all: foo bar + $(CC) -o app foo.o bar.o + +foo.o: foo.c + $(CC) -c foo.c diff --git a/tests/indent/nim.nim b/tests/indent/nim.nim new file mode 100644 index 00000000..66a5152f --- /dev/null +++ b/tests/indent/nim.nim @@ -0,0 +1,20 @@ +proc greet(name: string): string = + result = "hello, " & name + +iterator items(n: int): int = + for i in 0 .. n: + yield i + +for i in 0 .. 10: + echo i + +while running: + step() + +case n +of 1: + echo "one" +of 2: + echo "two" +else: + echo "many" diff --git a/tests/indent/perl.pl b/tests/indent/perl.pl new file mode 100644 index 00000000..1bec49ca --- /dev/null +++ b/tests/indent/perl.pl @@ -0,0 +1,30 @@ +use strict; + +sub greet { + my ($name) = @_; + print "hello, $name\n"; +} + +if ($x > 0) { + print "positive\n"; +} elsif ($x < 0) { + print "negative\n"; +} else { + print "zero\n"; +} + +for my $i (0 .. 10) { + print "$i\n"; +} + +while ($n > 0) { + $n--; +} + +my $config = { + name => "helix", + list => [ + 1, + 2, + ], +}; diff --git a/tests/indent/protobuf.proto b/tests/indent/protobuf.proto new file mode 100644 index 00000000..95fe3334 --- /dev/null +++ b/tests/indent/protobuf.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +message Person { + string name = 1; + + enum PhoneType { + MOBILE = 0; + HOME = 1; + } + + oneof contact { + string email = 3; + string phone = 4; + } +} + +service AddressBook { + rpc GetPerson(PersonRequest) returns (Person) { + option idempotency_level = NO_SIDE_EFFECTS; + } +} diff --git a/tests/indent/qml.qml b/tests/indent/qml.qml new file mode 100644 index 00000000..b11bd556 --- /dev/null +++ b/tests/indent/qml.qml @@ -0,0 +1,18 @@ +import QtQuick 2.0 + +Rectangle { + width: 100 + height: 100 + + Text { + text: "hi" + anchors { + top: parent.top + left: parent.left + } + } + + Column { + spacing: 4 + } +} diff --git a/tests/indent/ron.ron b/tests/indent/ron.ron index efc6967d..cb982981 100644 --- a/tests/indent/ron.ron +++ b/tests/indent/ron.ron @@ -1,7 +1,18 @@ Config( - name: "test", + name: "helix", values: [ 1, 2, ], + nested: Inner( + enabled: true, + map: { + "a": 1, + "b": 2, + }, + ), + pair: ( + 1, + "two", + ), ) diff --git a/tests/indent/scheme.scm b/tests/indent/scheme.scm index 9ee56ca8..f37e5c20 100644 --- a/tests/indent/scheme.scm +++ b/tests/indent/scheme.scm @@ -1,2 +1,9 @@ (define (process items) (fold-left + 0 items)) + +(let ((a 1) + (b 2)) + (+ a b)) + +(display "first" + "second") diff --git a/tests/indent/sway.sw b/tests/indent/sway.sw new file mode 100644 index 00000000..5f4175d6 --- /dev/null +++ b/tests/indent/sway.sw @@ -0,0 +1,14 @@ +script; + +struct Point { + x: u64, + y: u64, +} + +fn add(a: u64, b: u64) -> u64 { + let sum = a + b; + match sum { + 0 => 0, + _ => sum, + } +} diff --git a/tests/indent/textproto.textproto b/tests/indent/textproto.textproto new file mode 100644 index 00000000..e6f159c2 --- /dev/null +++ b/tests/indent/textproto.textproto @@ -0,0 +1,10 @@ +name: "helix" +id: 42 +nested { + enabled: true + values: 1 +} +list: [ + 1, + 2 +] diff --git a/tests/indent/toml.toml b/tests/indent/toml.toml new file mode 100644 index 00000000..053db579 --- /dev/null +++ b/tests/indent/toml.toml @@ -0,0 +1,38 @@ +title = "example" +version = 2 + +[package] +name = "helix" +edition = "2021" + +[dependencies] +serde = "1.0" +features = [ + "derive", + "rc", +] +matrix = [ + [ + 1, + 2, + ], + [ + 3, + 4, + ], +] + +[nested.table] +enabled = true +point = { x = 1, y = 2 } +servers = [ + { name = "a", port = 1 }, + { name = "b", port = 2 }, +] + +[[bin]] +name = "hx" +path = "src/main.rs" + +[[bin]] +name = "xtask" diff --git a/tests/indent/xml.xml b/tests/indent/xml.xml new file mode 100644 index 00000000..fe5ac4a5 --- /dev/null +++ b/tests/indent/xml.xml @@ -0,0 +1,11 @@ + + + text + + + a + b + + + +