]> code.delx.au - gnu-emacs-elpa/commitdiff
* sml-mode.el (sml--rightalign-and-p): New function.
authorStefan Monnier <monnier@iro.umontreal.ca>
Wed, 4 Jun 2014 14:58:39 +0000 (10:58 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Wed, 4 Jun 2014 14:58:39 +0000 (10:58 -0400)
packages/sml-mode/sml-mode.el
packages/sml-mode/testcases.sml

index e9c24779fbccf38f158b85edd8596f1c5e2f0951..a46d9ff1fb32c74b0bf70b1734ebb52a3df75f5d 100644 (file)
@@ -487,6 +487,30 @@ Regexp match data 0 points to the chars."
 
 (defvar sml-indent-separator-outdent 2)
 
+(defun sml--rightalign-and-p ()
+  (when sml-rightalign-and
+    ;; Only right-align the "and" if the intervening code is more deeply
+    ;; indented, to avoid things like:
+    ;; datatype foo
+    ;;   = Foo of int
+    ;;      and bar = Bar of string
+    (save-excursion
+      (let ((max (line-end-position 0))
+            (data (smie-backward-sexp "and"))
+            (startcol (save-excursion
+                        (forward-comment (- (point)))
+                        (current-column)))
+            (mincol (current-column)))
+        (save-excursion
+          (search-forward "=" max t)
+          (forward-line 1)
+          (if (< (point) max) (setq max (point))))
+        (while (and (<= (point) max) (not (eobp)))
+          (skip-chars-forward " \t")
+          (setq mincol (current-column))
+          (forward-line 1))
+        (>= mincol startcol)))))
+
 (defun sml-smie-rules (kind token)
   ;; I much preferred the pcase version of the code, especially while
   ;; edebugging the code.  But that will have to wait until we get rid of
@@ -528,7 +552,7 @@ Regexp match data 0 points to the chars."
       ((equal token "and")
        ;; FIXME: maybe "and" (c|sh)ould be handled as an smie-separator.
        (cond
-        ((smie-rule-parent-p "datatype") (if sml-rightalign-and 5 0))
+        ((smie-rule-parent-p "datatype") (if (sml--rightalign-and-p) 5 0))
         ((smie-rule-parent-p "fun" "val") 0)))
       ((equal token "d=")
        (cond
index 0e98ed61880f03a4eef90ce4eae9473db1e3cc57..14b73d3055b472a3c1a04a666750336374e4ff3d 100644 (file)
@@ -142,6 +142,7 @@ val x =
 datatype foobar
   = FooB of int
   | FooA of bool * int
+and baz = QUX of foo
 datatype foo = FOO | BAR of baz
      and baz = BAZ | QUUX of foo