]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle F2003 named interfaces.
authorGlenn Morris <rgm@gnu.org>
Sun, 7 Feb 2010 01:41:45 +0000 (17:41 -0800)
committerGlenn Morris <rgm@gnu.org>
Sun, 7 Feb 2010 01:41:45 +0000 (17:41 -0800)
* progmodes/f90.el (f90-font-lock-keywords-2)
(f90-looking-at-type-like, f90-looking-at-program-block-end):
Handle F2003 named interfaces.

lisp/ChangeLog
lisp/progmodes/f90.el

index cbada0d62c6174ad814a3c2447a3e7f94ecd56a7..ae3a55113dca2989d78b52c1bde630a00e8ad891 100644 (file)
@@ -1,3 +1,9 @@
+2010-02-07  Glenn Morris  <rgm@gnu.org>
+
+       * progmodes/f90.el (f90-font-lock-keywords-2)
+       (f90-looking-at-type-like, f90-looking-at-program-block-end):
+       Handle F2003 named interfaces.
+
 2010-02-06  Chong Yidong  <cyd@stupidchicken.com>
 
        * progmodes/cc-mode.el (c-common-init): Bind temporary variables
index eda9f4e01557a33a240fb069b6fdc7231467e492..da7058976228745d68aaad85710d97fc1bdf73e2 100644 (file)
@@ -560,6 +560,12 @@ logical\\|double[ \t]*precision\\|\
       (5 font-lock-function-name-face t) (6 'default t))
     ;; enum (F2003; must be followed by ", bind(C)").
     '("\\<\\(enum\\)[ \t]*," (1 font-lock-keyword-face))
+    ;; F2003.  Prevent operators being highlighted as constants.
+    '("\\<\\(\\(?:end[ \t]*\\)?interface[ \t]*\\(?:assignment\\|operator\\|\
+read\\|write\\)\\)[ \t]*(" (1 font-lock-keyword-face t))
+    ;; Interface blocks can be named in F2003.
+    '("\\<\\(\\(?:end[ \t]*\\)?interface\\)[ \t]*\\(\\sw+\\)?\\>"
+      (1 font-lock-keyword-face) (2 font-lock-constant-face nil t))
     ;; end do, enum (F2003), if, select, where, and forall constructs.
     '("\\<\\(end[ \t]*\\(do\\|if\\|enum\\|select\\|forall\\|where\\)\\)\\>\
 \\([ \t]+\\(\\sw+\\)\\)?"
@@ -1229,7 +1235,7 @@ NAME is nil if the statement has no label."
 
 (defsubst f90-looking-at-type-like ()
   "Return (KIND NAME) if a type/enum/interface/block-data starts after point.
-NAME is non-nil only for type."
+NAME is non-nil only for type and certain interfaces."
   (cond
    ((save-excursion
       (and (looking-at "\\<type\\>[ \t]*")
@@ -1242,7 +1248,15 @@ NAME is non-nil only for type."
 ;;;    ((and (not (looking-at f90-typeis-re))
 ;;;          (looking-at f90-type-def-re))
 ;;;     (list (match-string 1) (match-string 2)))
-   ((looking-at "\\(enum\\|interface\\|block[ \t]*data\\)\\>")
+   ((looking-at "\\<\\(interface\\)\\>[ \t]*")
+    (list (match-string 1)
+          (save-excursion
+            (goto-char (match-end 0))
+            (if (or (looking-at "\\(operator\\|assignment\\|read\\|\
+write\\)[ \t]*([^)\n]*)")
+                    (looking-at "\\sw+"))
+                (match-string 0)))))
+   ((looking-at "\\(enum\\|block[ \t]*data\\)\\>")
     (list (match-string 1) nil))
    ((looking-at "abstract[ \t]*\\(interface\\)\\>")
     (list (match-string 1) nil))))
@@ -1270,9 +1284,12 @@ NAME is non-nil only for type."
 
 (defsubst f90-looking-at-program-block-end ()
   "Return (KIND NAME) if a block with name NAME ends after point."
-  (if (looking-at (concat "end[ \t]*" f90-blocks-re
-                          "?\\([ \t]+\\(\\sw+\\)\\)?\\>"))
-      (list (match-string 1) (match-string 3))))
+  (cond ((looking-at "end[ \t]*\\(interface\\)[ \t]*\\(\
+\\(?:assignment\\|operator\\|read\\|write\\)[ \t]*([^)\n]*)\\)")
+         (list (match-string 1) (match-string 2)))
+        ((looking-at (concat "end[ \t]*" f90-blocks-re
+                             "?\\([ \t]+\\(\\sw+\\)\\)?\\>"))
+        (list (match-string 1) (match-string 3)))))
 
 (defsubst f90-comment-indent ()
   "Return the indentation to be used for a comment starting at point.