From 52c63983d85ee49eece41919dad201f9c533c74c Mon Sep 17 00:00:00 2001 From: Futar Date: Mon, 5 Aug 2024 09:06:42 +0800 Subject: [PATCH 1/3] support multiway-lambda expressions --- indent/haskell.vim | 8 ++++++++ test/case/cases.in.hs | 6 ++++++ test/case/cases.out.hs | 6 ++++++ test/case/cases_same_line.in.hs | 5 +++++ test/case/cases_same_line.out.hs | 5 +++++ 5 files changed, 30 insertions(+) create mode 100644 test/case/cases.in.hs create mode 100644 test/case/cases.out.hs create mode 100644 test/case/cases_same_line.in.hs create mode 100644 test/case/cases_same_line.out.hs diff --git a/indent/haskell.vim b/indent/haskell.vim index 54f244a..8696ffd 100644 --- a/indent/haskell.vim +++ b/indent/haskell.vim @@ -178,6 +178,14 @@ function! GetHaskellIndent() abort return match(line, '\v^\s*%(|.*)?\s*\zs') + &shiftwidth endif + if line =~# '\v\\\s*\s*%(--.*)?$' + return match(line, '\v^\s*%(|.*)?\s*\zs') + &shiftwidth + endif + + if line =~# '\v\\\s*\s*[[:alnum:](-\"'']' + return match(line, '\v\\\s*\s*\zs\S') + endif + if nonblankline =~# '\v^.*[^|]\|[^|].*\=' return s:after_guard() endif diff --git a/test/case/cases.in.hs b/test/case/cases.in.hs new file mode 100644 index 0000000..789e112 --- /dev/null +++ b/test/case/cases.in.hs @@ -0,0 +1,6 @@ +printGender :: Language -> Gender -> Text +printGender = \cases +English Male -> "Male" +English Female -> "Female" +Chinese Male -> "男性" +Chinese Female -> "女性" diff --git a/test/case/cases.out.hs b/test/case/cases.out.hs new file mode 100644 index 0000000..ab356f5 --- /dev/null +++ b/test/case/cases.out.hs @@ -0,0 +1,6 @@ +printGender :: Language -> Gender -> Text +printGender = \cases + English Male -> "Male" + English Female -> "Female" + Chinese Male -> "男性" + Chinese Female -> "女性" diff --git a/test/case/cases_same_line.in.hs b/test/case/cases_same_line.in.hs new file mode 100644 index 0000000..b068e11 --- /dev/null +++ b/test/case/cases_same_line.in.hs @@ -0,0 +1,5 @@ +printGender :: Language -> Gender -> Text +printGender = \cases English Male -> "Male" +English Female -> "Female" +Chinese Male -> "男性" +Chinese Female -> "女性" diff --git a/test/case/cases_same_line.out.hs b/test/case/cases_same_line.out.hs new file mode 100644 index 0000000..ec54c47 --- /dev/null +++ b/test/case/cases_same_line.out.hs @@ -0,0 +1,5 @@ +printGender :: Language -> Gender -> Text +printGender = \cases English Male -> "Male" + English Female -> "Female" + Chinese Male -> "男性" + Chinese Female -> "女性" From 2ffd185bdfa83fa47a3489efbcb9194f62dea785 Mon Sep 17 00:00:00 2001 From: Futar Date: Mon, 5 Aug 2024 09:28:19 +0800 Subject: [PATCH 2/3] include underscore in pattern --- indent/haskell.vim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/indent/haskell.vim b/indent/haskell.vim index 8696ffd..f02b425 100644 --- a/indent/haskell.vim +++ b/indent/haskell.vim @@ -182,7 +182,7 @@ function! GetHaskellIndent() abort return match(line, '\v^\s*%(|.*)?\s*\zs') + &shiftwidth endif - if line =~# '\v\\\s*\s*[[:alnum:](-\"'']' + if line =~# '\v\\\s*\s*[[:alnum:](_\-\"'']' return match(line, '\v\\\s*\s*\zs\S') endif From 39747d562a64cf6822049e8bf15a72a5a4611fba Mon Sep 17 00:00:00 2001 From: Futar Date: Mon, 5 Aug 2024 12:14:15 +0800 Subject: [PATCH 3/3] trigger indentation for guards in multiway-lambda expressions --- indent/haskell.vim | 2 ++ test/case/casesguard.in.hs | 3 +++ test/case/casesguard.out.hs | 3 +++ 3 files changed, 8 insertions(+) create mode 100644 test/case/casesguard.in.hs create mode 100644 test/case/casesguard.out.hs diff --git a/indent/haskell.vim b/indent/haskell.vim index f02b425..0f514f5 100644 --- a/indent/haskell.vim +++ b/indent/haskell.vim @@ -475,6 +475,8 @@ function! s:indent_bar() abort let line = getline(i) if line =~# '\v^[^[\]]*%([^[\]]*|\[[^[\]]*\])*\[%([^[\]]*|\[[^[\]]*\])*%(--.*)?$' return match(line, '\v^[^[\]]*%([^[\]]*|\[[^[\]]*\])*\zs\[([^[\]]*|\[[^[\]]*\])*%(--.*)?$') + &shiftwidth + elseif line =~# '\v\\\s*.*\|' + return match(line, '\v\\\s*.*\zs\|') elseif line =~# '\v^\s*%()?.*[^|]\|[^|].*\=' return match(line, '\v^\s*%()?.*[^|]\zs\|[^|].*\=') elseif line =~# '\v.*\=' diff --git a/test/case/casesguard.in.hs b/test/case/casesguard.in.hs new file mode 100644 index 0000000..a919118 --- /dev/null +++ b/test/case/casesguard.in.hs @@ -0,0 +1,3 @@ +filter = \cases _ [] -> [] +p (x:xs) | p x -> x : filter p xs +| otherwise -> filter p xs diff --git a/test/case/casesguard.out.hs b/test/case/casesguard.out.hs new file mode 100644 index 0000000..07148b6 --- /dev/null +++ b/test/case/casesguard.out.hs @@ -0,0 +1,3 @@ +filter = \cases _ [] -> [] + p (x:xs) | p x -> x : filter p xs + | otherwise -> filter p xs