[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode cc739ad 020/385: multiline topdecl type s
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode cc739ad 020/385: multiline topdecl type sections |
Date: |
Tue, 5 Oct 2021 23:58:53 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit cc739ad0d46bedce11d5eb19abe0952494b95fbc
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
multiline topdecl type sections
---
haskell-tng-font-lock.el | 94 ++++++++++++++++++++++++++++++++----------------
haskell-tng-mode.el | 2 +-
2 files changed, 64 insertions(+), 32 deletions(-)
diff --git a/haskell-tng-font-lock.el b/haskell-tng-font-lock.el
index a7e2ba7..746ff21 100644
--- a/haskell-tng-font-lock.el
+++ b/haskell-tng-font-lock.el
@@ -79,13 +79,13 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here is the `font-lock-keywords' table of matchers and highlighters.
-(setq
+(defconst
haskell-tng:keywords
;; These regexps use the `rx' library so we can reuse common subpatterns. It
;; also increases the readability of the code and, in many cases, allows us to
;; do more work in a single regexp instead of multiple passes.
(let ((conid haskell-tng:conid)
- (qual haskell-tng:qual)
+ ;;(qual haskell-tng:qual)
(consym haskell-tng:consym)
(toplevel haskell-tng:toplevel))
`(;; reservedid / reservedop
@@ -106,6 +106,9 @@
;; types
(haskell-tng:explicit-type
(0 'haskell-tng:type keep))
+ (haskell-tng:topdecl
+ (1 'haskell-tng:type keep))
+
;; ;; TODO multiline data/newtype/class/instance types
;; (,(rx-to-string `(: line-start "data" (+ space)
;; (group (| ,conid ,consym))))
@@ -164,64 +167,92 @@
;; the `font-lock-extend-region-functions' below. These set the match region
and
;; return nil if there is not match in the limited search.
;;
-;; Avoid compiling any regexes (i.e. `rx-to-string'), prefer `defconst' caches.
-(defconst haskell-tng:explicit-type-regex
+;; Avoid compiling any regexes (i.e. `rx-to-string'), prefer `defconst' and
`rx'.
+
+(defconst haskell-tng:type
;; TODO literal types and generic lists ... eek!
+ ;; TODO be more explicit about where class constraints can appear
(let ((newline haskell-tng:newline)
(typepart `(| (+ (any ?\( ?\) ?\[ ?\]))
(+ (any lower ?_))
(: (opt ,haskell-tng:qual)
- (| "::" ,haskell-tng:conid ,haskell-tng:consym)))))
- (rx-to-string
- `(: symbol-start "::" (* space) (opt ,newline) (+ (| space ,typepart))
- (* (opt ,newline (+ space)) "->" (+ (| space ,typepart)))))))
+ (| "::" "=>" ,haskell-tng:conid
,haskell-tng:consym)))))
+ `(: (+ (| space ,typepart))
+ (* (opt ,newline (+ space)) "->" (+ (| space ,typepart))))))
+(defconst haskell-tng:explicit-type-regexp
+ (rx-to-string
+ `(: symbol-start "::" (* space) (opt ,haskell-tng:newline)
,haskell-tng:type)))
(defun haskell-tng:explicit-type (limit)
"Matches an explicit type, bounded by a closing paren."
(when (re-search-forward (rx symbol-start "::" symbol-end) limit t)
(goto-char (match-beginning 0))
(when-let (bounded (haskell-tng:paren-close))
(setq limit (min limit (+ 1 bounded))))
- (re-search-forward haskell-tng:explicit-type-regex limit t)))
+ (re-search-forward
+ haskell-tng:explicit-type-regexp
+ limit t)))
+
+(defconst haskell-tng:topdecl-regexp
+ (rx-to-string
+ `(: line-start (| "data" "type" "newtype" "class" "instance") symbol-end
+ (group (+? anything))
+ (|
+ (>= 2 (: (* space) ,haskell-tng:newline))
+ (: symbol-start (| "where" "=") symbol-end)))))
+(defun haskell-tng:topdecl (limit)
+ "Matches the left hand side of a data, type, newtype, class or instance in
group 1."
+ (re-search-forward haskell-tng:topdecl-regexp limit t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Here are `font-lock-extend-region-functions' procedures for extending the
;; region. Note that because we are using `font-lock-multiline' then multiline
;; patterns will always be rehighlighted as a group.
;;
-;; Avoid compiling any regexes (i.e. `rx-to-string'), prefer `defconst' caches.
+;; Avoid compiling any regexes (i.e. `rx-to-string'), prefer `defconst' and
`rx'.
(eval-when-compile
;; NOTE: font-lock-end is non-inclusive.
(defvar font-lock-beg)
(defvar font-lock-end))
+;; TODO: more aggressive non-type chars
+(defconst haskell-tng:non-type "[^\\{}]")
+
+(defconst haskell-tng:extend-explicit-type-regexp
+ (rx-to-string
+ `(: symbol-start "::" symbol-end
+ (*? ,haskell-tng:non-type) point)))
(defun haskell-tng:extend-explicit-type ()
"Multiline explicit type signatures are considered."
(goto-char font-lock-end)
(when (re-search-backward
- ;; TODO: more restrictive back scan
- (rx symbol-start "::" symbol-end (*? (not (any ?\\ ?=))))
+ haskell-tng:extend-explicit-type-regexp
+ font-lock-beg t)
+ (goto-char (match-beginning 0))
+ (haskell-tng:explicit-type (point-max))
+ (haskell-tng:extend)))
+
+(defconst haskell-tng:extend-topdecl-regexp
+ (rx-to-string
+ `(: line-start (| "data" "type" "newtype") symbol-end
+ (*? ,haskell-tng:non-type) point)))
+(defun haskell-tng:extend-topdecl ()
+ "Multiline data, type and newtype definitions."
+ (goto-char font-lock-end)
+ (when (re-search-backward
+ haskell-tng:extend-topdecl-regexp
font-lock-beg t)
- (let ((beg (match-beginning 0)))
- (goto-char beg)
- (haskell-tng:explicit-type (point-max))
- (when (< font-lock-end (point))
- (haskell-tng:debug-extend (point))
- (setq font-lock-end (point))
- nil))))
-
-(defun haskell-tng:extend-defns ()
- "Multiline data, type, newtype, class and instance definitions."
- nil
- )
+ (goto-char (match-beginning 0))
+ (haskell-tng:topdecl (point-max))
+ (haskell-tng:extend)))
(defun haskell-tng:extend-module ()
"For use in `font-lock-extend-region-functions'.
-Ensures that multiline `module' definitions are opened."
+Ensures that multiline module definitions are opened."
nil)
(defun haskell-tng:extend-import ()
"For use in `font-lock-extend-region-functions'.
-Ensures that multiline `import' definitions are opened."
+Ensures that multiline import definitions are opened."
nil)
;; TODO multiline data / newtype / type definitions
@@ -246,11 +277,12 @@ Ensures that multiline `import' definitions are opened."
(when (looking-at ")")
(point)))))
-;; FIXME
-(defun debug-goto-close ()
- (interactive)
- (when-let (p (haskell-tng:paren-close))
- (goto-char p)))
+(defun haskell-tng:extend ()
+ "Extend the `font-lock-end' if point is further ahead."
+ (when (< font-lock-end (point))
+ (haskell-tng:debug-extend (point))
+ (setq font-lock-end (point))
+ nil))
(provide 'haskell-tng-font-lock)
;;; haskell-tng-font-lock.el ends here
diff --git a/haskell-tng-mode.el b/haskell-tng-mode.el
index 5577d39..5d60878 100644
--- a/haskell-tng-mode.el
+++ b/haskell-tng-mode.el
@@ -51,7 +51,7 @@
font-lock-multiline t
font-lock-extend-region-functions '(font-lock-extend-region-wholelines
haskell-tng:extend-explicit-type
- haskell-tng:extend-defns
+ haskell-tng:extend-topdecl
haskell-tng:extend-module
haskell-tng:extend-import)
- [nongnu] elpa/haskell-tng-mode c2a5b64 005/385: cleaner import fontification, (continued)
- [nongnu] elpa/haskell-tng-mode c2a5b64 005/385: cleaner import fontification, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode f6ce55f 006/385: type detection has begun, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 700524b 008/385: typo in keywords, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 6ce5efb 007/385: moar type fontification, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 7bc3218 010/385: extend types in parens, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 52f0cb9 011/385: expand parens, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode f99ca77 012/385: fixup! expand parens, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode bd8f905 016/385: almost there, regions not being expanded, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode db064be 024/385: dank macro for font-lock extends/keyword, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 639fc6c 018/385: multiline types and font-lock-multiline, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode cc739ad 020/385: multiline topdecl type sections,
ELPA Syncer <=
- [nongnu] elpa/haskell-tng-mode 595bd44 034/385: type families, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 77d6ec5 019/385: cleaned up multiline explicit types, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode fa32b46 037/385: finally caught the bug in anchor pre/post resetting, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode f2ce737 038/385: neutral, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 95ab59c 014/385: multiline type matching seems to work, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 85272cb 029/385: fixup! fixup! improve the multiline font macro, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 00f7d84 002/385: simplify names, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 111396f 004/385: converted many font-face rules to the rx DSL, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 6f8258c 009/385: thinking about multiline, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode 5536d23 025/385: all font locks use the new macro, ELPA Syncer, 2021/10/05