branch: elpa/raku-mode
commit 2810276a929d40db888640ab373aba282bc840a0
Author: Hinrik Örn Sigurðsson <[email protected]>
Commit: Hinrik Örn Sigurðsson <[email protected]>
Initial support for double-quote-words
No interpolation yet, though.
---
perl6-font-lock.el | 28 +++++++++++++++++++++++-----
test/perl6-mode-test.el | 11 +++++++++++
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/perl6-font-lock.el b/perl6-font-lock.el
index d679fe7329..10c5a8d44b 100644
--- a/perl6-font-lock.el
+++ b/perl6-font-lock.el
@@ -177,12 +177,14 @@
table)
"The top level syntax table for Perl 6.")
-(defvar perl6-comment-syntax-table
+(defvar perl6-bracket-syntax-table
(let ((table (make-syntax-table perl6-mode-syntax-table)))
(modify-syntax-entry ?< "(>" table)
(modify-syntax-entry ?> ")<" table)
+ (modify-syntax-entry ?« "(»" table)
+ (modify-syntax-entry ?» ")«" table)
table)
- "Syntax table for comments.")
+ "Syntax table for bracketing constructs.")
(defun perl6-forward-brackets (open close length)
"Move point past the end of a bracketed structure.
@@ -209,7 +211,7 @@ LENGTH is the length of the brackets (e.g. 2 for a
<<foo>>)."
(defun perl6-syntax-propertize-embedded-comment ()
"Add syntax properties to embedded comments \(#`<<foo>>\)."
- (with-syntax-table perl6-comment-syntax-table
+ (with-syntax-table perl6-bracket-syntax-table
(when (and (following-char)
(eq ?\( (char-syntax (following-char))))
(let* ((comment-beg (- (point) 2))
@@ -225,6 +227,21 @@ LENGTH is the length of the brackets (e.g. 2 for a
<<foo>>)."
(put-text-property (- comment-end 1) comment-end
'syntax-table (string-to-syntax "!"))))))))
+(defun perl6-syntax-propertize-dq-words ()
+ "Add syntax properties to double-quoted word lists \(«foo $bar baz»\)."
+ (with-syntax-table perl6-bracket-syntax-table
+ (let* ((quote-beg (match-beginning 0))
+ (quote-chars (match-string 0))
+ (quote-length (length quote-chars))
+ (open-quote (string-to-char (car (split-string quote-chars "" t))))
+ (close-quote (matching-paren open-quote)))
+ (put-text-property quote-beg (1+ quote-beg) 'syntax-table
(string-to-syntax "|"))
+ (perl6-forward-brackets open-quote close-quote quote-length)
+ (let ((quote-end (point)))
+ (put-text-property quote-beg quote-end 'syntax-multiline t)
+ (put-text-property (- quote-end 1) quote-end
+ 'syntax-table (string-to-syntax "|"))))))
+
(defun perl6-syntax-propertize (start end)
"Add context-specific syntax properties to code.
@@ -240,9 +257,10 @@ Takes arguments START and END which delimit the region to
propertize."
((rx (or (and "::" symbol-start)
(and symbol-end "::")))
(0 "_"))
- ; multiline comments
((rx "#`")
- (0 (ignore (perl6-syntax-propertize-embedded-comment)))))
+ (0 (ignore (perl6-syntax-propertize-embedded-comment))))
+ ((rx (or "«" "<<"))
+ (0 (ignore (perl6-syntax-propertize-dq-words)))))
start end)))
(defun perl6-font-lock-syntactic-face (state)
diff --git a/test/perl6-mode-test.el b/test/perl6-mode-test.el
index 2c9a268bc2..484eebf7cc 100644
--- a/test/perl6-mode-test.el
+++ b/test/perl6-mode-test.el
@@ -58,6 +58,17 @@ POS."
(should (eq (perl6-test-syntax-at 10) 'symbol))
(should (eq (perl6-test-syntax-at 11)
'symbol))))
+(ert-deftest perl6-syntax-propertize/dq-words ()
+ :tags '(syntax-table syntax-properties)
+ (perl6-test-with-temp-buffer "foo «bar» bla <<baz>> quux"
+ (should (eq (perl6-test-syntax-at 1) 'word))
+ (should (eq (perl6-test-syntax-at 5)
'generic-string))
+ (should (eq (perl6-test-syntax-at 9)
'generic-string))
+ (should (eq (perl6-test-syntax-at 15)
'generic-string))
+ (should (eq (perl6-test-syntax-at 16)
'punctuation))
+ (should (eq (perl6-test-syntax-at 20)
'punctuation))
+ (should (eq (perl6-test-syntax-at 21)
'generic-string))))
+
(ert-deftest perl6-mode-syntax-table/fontify-dq-string ()
:tags '(fontification syntax-table)
(should (eq (perl6-test-face-at 8 "$foo = \"bar\"") 'perl6-string)))