emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[nongnu] elpa/rust-mode 4d633fc 125/486: Merge pull request #32 from Mic


From: ELPA Syncer
Subject: [nongnu] elpa/rust-mode 4d633fc 125/486: Merge pull request #32 from MicahChalmer/raw-string-handling
Date: Sat, 7 Aug 2021 09:25:02 -0400 (EDT)

branch: elpa/rust-mode
commit 4d633fc20de2560f26bcaca95b5458dfa2efb6eb
Merge: 19bc0e9 bddc933
Author: Niko Matsakis <niko@alum.mit.edu>
Commit: Niko Matsakis <niko@alum.mit.edu>

    Merge pull request #32 from MicahChalmer/raw-string-handling
    
    Parse and highlight raw strings correctly
---
 rust-mode-tests.el | 38 +++++++++++++++++++++++++++++++++++++-
 rust-mode.el       | 24 ++++++++++++++++++------
 2 files changed, 55 insertions(+), 7 deletions(-)

diff --git a/rust-mode-tests.el b/rust-mode-tests.el
index 36e59df..e20e5fa 100644
--- a/rust-mode-tests.el
+++ b/rust-mode-tests.el
@@ -290,7 +290,7 @@ very very very long string
      deindented
      1
      (lambda ()
-       ;; The indentation will fial in some cases if the syntax properties are
+       ;; The indentation will fail in some cases if the syntax properties are
        ;; not set.  This only happens when font-lock fontifies the buffer.
        (font-lock-fontify-buffer)
        (indent-region 1 (buffer-size)))
@@ -927,6 +927,42 @@ list of substrings of `STR' each followed by its face."
      "let" font-lock-keyword-face
      "'\\''" font-lock-string-face)))
 
+(ert-deftest font-lock-raw-strings-no-hashes ()
+  (rust-test-font-lock
+   "r\"No hashes\";"
+   '("r\"No hashes\"" font-lock-string-face)))
+
+(ert-deftest font-lock-raw-strings-double-quote ()
+  (rust-test-font-lock
+   "fn main() {
+    r#\"With a double quote (\")\"#;
+}
+"
+   '("fn" font-lock-keyword-face
+     "main" font-lock-function-name-face
+     "r#\"With a double quote (\")\"#" font-lock-string-face)))
+
+(ert-deftest font-lock-raw-strings-two-hashes ()
+  (rust-test-font-lock
+   "r##\"With two hashes\"##;"
+   '("r##\"With two hashes\"##" font-lock-string-face)))
+
+(ert-deftest font-lock-raw-strings-backslash-at-end ()
+  (rust-test-font-lock
+   "r\"With a backslash at the end\\\";"
+   '("r\"With a backslash at the end\\\"" font-lock-string-face)))
+
+(ert-deftest font-lock-two-raw-strings ()
+  (rust-test-font-lock
+   "fn main() {
+    r\"With a backslash at the end\\\";
+    r##\"With two hashes\"##;
+}"
+   '("fn" font-lock-keyword-face
+     "main" font-lock-function-name-face
+     "r\"With a backslash at the end\\\"" font-lock-string-face
+     "r##\"With two hashes\"##" font-lock-string-face)))
+
 (ert-deftest indent-method-chains-no-align ()
   (let ((rust-indent-method-chain nil)) (test-indent
    "
diff --git a/rust-mode.el b/rust-mode.el
index 43afd9a..fe9660b 100644
--- a/rust-mode.el
+++ b/rust-mode.el
@@ -51,6 +51,13 @@
 
     table))
 
+(defvar rust-mode-inside-raw-string-syntax-table
+  (let ((table (make-syntax-table rust-mode-syntax-table)))
+    (modify-syntax-entry ?\" "_" table)
+    (modify-syntax-entry ?\\ "_" table)
+
+    table))
+
 (defgroup rust-mode nil
   "Support for Rust code."
   :link '(url-link "http://www.rust-lang.org/";)
@@ -312,12 +319,17 @@
              ("static" . font-lock-constant-face)))))
 
 (defvar rust-mode-font-lock-syntactic-keywords
-  (mapcar (lambda (re) (list re '(1 "\"") '(2 "\"")))
-          '("\\('\\)[^']\\('\\)"
-            "\\('\\)\\\\['nrt]\\('\\)"
-            "\\('\\)\\\\x[[:xdigit:]]\\{2\\}\\('\\)"
-            "\\('\\)\\\\u[[:xdigit:]]\\{4\\}\\('\\)"
-            "\\('\\)\\\\U[[:xdigit:]]\\{8\\}\\('\\)")))
+  (append
+   ;; Handle single quoted character literals:
+   (mapcar (lambda (re) (list re '(1 "\"") '(2 "\"")))
+           '("\\('\\)[^']\\('\\)"
+             "\\('\\)\\\\['nrt]\\('\\)"
+             "\\('\\)\\\\x[[:xdigit:]]\\{2\\}\\('\\)"
+             "\\('\\)\\\\u[[:xdigit:]]\\{4\\}\\('\\)"
+             "\\('\\)\\\\U[[:xdigit:]]\\{8\\}\\('\\)"))
+   ;; Handle raw strings:
+   `(("\\(r\\)\"\\([^\"]*\\)\\(\"\\)" (1 "|") (2 
,rust-mode-inside-raw-string-syntax-table) (3 "|"))
+     ("\\(r\\)#\\(#*\\)\\(\"[^#]*\"\\2\\)\\(#\\)" (1 "|") (3 
,rust-mode-inside-raw-string-syntax-table) (4 "|")))))
 
 (defun rust-fill-prefix-for-comment-start (line-start)
   "Determine what to use for `fill-prefix' based on what is at the beginning 
of a line."



reply via email to

[Prev in Thread] Current Thread [Next in Thread]