               (end-pos (ycmd--col-line-to-position
                         end-column-num
                         end-line-num))
-              (face (assoc-default kind ycmd--file-ready-faces)))
-          (with-silent-modifications
-            (set-text-properties
-             start-pos end-pos `(font-lock-face ,face))))))))
+              (btype (assoc-default kind ycmd--file-ready-buttons)))
+          (when btype
+            (with-silent-modifications
+              (ycmd--make-button
+               start-pos end-pos
+               btype
+               (concat kind ": " text)))))))))
+
+(defun ycmd--display-error (msg)
+  (message "ERROR: %s" msg))
 
 (defun ycmd--decorate-with-parse-results (results)
   "Decorates a buffer using the results of a file-ready parse

  "Convert COL and LINE into a position in the current buffer.

COL and LINE are expected to be as returned from ycmd, e.g. from
notify-file-ready.
"
  (save-excursion
    (goto-line line)
    (forward-char (- col 1))
    (point)))

(defconst ycmd--file-ready-faces
  '(("ERROR" . (error (underline t) bold))
    ("WARNING" . (warning)))
  "alist of file-parse types to faces. These faces are applied to
  buffers as ycmd reports errors, etc.")

(defun ycmd--decorate-single-parse-result (r)
  "Decorates a buffer based on the contents of a single parse

        (ycmd--request "/event_notification"
                       content
                       :parser 'json-read)
        (deferred:nextc it 'ycmd--decorate-with-parse-results)
        ))))

(defun ycmd-display-file-parse-results ()
  (interactive)
