Merge from emacs-24; up to 2014-06-22T05:00:14Z!dmantipov@yandex.ru

This commit is contained in:
Glenn Morris 2014-07-12 10:53:29 -07:00
commit b39c4d7b33
16 changed files with 937 additions and 241 deletions

View file

@ -1,3 +1,7 @@
2014-07-12 Paul Eggert <eggert@cs.ucla.edu>
* Makefile.in (install-arch-indep): Avoid readdir race (Bug#17971).
2014-07-10 Dmitry Antipov <dmantipov@yandex.ru>
* configure.ac: Check whether sys/sysinfo.h provides

View file

@ -594,8 +594,9 @@ install-arch-indep: lisp install-info install-man ${INSTALL_ARCH_INDEP_EXTRA}
[ -z "${GZIP_PROG}" ] || { \
echo "Compressing *.el ..." && \
cd "$(DESTDIR)${lispdir}" && \
find . -name '*.elc' -exec $(SHELL) -c \
'${GZIP_PROG} -9n `expr "$$1" : "\\(.*\\)c"`' dummy '{}' ';'; \
for f in `find . -name "*.elc" -print | sed 's/.elc$$/.el/'`; do \
${GZIP_PROG} -9n "$$f"; \
done; \
}
-chmod -R a+r "$(DESTDIR)${datadir}/emacs/${version}" ${COPYDESTS}

View file

@ -1931,6 +1931,16 @@ MSDN:
includes a short description of MSLU and a link where it can be
downloaded.
** Emacs refuses to start on Windows 9X because ctime64 function is missing
This is a sign that Emacs was compiled with MinGW runtime version
4.0.x or later. These versions of runtime call in their startup code
the ctime64 function, which does not exist in MSVCRT.DLL, the C
runtime shared library, distributed with Windows 9X.
A workaround is to build Emacs with MinGW runtime 3.x (the latest
version is 3.20).
** A few seconds delay is seen at startup and for many file operations
This happens when the Net Logon service is enabled. During Emacs
@ -1965,6 +1975,26 @@ Another possibility is to rebuild Emacs with the -shared-libgcc
switch, which will force Emacs to load libgcc_s_dw2-1.dll on startup,
ahead of any optional DLLs loaded on-demand later in the session.
** File selection dialog opens in incorrect directories
Invoking the file selection dialog on Windows 7 or later shows a
directory that is different from what was passed to `read-file-name'
or `x-file-dialog' via their arguments.
This is due to a deliberate change in behavior of the file selection
dialogs introduced in Windows 7. It is explicitly described in the
MSDN documentation of the GetOpenFileName API used by Emacs to pop up
the file selection dialog. For the details, see
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839%28v=vs.85%29.aspx
The dialog shows the last directory in which the user selected a file
in a previous invocation of the dialog with the same initial
directory.
You can reset this "memory" of that directory by invoking the file
selection dialog with a different initial directory.
** PATH can contain unexpanded environment variables
Old releases of TCC (version 9) and 4NT (up to version 8) do not correctly
@ -2098,7 +2128,7 @@ The function set-time-zone-rule gives incorrect results for many
non-US timezones. This is due to over-simplistic handling of
daylight savings switchovers by the Windows libraries.
** Files larger than 4GB report wrong size
** Files larger than 4GB report wrong size in a 32-bit Windows build
Files larger than 4GB cause overflow in the size (represented as a
32-bit integer) reported by `file-attributes'. This affects Dired as

View file

@ -1,3 +1,7 @@
2014-07-12 Paul Eggert <eggert@cs.ucla.edu>
* etags.c (Lisp_functions): Also record cl-defun etc. (Bug#17965)
2014-06-26 Glenn Morris <rgm@gnu.org>
* Makefile.in (blessmail): Depend on lisp/mail/blessmail.el.

View file

@ -4747,6 +4747,9 @@ Lisp_functions (FILE *inf)
}
}
if (strneq (dbp + 1, "cl-", 3) || strneq (dbp + 1, "CL-", 3))
dbp += 3;
if (strneq (dbp+1, "def", 3) || strneq (dbp+1, "DEF", 3))
{
dbp = skip_non_spaces (dbp);

View file

@ -1,3 +1,41 @@
2014-07-12 Paul Eggert <eggert@cs.ucla.edu>
Fix bug: C-x v v discarded existing log message (Bug#17884).
* vc/vc-dispatcher.el (vc-log-edit):
Don't clobber an already-existing log message.
2014-07-12 Glenn Morris <rgm@gnu.org>
* vc/log-edit.el (log-edit-changelog-entries):
Check for a visited-but-never-saved ChangeLog.
2014-07-12 Stefan Monnier <monnier@iro.umontreal.ca>
* vc/log-edit.el (log-edit-changelog-entries): Don't both visiting
a non-existing file (bug#17970).
* faces.el (face-name): Undo last change.
(x-resolve-font-name): Don't call face-name (bug#17956).
2014-07-12 Fabián Ezequiel Gallina <fgallina@gnu.org>
Fix dedenters and electric colon handling. (Bug#15163)
* progmodes/python.el
(python-rx-constituents): Add dedenter and block-ender.
(python-indent-dedenters, python-indent-block-enders): Delete.
(python-indent-context): Return new case for dedenter-statement.
(python-indent-calculate-indentation): Handle new case.
(python-indent-calculate-levels): Fix levels calculation for
dedenter statements.
(python-indent-post-self-insert-function): Fix colon handling.
(python-info-dedenter-opening-block-message): New function.
(python-indent-line): Use it.
(python-info-closing-block)
(python-info-closing-block-message): Remove.
(python-info-dedenter-opening-block-position)
(python-info-dedenter-opening-block-positions)
(python-info-dedenter-statement-p): New functions.
2014-07-11 Dmitry Antipov <dmantipov@yandex.ru>
* files.el (out-of-memory-warning-percentage): New defcustom.

View file

@ -370,10 +370,7 @@ If `inhibit-x-resources' is non-nil, this function does nothing."
(defun face-name (face)
"Return the name of face FACE."
(check-face face)
(if (symbolp face)
(symbol-name face)
face))
(symbol-name (check-face face)))
(defun face-all-attributes (face &optional frame)
@ -2749,8 +2746,6 @@ If PATTERN is nil, return the name of the frame's base font, which never
contains wildcards.
Given optional arguments FACE and FRAME, return a font which is
also the same size as FACE on FRAME, or fail."
(when face
(setq face (face-name face)))
(and (eq frame t)
(setq frame nil))
(if pattern

View file

@ -321,6 +321,13 @@
(or "def" "class" "if" "elif" "else" "try"
"except" "finally" "for" "while" "with")
symbol-end))
(dedenter . ,(rx symbol-start
(or "elif" "else" "except" "finally")
symbol-end))
(block-ender . ,(rx symbol-start
(or
"break" "continue" "pass" "raise" "return")
symbol-end))
(decorator . ,(rx line-start (* space) ?@ (any letter ?_)
(* (any word ?_))))
(defun . ,(rx symbol-start (or "def" "class") symbol-end))
@ -630,18 +637,6 @@ It makes underscores and dots word constituent chars.")
(defvar python-indent-levels '(0)
"Levels of indentation available for `python-indent-line-function'.")
(defvar python-indent-dedenters '("else" "elif" "except" "finally")
"List of words that should be dedented.
These make `python-indent-calculate-indentation' subtract the value of
`python-indent-offset'.")
(defvar python-indent-block-enders
'("break" "continue" "pass" "raise" "return")
"List of words that mark the end of a block.
These make `python-indent-calculate-indentation' subtract the
value of `python-indent-offset' when `python-indent-context' is
AFTER-LINE.")
(defun python-indent-guess-indent-offset ()
"Guess and set `python-indent-offset' for the current buffer."
(interactive)
@ -692,6 +687,7 @@ Where status can be any of the following symbols:
* after-backslash: Previous line ends in a backslash
* after-beginning-of-block: Point is after beginning of block
* after-line: Point is after normal line
* dedenter-statement: Point is on a dedenter statement.
* no-indent: Point is at beginning of buffer or other special case
START is the buffer position where the sexp starts."
(save-restriction
@ -746,6 +742,8 @@ START is the buffer position where the sexp starts."
(when (looking-at (python-rx block-start))
(point-marker)))))
'after-beginning-of-block)
((when (setq start (python-info-dedenter-statement-p))
'dedenter-statement))
;; After normal line
((setq start (save-excursion
(back-to-indentation)
@ -776,8 +774,7 @@ START is the buffer position where the sexp starts."
(goto-char context-start)
(+ (current-indentation) python-indent-offset))
;; When after a simple line just use previous line
;; indentation, in the case current line starts with a
;; `python-indent-dedenters' de-indent one level.
;; indentation.
(`after-line
(let* ((pair (save-excursion
(goto-char context-start)
@ -785,25 +782,27 @@ START is the buffer position where the sexp starts."
(current-indentation)
(python-info-beginning-of-block-p))))
(context-indentation (car pair))
(after-block-start-p (cdr pair))
;; TODO: Separate block enders into its own case.
(adjustment
(if (or (save-excursion
(back-to-indentation)
(and
;; De-indent only when dedenters are not
;; next to a block start. This allows
;; one-liner constructs such as:
;; if condition: print "yay"
;; else: print "wry"
(not after-block-start-p)
(looking-at (regexp-opt python-indent-dedenters))))
(save-excursion
(python-util-forward-comment -1)
(python-nav-beginning-of-statement)
(looking-at (regexp-opt python-indent-block-enders))))
(if (save-excursion
(python-util-forward-comment -1)
(python-nav-beginning-of-statement)
(looking-at (python-rx block-ender)))
python-indent-offset
0)))
(- context-indentation adjustment)))
;; When point is on a dedenter statement, search for the
;; opening block that corresponds to it and use its
;; indentation. If no opening block is found just remove
;; indentation as this is an invalid python file.
(`dedenter-statement
(let ((block-start-point
(python-info-dedenter-opening-block-position)))
(save-excursion
(if (not block-start-point)
0
(goto-char block-start-point)
(current-indentation)))))
;; When inside of a string, do nothing. just use the current
;; indentation. XXX: perhaps it would be a good idea to
;; invoke standard text indentation here
@ -930,16 +929,25 @@ START is the buffer position where the sexp starts."
(defun python-indent-calculate-levels ()
"Calculate `python-indent-levels' and reset `python-indent-current-level'."
(let* ((indentation (python-indent-calculate-indentation))
(remainder (% indentation python-indent-offset))
(steps (/ (- indentation remainder) python-indent-offset)))
(setq python-indent-levels (list 0))
(dotimes (step steps)
(push (* python-indent-offset (1+ step)) python-indent-levels))
(when (not (eq 0 remainder))
(push (+ (* python-indent-offset steps) remainder) python-indent-levels))
(setq python-indent-levels (nreverse python-indent-levels))
(setq python-indent-current-level (1- (length python-indent-levels)))))
(if (not (python-info-dedenter-statement-p))
(let* ((indentation (python-indent-calculate-indentation))
(remainder (% indentation python-indent-offset))
(steps (/ (- indentation remainder) python-indent-offset)))
(setq python-indent-levels (list 0))
(dotimes (step steps)
(push (* python-indent-offset (1+ step)) python-indent-levels))
(when (not (eq 0 remainder))
(push (+ (* python-indent-offset steps) remainder) python-indent-levels)))
(setq python-indent-levels
(or
(mapcar (lambda (pos)
(save-excursion
(goto-char pos)
(current-indentation)))
(python-info-dedenter-opening-block-positions))
(list 0))))
(setq python-indent-current-level (1- (length python-indent-levels))
python-indent-levels (nreverse python-indent-levels)))
(defun python-indent-toggle-levels ()
"Toggle `python-indent-current-level' over `python-indent-levels'."
@ -988,7 +996,7 @@ equal to
(indent-to next-indent)
(goto-char starting-pos))
(and follow-indentation-p (back-to-indentation)))
(python-info-closing-block-message))
(python-info-dedenter-opening-block-message))
(defun python-indent-line-function ()
"`indent-line-function' for Python mode.
@ -1124,14 +1132,7 @@ the line will be re-indented automatically if needed."
(eolp)
(not (equal ?: (char-before (1- (point)))))
(not (python-syntax-comment-or-string-p)))
(let ((indentation (current-indentation))
(calculated-indentation (python-indent-calculate-indentation)))
(python-info-closing-block-message)
(when (> indentation calculated-indentation)
(save-excursion
(indent-line-to calculated-indentation)
(when (not (python-info-closing-block-message))
(indent-line-to indentation)))))))))
(python-indent-line)))))
;;; Navigation
@ -3454,49 +3455,88 @@ parent defun name."
(and (python-info-end-of-statement-p)
(python-info-statement-ends-block-p)))
(defun python-info-closing-block ()
"Return the point of the block the current line closes."
(let ((closing-word (save-excursion
(back-to-indentation)
(current-word)))
(indentation (current-indentation)))
(when (member closing-word python-indent-dedenters)
(save-excursion
(forward-line -1)
(while (and (> (current-indentation) indentation)
(not (bobp))
(not (back-to-indentation))
(forward-line -1)))
(back-to-indentation)
(cond
((not (equal indentation (current-indentation))) nil)
((string= closing-word "elif")
(when (member (current-word) '("if" "elif"))
(point-marker)))
((string= closing-word "else")
(when (member (current-word) '("if" "elif" "except" "for" "while"))
(point-marker)))
((string= closing-word "except")
(when (member (current-word) '("try"))
(point-marker)))
((string= closing-word "finally")
(when (member (current-word) '("except" "else"))
(point-marker))))))))
(define-obsolete-function-alias
'python-info-closing-block
'python-info-dedenter-opening-block-position "24.4")
(defun python-info-closing-block-message (&optional closing-block-point)
"Message the contents of the block the current line closes.
With optional argument CLOSING-BLOCK-POINT use that instead of
recalculating it calling `python-info-closing-block'."
(let ((point (or closing-block-point (python-info-closing-block))))
(defun python-info-dedenter-opening-block-position ()
"Return the point of the closest block the current line closes.
Returns nil if point is not on a dedenter statement or no opening
block can be detected. The latter case meaning current file is
likely an invalid python file."
(let ((positions (python-info-dedenter-opening-block-positions))
(indentation (current-indentation))
(position))
(while (and (not position)
positions)
(save-excursion
(goto-char (car positions))
(if (<= (current-indentation) indentation)
(setq position (car positions))
(setq positions (cdr positions)))))
position))
(defun python-info-dedenter-opening-block-positions ()
"Return points of blocks the current line may close sorted by closer.
Returns nil if point is not on a dedenter statement or no opening
block can be detected. The latter case meaning current file is
likely an invalid python file."
(save-excursion
(let ((dedenter-pos (python-info-dedenter-statement-p)))
(when dedenter-pos
(goto-char dedenter-pos)
(let* ((pairs '(("elif" "elif" "if")
("else" "if" "elif" "except" "for" "while")
("except" "except" "try")
("finally" "else" "except" "try")))
(dedenter (match-string-no-properties 0))
(possible-opening-blocks (cdr (assoc-string dedenter pairs)))
(collected-indentations)
(opening-blocks))
(catch 'exit
(while (python-nav--syntactically
(lambda ()
(re-search-backward (python-rx block-start) nil t))
#'<)
(let ((indentation (current-indentation)))
(when (and (not (memq indentation collected-indentations))
(or (not collected-indentations)
(< indentation (apply #'min collected-indentations))))
(setq collected-indentations
(cons indentation collected-indentations))
(when (member (match-string-no-properties 0)
possible-opening-blocks)
(setq opening-blocks (cons (point) opening-blocks))))
(when (zerop indentation)
(throw 'exit nil)))))
;; sort by closer
(nreverse opening-blocks))))))
(define-obsolete-function-alias
'python-info-closing-block-message
'python-info-dedenter-opening-block-message "24.4")
(defun python-info-dedenter-opening-block-message ()
"Message the first line of the block the current statement closes."
(let ((point (python-info-dedenter-opening-block-position)))
(when point
(save-restriction
(widen)
(message "Closes %s" (save-excursion
(goto-char point)
(back-to-indentation)
(buffer-substring
(point) (line-end-position))))))))
(defun python-info-dedenter-statement-p ()
"Return point if current statement is a dedenter.
Sets `match-data' to the keyword that starts the dedenter
statement."
(save-excursion
(python-nav-beginning-of-statement)
(when (and (not (python-syntax-context-type))
(looking-at (python-rx dedenter)))
(point))))
(defun python-info-line-ends-backslash-p (&optional line-number)
"Return non-nil if current line ends with backslash.
With optional argument LINE-NUMBER, check that line instead."

View file

@ -905,44 +905,46 @@ where LOGBUFFER is the name of the ChangeLog buffer, and each
;; that memoizing which is undesired here.
(setq change-log-default-name nil)
(find-change-log)))))
(with-current-buffer (find-file-noselect changelog-file-name)
(unless (eq major-mode 'change-log-mode) (change-log-mode))
(goto-char (point-min))
(if (looking-at "\\s-*\n") (goto-char (match-end 0)))
(if (not (log-edit-changelog-ours-p))
(list (current-buffer))
(save-restriction
(log-edit-narrow-changelog)
(goto-char (point-min))
(when (or (find-buffer-visiting changelog-file-name)
(file-exists-p changelog-file-name))
(with-current-buffer (find-file-noselect changelog-file-name)
(unless (eq major-mode 'change-log-mode) (change-log-mode))
(goto-char (point-min))
(if (looking-at "\\s-*\n") (goto-char (match-end 0)))
(if (not (log-edit-changelog-ours-p))
(list (current-buffer))
(save-restriction
(log-edit-narrow-changelog)
(goto-char (point-min))
;; Search for the name of FILE relative to the ChangeLog. If that
;; doesn't occur anywhere, they're not using full relative
;; filenames in the ChangeLog, so just look for FILE; we'll accept
;; some false positives.
(let ((pattern (file-relative-name
file (file-name-directory changelog-file-name))))
(if (or (string= pattern "")
(not (save-excursion
(search-forward pattern nil t))))
(setq pattern (file-name-nondirectory file)))
;; Search for the name of FILE relative to the ChangeLog. If that
;; doesn't occur anywhere, they're not using full relative
;; filenames in the ChangeLog, so just look for FILE; we'll accept
;; some false positives.
(let ((pattern (file-relative-name
file (file-name-directory changelog-file-name))))
(if (or (string= pattern "")
(not (save-excursion
(search-forward pattern nil t))))
(setq pattern (file-name-nondirectory file)))
(setq pattern (concat "\\(^\\|[^[:alnum:]]\\)"
(regexp-quote pattern)
"\\($\\|[^[:alnum:]]\\)"))
(setq pattern (concat "\\(^\\|[^[:alnum:]]\\)"
(regexp-quote pattern)
"\\($\\|[^[:alnum:]]\\)"))
(let (texts
(pos (point)))
(while (and (not (eobp)) (re-search-forward pattern nil t))
(let ((entry (log-edit-changelog-entry)))
(if (< (elt entry 1) (max (1+ pos) (point)))
;; This is not relevant, actually.
nil
(push entry texts))
;; Make sure we make progress.
(setq pos (max (1+ pos) (elt entry 1)))
(goto-char pos)))
(let (texts
(pos (point)))
(while (and (not (eobp)) (re-search-forward pattern nil t))
(let ((entry (log-edit-changelog-entry)))
(if (< (elt entry 1) (max (1+ pos) (point)))
;; This is not relevant, actually.
nil
(push entry texts))
;; Make sure we make progress.
(setq pos (max (1+ pos) (elt entry 1)))
(goto-char pos)))
(cons (current-buffer) texts))))))))
(cons (current-buffer) texts)))))))))
(defun log-edit-changelog-insert-entries (buffer beg end &rest files)
"Insert the text from BUFFER between BEG and END.

View file

@ -596,7 +596,7 @@ NOT-URGENT means it is ok to continue if the user says not to save."
(setq default-directory
(buffer-local-value 'default-directory vc-parent-buffer))
(log-edit 'vc-finish-logentry
t
(= (point-min) (point-max))
`((log-edit-listfun . (lambda ()
;; FIXME: Should expand the list
;; for directories.

View file

@ -1,5 +1,15 @@
2014-07-12 Eli Zaretskii <eliz@gnu.org>
* xdisp.c (display_line): Don't call FETCH_BYTE with argument less
than 1. (Bug#17962)
* w32fns.c (Fx_file_dialog): Mention in the doc string the
behavior on Windows 7 and later when the function is repeatedly
invoked with the same value of DIR. (Bug#17950)
* xfns.c (Fx_file_dialog) [USE_MOTIF, USE_GTK]: Update the doc
string to match the one in w32fns.c.
* minibuf.c (read_minibuf_noninteractive) [WINDOWSNT]: Switch
stdin to binary mode only if it is connected to a terminal.

View file

@ -6394,7 +6394,11 @@ or directory must exist.
This function is only defined on NS, MS Windows, and X Windows with the
Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories.
On Windows 7 and later, the file selection dialog "remembers" the last
directory where the user selected a file, and will open that directory
instead of DIR on subsequent invocations of this function with the same
value of DIR as in previous invocations; this is standard Windows behavior. */)
(Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p)
{
/* Filter index: 1: All Files, 2: Directories only */

View file

@ -20494,7 +20494,10 @@ display_line (struct it *it)
row->truncated_on_right_p = 1;
it->continuation_lines_width = 0;
reseat_at_next_visible_line_start (it, 0);
row->ends_at_zv_p = FETCH_BYTE (IT_BYTEPOS (*it) - 1) != '\n';
if (IT_BYTEPOS (*it) <= BEG_BYTE)
row->ends_at_zv_p = true;
else
row->ends_at_zv_p = FETCH_BYTE (IT_BYTEPOS (*it) - 1) != '\n';
break;
}
}

View file

@ -5705,7 +5705,11 @@ or directory must exist.
This function is only defined on NS, MS Windows, and X Windows with the
Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories.
On Windows 7 and later, the file selection dialog "remembers" the last
directory where the user selected a file, and will open that directory
instead of DIR on subsequent invocations of this function with the same
value of DIR as in previous invocations; this is standard Windows behavior. */)
(Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename,
Lisp_Object mustmatch, Lisp_Object only_dir_p)
{
@ -5877,7 +5881,11 @@ or directory must exist.
This function is only defined on NS, MS Windows, and X Windows with the
Motif or Gtk toolkits. With the Motif toolkit, ONLY-DIR-P is ignored.
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories. */)
Otherwise, if ONLY-DIR-P is non-nil, the user can only select directories.
On Windows 7 and later, the file selection dialog "remembers" the last
directory where the user selected a file, and will open that directory
instead of DIR on subsequent invocations of this function with the same
value of DIR as in previous invocations; this is standard Windows behavior. */)
(Lisp_Object prompt, Lisp_Object dir, Lisp_Object default_filename, Lisp_Object mustmatch, Lisp_Object only_dir_p)
{
struct frame *f = SELECTED_FRAME ();

View file

@ -1,3 +1,33 @@
2014-07-12 Fabián Ezequiel Gallina <fgallina@gnu.org>
* automated/python-tests.el (python-indent-block-enders-1)
(python-indent-block-enders-2): Fix tests.
(python-indent-block-enders-3, python-indent-block-enders-4)
(python-indent-block-enders-5, python-indent-dedenters-1)
(python-indent-dedenters-2): Remove tests.
(python-indent-dedenters-1, python-indent-dedenters-2)
(python-indent-dedenters-3, python-indent-dedenters-4)
(python-indent-dedenters-5, python-indent-dedenters-6)
(python-indent-dedenters-7)
(python-info-dedenter-opening-block-position-1)
(python-info-dedenter-opening-block-position-2)
(python-info-dedenter-opening-block-position-3)
(python-info-dedenter-opening-block-positions-1)
(python-info-dedenter-opening-block-positions-2)
(python-info-dedenter-opening-block-positions-3)
(python-info-dedenter-opening-block-positions-4)
(python-info-dedenter-opening-block-positions-5)
(python-info-dedenter-opening-block-message-1)
(python-info-dedenter-opening-block-message-2)
(python-info-dedenter-opening-block-message-3)
(python-info-dedenter-opening-block-message-4)
(python-info-dedenter-opening-block-message-5)
(python-info-dedenter-statement-p-1)
(python-info-dedenter-statement-p-2)
(python-info-dedenter-statement-p-3)
(python-info-dedenter-statement-p-4)
(python-info-dedenter-statement-p-5): New tests.
2014-07-08 Stefan Monnier <monnier@iro.umontreal.ca>
* indent/perl.perl: Add indentation pattern for hash-table entries.

View file

@ -435,79 +435,6 @@ def foo(a, b, c={
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 4))))
(ert-deftest python-indent-dedenters-1 ()
"Check all dedenters."
(python-tests-with-temp-buffer
"
def foo(a, b, c):
if a:
print (a)
elif b:
print (b)
else:
try:
print (c.pop())
except (IndexError, AttributeError):
print (c)
finally:
print ('nor a, nor b are true')
"
(python-tests-look-at "if a:")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "print (a)")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "elif b:")
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "print (b)")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "else:")
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "try:")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "print (c.pop())")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 12))
(python-tests-look-at "except (IndexError, AttributeError):")
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "print (c)")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 12))
(python-tests-look-at "finally:")
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "print ('nor a, nor b are true')")
(should (eq (car (python-indent-context)) 'after-beginning-of-block))
(should (= (python-indent-calculate-indentation) 12))))
(ert-deftest python-indent-dedenters-2 ()
"Check one-liner block special case.."
(python-tests-with-temp-buffer
"
cond = True
if cond:
if cond: print 'True'
else: print 'False'
else:
return
"
(python-tests-look-at "else: print 'False'")
;; When a block has code after ":" it's just considered a simple
;; line as that's a common thing to happen in one-liners.
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "else:")
(should (eq (car (python-indent-context)) 'after-line))
(should (= (python-indent-calculate-indentation) 0))))
(ert-deftest python-indent-after-backslash-1 ()
"The most common case."
(python-tests-with-temp-buffer
@ -575,9 +502,9 @@ objects = Thing.objects.all() \\\\
(should (= (python-indent-calculate-indentation) 0))))
(ert-deftest python-indent-block-enders-1 ()
"Test `python-indent-block-enders' value honoring."
"Test de-indentation for pass keyword."
(python-tests-with-temp-buffer
"
"
Class foo(object):
def bar(self):
@ -589,17 +516,17 @@ Class foo(object):
else:
pass
"
(python-tests-look-at "3)")
(forward-line 1)
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "pass")
(forward-line 1)
(should (= (python-indent-calculate-indentation) 8))))
(python-tests-look-at "3)")
(forward-line 1)
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "pass")
(forward-line 1)
(should (= (python-indent-calculate-indentation) 8))))
(ert-deftest python-indent-block-enders-2 ()
"Test `python-indent-block-enders' value honoring."
"Test de-indentation for return keyword."
(python-tests-with-temp-buffer
"
"
Class foo(object):
'''raise lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
@ -612,10 +539,177 @@ Class foo(object):
2,
3)
"
(python-tests-look-at "def")
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "if")
(should (= (python-indent-calculate-indentation) 8))))
(python-tests-look-at "def")
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "if")
(should (= (python-indent-calculate-indentation) 8))
(python-tests-look-at "return")
(should (= (python-indent-calculate-indentation) 12))
(goto-char (point-max))
(should (= (python-indent-calculate-indentation) 8))))
(ert-deftest python-indent-block-enders-3 ()
"Test de-indentation for continue keyword."
(python-tests-with-temp-buffer
"
for element in lst:
if element is None:
continue
"
(python-tests-look-at "if")
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "continue")
(should (= (python-indent-calculate-indentation) 8))
(forward-line 1)
(should (= (python-indent-calculate-indentation) 4))))
(ert-deftest python-indent-block-enders-4 ()
"Test de-indentation for break keyword."
(python-tests-with-temp-buffer
"
for element in lst:
if element is None:
break
"
(python-tests-look-at "if")
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "break")
(should (= (python-indent-calculate-indentation) 8))
(forward-line 1)
(should (= (python-indent-calculate-indentation) 4))))
(ert-deftest python-indent-block-enders-5 ()
"Test de-indentation for raise keyword."
(python-tests-with-temp-buffer
"
for element in lst:
if element is None:
raise ValueError('Element cannot be None')
"
(python-tests-look-at "if")
(should (= (python-indent-calculate-indentation) 4))
(python-tests-look-at "raise")
(should (= (python-indent-calculate-indentation) 8))
(forward-line 1)
(should (= (python-indent-calculate-indentation) 4))))
(ert-deftest python-indent-dedenters-1 ()
"Test de-indentation for the elif keyword."
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
finally:
cleanup()
elif
"
(python-tests-look-at "elif\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 0))
(should (equal (python-indent-calculate-levels) '(0)))))
(ert-deftest python-indent-dedenters-2 ()
"Test de-indentation for the else keyword."
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
except IOError:
msg = 'Error saving to disk'
message(msg)
logger.exception(msg)
except Exception:
if hide_details:
logger.exception('Unhandled exception')
else
finally:
data.free()
"
(python-tests-look-at "else\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 8))
(should (equal (python-indent-calculate-levels) '(0 4 8)))))
(ert-deftest python-indent-dedenters-3 ()
"Test de-indentation for the except keyword."
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
except
"
(python-tests-look-at "except\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 4))
(should (equal (python-indent-calculate-levels) '(4)))))
(ert-deftest python-indent-dedenters-4 ()
"Test de-indentation for the finally keyword."
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
finally
"
(python-tests-look-at "finally\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 4))
(should (equal (python-indent-calculate-levels) '(4)))))
(ert-deftest python-indent-dedenters-5 ()
"Test invalid levels are skipped in a complex example."
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
except IOError:
msg = 'Error saving to disk'
message(msg)
logger.exception(msg)
finally:
if cleanup:
do_cleanup()
else
"
(python-tests-look-at "else\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 8))
(should (equal (python-indent-calculate-levels) '(0 8)))))
(ert-deftest python-indent-dedenters-6 ()
"Test indentation is zero when no opening block for dedenter."
(python-tests-with-temp-buffer
"
try:
# if save:
write_to_disk(data)
else
"
(python-tests-look-at "else\n")
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 0))
(should (equal (python-indent-calculate-levels) '(0)))))
(ert-deftest python-indent-dedenters-7 ()
"Test indentation case from Bug#15163."
(python-tests-with-temp-buffer
"
if a:
if b:
pass
else:
pass
else:
"
(python-tests-look-at "else:" 2)
(should (eq (car (python-indent-context)) 'dedenter-statement))
(should (= (python-indent-calculate-indentation) 0))
(should (equal (python-indent-calculate-levels) '(0)))))
;;; Navigation
@ -2428,9 +2522,9 @@ if width == 0 and height == 0 and \\\\
(python-util-forward-comment -1)
(should (python-info-end-of-block-p))))
(ert-deftest python-info-closing-block-1 ()
(ert-deftest python-info-dedenter-opening-block-position-1 ()
(python-tests-with-temp-buffer
"
"
if request.user.is_authenticated():
try:
profile = request.user.get_profile()
@ -2445,26 +2539,26 @@ if request.user.is_authenticated():
profile.views += 1
profile.save()
"
(python-tests-look-at "try:")
(should (not (python-info-closing-block)))
(python-tests-look-at "except Profile.DoesNotExist:")
(should (= (python-tests-look-at "try:" -1 t)
(python-info-closing-block)))
(python-tests-look-at "else:")
(should (= (python-tests-look-at "except Profile.DoesNotExist:" -1 t)
(python-info-closing-block)))
(python-tests-look-at "if profile.stats:")
(should (not (python-info-closing-block)))
(python-tests-look-at "else:")
(should (= (python-tests-look-at "if profile.stats:" -1 t)
(python-info-closing-block)))
(python-tests-look-at "finally:")
(should (= (python-tests-look-at "else:" -2 t)
(python-info-closing-block)))))
(python-tests-look-at "try:")
(should (not (python-info-dedenter-opening-block-position)))
(python-tests-look-at "except Profile.DoesNotExist:")
(should (= (python-tests-look-at "try:" -1 t)
(python-info-dedenter-opening-block-position)))
(python-tests-look-at "else:")
(should (= (python-tests-look-at "except Profile.DoesNotExist:" -1 t)
(python-info-dedenter-opening-block-position)))
(python-tests-look-at "if profile.stats:")
(should (not (python-info-dedenter-opening-block-position)))
(python-tests-look-at "else:")
(should (= (python-tests-look-at "if profile.stats:" -1 t)
(python-info-dedenter-opening-block-position)))
(python-tests-look-at "finally:")
(should (= (python-tests-look-at "else:" -2 t)
(python-info-dedenter-opening-block-position)))))
(ert-deftest python-info-closing-block-2 ()
(ert-deftest python-info-dedenter-opening-block-position-2 ()
(python-tests-with-temp-buffer
"
"
if request.user.is_authenticated():
profile = Profile.objects.get_or_create(user=request.user)
if profile.stats:
@ -2475,10 +2569,440 @@ data = {
}
'else'
"
(python-tests-look-at "'else': 'do it'")
(should (not (python-info-closing-block)))
(python-tests-look-at "'else'")
(should (not (python-info-closing-block)))))
(python-tests-look-at "'else': 'do it'")
(should (not (python-info-dedenter-opening-block-position)))
(python-tests-look-at "'else'")
(should (not (python-info-dedenter-opening-block-position)))))
(ert-deftest python-info-dedenter-opening-block-position-3 ()
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
except IOError:
msg = 'Error saving to disk'
message(msg)
logger.exception(msg)
except Exception:
if hide_details:
logger.exception('Unhandled exception')
else
finally:
data.free()
"
(python-tests-look-at "try:")
(should (not (python-info-dedenter-opening-block-position)))
(python-tests-look-at "except IOError:")
(should (= (python-tests-look-at "try:" -1 t)
(python-info-dedenter-opening-block-position)))
(python-tests-look-at "except Exception:")
(should (= (python-tests-look-at "except IOError:" -1 t)
(python-info-dedenter-opening-block-position)))
(python-tests-look-at "if hide_details:")
(should (not (python-info-dedenter-opening-block-position)))
;; check indentation modifies the detected opening block
(python-tests-look-at "else")
(should (= (python-tests-look-at "if hide_details:" -1 t)
(python-info-dedenter-opening-block-position)))
(indent-line-to 8)
(should (= (python-tests-look-at "if hide_details:" -1 t)
(python-info-dedenter-opening-block-position)))
(indent-line-to 4)
(should (= (python-tests-look-at "except Exception:" -1 t)
(python-info-dedenter-opening-block-position)))
(indent-line-to 0)
(should (= (python-tests-look-at "if save:" -1 t)
(python-info-dedenter-opening-block-position)))))
(ert-deftest python-info-dedenter-opening-block-positions-1 ()
(python-tests-with-temp-buffer
"
if save:
try:
write_to_disk(data)
except IOError:
msg = 'Error saving to disk'
message(msg)
logger.exception(msg)
except Exception:
if hide_details:
logger.exception('Unhandled exception')
else
finally:
data.free()
"
(python-tests-look-at "try:")
(should (not (python-info-dedenter-opening-block-positions)))
(python-tests-look-at "except IOError:")
(should
(equal (list
(python-tests-look-at "try:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "except Exception:")
(should
(equal (list
(python-tests-look-at "except IOError:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "if hide_details:")
(should (not (python-info-dedenter-opening-block-positions)))
;; check indentation does not modify the detected opening blocks
(python-tests-look-at "else")
(should
(equal (list
(python-tests-look-at "if hide_details:" -1 t)
(python-tests-look-at "except Exception:" -1 t)
(python-tests-look-at "if save:" -1 t))
(python-info-dedenter-opening-block-positions)))
(indent-line-to 8)
(should
(equal (list
(python-tests-look-at "if hide_details:" -1 t)
(python-tests-look-at "except Exception:" -1 t)
(python-tests-look-at "if save:" -1 t))
(python-info-dedenter-opening-block-positions)))
(indent-line-to 4)
(should
(equal (list
(python-tests-look-at "if hide_details:" -1 t)
(python-tests-look-at "except Exception:" -1 t)
(python-tests-look-at "if save:" -1 t))
(python-info-dedenter-opening-block-positions)))
(indent-line-to 0)
(should
(equal (list
(python-tests-look-at "if hide_details:" -1 t)
(python-tests-look-at "except Exception:" -1 t)
(python-tests-look-at "if save:" -1 t))
(python-info-dedenter-opening-block-positions)))))
(ert-deftest python-info-dedenter-opening-block-positions-2 ()
"Test detection of opening blocks for elif."
(python-tests-with-temp-buffer
"
if var:
if var2:
something()
elif var3:
something_else()
elif
"
(python-tests-look-at "elif var3:")
(should
(equal (list
(python-tests-look-at "if var2:" -1 t)
(python-tests-look-at "if var:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "elif\n")
(should
(equal (list
(python-tests-look-at "elif var3:" -1 t)
(python-tests-look-at "if var:" -1 t))
(python-info-dedenter-opening-block-positions)))))
(ert-deftest python-info-dedenter-opening-block-positions-3 ()
"Test detection of opening blocks for else."
(python-tests-with-temp-buffer
"
try:
something()
except:
if var:
if var2:
something()
elif var3:
something_else()
else
if var4:
while var5:
var4.pop()
else
for value in var6:
if value > 0:
print value
else
"
(python-tests-look-at "else\n")
(should
(equal (list
(python-tests-look-at "elif var3:" -1 t)
(python-tests-look-at "if var:" -1 t)
(python-tests-look-at "except:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "else\n")
(should
(equal (list
(python-tests-look-at "while var5:" -1 t)
(python-tests-look-at "if var4:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "else\n")
(should
(equal (list
(python-tests-look-at "if value > 0:" -1 t)
(python-tests-look-at "for value in var6:" -1 t)
(python-tests-look-at "if var4:" -1 t))
(python-info-dedenter-opening-block-positions)))))
(ert-deftest python-info-dedenter-opening-block-positions-4 ()
"Test detection of opening blocks for except."
(python-tests-with-temp-buffer
"
try:
something()
except ValueError:
something_else()
except
"
(python-tests-look-at "except ValueError:")
(should
(equal (list (python-tests-look-at "try:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "except\n")
(should
(equal (list (python-tests-look-at "except ValueError:" -1 t))
(python-info-dedenter-opening-block-positions)))))
(ert-deftest python-info-dedenter-opening-block-positions-5 ()
"Test detection of opening blocks for finally."
(python-tests-with-temp-buffer
"
try:
something()
finally
try:
something_else()
except:
logger.exception('something went wrong')
finally
try:
something_else_else()
except Exception:
logger.exception('something else went wrong')
else:
print ('all good')
finally
"
(python-tests-look-at "finally\n")
(should
(equal (list (python-tests-look-at "try:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "finally\n")
(should
(equal (list (python-tests-look-at "except:" -1 t))
(python-info-dedenter-opening-block-positions)))
(python-tests-look-at "finally\n")
(should
(equal (list (python-tests-look-at "else:" -1 t))
(python-info-dedenter-opening-block-positions)))))
(ert-deftest python-info-dedenter-opening-block-message-1 ()
"Test dedenters inside strings are ignored."
(python-tests-with-temp-buffer
"'''
try:
something()
except:
logger.exception('something went wrong')
'''
"
(python-tests-look-at "except\n")
(should (not (python-info-dedenter-opening-block-message)))))
(ert-deftest python-info-dedenter-opening-block-message-2 ()
"Test except keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
"
(python-tests-look-at "except:")
(should (string=
"Closes try:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))
(end-of-line)
(should (string=
"Closes try:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))))
(ert-deftest python-info-dedenter-opening-block-message-3 ()
"Test else keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
else:
logger.debug('all good')
"
(python-tests-look-at "else:")
(should (string=
"Closes except:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))
(end-of-line)
(should (string=
"Closes except:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))))
(ert-deftest python-info-dedenter-opening-block-message-4 ()
"Test finally keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
else:
logger.debug('all good')
finally:
clean()
"
(python-tests-look-at "finally:")
(should (string=
"Closes else:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))
(end-of-line)
(should (string=
"Closes else:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))))
(ert-deftest python-info-dedenter-opening-block-message-5 ()
"Test elif keyword."
(python-tests-with-temp-buffer
"
if a:
something()
elif b:
"
(python-tests-look-at "elif b:")
(should (string=
"Closes if a:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))
(end-of-line)
(should (string=
"Closes if a:"
(substring-no-properties
(python-info-dedenter-opening-block-message))))))
(ert-deftest python-info-dedenter-statement-p-1 ()
"Test dedenters inside strings are ignored."
(python-tests-with-temp-buffer
"'''
try:
something()
except:
logger.exception('something went wrong')
'''
"
(python-tests-look-at "except\n")
(should (not (python-info-dedenter-statement-p)))))
(ert-deftest python-info-dedenter-statement-p-2 ()
"Test except keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
"
(python-tests-look-at "except:")
(should (= (point) (python-info-dedenter-statement-p)))
(end-of-line)
(should (= (save-excursion
(back-to-indentation)
(point))
(python-info-dedenter-statement-p)))))
(ert-deftest python-info-dedenter-statement-p-3 ()
"Test else keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
else:
logger.debug('all good')
"
(python-tests-look-at "else:")
(should (= (point) (python-info-dedenter-statement-p)))
(end-of-line)
(should (= (save-excursion
(back-to-indentation)
(point))
(python-info-dedenter-statement-p)))))
(ert-deftest python-info-dedenter-statement-p-4 ()
"Test finally keyword."
(python-tests-with-temp-buffer
"
try:
something()
except:
logger.exception('something went wrong')
else:
logger.debug('all good')
finally:
clean()
"
(python-tests-look-at "finally:")
(should (= (point) (python-info-dedenter-statement-p)))
(end-of-line)
(should (= (save-excursion
(back-to-indentation)
(point))
(python-info-dedenter-statement-p)))))
(ert-deftest python-info-dedenter-statement-p-5 ()
"Test elif keyword."
(python-tests-with-temp-buffer
"
if a:
something()
elif b:
"
(python-tests-look-at "elif b:")
(should (= (point) (python-info-dedenter-statement-p)))
(end-of-line)
(should (= (save-excursion
(back-to-indentation)
(point))
(python-info-dedenter-statement-p)))))
(ert-deftest python-info-line-ends-backslash-p-1 ()
(python-tests-with-temp-buffer