Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Nickel inconsistent formatting of annotated let-bindings #744

Merged
merged 5 commits into from
Sep 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ This name should be decided amongst the team before the release.
### Fixed
- [#720](https://github.com/tweag/topiary/pull/720) [#722](https://github.com/tweag/topiary/pull/722) [#723](https://github.com/tweag/topiary/pull/723) [#724](https://github.com/tweag/topiary/pull/724) [#735](https://github.com/tweag/topiary/pull/735)
[#738](https://github.com/tweag/topiary/pull/738) [#739](https://github.com/tweag/topiary/pull/739) [#745](https://github.com/tweag/topiary/pull/745) Various OCaml improvements
- [#744](https://github.com/tweag/topiary/pull/744) Nickel: fix the indentation of `in` for annotated multiline let-bindings

### Changed
- [#704](https://github.com/tweag/topiary/pull/704) Refactors our postprocessing code to be more versatile.
Expand Down
15 changes: 14 additions & 1 deletion topiary-cli/tests/samples/expected/nickel.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,20 @@
1
else
3
)
),

# regression test for https://github.com/tweag/topiary/issues/743
# (partially fixed)
let foo
| Number
= [
1,
2,
3
]
in
foo
@ [],
],

# Nickel standard library as of 44aef1672a09a76a71946fbf822713747ab7b9df
Expand Down
16 changes: 15 additions & 1 deletion topiary-cli/tests/samples/input/nickel.ncl
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,21 @@ bar == 'Goodbye
if x == 1 then
1
else
3)
3),

# regression test for https://github.com/tweag/topiary/issues/743
# (partially fixed)
let foo
| Number
=
[
1,
2,
3
]
in
foo
@ [],
],

# Nickel standard library as of 44aef1672a09a76a71946fbf822713747ab7b9df
Expand Down
77 changes: 64 additions & 13 deletions topiary-queries/queries/nickel.scm
Original file line number Diff line number Diff line change
Expand Up @@ -318,19 +318,15 @@

;; Annotations

; Start an indentation block from the start of the annotations to the
; end of the enclosing node
(_
(annot) @prepend_indent_start
) @append_indent_end

; Start a scope from the node previous to the annotations.
; This properly checks if the annotations were intended to be
; on newlines in such cases as:
; Start a scope from the node previous to the annotations. This properly checks
; if the annotations were intended to be on newlines in such cases as:
;
; id
; | a -> a
;
; which, without the annotations scope, would consider the annotations to be a
; single line node and format it as such:
;
; id | a -> a
(
(#scope_id! "annotations")
Expand All @@ -339,17 +335,72 @@
(annot) @append_end_scope
)

; Put each annotation -- and the equals sign, if it follows annotations
; -- on a new line, in a multi-line context.
; Put each annotation on a new line, in a multi-line context.
(annot
(#scope_id! "annotations")
(annot_atom) @prepend_spaced_scoped_softline
)

; Add a new line before the last annotation and the following equal sign.
;
; [^annotations-followed-by-eq]: Ideally, we would like to add this new
; line for multi-line annotations only. That is, we would like to have the
; following formatting:
;
; let foo
; | Array Number
; | doc "hello"
; = [
; 1,
; 2,
; ]
; in ...
;
; But
;
; let foo | Array Number = [
; 1,
; 2,
; ]
; in ...
;
; While adding a scoped line isn't an issue, note that in the examples above,
; the indentation of what comes after the `=` sign depends on the multi-liness
; of the annotations (and thus of the multiliness of the "annotations" scope).
; However, the RHS isn't part of this scope (and we don't want it to be).
; Unfortunately, this can't be achieved in current Topiary.
;
; In the meantime, we always put the `=` sign a new line, whether in single-line
; or multi-line mode, and always indent the RHS further in presence of
; annotations. This give the following formatting for the second example:
;
; let foo | Array Number
; = [
; 1,
; 2,
; ]
; in ...
;
; which isn't optimal but still acceptable.
(
(annot)
(annot) @append_spaced_softline
.
"=" @prepend_spaced_softline
"="
)

; Indent the annotations with respect to the identifier they annotate.
(
(annot) @prepend_indent_start @append_indent_end
)

; Indent the RHS of the let-binding in presence of annotations.
;
; Ideally, we would like to indent only when annotations are multi-line, but
; this isn't current possible; see [^annotations-followed-by-eq].
(_
(annot) @append_indent_start
"="
(term) @append_indent_end
)

; Break a multi-line polymorphic type annotation after the type
Expand Down
Loading