From 1f69089d359f5c2c04bffc352b16810d40f79a36 Mon Sep 17 00:00:00 2001
From: Stefan Monnier <monnier@iro.umontreal.ca>
Date: Thu, 4 Sep 2014 11:23:37 -0400
Subject: [PATCH] * lisp/emacs-lisp/eldoc.el (eldoc-function-argstring): Don't
 strip terminating paren. (eldoc-last-data-store): Return cached data.
 (eldoc-get-var-docstring): Avoid setq. (eldoc-get-fnsym-args-string): Clarify
 data flow.

Fixes: debbugs:18352
---
 lisp/ChangeLog           |  8 +++++
 lisp/emacs-lisp/eldoc.el | 68 +++++++++++++++++++++-------------------
 2 files changed, 43 insertions(+), 33 deletions(-)

diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 78d3cf56321..24adcdc13c9 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,11 @@
+2014-09-04  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/eldoc.el (eldoc-function-argstring): Don't strip
+	terminating paren (bug#18352).
+	(eldoc-last-data-store): Return cached data.
+	(eldoc-get-var-docstring): Avoid setq.
+	(eldoc-get-fnsym-args-string): Clarify data flow.
+
 2014-09-04  Thierry Volpiatto  <thierry.volpiatto@gmail.com>
 
 	* emacs-lisp/eldoc.el (eldoc-highlight-function-argument): Handle the
diff --git a/lisp/emacs-lisp/eldoc.el b/lisp/emacs-lisp/eldoc.el
index acb1bdc32e8..6f933268e52 100644
--- a/lisp/emacs-lisp/eldoc.el
+++ b/lisp/emacs-lisp/eldoc.el
@@ -1,4 +1,4 @@
-;;; eldoc.el --- show function arglist or variable docstring in echo area  -*- lexical-binding: t; -*-
+;;; eldoc.el --- Show function arglist or variable docstring in echo area  -*- lexical-binding:t; -*-
 
 ;; Copyright (C) 1996-2014 Free Software Foundation, Inc.
 
@@ -344,27 +344,29 @@ Emacs Lisp mode) that support ElDoc.")
   "Return a string containing the parameter list of the function SYM.
 If SYM is a subr and no arglist is obtainable from the docstring
 or elsewhere, return a 1-line docstring."
-  (let (args doc advertised)
-    (cond ((not (and sym (symbolp sym) (fboundp sym))))
+  (let ((argstring
+	 (cond
+	  ((not (and sym (symbolp sym) (fboundp sym))) nil)
 	  ((and (eq sym (aref eldoc-last-data 0))
 		(eq 'function (aref eldoc-last-data 2)))
-	   (setq doc (aref eldoc-last-data 1)))
-	  ((listp (setq advertised (gethash (indirect-function sym)
-					    advertised-signature-table t)))
-	   (setq args advertised))
-	  ((setq doc (help-split-fundoc (documentation sym t) sym))
-	   (setq args (car doc)))
+	   (aref eldoc-last-data 1))
 	  (t
-	   (setq args (help-function-arglist sym))))
-    (if args
-	;; Stringify, and store before highlighting, downcasing, etc.
-	;; FIXME should truncate before storing.
-	(eldoc-last-data-store sym (setq args (eldoc-function-argstring args))
-			       'function)
-      (setq args doc))		  ; use stored value
-    ;; Change case, highlight, truncate.
-    (if args
-	(eldoc-highlight-function-argument sym args index))))
+	   (let* ((advertised (gethash (indirect-function sym)
+                                       advertised-signature-table t))
+                  doc
+		  (args
+		   (cond
+		    ((listp advertised) advertised)
+		    ((setq doc (help-split-fundoc (documentation sym t) sym))
+		     (car doc))
+		    (t (help-function-arglist sym)))))
+             ;; Stringify, and store before highlighting, downcasing, etc.
+             ;; FIXME should truncate before storing.
+	     (eldoc-last-data-store sym (eldoc-function-argstring args)
+                                    'function))))))
+    ;; Highlight, truncate.
+    (if argstring
+	(eldoc-highlight-function-argument sym argstring index))))
 
 (defun eldoc-highlight-function-argument (sym args index)
   "Highlight argument INDEX in ARGS list for function SYM.
@@ -478,23 +480,23 @@ In the absence of INDEX, just call `eldoc-docstring-format-sym-doc'."
 ;; Return a string containing a brief (one-line) documentation string for
 ;; the variable.
 (defun eldoc-get-var-docstring (sym)
-  (when sym
-    (cond ((and (eq sym (aref eldoc-last-data 0))
-		(eq 'variable (aref eldoc-last-data 2)))
-	   (aref eldoc-last-data 1))
-	  (t
-	   (let ((doc (documentation-property sym 'variable-documentation t)))
-	     (cond (doc
-		    (setq doc (eldoc-docstring-format-sym-doc
-			       sym (eldoc-docstring-first-line doc)
-			       'font-lock-variable-name-face))
-		    (eldoc-last-data-store sym doc 'variable)))
-	     doc)))))
+  (cond ((not sym) nil)
+        ((and (eq sym (aref eldoc-last-data 0))
+              (eq 'variable (aref eldoc-last-data 2)))
+         (aref eldoc-last-data 1))
+        (t
+         (let ((doc (documentation-property sym 'variable-documentation t)))
+           (when doc
+             (let ((doc (eldoc-docstring-format-sym-doc
+                         sym (eldoc-docstring-first-line doc)
+                         'font-lock-variable-name-face)))
+               (eldoc-last-data-store sym doc 'variable)))))))
 
 (defun eldoc-last-data-store (symbol doc type)
   (aset eldoc-last-data 0 symbol)
   (aset eldoc-last-data 1 doc)
-  (aset eldoc-last-data 2 type))
+  (aset eldoc-last-data 2 type)
+  doc)
 
 ;; Note that any leading `*' in the docstring (which indicates the variable
 ;; is a user option) is removed.
@@ -596,7 +598,7 @@ ARGLIST is either a string, or a list of strings or symbols."
   (let ((str (cond ((stringp arglist) arglist)
                    ((not (listp arglist)) nil)
                    (t (format "%S" (help-make-usage 'toto arglist))))))
-    (if (and str (string-match "\\`([^ ]+ ?" str))
+    (if (and str (string-match "\\`([^ )]+ ?" str))
         (replace-match "(" t t str)
       str)))
 
-- 
2.39.5