summaryrefslogtreecommitdiff
path: root/lisp/progmodes/f90.el
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2010-02-06 17:41:45 -0800
committerGlenn Morris <rgm@gnu.org>2010-02-06 17:41:45 -0800
commit7cf3f3d6dad1f58775723ab29e59336159195183 (patch)
treee3256ffd6f2a5a84380d74ff047490b237cacd4c /lisp/progmodes/f90.el
parent953d248c55173853e6cffb01a5348703faf4e990 (diff)
downloademacs-7cf3f3d6dad1f58775723ab29e59336159195183.tar.gz
Handle F2003 named interfaces.
* progmodes/f90.el (f90-font-lock-keywords-2) (f90-looking-at-type-like, f90-looking-at-program-block-end): Handle F2003 named interfaces.
Diffstat (limited to 'lisp/progmodes/f90.el')
-rw-r--r--lisp/progmodes/f90.el27
1 files changed, 22 insertions, 5 deletions
diff --git a/lisp/progmodes/f90.el b/lisp/progmodes/f90.el
index eda9f4e0155..da705897622 100644
--- a/lisp/progmodes/f90.el
+++ b/lisp/progmodes/f90.el
@@ -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.