From eebce3047c64dd2628d98b6da54eb8042c652fb5 Mon Sep 17 00:00:00 2001 From: Samuel Tonini Date: Sun, 3 Apr 2016 12:15:44 +0200 Subject: [PATCH] Correct pipeline indentation --- elixir-smie.el | 41 ++++++++++++++++++++++++---- test/elixir-mode-indentation-test.el | 26 +++++++++++++++++- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/elixir-smie.el b/elixir-smie.el index fb54eb1c..8fa0763c 100644 --- a/elixir-smie.el +++ b/elixir-smie.el @@ -195,6 +195,23 @@ (beginning-of-line) (looking-at "^\s+->.+$"))) +(defun elixir-smie-current-line-start-with-pipe-operator-p () + (save-excursion + (beginning-of-line) + (looking-at "^\s*|>.+$"))) + +(defun elixir-smie-last-line-is-assignment-p () + (save-excursion + (forward-line -1) + (beginning-of-line) + (looking-at "^.+=.+$"))) + +(defun elixir-smie-last-line-start-with-pipe-operator-p () + (save-excursion + (forward-line -1) + (beginning-of-line) + (looking-at "^\s*|>.+$"))) + (defun elixir-smie-line-starts-with-do-colon-p () (save-excursion (beginning-of-line) @@ -305,11 +322,20 @@ (`(:elem . args) -4) (`(:before . "OP") - (cond ((and (not (smie-rule-hanging-p)) - (smie-rule-prev-p "OP")) - -2) - ((smie-rule-parent-p "def" "defp" "defmacro" "defmacrop") - (smie-rule-parent)))) + (cond + ((and (not (smie-rule-hanging-p)) + (elixir-smie-current-line-start-with-pipe-operator-p) + (elixir-smie-last-line-is-assignment-p)) + (smie-rule-parent)) + ((and (not (smie-rule-hanging-p)) + (elixir-smie-current-line-start-with-pipe-operator-p)) + (goto-char (elixir-smie--previous-line-indentation))) + ((and (not (smie-rule-hanging-p)) + (smie-rule-prev-p "OP")) + -2) + ((smie-rule-parent-p "def" "defp" "defmacro" "defmacrop") + (smie-rule-parent)) + (t (smie-rule-parent)))) (`(:before . "def") (cond (t @@ -648,7 +674,10 @@ ((and (smie-rule-parent-p ";") (smie-rule-hanging-p) (elixir-smie-line-starts-with-do-colon-p)) - (smie-rule-parent (- elixir-smie-indent-basic))))) + (smie-rule-parent (- elixir-smie-indent-basic))) + + ((elixir-smie-current-line-start-with-pipe-operator-p) + (smie-rule-parent)))) (`(:after . ";") (cond ((smie-rule-parent-p "def") diff --git a/test/elixir-mode-indentation-test.el b/test/elixir-mode-indentation-test.el index 5b14de7b..36f49f0f 100644 --- a/test/elixir-mode-indentation-test.el +++ b/test/elixir-mode-indentation-test.el @@ -696,7 +696,31 @@ defmodule Foo do end ") -(elixir-def-indentation-test indent-pipes +(elixir-def-indentation-test indent-multiline-pipes-after-call + (:tags '(indentation)) + " + some_string + |> String.downcase + |> String.strip" + " +some_string +|> String.downcase +|> String.strip") + +(elixir-def-indentation-test indent-multiline-on-the-right-of-pattern-match + (:tags '(indentation)) + " +sanitized_string = + some_string +|> String.downcase + |> String.strip" + " +sanitized_string = + some_string + |> String.downcase + |> String.strip") + +(elixir-def-indentation-test indent-pipes-after-assignment (:tags '(indentation)) " def foo(x) do