branch: elpa/dart-mode
commit a9899a9d9c9e6f046eceb868a7e6161c7d94a8d2
Author: Brady Trainor <[email protected]>
Commit: Brady Trainor <[email protected]>
Fontify abstract methods
---
dart-mode.el | 47 +++++++++++++++++++++-
.../interfaces-and-abstract-classes.dart.faceup | 2 +-
test/test.el | 1 -
3 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/dart-mode.el b/dart-mode.el
index edffa20..0923fcb 100644
--- a/dart-mode.el
+++ b/dart-mode.el
@@ -268,6 +268,47 @@ For example, \"main\" in \"void main() async\" would be
matched."
(goto-char end))
(throw 'result nil))))
+(defun dart--abstract-method-func (limit)
+ "Font-lock matcher function for abstract methods.
+
+Matches function declarations before LIMIT that look like,
+
+ \" [^ ][^=]* lowercaseIdentifier([...]);\"
+
+For example, \"compareTo\" in \" int compareTo(num other);\" would be
+matched."
+ (catch 'result
+ (let (beg end)
+ (while (re-search-forward
+ (rx (group (eval (dart--identifier 'lower))) ?\() limit t)
+ (setq beg (match-beginning 1))
+ (setq end (match-end 1))
+ (condition-case nil
+ (progn
+ (up-list)
+ (when (> (point) limit)
+ (throw 'result nil))
+ (unless (= (char-after (point)) ?\;)
+ (throw 'result nil))
+ (goto-char beg)
+ (back-to-indentation)
+ (unless (= (current-column) 2)
+ (throw 'result nil))
+ (unless (string-match-p
+ " " (buffer-substring-no-properties
+ (point) beg))
+ (throw 'result nil))
+ (when (string-match-p
+ "=" (buffer-substring-no-properties
+ (point) beg))
+ (throw 'result nil))
+ (goto-char end)
+ (set-match-data (list beg end))
+ (throw 'result t))
+ (scan-error nil))
+ (goto-char end))
+ (throw 'result nil))))
+
(defun dart--declared-identifier-func (limit)
"Font-lock matcher function for declared identifiers.
@@ -465,7 +506,8 @@ untyped parameters. For example, in
(defvar dart-font-lock-keywords-1
`((,(regexp-opt dart--file-directives 'words) . font-lock-builtin-face)
(dart--function-declaration-func . font-lock-function-name-face)
- (,dart--operator-declaration-re . (1
font-lock-function-name-face))))
+ (,dart--operator-declaration-re . (1
font-lock-function-name-face))
+ (dart--abstract-method-func .
font-lock-function-name-face)))
(defvar dart-font-lock-keywords-2
`(,dart--async-keywords-re
@@ -479,7 +521,8 @@ untyped parameters. For example, in
(,(regexp-opt dart--types 'words) . font-lock-type-face)
(,dart--types-re . font-lock-type-face)
(dart--function-declaration-func . font-lock-function-name-face)
- (,dart--operator-declaration-re . (1 font-lock-function-name-face))))
+ (,dart--operator-declaration-re . (1 font-lock-function-name-face))
+ (dart--abstract-method-func . font-lock-function-name-face)))
(defvar dart-font-lock-keywords-3
(append
diff --git
a/test/faceup/language-samples/interfaces-and-abstract-classes.dart.faceup
b/test/faceup/language-samples/interfaces-and-abstract-classes.dart.faceup
index 4d7617c..221d320 100644
--- a/test/faceup/language-samples/interfaces-and-abstract-classes.dart.faceup
+++ b/test/faceup/language-samples/interfaces-and-abstract-classes.dart.faceup
@@ -3,7 +3,7 @@
»}
«b:abstract» «k:class» «t:Describable» {
- «t:void» describe();
+ «t:void» «f:describe»();
«t:void» «f:describeWithEmphasis»() {
print(«s:'========='»);
diff --git a/test/test.el b/test/test.el
index a2b029e..a6e1c84 100644
--- a/test/test.el
+++ b/test/test.el
@@ -23,7 +23,6 @@
(should (dart-font-lock-test-apps "faceup/language-samples/variables.dart")))
(ert-deftest dart-font-lock-abstract-method-test ()
- :expected-result :failed
(should (dart-font-lock-test-apps "faceup/issues/abstract-methods.dart")))
(ert-deftest dart-font-lock-covariant-test ()