[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master be50572 2/2: Fix electric-pair-tests by disabling b
From: |
João Távora |
Subject: |
[Emacs-diffs] master be50572 2/2: Fix electric-pair-tests by disabling bug#33794's fix with a variable |
Date: |
Thu, 17 Jan 2019 13:49:33 -0500 (EST) |
branch: master
commit be505726b68d407a44fdcd9c7ac1ef722398532d
Author: João Távora <address@hidden>
Commit: João Távora <address@hidden>
Fix electric-pair-tests by disabling bug#33794's fix with a variable
The variable c--disable-fix-of-bug-33794, which should be removed in
the short term in favor of a permanent solution, is introduced.
It is bound to nil by default. This means that breakage is still
happening in actual c-mode and c++-mode usage, though the tests no
longer show it.
To get around this breakage, put
(setq c--disable-fix-of-bug-33794 t)
In your init file. Evidently, you will lose the fix for bug#33794,
but that only affects a small corner case of c-toggle-auto-newline,
which is not turned on by default.
See https://lists.gnu.org/archive/html/emacs-devel/2019-01/msg00360.html
for more information.
* lisp/progmodes/cc-cmds.el (c--disable-fix-of-bug-33794): New
variable.
(c--with-post-self-insert-hook-maybe): New macro.
(c-electric-pound, c-electric-brace, c-electric-slash)
(c-electric-star, c-electric-semi&comma, c-electric-colon)
(c-electric-lt-gt, c-electric-paren): Use it.
(c-electric-paren, c-electric-brace): Check
c--disable-fix-of-bug-33794.
* test/lisp/electric-tests.el (c--disable-fix-of-bug-33794):
Forward declare.
(electric-pair-test-for)
(electric-layout-int-main-kernel-style)
(electric-modes-in-c-mode-with-self-insert-command): Use it.
---
lisp/progmodes/cc-cmds.el | 96 ++++++++++++++++++++++++++-------------------
test/lisp/electric-tests.el | 6 +++
2 files changed, 62 insertions(+), 40 deletions(-)
diff --git a/lisp/progmodes/cc-cmds.el b/lisp/progmodes/cc-cmds.el
index 78677fe..6b0d961 100644
--- a/lisp/progmodes/cc-cmds.el
+++ b/lisp/progmodes/cc-cmds.el
@@ -485,6 +485,20 @@ function to control that."
(c-hungry-delete-forward)
(c-hungry-delete-backwards)))
+(defvar c--disable-fix-of-bug-33794 nil
+ "If non-nil disable alans controversional fix of 33794.
+This fix breaks most features of `electric-pair-mode' by
+incompletely reimplementing in in this mode.")
+
+(defmacro c--with-post-self-insert-hook-maybe (&rest body)
+ `(let ((post-self-insert-hook
+ (if c--disable-fix-of-bug-33794
+ post-self-insert-hook
+ ;; Acording to AM: Disable random functionality to get
+ ;; defined functionality from `self-insert-command'
+ nil)))
+ ,@body))
+
(defun c-electric-pound (arg)
"Insert a \"#\".
If `c-electric-flag' is set, handle it specially according to the variable
@@ -504,7 +518,7 @@ inside a literal or a macro, nothing special happens."
(eq (char-before) ?\\))))
(c-in-literal)))
;; do nothing special
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
;; place the pound character at the left edge
(let ((pos (- (point-max) (point)))
@@ -857,36 +871,38 @@ settings of `c-cleanup-list' are done."
;; Insert the brace. Note that expand-abbrev might reindent
;; the line here if there's a preceding "else" or something.
- (let (post-self-insert-hook) ; the only way to get defined functionality
- ; from `self-insert-command'.
- (self-insert-command (prefix-numeric-value arg)))
+ (c--with-post-self-insert-hook-maybe
+ (self-insert-command (prefix-numeric-value arg)))
;; Emulate `electric-pair-mode'.
- (when (and (boundp 'electric-pair-mode)
- electric-pair-mode)
- (let ((size (buffer-size))
- (c-in-electric-pair-functionality t)
- post-self-insert-hook)
- (electric-pair-post-self-insert-function)
- (setq got-pair-} (and at-eol
- (eq (c-last-command-char) ?{)
- (eq (char-after) ?}))
- electric-pair-deletion (< (buffer-size) size))))
-
- ;; Perform any required CC Mode electric actions.
- (cond
- ((or literal arg (not c-electric-flag) active-region))
- ((not at-eol)
- (c-indent-line))
- (electric-pair-deletion
- (c-indent-line)
- (c-do-brace-electrics 'ignore nil))
- (t (c-do-brace-electrics nil nil)
- (when got-pair-}
- (save-excursion
- (forward-char)
- (c-do-brace-electrics 'assume 'ignore))
- (c-indent-line))))
+ (unless c--disable-fix-of-bug-33794
+ (when (and (boundp 'electric-pair-mode)
+ electric-pair-mode)
+ (let ((size (buffer-size))
+ (c-in-electric-pair-functionality t)
+ post-self-insert-hook)
+ (electric-pair-post-self-insert-function)
+ (setq got-pair-} (and at-eol
+ (eq (c-last-command-char) ?{)
+ (eq (char-after) ?}))
+ electric-pair-deletion (< (buffer-size) size))))
+
+ ;; Perform any required CC Mode electric actions.
+ (cond
+ ((or literal arg (not c-electric-flag) active-region))
+ ((not at-eol)
+ (c-indent-line))
+ (electric-pair-deletion
+ (c-indent-line)
+ (c-do-brace-electrics 'ignore nil))
+ (t (c-do-brace-electrics nil nil)
+ (when got-pair-}
+ (save-excursion
+ (forward-char)
+ (c-do-brace-electrics 'assume 'ignore))
+ (c-indent-line)))))
+
+
;; blink the paren
(and (eq (c-last-command-char) ?\})
@@ -944,7 +960,7 @@ is inhibited."
c-electric-flag
(eq (c-last-command-char) ?/)
(eq (char-before) (if literal ?* ?/))))
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
(if indentp
(indent-according-to-mode))))
@@ -958,7 +974,7 @@ supplied, point is inside a literal, or
`c-syntactic-indentation' is nil,
this indentation is inhibited."
(interactive "*P")
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
;; if we are in a literal, or if arg is given do not reindent the
;; current line, unless this star introduces a comment-only line.
@@ -1006,7 +1022,7 @@ settings of `c-cleanup-list'."
(setq lim (c-most-enclosing-brace (c-parse-state))
literal (c-in-literal lim)))
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
(if (and c-electric-flag (not literal) (not arg))
@@ -1076,7 +1092,7 @@ reindented unless `c-syntactic-indentation' is nil.
newlines is-scope-op
;; shut this up
(c-echo-syntactic-information-p nil))
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
;; Any electric action?
(if (and c-electric-flag (not literal) (not arg))
@@ -1170,7 +1186,7 @@ numeric argument is supplied, or the point is inside a
literal."
(let ((c-echo-syntactic-information-p nil)
final-pos found-delim case-fold-search)
- (let (post-self-insert-hook) ; Disable random functionality.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
(setq final-pos (point))
@@ -1236,8 +1252,7 @@ newline cleanups are done if appropriate; see the
variable `c-cleanup-list'."
;; shut this up
(c-echo-syntactic-information-p nil)
case-fold-search)
- (let (post-self-insert-hook) ; The only way to get defined functionality
- ; from `self-insert-command'.
+ (c--with-post-self-insert-hook-maybe
(self-insert-command (prefix-numeric-value arg)))
(if (and (not arg) (not literal))
@@ -1288,10 +1303,11 @@ newline cleanups are done if appropriate; see the
variable `c-cleanup-list'."
(insert-and-inherit "} catch (")))
;; Apply `electric-pair-mode' stuff.
- (when (and (boundp 'electric-pair-mode)
- electric-pair-mode)
- (let (post-self-insert-hook)
- (electric-pair-post-self-insert-function)))
+ (unless c--disable-fix-of-bug-33794
+ (when (and (boundp 'electric-pair-mode)
+ electric-pair-mode)
+ (let (post-self-insert-hook)
+ (electric-pair-post-self-insert-function))))
;; Check for clean-ups at function calls. These two DON'T need
;; `c-electric-flag' or `c-syntactic-indentation' set.
diff --git a/test/lisp/electric-tests.el b/test/lisp/electric-tests.el
index 5a4b20e..b55d889 100644
--- a/test/lisp/electric-tests.el
+++ b/test/lisp/electric-tests.el
@@ -47,10 +47,14 @@
(declare (indent defun) (debug t))
`(call-with-saved-electric-modes #'(lambda () ,@body)))
+;; Defined in lisp/progmodes/cc-cmds.el
+(defvar c--disable-fix-of-bug-33794 t)
+
(defun electric-pair-test-for (fixture where char expected-string
expected-point mode bindings fixture-fn)
(with-temp-buffer
(funcall mode)
+ (setq-local c--disable-fix-of-bug-33794 t)
(insert fixture)
(save-electric-modes
(let ((last-command-event char)
@@ -821,6 +825,7 @@ baz\"\""
(electric-layout-local-mode 1)
(electric-pair-local-mode 1)
(electric-indent-local-mode 1)
+ (setq-local c--disable-fix-of-bug-33794 t)
(setq-local electric-layout-rules
'((?\{ . (after-stay after))))
(insert "int main () ")
@@ -834,6 +839,7 @@ baz\"\""
(electric-layout-local-mode 1)
(electric-pair-local-mode 1)
(electric-indent-local-mode 1)
+ (setq-local c--disable-fix-of-bug-33794 t)
(setq-local electric-layout-rules
'((?\{ . (before after-stay after))))
(insert "int main () ")