Skip to content

Commit

Permalink
Add indent queries for scheme (and reuse them for common-lisp & racke…
Browse files Browse the repository at this point in the history
  • Loading branch information
Triton171 authored and danillos committed Nov 21, 2023
1 parent 179280c commit d74205c
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 3 deletions.
6 changes: 3 additions & 3 deletions book/src/generated/lang-support.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
| clojure || | | `clojure-lsp` |
| cmake |||| `cmake-language-server` |
| comment || | | |
| common-lisp || | | `cl-lsp` |
| common-lisp || | | `cl-lsp` |
| cpon || || |
| cpp |||| `clangd` |
| crystal ||| | `crystalline` |
Expand Down Expand Up @@ -128,7 +128,7 @@
| python |||| `pylsp` |
| qml || || `qmlls` |
| r || | | `R` |
| racket || | | `racket` |
| racket || | | `racket` |
| regex || | | |
| rego || | | `regols` |
| rescript ||| | `rescript-language-server` |
Expand All @@ -140,7 +140,7 @@
| rust |||| `rust-analyzer` |
| sage ||| | |
| scala || || `metals` |
| scheme || | | |
| scheme || | | |
| scss || | | `vscode-css-language-server` |
| slint || || `slint-lsp` |
| smithy || | | `cs` |
Expand Down
1 change: 1 addition & 0 deletions languages.toml
Original file line number Diff line number Diff line change
Expand Up @@ -1278,6 +1278,7 @@ roots = []
file-types = ["rkt", "rktd", "rktl", "scrbl"]
shebangs = ["racket"]
comment-token = ";"
indent = { tab-width = 2, unit = " " }
language-servers = [ "racket" ]
grammar = "scheme"

Expand Down
1 change: 1 addition & 0 deletions runtime/queries/common-lisp/indents.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
; inherits: scheme
1 change: 1 addition & 0 deletions runtime/queries/racket/indents.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
; inherits: scheme
43 changes: 43 additions & 0 deletions runtime/queries/scheme/indents.scm
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
; This roughly follows the description at: https://github.com/ds26gte/scmindent#how-subforms-are-indented

; Exclude literals in the first patterns, since different rules apply for them.
; Similarly, exclude certain keywords (detected by a regular expression).
; If a list has 2 elements on the first line, it is aligned to the second element.
(list . (_) @first . (_) @anchor
(#same-line? @first @anchor)
(#set! "scope" "tail")
(#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
(#not-match? @first "def.*|let.*|set!")) @align
; If the first element in a list is also a list and on a line by itself, the outer list is aligned to it
(list . (list) @anchor .
(#set! "scope" "tail")
(#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")) @align
(list . (list) @anchor . (_) @second
(#not-same-line? @anchor @second)
(#set! "scope" "tail")
(#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
(#not-match? @first "def.*|let.*|set!")) @align
; If the first element in a list is not a list and on a line by itself, the outer list is aligned to
; it plus 1 additional space. This cannot currently be modelled exactly by our indent queries,
; but the following is equivalent, assuming that:
; - the indent width is 2 (the default for scheme)
; - There is no space between the opening parenthesis of the list and the first element
(list . (_) @first .
(#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
(#not-match? @first "def.*|let.*|set!")) @indent
(list . (_) @first . (_) @second
(#not-same-line? @first @second)
(#not-kind-eq? @first "boolean") (#not-kind-eq? @first "character") (#not-kind-eq? @first "string") (#not-kind-eq? @first "number")
(#not-match? @first "def.*|let.*|set!")) @indent

; If the first element in a list is a literal, align the list to it
(list . [(boolean) (character) (string) (number)] @anchor
(#set! "scope" "tail")) @align

; If the first element is among a set of predefined keywords, align the list to this element
; plus 1 space (using the same workaround as above for now). This is a simplification since actually
; the second line of the list should be indented by 2 spaces more in some cases. Supporting this would
; be possible but require significantly more patterns.
(list . (symbol) @first
(#match? @first "def.*|let.*|set!")) @indent

0 comments on commit d74205c

Please sign in to comment.