[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/haskell-tng-mode bd8f905 016/385: almost there, regions no
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/haskell-tng-mode bd8f905 016/385: almost there, regions not being expanded |
Date: |
Tue, 5 Oct 2021 23:58:52 -0400 (EDT) |
branch: elpa/haskell-tng-mode
commit bd8f9056603673e67ce9e9aac52d88c9c52b3c5d
Author: Tseen She <ts33n.sh3@gmail.com>
Commit: Tseen She <ts33n.sh3@gmail.com>
almost there, regions not being expanded
---
haskell-tng-font-lock.el | 96 +++++++++++++++++++++++++++++-------------------
1 file changed, 58 insertions(+), 38 deletions(-)
diff --git a/haskell-tng-font-lock.el b/haskell-tng-font-lock.el
index 8b48c34..ba22a19 100644
--- a/haskell-tng-font-lock.el
+++ b/haskell-tng-font-lock.el
@@ -80,7 +80,6 @@
(+ (not (syntax comment-end)))
(+ (syntax comment-end))))
"Newline or line comment.")
-;; note that type matching must be bounded for inline occurences
(defconst haskell-tng:type
;; TODO literal types and generic lists ... eek!
(let ((typepart `(| (+ (any ?\( ?\)))
@@ -118,15 +117,10 @@
(: symbol-start (char ?\\))))
. 'haskell-tng:keyword)
- ;; types (multi-line support would improve this)
- ;; TODO bracketed types (when are these allowed)
- (,(rx-to-string '(: (|
- (: line-start (+ space) "->")
- (: symbol-start "::" symbol-end))
- (+ space)
- (group (+? (not (syntax comment-start))))
- (| ?\; (syntax comment-start) line-end)))
- (1 'haskell-tng:type keep))
+ ;; types
+ (,(rx-to-string '(: symbol-start "::" symbol-end)) .
+ (haskell-tng:explicit-type-paint
+ (backward-char 2) nil (0 'haskell-tng:type keep)))
(,(rx-to-string `(: line-start "data" (+ space)
(group (| ,conid ,consym))))
(1 'haskell-tng:type))
@@ -181,11 +175,24 @@
(defvar haskell-tng:explicit-type-regex
(rx-to-string `(: point "::" (* space) ,haskell-tng:type))
"Cache of a regex internal to `haskell-tng:explicit-type'")
-(defun haskell-tng:explicit-type ()
+(defun haskell-tng:explicit-type (limit)
+ "Matches an explicit type at point, bounded by a closing paren."
+ (let ((end (min limit (or (haskell-tng:paren-close) limit))))
+ (re-search-forward haskell-tng:explicit-type-regex end t)))
+
+;; FIXME: this is for debugging only
+(defun haskell-tng:explicit-type-paint (limit)
"Matches an explicit type at point, bounded by a closing paren."
- (re-search-forward
- haskell-tng:explicit-type-regex
- (or (haskell-tng:paren-close) (point-max)) t))
+ (let ((end (min limit (or (haskell-tng:paren-close) limit))))
+ ;; FIXME: why do we sometimes get empty searches? Or without the backward
2?
+ (message "explicit-type-paint in %s" (buffer-substring-no-properties
(point) end))
+ (re-search-forward haskell-tng:explicit-type-regex end t)))
+
+;; FIXME FIXME FIXME: for interactive debugging
+(defun type ()
+ (interactive)
+ (let ((case-fold-search nil))
+ (haskell-tng:explicit-type (point-max))))
(eval-when-compile
;; available inside font-lock-extend-region-functions procedures.
@@ -193,19 +200,24 @@
(defvar font-lock-beg)
(defvar font-lock-end))
-;; TODO optimise extend-parens-* to just module / import / types
+(defconst haskell-tng:non-import
+ ;; TODO: exclude more non-import/export characters. ideas: dots that aren't
+ ;; (..) or part of a symbolic import, symbolic operators that are not
+ ;; surrounded by parens.
+ (rx (| ?\" ?\\))
+ "Matches that should never exist in the parens of an import or export")
(defun haskell-tng:extend-parens-open ()
"For use in `font-lock-extend-region-functions'.
Expand the region to include the opening parenthesis.
The caller loops until everything is opened."
(goto-char font-lock-beg)
;; TODO: exit early if in comment
- ;; TODO: use a bounded search-backward to exclude non-package characters
(when-let (open (nth 1 (syntax-ppss)))
(goto-char open)
(when (looking-at "(")
- ;;(haskell-tng:debug-extend (point))
- (setq font-lock-beg (point)))))
+ (unless (re-search-forward haskell-tng:non-import font-lock-beg t)
+ (haskell-tng:debug-extend open)
+ (setq font-lock-beg open)))))
(defun haskell-tng:extend-parens-close ()
"For use in `font-lock-extend-region-functions'.
@@ -213,10 +225,12 @@ Expand the region to include a closing parenthesis.
The caller loops until everything is closed."
(goto-char font-lock-end)
;; TODO: exit early if in comment
- ;; TODO: use a bounded search-forward to exclude non-package characters
(when-let (close (haskell-tng:paren-close))
- ;;(haskell-tng:debug-extend (point))
- (setq font-lock-end (+ 1 close))))
+ (let ((end (+ 1 close)))
+ (goto-char end)
+ (unless (re-search-backward haskell-tng:non-import font-lock-end t)
+ (haskell-tng:debug-extend end)
+ (setq font-lock-end end)))))
(defun haskell-tng:paren-close ()
"Return the position of the next `)', if it closes the current paren depth."
@@ -227,41 +241,47 @@ The caller loops until everything is closed."
(when (looking-at ")")
(point)))))
+(setq
+ haskell-tng:beg-type
+ ;; TODO: more restrictive search, do not scan past non-type constructs
+ (rx symbol-start "::" symbol-end))
(defun haskell-tng:extend-type-open ()
"For use in `font-lock-extend-region-functions'.
Ensures that multiline type signatures are opened."
(goto-char font-lock-beg)
;; TODO: exit early if in comment
- (when (re-search-backward
- ;; TODO: replace \ with a larger list of non-type chars
- (rx symbol-start "::" symbol-end (*? (not (any ?\\))) point)
- (point-min) t)
+ ;; TODO: maximum lookback for a type
+ (when (re-search-backward haskell-tng:beg-type (point-min) t)
(let ((beg (match-beginning 0)))
(when (< beg font-lock-beg)
(goto-char beg)
+ (message "checking for types at %s" (buffer-substring-no-properties
beg (+ beg 10)))
;; validate that it's actually a type
- (haskell-tng:explicit-type) ;; is this needed if we trust the
non-lambda backscan?
- (when (< font-lock-beg (point))
+ (haskell-tng:explicit-type (point-max)) ;; is this needed if we trust
the non-lambda backscan?
+ (message "found one %s from %s to %s in (%s, %s) "
+ (match-string 0)
+ (match-beginning 0) (match-end 0)
+ font-lock-beg font-lock-end)
+ (when (<= font-lock-beg (match-end 0))
+ ;; FIXME FIXME FIXME this is never triggering, is the
re-search-backward going too far back?
(haskell-tng:debug-extend beg)
- (setq font-lock-beg beg)))))
- nil)
+ (setq font-lock-beg beg)
+ nil)))))
(defun haskell-tng:extend-type-close ()
"For use in `font-lock-extend-region-functions'.
Ensures that multiline type signatures are closed."
(goto-char font-lock-end)
;; TODO: exit early if in comment
- (when (re-search-backward
- ;; TODO: replace \ with a larger list of non-type chars
- (rx symbol-start "::" symbol-end (*? (not (any ?\\))) point)
- font-lock-beg t)
+ (when (re-search-backward haskell-tng:beg-type font-lock-beg t)
(let ((beg (match-beginning 0)))
(goto-char beg)
- (haskell-tng:explicit-type)
- (when (< font-lock-end (point))
- (haskell-tng:debug-extend (point))
- (setq font-lock-beg (point)))))
- nil)
+ (haskell-tng:explicit-type (point-max))
+ (let ((end (match-end 0)))
+ (when (< font-lock-end end)
+ (haskell-tng:debug-extend end)
+ (setq font-lock-beg end)
+ nil)))))
(defun haskell-tng:extend-module-open ()
"For use in `font-lock-extend-region-functions'.
- [nongnu] branch elpa/haskell-tng-mode created (now 55d8e69), ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode bf24329 001/385: going nova, ELPA Syncer, 2021/10/05
- [nongnu] elpa/haskell-tng-mode aadf499 003/385: module fontification, ELPA Syncer, 2021/10/05
- [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 <=
- [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, 2021/10/05
- [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