summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Morris <rgm@gnu.org>2010-04-09 19:12:03 -0700
committerGlenn Morris <rgm@gnu.org>2010-04-09 19:12:03 -0700
commit119850e9279ac597b11abd92e56c1989e72f7b04 (patch)
treebdbae563d613e73694e2afaf29d066fe4c329a11
parent16207c0a480063e5c88f57bd0c088d32783dc603 (diff)
downloademacs-119850e9279ac597b11abd92e56c1989e72f7b04.tar.gz
Close bug#1835.
* progmodes/fortran.el (fortran-match-and-skip-declaration): New function. (fortran-font-lock-keywords-3): Use it. (Bug#1835)
-rw-r--r--lisp/ChangeLog6
-rw-r--r--lisp/progmodes/fortran.el24
2 files changed, 29 insertions, 1 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 1870690f89b..6e06f5ec72b 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-10 Glenn Morris <rgm@gnu.org>
+
+ * progmodes/fortran.el (fortran-match-and-skip-declaration):
+ New function.
+ (fortran-font-lock-keywords-3): Use it. (Bug#1835)
+
2010-04-07 Kenichi Handa <handa@m17n.org>
* language/indian.el (malayalam-composable-pattern): Fix previous
diff --git a/lisp/progmodes/fortran.el b/lisp/progmodes/fortran.el
index 6ba9fac608d..03f3bbc7af7 100644
--- a/lisp/progmodes/fortran.el
+++ b/lisp/progmodes/fortran.el
@@ -403,6 +403,28 @@ program\\|subroutine\\)\\>[ \t]*\\(\\sw+\\)?"
'("^ *\\([0-9]+\\)" . font-lock-constant-face)))
"Medium level highlighting for Fortran mode.")
+;; See bug#1835. Never really looked into _why_ this matters...
+(defun fortran-match-and-skip-declaration (limit)
+ "Like `font-lock-match-c-style-declaration-item-and-skip-to-next'.
+The only difference is, it returns t in a case when the default returns nil."
+ (when (looking-at "[ \n\t*]*\\(\\sw+\\)[ \t\n]*\\(((?\\)?")
+ (when (and (match-end 2) (> (- (match-end 2) (match-beginning 2)) 1))
+ (let ((pos (point)))
+ (skip-chars-backward " \t\n")
+ (skip-syntax-backward "w")
+ (unless (looking-at "\\(\\sw+\\)[ \t\n]*\\sw+[ \t\n]*\\(((?\\)?")
+ (goto-char pos)
+ (looking-at "[ \n\t*]*\\(\\sw+\\)[ \t\n]*\\(((?\\)?"))))
+ (save-match-data
+ (condition-case nil
+ (save-restriction
+ (narrow-to-region (point-min) limit)
+ (goto-char (match-end 1))
+ (while (not (looking-at "[ \t\n]*\\(\\(,\\)\\|;\\|\\'\\)"))
+ (goto-char (or (scan-sexps (point) 1) (point-max))))
+ (goto-char (match-end 2)))
+ (error t)))))
+
(defvar fortran-font-lock-keywords-3
(append
fortran-font-lock-keywords-1
@@ -412,7 +434,7 @@ program\\|subroutine\\)\\>[ \t]*\\(\\sw+\\)?"
;; Type specifier.
'(1 font-lock-type-face)
;; Declaration item (or just /.../ block name).
- `(font-lock-match-c-style-declaration-item-and-skip-to-next
+ `(fortran-match-and-skip-declaration
;; Start after any *(...) expression.
(condition-case nil
(and (match-beginning ,(1+ (regexp-opt-depth