branch: elpa/d-mode
commit f8c37b938a507498f0d05245fddc5bbe29e14e7d
Author: Vladimir Panteleev <[email protected]>
Commit: Vladimir Panteleev <[email protected]>
Implement parsing module names in import and module declarations
Fully fixes issue #54.
---
d-mode.el | 43 ++++++++++++++++++++++++++++++++++++++++++-
tests/I0054.d | 6 ++++--
tests/I0054.d.html | 14 ++++++++------
3 files changed, 54 insertions(+), 9 deletions(-)
diff --git a/d-mode.el b/d-mode.el
index e5d6932..b3d503d 100644
--- a/d-mode.el
+++ b/d-mode.el
@@ -7,7 +7,7 @@
;; Maintainer: Russel Winder <[email protected]>
;; Vladimir Panteleev <[email protected]>
;; Created: March 2007
-;; Version: 201909120240
+;; Version: 201909120344
;; Keywords: D programming language emacs cc-mode
;; Package-Requires: ((emacs "25.1"))
@@ -467,6 +467,17 @@ Each list item should be a regexp matching a single
identifier."
:type '(repeat regexp)
:group 'd-mode)
+(c-lang-defconst c-basic-matchers-after
+ d (append
+ ;; D module and import statements
+ (list (c-make-font-lock-BO-decl-search-function
+ (c-make-keywords-re t (c-lang-const c-ref-list-kwds))
+ '((c-fontify-types-and-refs ()
+ (d-forward-module-clause)
+ (if (> (point) limit) (goto-char limit))))))
+ ;; cc-mode defaults
+ (c-lang-const c-basic-matchers-after)))
+
(defconst d-font-lock-keywords-1 (c-lang-const c-matchers-1 d)
"Minimal highlighting for D mode.")
@@ -1593,6 +1604,36 @@ Key bindings:
(advice-add 'c-update-brace-stack :around #'d-around--c-update-brace-stack)
;;----------------------------------------------------------------------------
+;; Support for fontifying module name(s) after a module or import keyword.
+
+(defun d-forward-module-clause ()
+ "Fontify the module name(s) after a module or import keyword."
+ (let (safe-pos pos)
+ (goto-char (match-end 1))
+ (while
+ (progn
+ (c-forward-syntactic-ws)
+ (setq safe-pos (point))
+ (cond
+ ((looking-at c-identifier-start)
+ ;; identifier
+ (setq c-last-identifier-range nil)
+ (forward-char)
+ (when (c-end-of-current-token)
+ (when c-record-type-identifiers
+ (c-record-ref-id (cons safe-pos (point))))
+ t))
+ ;; . or , or = (keep fontifying)
+ ((memq (char-after) '(?. ?, ?=))
+ (forward-char)
+ t)
+ ;; ; or : or anything else weird
+ (t
+ nil))))
+ (goto-char safe-pos)
+ t))
+
+;;----------------------------------------------------------------------------
;;
;; Support for "Adjusting Alignment Rules for UCFS-Chains in D",
;; cf.
https://stackoverflow.com/questions/25797945/adjusting-alignment-rules-for-ucfs-chains-in-d
diff --git a/tests/I0054.d b/tests/I0054.d
index f146247..acca87a 100644
--- a/tests/I0054.d
+++ b/tests/I0054.d
@@ -4,8 +4,6 @@ module aaa;
import bbb;
-// FIXME:
-
module aaa.bbb.ccc;
import aaa.bbb;
@@ -14,3 +12,7 @@ import aaa.bbb.ccc;
import Aaa.Bbb.ccc;
import Aaa.Bbb.Ccc;
import aaa.bbb.Ccc;
+
+import ddd = aaa.bbb.ccc, vvv = xxx.yyy.zzz;
+import aaa.bbb.ccc : x, y, z;
+import aaa.bbb.ccc : i = x, j = y, k = z;
diff --git a/tests/I0054.d.html b/tests/I0054.d.html
index 33b7df8..22dd3e2 100644
--- a/tests/I0054.d.html
+++ b/tests/I0054.d.html
@@ -4,13 +4,15 @@
<span class="keyword">import</span> <span class="constant">bbb</span>;
-<span class="comment-delimiter">// </span><span class="comment">FIXME:
-</span>
-<span class="keyword">module</span> aaa.bbb.<span class="constant">ccc</span>;
+<span class="keyword">module</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>.<span class="constant">ccc</span>;
-<span class="keyword">import</span> aaa.<span class="constant">bbb</span>;
+<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>;
<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">Bbb</span>;
-<span class="keyword">import</span> aaa.bbb.<span class="constant">ccc</span>;
-<span class="keyword">import</span> <span
class="constant">Aaa</span>.Bbb.<span class="constant">ccc</span>;
+<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>.<span class="constant">ccc</span>;
+<span class="keyword">import</span> <span class="constant">Aaa</span>.<span
class="constant">Bbb</span>.<span class="constant">ccc</span>;
<span class="keyword">import</span> <span class="constant">Aaa</span>.<span
class="constant">Bbb</span>.<span class="constant">Ccc</span>;
<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>.<span class="constant">Ccc</span>;
+
+<span class="keyword">import</span> <span class="constant">ddd</span> = <span
class="constant">aaa</span>.<span class="constant">bbb</span>.<span
class="constant">ccc</span>, <span class="constant">vvv</span> = <span
class="constant">xxx</span>.<span class="constant">yyy</span>.<span
class="constant">zzz</span>;
+<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>.<span class="constant">ccc</span> : x, y, z;
+<span class="keyword">import</span> <span class="constant">aaa</span>.<span
class="constant">bbb</span>.<span class="constant">ccc</span> : i = x, j = y, k
= z;