From: Glenn Morris Date: Sun, 7 Feb 2010 01:41:45 +0000 (-0800) Subject: Handle F2003 named interfaces. X-Git-Tag: emacs-pretest-23.1.93~95 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=7cf3f3d6dad1f58775723ab29e59336159195183;p=emacs.git 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. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index cbada0d62c6..ae3a55113dc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2010-02-07 Glenn Morris + + * 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 * progmodes/cc-mode.el (c-common-init): Bind temporary variables 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 "\\[ \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.