branch: elpa/haskell-tng-mode
commit 6ce5efb7aeeb58985eff60d71db8ee37bd721e4e
Author: Tseen She <[email protected]>
Commit: Tseen She <[email protected]>
moar type fontification
---
haskell-tng-font-lock.el | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/haskell-tng-font-lock.el b/haskell-tng-font-lock.el
index 8558efc..68f5a2f 100644
--- a/haskell-tng-font-lock.el
+++ b/haskell-tng-font-lock.el
@@ -14,12 +14,6 @@
;; parsing, but until that day, we do it the idiomatic Emacs way (with hacks
;; and more hacks).
;;
-;; We try very hard to use only single line fontifications, since multiline
-;; introduces both a performance and maintenance penalty. For this reason,
some
-;; very unusual styles of Haskell, although valid, may not be supported. For
-;; example, comments in unusual positions and line breaks after contextual
-;; markers (e.g. multiline imports may pick up incorrect colours).
-;;
;;
https://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Font-Lock-Mode
;;
;;; Code:
@@ -57,7 +51,13 @@
;;
;; TODO: numeric / char primitives?
;;
-;; TODO: haddock
+;; TODO: haddock, different face vs line comments, and some markup.
+;;
+;; TODO: multiline support for imports and type detection.
+;;
+;; TODO: consider comments where we currently check for spaces.
+;;
+;; TODO: consider ; in the "until the end of the line" searches.
(setq
haskell-tng:keywords
@@ -82,28 +82,33 @@
(: symbol-start (char ?\\))))
. 'haskell-tng:keyword)
- ;; types
- ;; TODO TypeApplications
+ ;; types (multi-line support would improve this)
;; TODO bracketed types (when are these allowed)
- ;; TODO class definitions
- ;; TODO types (not constructors) in imports
(,(rx-to-string '(: (|
(: line-start (+ space) "->")
(: symbol-start "::" symbol-end))
(+ space)
(group (+? (not (syntax comment-start))))
- (| (syntax comment-start) line-end)))
+ (| ?\; (syntax comment-start) line-end)))
(1 'haskell-tng:type keep))
(,(rx-to-string `(: line-start "data" (+ space)
(group (| ,conid ,consym))))
(1 'haskell-tng:type))
+ (,(rx-to-string `(: line-start (| "class" "instance") (+ space)
+ (group (+? anything))
+ (+ space) "where"))
+ (1 'haskell-tng:type keep))
+ ;; TypeApplications
+ (,(rx-to-string `(: symbol-start "@" (+ space)
+ (group (opt ,qual) (| ,conid ,consym))))
+ (1 'haskell-tng:type))
;; modules
(,(rx-to-string `(: symbol-start "module" symbol-end (+ space)
symbol-start (group (opt ,qual) ,conid) symbol-end))
1 'haskell-tng:module)
- ;; imports
+ ;; imports (multi-line support would improve this)
(,(rx-to-string '(: word-start "import" word-end)) ;; anchor matcher
(,(rx-to-string `(: point (+ space) (group word-start "qualified"
word-end)))
nil nil (1 'haskell-tng:keyword))
@@ -114,7 +119,12 @@
(,(rx-to-string `(: point (+? (not (any ?\()))
word-start (group (| "hiding" "as")) word-end
(opt (+ space) word-start (group ,conid) word-end)))
- nil nil (1 'haskell-tng:keyword) (2 'haskell-tng:module nil t)))
+ nil nil (1 'haskell-tng:keyword) (2 'haskell-tng:module nil t))
+ (,(rx-to-string `(: symbol-start (group (| ,conid ,consym)) symbol-end
+ (* space) "(..)"))
+ nil nil (1 'haskell-tng:constructor))
+ (,(rx-to-string `(: symbol-start (group (| ,conid ,consym)) symbol-end))
+ nil nil (1 'haskell-tng:type)))
;; top-level
(,(rx-to-string `(: line-start