     ('IDENTIFIER (string-join (lean-info-symbol-body info) "\n"))
     ('SYMBOL     (string-join (lean-info-identifier-body info) "\n"))))
 
-;; NAY Information
-;; ----------------
-(defun lean-info-nay () '(NAY))
-
-(defun lean-info-nay-type (nay)
-  (cl-first nay))
-(defun lean-info-nay-p (nay)
-  (pcase nay
-    (`NAY t)
-    ((pred stringp) (string= "-- NAY" nay))
-    ((pred listp) (and (lean-info-nay-p (cl-first nay))))))
-(defun lean-info-nay-parse (seq)
-  (when (lean-info-nay-p seq)
-    (lean-info-nay)))
-
-;; -- Test
-(cl-assert (lean-info-nay-p "-- NAY"))
-(cl-assert (lean-info-nay-p '("-- NAY")))
-(cl-assert (equal (lean-info-nay-parse '("-- NAY"))
-                  '(NAY)))
-
 ;; Basic
 ;; -----
 (defun lean-info-kind (info)
   (cl-first info))
-(defun lean-info-ack-str-p (str)
-  (string= "-- ACK" str))
-(defun lean-info-begininfo-str-p (str)
-  (string= "-- BEGININFO" str))
-(defun lean-info-endinfo-str-p (str)
-  (string= "-- ENDINFO" str))
+(defun lean-info-nay-p (str)
+  (when (string-match (rx "-- BEGININFO " (* not-newline) "NAY") str)
+    t))
+(defun lean-info-stale-p (str)
+  (when (string-match (rx "-- BEGININFO " (* not-newline) "STALE") str)
+    t))
 (defun lean-info-pos (info)
   (cl-case (lean-info-kind info)
-    (TYPE       (lean-info-type-pos   info))
+    (TYPE       (lean-info-type-pos       info))
     (OVERLOAD   (lean-info-overload-pos   info))
     (SYNTH      (lean-info-synth-pos      info))
+    (COERCION   (lean-info-coercion-pos   info))
     (IDENTIFIER (lean-info-identifier-pos info))
-    (SYMBOL     (lean-info-symbol-pos      info))
-    (NAY        ())))
+    (SYMBOL     (lean-info-symbol-pos     info))
+    ))
 (defun lean-info-line-number (info)
   (cl-first (lean-info-pos info)))
 (defun lean-info-column (info)

      (setq str (format "%s : %s"
                        (propertize name-str 'face 'font-lock-variable-name-face)
                        type-str)))
    (when overload-str
      (setq str (concat str
                        (format "\n%s with %s"
                                (propertize "overloaded" 'face 'font-lock-keyword-face)
                                overload-str))))
    str))

(defun lean-get-info-record (file-name line-number column-number)
  "Get info list from lean server using file-name and line-number"
  (when (and file-name line-number column-number)
    (lean-server-check-current-file file-name)
    (lean-server-send-cmd (lean-cmd-info line-number))
    (while (not lean-global-server-message-to-process)
      (accept-process-output (lean-server-get-process) 0 50 t))
    (pcase lean-global-server-message-to-process
      (`(INFO ,pre ,body)
       (lean-server-log "The following pre-message will be thrown away:")
       (lean-server-log "%s" pre)
       (setq lean-global-server-message-to-process nil)
       (lean-info-record-parse body file-name column-number))
      (`(,type ,pre , body)
       (lean-server-log "The following pre-message will be thrown away:")
       (lean-server-log "%s" pre)
       (lean-server-log "Something other than INFO detected: %S" type)
       ;; (lean-server-log "Body: %S" body)
       (setq lean-global-server-message-to-process nil)))))

(defun lean-get-info-record-at-point ()
  "Get info-record at the current point"
  (interactive)
  (let* ((file-name (buffer-file-name))
         (line-number (line-number-at-pos))
         (column (current-column))
         (cur-char (char-after (point))))
    (when (and cur-char
               (or (char-equal cur-char ?\s)
                   (char-equal cur-char ?\t)
                   (char-equal cur-char ?\t)
                   (char-equal cur-char ?\,)
                   (char-equal cur-char ?\))
                   (char-equal cur-char ?\})
                   (char-equal cur-char ?\]))
               (> column 1))
      (setq column (1- column)))
    (lean-get-info-record file-name line-number column)))

(defun lean-get-full-name-at-point ()
  "Return the full-name at point (if any)"
  (let* ((info-record (lean-get-info-record-at-point))
         (id (cl-first (lean-info-record-identifier info-record))))
    (when id
      (lean-info-identifier-body-str id))))

(provide 'lean-info)

  (let ((info-list (lean-info-list-parse-string str))
        start-column)
    (cond
     ;; When file-name/column-number is specified, try to start-column of id/symbol
     ((and file-name column-number)
      (setq start-column (lean-info-list-find-start-column info-list file-name column-number))
