diff options
| author | Niko Matsakis <niko@alum.mit.edu> | 2019-05-17 16:37:28 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-17 16:37:28 -0400 |
| commit | c62185ae1c6edf0335261f169241eb8ee9713ad5 (patch) | |
| tree | 0ef78b819f6711670ea13be45e53b2aa4ed00cda | |
| parent | 0a942686fde57bb0fe9b59c0148acdb67455eaaf (diff) | |
| parent | e53dc8a31f07248422606e45a1dd67b935be2ac3 (diff) | |
| download | rust-mode-c62185ae1c6edf0335261f169241eb8ee9713ad5.tar.gz | |
Merge pull request #304 from kurnevsky/raw-string-propertize
Don't insert string delimiter inside strings.
| -rw-r--r-- | rust-mode-tests.el | 13 | ||||
| -rw-r--r-- | rust-mode.el | 49 |
2 files changed, 39 insertions, 23 deletions
diff --git a/rust-mode-tests.el b/rust-mode-tests.el index 72a9e4e..b21202a 100644 --- a/rust-mode-tests.el +++ b/rust-mode-tests.el @@ -1452,6 +1452,19 @@ fn g() { "g" font-lock-function-name-face "\"xs\"" font-lock-string-face))) +(ert-deftest font-lock-string-ending-with-r-word-boundary () + (with-temp-buffer + (rust-mode) + (insert "const foo = \"foo bar\"") + (font-lock-fontify-buffer) + ;; right-word should move the point to the end of the words. + (goto-char 14) + (right-word) + (should (equal 17 (point))) + (right-word) + (should (equal 21 (point))) + )) + (ert-deftest font-lock-raw-string-trick-ending-followed-by-string-with-quote () (rust-test-font-lock "r\"With what looks like the start of a raw string at the end r#\"; diff --git a/rust-mode.el b/rust-mode.el index c7afd34..a5f658a 100644 --- a/rust-mode.el +++ b/rust-mode.el @@ -1105,41 +1105,44 @@ should be considered a paired angle bracket." (group "'"))) "A regular expression matching a character literal.")) -(defun rust--syntax-propertize-raw-string (end) +(defun rust--syntax-propertize-raw-string (str-start end) "A helper for rust-syntax-propertize. -If point is already in a raw string, this will apply the -appropriate string syntax to the character up to the end of the -raw string, or to END, whichever comes first." - (let ((str-start (nth 8 (syntax-ppss)))) - (when str-start - (when (save-excursion - (goto-char str-start) - (looking-at "r\\(#*\\)\\(\"\\)")) - ;; In a raw string, so try to find the end. - (let ((hashes (match-string 1))) - ;; Match \ characters at the end of the string to suppress - ;; their normal character-quote syntax. - (when (re-search-forward (concat "\\(\\\\*\\)\\(\"" hashes "\\)") end t) - (put-text-property (match-beginning 1) (match-end 1) - 'syntax-table (string-to-syntax "_")) - (put-text-property (1- (match-end 2)) (match-end 2) - 'syntax-table (string-to-syntax "|")) - (goto-char (match-end 0)))))))) +This will apply the appropriate string syntax to the character +from the STR-START up to the end of the raw string, or to END, +whichever comes first." + (when (save-excursion + (goto-char str-start) + (looking-at "r\\(#*\\)\\(\"\\)")) + ;; In a raw string, so try to find the end. + (let ((hashes (match-string 1))) + ;; Match \ characters at the end of the string to suppress + ;; their normal character-quote syntax. + (when (re-search-forward (concat "\\(\\\\*\\)\\(\"" hashes "\\)") end t) + (put-text-property (match-beginning 1) (match-end 1) + 'syntax-table (string-to-syntax "_")) + (put-text-property (1- (match-end 2)) (match-end 2) + 'syntax-table (string-to-syntax "|")) + (goto-char (match-end 0)))))) (defun rust-syntax-propertize (start end) "A `syntax-propertize-function' to apply properties from START to END." (goto-char start) - (rust--syntax-propertize-raw-string end) + (let ((str-start (rust-in-str-or-cmnt))) + (when str-start + (rust--syntax-propertize-raw-string str-start end))) (funcall (syntax-propertize-rules ;; Character literals. (rust--char-literal-rx (1 "\"") (2 "\"")) ;; Raw strings. ("\\(r\\)#*\"" - (1 (prog1 "|" - (goto-char (match-end 0)) - (rust--syntax-propertize-raw-string end)))) + (0 (ignore + (goto-char (match-end 0)) + (unless (save-excursion (nth 8 (syntax-ppss (match-beginning 0)))) + (put-text-property (match-beginning 1) (match-end 1) + 'syntax-table (string-to-syntax "|")) + (rust--syntax-propertize-raw-string (match-beginning 0) end))))) ("[<>]" (0 (ignore (when (save-match-data |
