]> git.eshelyaron.com Git - emacs.git/commitdiff
Improve treatment of Fortran's "class default"
authorGlenn Morris <rgm@gnu.org>
Fri, 20 Oct 2017 00:05:48 +0000 (20:05 -0400)
committerGlenn Morris <rgm@gnu.org>
Fri, 20 Oct 2017 00:05:48 +0000 (20:05 -0400)
* lisp/progmodes/f90.el (f90-start-block-re, f90-no-block-limit):
Handle "class default".  (Bug#28786)
* test/automated/f90.el (f90-test-bug25039): Add "class default".

lisp/progmodes/f90.el
test/lisp/progmodes/f90-tests.el

index 6421ba60dcec67b253fa88d45b0364461d1c837b..72156288ebac45c738b47eced8b36e10bcffb6be 100644 (file)
@@ -909,6 +909,8 @@ Can be overridden by the value of `font-lock-maximum-decoration'.")
 [ \t]*\\(\\(?:\\sw\\|\\s_\\)+\\)"
   "Regexp matching the definition of a derived type.")
 
+;; Maybe this should include "class default", but the constant is no
+;; longer used.
 (defconst f90-typeis-re
   "\\_<\\(class\\|type\\)[ \t]*is[ \t]*("
   "Regexp matching a CLASS/TYPE IS statement.")
@@ -955,10 +957,14 @@ Used in the F90 entry in `hs-special-modes-alist'.")
    ;; Avoid F2003 "type is" in "select type",
    ;; and also variables of derived type "type (foo)".
    ;; "type, foo" must be a block (?).
+   ;; And a partial effort to avoid "class default".
    "\\(?:type\\|class\\)[ \t,]\\("
-   "[^i(!\n\"& \t]\\|"                 ; not-i(
+   "[^id(!\n\"& \t]\\|"                ; not-id(
    "i[^s!\n\"& \t]\\|"                 ; i not-s
-   "is\\(?:\\sw\\|\\s_\\)\\)\\|"
+   "d[^e!\n\"& \t]\\|"                 ; d not-e
+   "de[^f!\n\"& \t]\\|"                ; de not-f
+   "def[^a!\n\"& \t]\\|"               ; def not-a
+   "\\(?:is\\|default\\)\\(?:\\sw\\|\\s_\\)\\)\\|"
    ;; "abstract interface" is F2003; "submodule" is F2008.
    "program\\|\\(?:abstract[ \t]*\\)?interface\\|\\(?:sub\\)?module\\|"
    ;; "enum", but not "enumerator".
@@ -1454,7 +1460,7 @@ if all else fails."
     (not (or (looking-at "end")
              (looking-at "\\(do\\|if\\|else\\(if\\|where\\)?\
 \\|select[ \t]*\\(case\\|type\\)\\|case\\|where\\|forall\\|\
-\\(?:class\\|type\\)[ \t]*is\\|\
+\\(?:class\\|type\\)[ \t]*is\\|class[ \t]*default\\|\
 block\\|critical\\|enum\\|associate\\)\\_>")
              (looking-at "\\(program\\|\\(?:sub\\)?module\\|\
 \\(?:abstract[ \t]*\\)?interface\\|block[ \t]*data\\)\\_>")
index 0c03a190ca27cf32a910ed2026bd99d79af91fa6..2a9100adff639bbd9ff40cf568557a35a5191161 100644 (file)
@@ -256,21 +256,25 @@ end program prog")
     (should (= 5 (current-indentation)))))
 
 (ert-deftest f90-test-bug25039 ()
-  "Test for https://debbugs.gnu.org/25039 ."
+  "Test for https://debbugs.gnu.org/25039 and 28786."
   (with-temp-buffer
     (f90-mode)
     (insert "program prog
 select type (a)
-class is (c1)
-x = 1
 type is (t1)
 x = 2
+class is (c1)
+x = 1
+class default
+x=3
 end select
 end program prog")
     (f90-indent-subprogram)
     (forward-line -3)
-    (should (= 2 (current-indentation))) ; type is
+    (should (= 2 (current-indentation))) ; class default
+    (forward-line -2)
+    (should (= 2 (current-indentation))) ; class is
     (forward-line -2)
-    (should (= 2 (current-indentation))))) ; class is
+    (should (= 2 (current-indentation))))) ; type is
 
 ;;; f90-tests.el ends here