[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode 7a8f714 139/385: indent back to the same
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode 7a8f714 139/385: indent back to the same level of `do' |
Date: |
Tue, 5 Oct 2021 23:59:17 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit 7a8f7140af71c0e201bf6ee7e02083c8023448c2
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
indent back to the same level of `do'
---
haskell-tng-smie.el | 43 +++++++++++------
test/src/indentation.hs | 34 ++++++++------
test/src/indentation.hs.insert.indent | 88 ++++++++++++++++++++---------------
test/src/indentation.hs.layout | 34 ++++++++------
test/src/indentation.hs.lexer | 6 +++
test/src/indentation.hs.reindent | 48 ++++++++++++-------
test/src/indentation.hs.sexps | 34 ++++++++------
7 files changed, 174 insertions(+), 113 deletions(-)
diff --git a/haskell-tng-smie.el b/haskell-tng-smie.el
index 9fac90d..8caab9f 100644
--- a/haskell-tng-smie.el
+++ b/haskell-tng-smie.el
@@ -20,8 +20,7 @@
;; on the side of "staying at the same level" (not escaping or closing a
;; previous line) when we can.
;;
-;; Users may consult the SMIE manual to customise their indentation rules:
-;; https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#SMIE
+;; All the good ideas are from Stefan Monnier, all the bad ones are mine.
;;
;;; Code:
@@ -34,6 +33,9 @@
;; https://www.haskell.org/onlinereport/haskell2010/haskellch3.html
;; https://gitlab.haskell.org/ghc/ghc/blob/master/compiler/parser/Parser.y
;;
+;; See also the documentation for `smie-bnf->prec2' which tends to be more up
to
+;; date.
+;;
;; Many of these grammar rules cannot be expressed in SMIE because Haskell uses
;; whitespace separators a lot, whereas the BNF must use non-terminals.
;;
@@ -115,12 +117,15 @@ information, to aid in the creation of new rules."
;;
https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#SMIE-Indentation
;;
+;; See also the documentation for `smie-rules-function', which tends to be more
+;; up to date.
+;;
;; The concept of "virtual indentation" can be confusing. This function is
;; called multiple times for a single indentation command. `:before' does not
-;; always mean that we are indenting the next token, but could be a request for
-;; the virtual indentation of the previous token. For example, consider a `do'
-;; block, we will get an `:after' and a `:before' on the `do' which may be at
-;; column 20 but virtually at column 0.
+;; mean that we are indenting the next token, but is a request for the virtual
+;; indentation of that token. For example, consider a `do' block, we may get an
+;; `:after' and a `:before' for `do' which may be at column 20 but virtually at
+;; column 0.
(defun haskell-tng-smie:rules (method arg)
;; see docs for `smie-rules-function'
(when haskell-tng-smie:debug
@@ -133,22 +138,28 @@ information, to aid in the creation of new rules."
(:elem
(pcase arg
- ((or 'empty-line-token 'args) 0)
- ('basic 0)
+ ((or 'args 'basic) 0)
+
+ ;; TODO consult a local table, populated by an external tool, containing
+ ;; the parameter requirements for function calls. For simple cases, we
+ ;; should be able to infer if the user wants to terminate ; or continue
+ ;; "" the current line.
+ ;;
+ ;; TODO if there is already an empty lines before here, perhaps best to
+ ;; close out the indentation with a }.
+ ('empty-line-token ";")
))
- ;; It looks like all patterns of the form
+ ;; Patterns of the form
;;
;; {TOKEN TOKEN HEAD ; A ; B ; ...}
;;
- ;; are showing up as `:list-intro "HEAD"` in positions A and B.
+ ;; get called with `:list-intro "HEAD"` when indenting positions A and B.
(:list-intro
- ;; TODO could consult a local table that is populated by an external tool
- ;; containing the parameter requirements for function calls to let us know
- ;; if it's a single statement or many.
(pcase arg
- ;; TODO this is a hack to workaround broken list detection
- ((or "CONID" "VARID" "}" "<-" "=") t)
+ ;; TODO work out why we need these list-intro rules. Re-indentation of
+ ;; continued lines in WLDOs don't behave as expected without.
+ ((or "<-" "=") t)
))
(:after
@@ -226,6 +237,8 @@ current line."
(looking-at
(rx (* space) (| "where" "let" "do") word-end)))
(push (current-indentation) relevant))
+ ;; TODO when there is a <- add its close +4 (possibly just for the
+ ;; immediately previous line).
(forward-line))
(goto-char start)
(while (< (point) bound)
diff --git a/test/src/indentation.hs b/test/src/indentation.hs
index 8c98baa..7dd8dab 100644
--- a/test/src/indentation.hs
+++ b/test/src/indentation.hs
@@ -1,6 +1,12 @@
-- | Idealised indentation scenarios.
--
-- Bugs and unexpected behaviour in (re-)indentation may be documented here.
+--
+-- Lines marked "manual correction" indicate where we expect the user to
+-- re-indent because it goes against our prediction. In some of these cases,
+-- we could improve the guess with semantic information (e.g. if we know that
+-- the RHS of a bind is only partially applied, then we probably mean to
+-- continue that line instead of start a new one).
module Indentation where
import Foo.Bar
@@ -10,30 +16,30 @@ import Foo.Baz hiding ( gaz,
basic_do = do
foo <- blah blah blah
- bar <- blah blah -- TODO same level as foo
- blah -- TODO manual correction
- blah -- continue the blah
- sideeffect -- manual correction
+ bar <- blah blah
+ blah -- manual correction
+ blah -- manual correction
+ sideeffect
sideeffect' blah
let baz = blah blah
- blah -- TODO manual correction
- gaz = blah -- TODO same level as baz
- haz = -- TODO same level as gaz
+ blah -- manual correction
+ gaz = blah
+ haz =
blah
pure faz -- manual correction
-nested_do =
+nested_do = -- manual correction
do foo <- blah
- do bar <- blah -- TODO same level as foo
- baz -- TODO same level as bar
+ do bar <- blah -- same level as foo
+ baz -- same level as bar
nested_where a b = foo a b
where -- TODO 2
- foo = bar baz -- TODO indented
- baz = blah blah -- TODO same level as foo
+ foo = bar baz -- indented
+ baz = blah blah -- same level as foo
where -- manual correction
- gaz a = blah -- TODO indented
- faz = blah -- TODO same level as gaz
+ gaz a = blah -- indented
+ faz = blah -- same level as gaz
-- TODO case statements
-- TODO let / in
diff --git a/test/src/indentation.hs.insert.indent
b/test/src/indentation.hs.insert.indent
index 6766ce4..442c096 100644
--- a/test/src/indentation.hs.insert.indent
+++ b/test/src/indentation.hs.insert.indent
@@ -4,6 +4,18 @@ v
v
-- Bugs and unexpected behaviour in (re-)indentation may be documented here.
v
+--
+v
+-- Lines marked "manual correction" indicate where we expect the user to
+v
+-- re-indent because it goes against our prediction. In some of these cases,
+v
+-- we could improve the guess with semantic information (e.g. if we know that
+v
+-- the RHS of a bind is only partially applied, then we probably mean to
+v
+-- continue that line instead of start a new one).
+v
module Indentation where
v
@@ -21,70 +33,70 @@ v 1 2
basic_do = do
1 v
foo <- blah blah blah
-2 1 v
- bar <- blah blah -- TODO same level as foo
-2 1 v
- blah -- TODO manual correction
-1 2 v
- blah -- continue the blah
-2 1 v
- sideeffect -- manual correction
+1 v
+ bar <- blah blah
+2 v 1
+ blah -- manual correction
+2 v 1
+ blah -- manual correction
+2 v 1
+ sideeffect
1 v 2
sideeffect' blah
2 v 1 3
let baz = blah blah
-3 2 1 4 v
- blah -- TODO manual correction
-2 3 1 4 v
- gaz = blah -- TODO same level as baz
-2 3 1 4 v
- haz = -- TODO same level as gaz
+3 1 v 4 2
+ blah -- manual correction
+2 3 v 4 1
+ gaz = blah
+1 2 v 3 4
+ haz =
2 3 1 v4 5
blah
-2 1 3 v4 5
+3 2 v 14 5
pure faz -- manual correction
1 v 2 34 5
1 v 2 34 5
-nested_do =
+nested_do = -- manual correction
1 v 2
do foo <- blah
-3 1 2 v
- do bar <- blah -- TODO same level as foo
-3 2 1 v
- baz -- TODO same level as bar
+2 v 1
+ do bar <- blah -- same level as foo
+2 1 v
+ baz -- same level as bar
1 2 v
1 2 v
nested_where a b = foo a b
-1 v
+v
where -- TODO 2
1 v
- foo = bar baz -- TODO indented
-2 1 v
- baz = blah blah -- TODO same level as foo
-2 1 v
+ foo = bar baz -- indented
+1 v
+ baz = blah blah -- same level as foo
+1 v
where -- manual correction
1 2 v
- gaz a = blah -- TODO indented
-2 3 1 v
- faz = blah -- TODO same level as gaz
-2 3 1 v
+ gaz a = blah -- indented
+1 2 v
+ faz = blah -- same level as gaz
+1 2 v
-1 2 3 v
+1 2 v
-- TODO case statements
-1 2 3 v
+1 2 v
-- TODO let / in
-1 2 3 v
+1 2 v
-1 2 3 v
+1 2 v
-- TODO coproduct definitions, the | should align with =
-1 2 3 v
+1 2 v
-1 2 3 v
+1 2 v
-- TODO lists, records, tuples
-1 2 3 v
+1 2 v
-1 2 3 v
+1 2 v
-- TODO long type signatures vs definitions
-1 2 3 v
\ No newline at end of file
+1 2 v
\ No newline at end of file
diff --git a/test/src/indentation.hs.layout b/test/src/indentation.hs.layout
index 8ae3b00..2c5f03d 100644
--- a/test/src/indentation.hs.layout
+++ b/test/src/indentation.hs.layout
@@ -1,6 +1,12 @@
-- | Idealised indentation scenarios.
--
-- Bugs and unexpected behaviour in (re-)indentation may be documented here.
+--
+-- Lines marked "manual correction" indicate where we expect the user to
+-- re-indent because it goes against our prediction. In some of these cases,
+-- we could improve the guess with semantic information (e.g. if we know that
+-- the RHS of a bind is only partially applied, then we probably mean to
+-- continue that line instead of start a new one).
module Indentation where
{import Foo.Bar
@@ -10,30 +16,30 @@ module Indentation where
;basic_do = do
{foo <- blah blah blah
- ;bar <- blah blah -- TODO same level as foo
- blah -- TODO manual correction
- blah -- continue the blah
- ;sideeffect -- manual correction
+ ;bar <- blah blah
+ blah -- manual correction
+ blah -- manual correction
+ ;sideeffect
;sideeffect' blah
;let {baz = blah blah
- blah -- TODO manual correction
- ;gaz = blah -- TODO same level as baz
- ;haz = -- TODO same level as gaz
+ blah -- manual correction
+ ;gaz = blah
+ ;haz =
blah
};pure faz -- manual correction
-};nested_do =
+};nested_do = -- manual correction
do {foo <- blah
- ;do {bar <- blah -- TODO same level as foo
- ;baz -- TODO same level as bar
+ ;do {bar <- blah -- same level as foo
+ ;baz -- same level as bar
}};nested_where a b = foo a b
where -- TODO 2
- {foo = bar baz -- TODO indented
- ;baz = blah blah -- TODO same level as foo
+ {foo = bar baz -- indented
+ ;baz = blah blah -- same level as foo
where -- manual correction
- {gaz a = blah -- TODO indented
- ;faz = blah -- TODO same level as gaz
+ {gaz a = blah -- indented
+ ;faz = blah -- same level as gaz
-- TODO case statements
-- TODO let / in
diff --git a/test/src/indentation.hs.lexer b/test/src/indentation.hs.lexer
index 510db03..df70005 100644
--- a/test/src/indentation.hs.lexer
+++ b/test/src/indentation.hs.lexer
@@ -1,6 +1,12 @@
+
+
+
+
+
+
module CONID where
{ import CONID
diff --git a/test/src/indentation.hs.reindent b/test/src/indentation.hs.reindent
index ee5284f..f9fa74f 100644
--- a/test/src/indentation.hs.reindent
+++ b/test/src/indentation.hs.reindent
@@ -5,6 +5,18 @@ v
v
-- Bugs and unexpected behaviour in (re-)indentation may be documented here.
v
+--
+v
+-- Lines marked "manual correction" indicate where we expect the user to
+v
+-- re-indent because it goes against our prediction. In some of these cases,
+v
+-- we could improve the guess with semantic information (e.g. if we know that
+v
+-- the RHS of a bind is only partially applied, then we probably mean to
+v
+-- continue that line instead of start a new one).
+v
module Indentation where
v
@@ -23,23 +35,23 @@ basic_do = do
1 v
foo <- blah blah blah
v 1 2
- bar <- blah blah -- TODO same level as foo
+ bar <- blah blah
2 1 v
- blah -- TODO manual correction
+ blah -- manual correction
2 1 v
- blah -- continue the blah
+ blah -- manual correction
v 2 1
- sideeffect -- manual correction
+ sideeffect
v 1 2 3
sideeffect' blah
v 1 3 2
let baz = blah blah
3 2 1 4 v
- blah -- TODO manual correction
+ blah -- manual correction
v 3 2 4 1
- gaz = blah -- TODO same level as baz
+ gaz = blah
v 3 1 24 5
- haz = -- TODO same level as gaz
+ haz =
3 2 1 v4 5
blah
2 v 3 14 5
@@ -47,13 +59,13 @@ v 3 1 24 5
1 v 2 34 5
v 2 13 45 6
-nested_do =
+nested_do = -- manual correction
v 1
do foo <- blah
v 1 2
- do bar <- blah -- TODO same level as foo
+ do bar <- blah -- same level as foo
v 2 1
- baz -- TODO same level as bar
+ baz -- same level as bar
1 2 v
v 1 2
@@ -61,30 +73,30 @@ nested_where a b = foo a b
1 v 2
where -- TODO 2
1 v
- foo = bar baz -- TODO indented
+ foo = bar baz -- indented
v 1
- baz = blah blah -- TODO same level as foo
+ baz = blah blah -- same level as foo
2 v 1
where -- manual correction
1 2 v
- gaz a = blah -- TODO indented
+ gaz a = blah -- indented
v 2 1
- faz = blah -- TODO same level as gaz
-2 3 1 v
+ faz = blah -- same level as gaz
+1 2 v
v 1 2
-- TODO case statements
v 1 2
-- TODO let / in
-1 2 3 v
+1 2 v
v 1 2
-- TODO coproduct definitions, the | should align with =
-1 2 3 v
+1 2 v
v 1 2
-- TODO lists, records, tuples
-1 2 3 v
+1 2 v
v 1 2
-- TODO long type signatures vs definitions
\ No newline at end of file
diff --git a/test/src/indentation.hs.sexps b/test/src/indentation.hs.sexps
index 8482b82..0611710 100644
--- a/test/src/indentation.hs.sexps
+++ b/test/src/indentation.hs.sexps
@@ -1,6 +1,12 @@
-- | Idealised indentation scenarios.
--
-- Bugs and unexpected behaviour in re-indentation may be documented here.
+--
+-- Lines marked "manual correction" indicate where we expect the user to
+-- re-indent because it goes against our prediction. In some of these cases,
+-- we could improve the guess with semantic information e.g. if we know that
+-- the RHS of a bind is only partially applied, then we probably mean to
+-- continue that line instead of start a new one.
((module (Indentation) (where)
(((import) ((Foo).)(Bar))
@@ -10,30 +16,30 @@
((basic_do) = (do
((foo) <- (blah) (blah) (blah)
- ((bar) <- (blah) (blah) -- TODO same level as foo
- (blah) -- TODO manual correction
- (blah)) -- continue the blah
- (sideeffect) -- manual correction
+ ((bar) <- (blah) (blah)
+ (blah) -- manual correction
+ (blah)) -- manual correction
+ (sideeffect)
((sideeffect') (blah))
(let ((baz) = (blah) (blah)
- (blah) -- TODO manual correction
- ((gaz) = (blah)) -- TODO same level as baz
- ((haz) = -- TODO same level as gaz
+ (blah) -- manual correction
+ ((gaz) = (blah))
+ ((haz) =
(blah))
)(pure) (faz)) -- manual correction
-)(nested_do) =
+)(nested_do) = -- manual correction
(do (((foo) <- (blah)
- (do ((bar) <- (blah) -- TODO same level as foo
- (baz) -- TODO same level as bar
+ (do ((bar) <- (blah) -- same level as foo
+ (baz) -- same level as bar
)))(nested_where) (a) (b) = (foo) (a) (b)
(where) -- TODO 2
- (((foo) = (bar) (baz) -- TODO indented
- ((baz) = (blah) (blah)) -- TODO same level as foo
+ (((foo) = (bar) (baz) -- indented
+ ((baz) = (blah) (blah)) -- same level as foo
(where) -- manual correction
- ((gaz) (a) = (blah) -- TODO indented
- ((faz) = (blah)) -- TODO same level as gaz
+ ((gaz) (a) = (blah) -- indented
+ ((faz) = (blah)) -- same level as gaz
-- TODO case statements
-- TODO let / in
- [nongnu] elpa/haskell-tng-mode 8b6d545 178/385: split all the tests, (continued)
- [nongnu] elpa/haskell-tng-mode 8b6d545 178/385: split all the tests, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 4e1f51c 170/385: indent is deriving aware, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 3ddafce 181/385: disambiguate -> during lexing, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 6b4dca0 189/385: note other build tools, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode cc657a8 197/385: support type alignment options, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode a7098e8 194/385: stylish haskell outputs failures, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 21fe2a0 221/385: fix broken test assertions, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 907255e 026/385: some namespacing, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode e7eaa38 077/385: some ideas for cabal, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode ddd0706 108/385: suggest next line indentation, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 7a8f714 139/385: indent back to the same level of `do',
ELPA Syncer <=
- [nongnu] elpa/haskell-tng-mode ac55d33 134/385: interactive SMIE debugging, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 6ade588 195/385: key bindings in compilation mode, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 144cabf 202/385: fix test assertions, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 04ebec6 204/385: third party integrations, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode aa9bbb7 216/385: add (broken) test coverage for consyms, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 5f423b9 100/385: some alts in the indentation test, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 50b53d3 114/385: tng compilation tests, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 36ece6d 117/385: low hanging fruit, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 489e4c9 124/385: document explicit export fontification bug, ELPA Syncer, 2021/10/06
- [nongnu] elpa/haskell-tng-mode 91a1d08 136/385: creating small scenarios for indentation specs, ELPA Syncer, 2021/10/06