Skip to content

Commit 83ff8fe

Browse files
committed
Merge pull request #329 from elixir-lang/two-level-indent-after-comma
Indent by one level if current line belongs to function call
2 parents 230b0dc + f721fb4 commit 83ff8fe

File tree

2 files changed

+149
-67
lines changed

2 files changed

+149
-67
lines changed

elixir-smie.el

Lines changed: 92 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@
6767
(rassoc next smie-closer-alist))))
6868
(smie-indent-calculate))))))))
6969

70+
(defun elixir-smie-looking-around (back at)
71+
"Check if looking backwards at BACK and forward at AT."
72+
(and (looking-at-p at) (looking-back back)))
73+
7074
;; Declare variable that we need from the smie package
7175
(defvar smie--parent)
7276

@@ -271,7 +275,9 @@
271275
;; the beginning of a new line. Keep that in mind.
272276
(if (elixir-smie--semi-ends-match)
273277
"MATCH-STATEMENT-DELIMITER"
274-
";"))
278+
(if (and (looking-at ".+,$")
279+
(not (> (nth 0 (syntax-ppss)) 0)))
280+
"COMMA"";")))
275281
((looking-at elixir-smie--block-operator-regexp)
276282
(goto-char (match-end 0))
277283
"->")
@@ -296,7 +302,10 @@
296302
(elixir-smie--implicit-semi-p))
297303
(if (elixir-smie--semi-ends-match)
298304
"MATCH-STATEMENT-DELIMITER"
299-
";"))
305+
(if (and (looking-back ",$" (- (point) 2) t)
306+
(not (> (nth 0 (syntax-ppss)) 0)))
307+
"COMMA"
308+
";")))
300309
((looking-back elixir-smie--oneline-def-operator-regexp (- (point) 3) t)
301310
(goto-char (match-beginning 0))
302311
";")
@@ -330,8 +339,33 @@
330339
-4)
331340
(`(:elem . args)
332341
-4)
342+
(`(:before . "COMMA")
343+
(cond
344+
((and (smie-rule-parent-p ";")
345+
(smie-rule-hanging-p))
346+
(smie-rule-parent (- elixir-smie-indent-basic)))
347+
((smie-rule-parent-p "(")
348+
(smie-rule-parent))
349+
((smie-rule-parent-p "->")
350+
(smie-rule-parent (- elixir-smie-indent-basic)))))
351+
(`(:after . "COMMA")
352+
(cond
353+
((and (smie-rule-parent-p ";")
354+
(smie-rule-hanging-p))
355+
(smie-rule-parent elixir-smie-indent-basic))
356+
((and (smie-rule-parent-p "{")
357+
(smie-rule-hanging-p))
358+
(smie-rule-parent elixir-smie-indent-basic))
359+
((and (smie-rule-parent-p "[")
360+
(smie-rule-hanging-p))
361+
0)
362+
((smie-rule-parent-p "->")
363+
(smie-rule-parent elixir-smie-indent-basic))
364+
(t (smie-rule-parent elixir-smie-indent-basic))))
333365
(`(:before . "OP")
334366
(cond
367+
((smie-rule-parent-p "for")
368+
(smie-rule-parent))
335369
((and (not (smie-rule-hanging-p))
336370
(elixir-smie-current-line-start-with-pipe-operator-p)
337371
(elixir-smie-last-line-is-assignment-p))
@@ -341,38 +375,25 @@
341375
(cons 'column (elixir-smie--previous-line-indentation)))
342376
((and (not (smie-rule-hanging-p))
343377
(smie-rule-prev-p "OP"))
344-
-2)
378+
(- elixir-smie-indent-basic))
345379
((smie-rule-parent-p "def" "defp" "defmacro" "defmacrop")
346380
(smie-rule-parent))
347381
(t (smie-rule-parent))))
348-
(`(:before . "def")
349-
(cond
350-
(t
351-
(smie-rule-parent))))
352-
(`(:before . "defp")
353-
(cond
354-
(t
355-
(smie-rule-parent))))
356-
(`(:before . "defmacro")
357-
(cond
358-
(t
359-
(smie-rule-parent))))
360-
(`(:before . "defmacrop")
361-
(cond
362-
(t
363-
(smie-rule-parent))))
364382
(`(:after . "OP")
365383
(cond
366384
((smie-rule-sibling-p) nil)
367-
((smie-rule-hanging-p) (smie-rule-parent elixir-smie-indent-basic))
385+
((smie-rule-hanging-p)
386+
(smie-rule-parent elixir-smie-indent-basic))
368387
((and (not (smie-rule-sibling-p))
369388
(not (smie-rule-hanging-p))
370389
(smie-rule-parent-p "do:"))
371390
;; Dedent the line after an OP if it's after a "do:" token, which implies
372391
;; a one-line function.
373392
(smie-rule-parent
374393
(- (+ elixir-smie-indent-basic elixir-smie-indent-basic))))
375-
(t (smie-rule-parent))))
394+
((smie-rule-parent-p ";")
395+
(smie-rule-parent ))
396+
(t (smie-rule-parent (- elixir-smie-indent-basic)))))
376397
(`(:before . "MATCH-STATEMENT-DELIMITER")
377398
(cond
378399
((and (smie-rule-parent-p "do")
@@ -426,19 +447,23 @@
426447
(t
427448
(smie-rule-parent))))
428449
(`(:before . "fn")
429-
(smie-rule-parent))
450+
(cond
451+
((smie-rule-parent-p "(")
452+
(smie-rule-parent))
453+
(t (smie-rule-parent))))
430454
(`(:before . "for")
431455
(cond
432456
((elixir-smie-last-line-end-with-block-operator-p)
433457
(smie-rule-parent elixir-smie-indent-basic))
434-
(t (smie-rule-parent))))
458+
((smie-rule-prev-p "OP")
459+
(smie-rule-parent))))
435460
(`(:before . "do:")
436461
(cond
437462
((smie-rule-parent-p "def" "if" "defp" "defmacro" "defmacrop")
438463
(smie-rule-parent))
439464
((and (smie-rule-parent-p ";")
440465
(not (smie-rule-hanging-p)))
441-
(smie-rule-parent))
466+
(smie-rule-parent (+ elixir-smie-indent-basic elixir-smie-indent-basic)))
442467
;; Example
443468
;;
444469
;; hi = for i <- list, do: i
@@ -451,7 +476,7 @@
451476
(smie-rule-parent))
452477
((and (smie-rule-parent-p "OP")
453478
(not (smie-rule-hanging-p)))
454-
(smie-rule-parent))))
479+
(smie-rule-parent elixir-smie-indent-basic))))
455480
(`(:before . "do")
456481
(cond
457482
((and (smie-rule-parent-p "case")
@@ -476,7 +501,15 @@
476501
(smie-rule-parent elixir-smie-indent-basic))
477502
(t elixir-smie-indent-basic)))
478503
(`(:before . "end")
479-
(smie-rule-parent))
504+
(cond
505+
((smie-rule-parent-p "(")
506+
(smie-rule-parent))
507+
(t (smie-rule-parent))))
508+
(`(:before . "else:")
509+
(cond
510+
((smie-rule-parent-p ";")
511+
(smie-rule-parent))
512+
(t (smie-rule-parent))))
480513
;; Closing paren on the other line
481514
(`(:before . "(")
482515
(cond
@@ -491,13 +524,19 @@
491524
;; .....
492525
((smie-rule-parent-p "do")
493526
(smie-rule-parent))
527+
((smie-rule-parent-p "OP")
528+
(smie-rule-parent))
529+
((smie-rule-parent-p ";")
530+
(smie-rule-parent))
494531
(t (smie-rule-parent))))
495532
(`(:before . "[")
496533
(cond
497534
((smie-rule-hanging-p)
498535
(smie-rule-parent))))
499536
(`(:before . "{")
500537
(cond
538+
((smie-rule-parent-p "COMMA")
539+
(smie-rule-parent))
501540
;; Example
502541
;;
503542
;; case parse do
@@ -523,7 +562,7 @@
523562
(if (elixir-smie-last-line-end-with-block-operator-p)
524563
(smie-rule-parent elixir-smie-indent-basic)
525564
(if (elixir-smie-last-line-start-with-block-operator-p)
526-
(smie-rule-parent -2)
565+
(smie-rule-parent (- elixir-smie-indent-basic))
527566
(smie-rule-parent))))
528567
((and (smie-rule-parent-p "OP")
529568
(smie-rule-hanging-p))
@@ -536,14 +575,14 @@
536575
(if (save-excursion
537576
(move-end-of-line 1)
538577
(looking-back elixir-smie--block-operator-regexp (- (point) 3) t))
539-
(smie-rule-parent -2)
578+
(smie-rule-parent (- elixir-smie-indent-basic))
540579
elixir-smie-indent-basic))
541580
((smie-rule-parent-p ";")
542581
(if (save-excursion
543582
(move-end-of-line 1)
544583
(looking-back elixir-smie--block-operator-regexp (- (point) 3) t))
545-
(smie-rule-parent -2)
546-
elixir-smie-indent-basic))
584+
(smie-rule-parent (- elixir-smie-indent-basic))
585+
(smie-rule-parent)))
547586
(t (smie-rule-parent elixir-smie-indent-basic))))
548587
(`(:after . "{")
549588
(cond
@@ -680,9 +719,11 @@
680719
((and (smie-rule-parent-p "else")
681720
(smie-rule-hanging-p))
682721
(smie-rule-parent elixir-smie-indent-basic))
683-
((smie-rule-parent-p "after" "catch" "def" "defmodule" "defp" "do" "else"
722+
((smie-rule-parent-p "catch" "def" "defmodule" "defp" "do" "else"
684723
"fn" "if" "rescue" "try" "unless" "defmacro" "defmacrop")
685724
(smie-rule-parent))
725+
((smie-rule-parent-p "after")
726+
(smie-rule-parent elixir-smie-indent-basic))
686727
;; Example
687728
;;
688729
;; case parse do
@@ -702,7 +743,26 @@
702743
(smie-rule-hanging-p)
703744
(elixir-smie-line-starts-with-do-colon-p))
704745
(smie-rule-parent (- elixir-smie-indent-basic)))
705-
746+
((and (smie-rule-parent-p ";")
747+
(smie-rule-hanging-p)
748+
(save-excursion
749+
(forward-line 1)
750+
(looking-at "*.do:.*")))
751+
(smie-rule-parent (- elixir-smie-indent-basic)))
752+
((and (smie-rule-parent-p ";")
753+
(save-excursion
754+
(forward-line -1)
755+
(move-end-of-line 1)
756+
(looking-back ",$"))
757+
(not (smie-rule-hanging-p)))
758+
(smie-rule-parent elixir-smie-indent-basic))
759+
((and (smie-rule-parent-p ";")
760+
(smie-rule-hanging-p))
761+
(if (save-excursion
762+
(forward-line 1)
763+
(looking-at "^.+do:.+$"))
764+
(cons 'column elixir-smie-indent-basic)
765+
(smie-rule-parent)))
706766
((elixir-smie-current-line-start-with-pipe-operator-p)
707767
(smie-rule-parent))
708768
((smie-rule-parent-p "(")

0 commit comments

Comments
 (0)