diff --git a/elixir-smie.el b/elixir-smie.el index e1823c64..a96d641b 100644 --- a/elixir-smie.el +++ b/elixir-smie.el @@ -250,6 +250,8 @@ Return non-nil if any line breaks were skipped." (statement) (statement ";" statements)) (statement + (non-block-expr "fn" match-statement "end") + (non-block-expr "do" statements "end") ("if" non-block-expr "do" statements "else" statements "end") ("if" non-block-expr "do" statements "end") ("if" non-block-expr "COMMA" "do:" statement) @@ -258,10 +260,7 @@ Return non-nil if any line breaks were skipped." ("try" "do" statements "catch" match-statements "end") ("try" "do" statements "end") ("case" non-block-expr "do" match-statements "end") - ("def" non-block-expr "do" statements "end") - (non-block-expr "do" statements "end") - (expr) - ) + ("def" non-block-expr "do" statements "end")) (non-block-expr (non-block-expr "OP" non-block-expr) (non-block-expr "COMMA" non-block-expr) @@ -309,9 +308,15 @@ Return non-nil if any line breaks were skipped." ;; for some reason SMIE doesn't look this far when there's a ;; comment terminating the previous line. Ugh. nil) + ;; If the parent token of `->' is `fn', then we want to align to the + ;; parent, and offset by `elixir-smie-indent-basic'. Otherwise, indent + ;; normally. This helps us work with/indent anonymous function blocks + ;; correctly. (`(:after . "->") (when (smie-rule-hanging-p) - elixir-smie-indent-basic)) + (if (smie-rule-parent-p "fn") + (smie-rule-parent elixir-smie-indent-basic) + elixir-smie-indent-basic))) (`(,_ . ,(or `"COMMA")) (smie-rule-separator kind)) (`(:after . "=") elixir-smie-indent-basic) (`(:after . "end") 0) diff --git a/test/elixir-mode-indentation-tests.el b/test/elixir-mode-indentation-tests.el index f4ddc2b1..e455dbcb 100644 --- a/test/elixir-mode-indentation-tests.el +++ b/test/elixir-mode-indentation-tests.el @@ -363,7 +363,7 @@ to_process = [27, 33, 35, 11, 36, 29, 18, 37, 21, 31, 19, 10, 14, 30, ") (elixir-def-indentation-test indent-nested-fn - (:expected-result :failed) ; #59 + () "defmodule FooModule do def foo do x = fn(a, b) -> a + b end