diff options
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/lsp-ui-20180913.833/lsp-ui-sideline.el')
-rw-r--r-- | configs/shared/emacs/.emacs.d/elpa/lsp-ui-20180913.833/lsp-ui-sideline.el | 506 |
1 files changed, 0 insertions, 506 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/lsp-ui-20180913.833/lsp-ui-sideline.el b/configs/shared/emacs/.emacs.d/elpa/lsp-ui-20180913.833/lsp-ui-sideline.el deleted file mode 100644 index f61e43c895ac..000000000000 --- a/configs/shared/emacs/.emacs.d/elpa/lsp-ui-20180913.833/lsp-ui-sideline.el +++ /dev/null @@ -1,506 +0,0 @@ -;;; lsp-ui-sideline.el --- Lsp-Ui-Sideline -*- lexical-binding: t -*- - -;; Copyright (C) 2017 Sebastien Chapuis - -;; Author: Sebastien Chapuis <sebastien@chapu.is> -;; URL: https://github.com/emacs-lsp/lsp-ui -;; Keywords: lsp, ui - -;;; License -;; -;; This program is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 3, or (at your option) -;; any later version. - -;; This program is distributed in the hope that it will be useful, -;; but WITHOUT ANY WARRANTY; without even the implied warranty of -;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -;; GNU General Public License for more details. - -;; You should have received a copy of the GNU General Public License -;; along with this program; see the file COPYING. If not, write to -;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth -;; Floor, Boston, MA 02110-1301, USA. - -;;; Commentary: -;; -;; Utility to show informations of the current line - -;;; Code: - -(require 'lsp-mode) -(require 'flycheck) -(require 'dash) - -(defgroup lsp-ui-sideline nil - "Display informations of the current line." - :group 'tools - :group 'convenience - :group 'lsp-ui - :link '(custom-manual "(lsp-ui-sideline) Top") - :link '(info-link "(lsp-ui-sideline) Customizing")) - -(defcustom lsp-ui-sideline-enable t - "Whether or not to enable ‘lsp-ui-sideline’." - :type 'boolean - :group 'lsp-ui) - -(defcustom lsp-ui-sideline-ignore-duplicate nil - "Control to ignore duplicates when there is a same symbol with the same contents." - :type 'boolean - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-show-symbol t - "When t, show the symbol name on the right of the information." - :type 'boolean - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-show-hover t - "Whether to show hover messages in sideline." - :type 'boolean - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-show-flycheck t - "Whether to show flycheck messages in sideline." - :type 'boolean - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-show-code-actions t - "Whether to show code actions in sideline." - :type 'boolean - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-update-mode 'line - "Define the mode for updating sideline information. - -When set to `line' the information will be updated when user -changes current line otherwise the information will be updated -when user changes current point." - :type '(choice (const line) - (const point)) - :group 'lsp-ui-sideline) - -(defcustom lsp-ui-sideline-delay 0.2 - "Number of seconds to wait before showing sideline." - :type 'number - :group 'lsp-ui-sideline) - -(defvar lsp-ui-sideline-code-actions-prefix "" - "Prefix to insert before the code action title. -This can be used to insert, for example, an unicode character: 💡") - -(defvar-local lsp-ui-sideline--ovs nil - "Overlays used by `lsp-ui-sideline'.") - -(defvar-local lsp-ui-sideline--occupied-lines nil - "List of lines occupied by an overlay of `lsp-ui-sideline'.") - -(defvar-local lsp-ui-sideline--tag nil - "Tag marking where the last operation was based. -It is used to know when the cursor has changed of line or point.") - -(defvar-local lsp-ui-sideline--last-width nil - "Value of window's width on the last operation. -It is used to know when the window has changed of width.") - -(defvar-local lsp-ui-sideline--timer nil) - -(defface lsp-ui-sideline-symbol - '((t :foreground "grey" - :box (:line-width -1 :color "grey") - :height 0.99)) - "Face used to highlight symbols." - :group 'lsp-ui-sideline) - -(defface lsp-ui-sideline-current-symbol - '((t :foreground "white" - :weight ultra-bold - :box (:line-width -1 :color "white") - :height 0.99)) - "Face used to highlight the symbol on point." - :group 'lsp-ui-sideline) - -(defface lsp-ui-sideline-code-action - '((t :foreground "yellow")) - "Face used to highlight code action text." - :group 'lsp-ui-sideline) - -(defface lsp-ui-sideline-symbol-info - '((t :slant italic :height 0.99)) - "Face used to highlight the symbols informations (LSP hover)." - :group 'lsp-ui-sideline) - -(defface lsp-ui-sideline-global - '((t)) - "Face which apply to all overlays. -This face have a low priority over the others." - :group 'lsp-ui-sideline) - -(defun lsp-ui-sideline--calc-space (win-width str-len index) - "Calcul whether there is enough space on line. -If there is enough space, it returns the point of the last -character on the line. - -WIN-WIDTH is the window width. -STR-LEN is the string size. -INDEX is the line number (relative to the current line)." - (let ((eol (line-end-position index))) - (unless (member eol lsp-ui-sideline--occupied-lines) - (save-excursion - (goto-char eol) - (when (>= (- win-width (current-column)) str-len) - eol))))) - -(defun lsp-ui-sideline--find-line (str-len &optional up) - "Find a line where the string can be inserted. -It loops on the nexts lines to find enough space. -Returns the point of the last character on the line. - -WIN-WIDTH is the window width. -STR-LEN is the string size. -if UP is non-nil, it loops on the previous lines.." - (let ((win-width (lsp-ui-sideline--window-width)) - (index 1) pos) - (while (and (null pos) (<= (abs index) 30)) - (setq index (if up (1- index) (1+ index))) - (setq pos (lsp-ui-sideline--calc-space win-width str-len index))) - (when pos (push pos lsp-ui-sideline--occupied-lines)) - (if (or (equal pos (point-min)) - (and up (null pos))) - (lsp-ui-sideline--find-line str-len) - pos))) - -(defun lsp-ui-sideline--delete-ov () - "Delete overlays." - (seq-do 'delete-overlay lsp-ui-sideline--ovs) - (setq lsp-ui-sideline--ovs nil)) - -(defun lsp-ui-sideline--get-renderer (language) - "Return a function to fontify a string in LANGUAGE." - (thread-last lsp--cur-workspace - lsp--workspace-client - lsp--client-string-renderers - (assoc-string language) - cdr)) - -(defun lsp-ui-sideline--get-language () - "Return the language of the buffer." - (thread-first lsp--cur-workspace - lsp--workspace-client - lsp--client-language-id - (funcall (current-buffer)))) - -(defun lsp-ui-sideline--extract-info (contents) - "Extract the line to print from CONTENTS. -CONTENTS can be differents type of values: -MarkedString | MarkedString[] | MarkupContent (as defined in the LSP). -We prioritize string with a language (which is probably a type or a -function signature)." - (when contents - (cond - ((stringp contents) contents) - ((sequencep contents) ;; MarkedString[] - (seq-find (lambda (it) (and (hash-table-p it) - (lsp-ui-sideline--get-renderer (gethash "language" it)))) - contents)) - ((gethash "kind" contents) (gethash "value" contents)) ;; MarkupContent - ((gethash "language" contents) ;; MarkedString - (and (lsp-ui-sideline--get-renderer (gethash "language" contents)) - (gethash "value" contents)))))) - -(defun lsp-ui-sideline--format-info (marked-string) - "Format MARKED-STRING. -If the string has a language, we fontify it with the function provided -by `lsp-mode'. -MARKED-STRING is the string returned by `lsp-ui-sideline--extract-info'." - (when marked-string - (when (hash-table-p marked-string) - (let* ((language (gethash "language" marked-string)) - (value (gethash "value" marked-string)) - (renderer (lsp-ui-sideline--get-renderer language))) - (setq marked-string (if (and (functionp renderer) value) - (funcall renderer value) - value)))) - (add-face-text-property 0 (length marked-string) 'lsp-ui-sideline-symbol-info nil marked-string) - (add-face-text-property 0 (length marked-string) 'default t marked-string) - (replace-regexp-in-string "[\n\t ]+" " " marked-string))) - -(defun lsp-ui-sideline--align (&rest lengths) - (+ (apply '+ lengths) - (if (display-graphic-p) 1 2))) - -(defun lsp-ui-sideline--make-display-string (info symbol current) - "Make final string to display on buffer. -INFO is the information to display. -SYMBOL is the symbol associated to the info. -CURRENT is non-nil when the point is on the symbol." - (let* ((face (if current 'lsp-ui-sideline-current-symbol 'lsp-ui-sideline-symbol)) - (str (if lsp-ui-sideline-show-symbol - (concat info " " (propertize (concat " " symbol " ") 'face face)) - info)) - (len (length str)) - (margin (lsp-ui-sideline--margin-width))) - (add-face-text-property 0 len 'lsp-ui-sideline-global nil str) - (concat - (propertize " " 'display `(space :align-to (- right-fringe ,(lsp-ui-sideline--align len margin)))) - str))) - -(defun lsp-ui-sideline--check-duplicate (symbol info) - (not (when lsp-ui-sideline-ignore-duplicate - (--any (and (string= (overlay-get it 'symbol) symbol) - (string= (overlay-get it 'info) info)) - lsp-ui-sideline--ovs)))) - -(defun lsp-ui-sideline--margin-width () - (+ (if fringes-outside-margins right-margin-width 0) - (or (and (boundp 'fringe-mode) - (consp fringe-mode) - (or (equal (car fringe-mode) 0) - (equal (cdr fringe-mode) 0)) - 1) - 0) - (if (bound-and-true-p display-line-numbers-mode) - (+ 2 (line-number-display-width)) - 0))) - -(defun lsp-ui-sideline--window-width () - (- (min (window-text-width) (window-body-width)) - (lsp-ui-sideline--margin-width))) - -(defun lsp-ui-sideline--push-info (symbol tag bounds info) - (when (and (= tag (lsp-ui-sideline--calculate-tag)) - (not (lsp-ui-sideline--stop-p))) - (let* ((info (concat (thread-first (gethash "contents" info) - lsp-ui-sideline--extract-info - lsp-ui-sideline--format-info))) - (current (and (>= (point) (car bounds)) (<= (point) (cdr bounds))))) - (when (and (> (length info) 0) - (lsp-ui-sideline--check-duplicate symbol info)) - (let* ((final-string (lsp-ui-sideline--make-display-string info symbol current)) - (pos-ov (lsp-ui-sideline--find-line (length final-string))) - (ov (when pos-ov (make-overlay pos-ov pos-ov)))) - (when pos-ov - (overlay-put ov 'info info) - (overlay-put ov 'symbol symbol) - (overlay-put ov 'bounds bounds) - (overlay-put ov 'current current) - (overlay-put ov 'after-string final-string) - (overlay-put ov 'window (get-buffer-window)) - (push ov lsp-ui-sideline--ovs))))))) - -(defun lsp-ui-sideline--toggle-current (ov current) - "Toggle the OV face according to CURRENT." - (let* ((info (overlay-get ov 'info)) - (symbol (overlay-get ov 'symbol)) - (string (lsp-ui-sideline--make-display-string info symbol current))) - (overlay-put ov 'current current) - (overlay-put ov 'after-string string))) - -(defun lsp-ui-sideline--highlight-current (point) - "Update the symbol's face according to POINT." - (dolist (ov lsp-ui-sideline--ovs) - (let* ((bounds (overlay-get ov 'bounds)) - (start (car bounds)) - (end (cdr bounds))) - (if (and bounds (>= point start) (<= point end)) - (unless (overlay-get ov 'current) - (lsp-ui-sideline--toggle-current ov t)) - (when (overlay-get ov 'current) - (lsp-ui-sideline--toggle-current ov nil)))))) - -(defun lsp-ui-sideline--flycheck () - "Show flycheck message(s)." - (let ((bol (line-beginning-position)) - (eol (line-end-position))) - (dolist (e (flycheck-overlay-errors-in bol (1+ eol))) - (let* ((message (--> (flycheck-error-format-message-and-id e) - (car (split-string it "\n")) - (replace-regexp-in-string "[\n\t ]+" " " it))) - (len (length message)) - (level (flycheck-error-level e)) - (face (if (eq level 'info) 'success level)) - (margin (lsp-ui-sideline--margin-width)) - (message (progn (add-face-text-property 0 len 'lsp-ui-sideline-global nil message) - (add-face-text-property 0 len face nil message) - message)) - (string (concat (propertize " " 'display `(space :align-to (- right-fringe ,(lsp-ui-sideline--align len margin)))) - message)) - (pos-ov (lsp-ui-sideline--find-line len t)) - (ov (and pos-ov (make-overlay pos-ov pos-ov)))) - (when pos-ov - (overlay-put ov 'after-string string) - (push ov lsp-ui-sideline--ovs)))))) - -(defvar-local lsp-ui-sideline--code-actions nil) - -(defun lsp-ui-sideline-apply-code-actions nil - "Choose and apply code action(s) on the current line." - (interactive) - (unless lsp-ui-sideline--code-actions - (user-error "No code actions on the current line")) - (let* ((actions lsp-ui-sideline--code-actions) - (title (completing-read "Apply: " (--map (gethash "title" it) actions) - nil t)) - (action (--first (equal (gethash "title" it) title) actions))) - (unless action - (error "Fail to apply action")) - (lsp-execute-code-action action))) - -(defun lsp-ui-sideline--code-actions (actions) - "Show code ACTIONS." - (setq lsp-ui-sideline--code-actions actions) - (seq-doseq (action actions) - (-let* ((title (->> (gethash "title" action) - (replace-regexp-in-string "[\n\t ]+" " ") - (concat lsp-ui-sideline-code-actions-prefix))) - (margin (lsp-ui-sideline--margin-width)) - (keymap (let ((map (make-sparse-keymap))) - (define-key map [down-mouse-1] (lambda () (interactive) - (save-excursion - (lsp-execute-code-action action)))) - map)) - (len (length title)) - (title (progn (add-face-text-property 0 len 'lsp-ui-sideline-global nil title) - (add-face-text-property 0 len 'lsp-ui-sideline-code-action nil title) - (add-text-properties 0 len `(keymap ,keymap mouse-face highlight) title) - title)) - (string (concat (propertize " " 'display `(space :align-to (- right-fringe ,(lsp-ui-sideline--align len margin)))) - title)) - (pos-ov (lsp-ui-sideline--find-line (1+ (length title)) t)) - (ov (and pos-ov (make-overlay pos-ov pos-ov)))) - (when pos-ov - (overlay-put ov 'after-string string) - (push ov lsp-ui-sideline--ovs))))) - -(defun lsp-ui-sideline--calculate-tag() - "Calculate the tag used to determinie whether to update sideline information." - (if (equal lsp-ui-sideline-update-mode 'line) - (line-number-at-pos) - (point))) - -(defun lsp-ui-sideline--run () - "Show informations (flycheck + lsp). -It loops on the symbols of the current line and request information -to the language server." - (lsp-ui-sideline--delete-ov) - (when (and lsp--cur-workspace - buffer-file-name) - (let ((eol (line-end-position)) - (bol (line-beginning-position)) - (tag (lsp-ui-sideline--calculate-tag)) - (line-widen (save-restriction (widen) (line-number-at-pos))) - (doc-id (lsp--text-document-identifier))) - (save-excursion - (setq lsp-ui-sideline--occupied-lines nil - lsp-ui-sideline--tag tag - lsp-ui-sideline--last-width (window-text-width)) - (when lsp-ui-sideline-show-flycheck - (lsp-ui-sideline--flycheck)) - (when (and lsp-ui-sideline-show-code-actions (or (lsp--capability "codeActionProvider") - (lsp--registered-capability "textDocument/codeAction"))) - (lsp--send-request-async (lsp--make-request - "textDocument/codeAction" - (if (equal lsp-ui-sideline-update-mode 'line) - (list :textDocument doc-id - :range (lsp--region-to-range bol eol) - :context (list :diagnostics (lsp--cur-line-diagnotics))) - (lsp--text-document-code-action-params))) - #'lsp-ui-sideline--code-actions)) - ;; Go through all symbols and request hover information. Note that the symbols are - ;; traversed backwards as `forward-symbol' with a positive argument will jump just past the - ;; current symbol. By going from the end of the line towards the front, point will be placed - ;; at the beginning of each symbol. As the requests are first collected in a list before - ;; being processed they are still sent in order from left to right. - (when (and lsp-ui-sideline-show-hover (lsp--capability "hoverProvider")) - (let ((symbols)) - (goto-char eol) - (while (and (> (point) bol) - (progn (forward-symbol -1) - (>= (point) bol))) - (let* ((symbol (thing-at-point 'symbol t)) - (bounds (bounds-of-thing-at-point 'symbol)) - (parsing-state (syntax-ppss)) - (in-string (nth 3 parsing-state)) - (outside-comment (eq (nth 4 parsing-state) nil))) - ;; Skip strings and comments - (when (and symbol (not in-string) outside-comment) - (push (list symbol tag bounds (lsp--position (1- line-widen) (- (point) bol))) symbols)))) - (dolist (entry symbols) - (-let [(symbol tag bounds position) entry] - (lsp--send-request-async - (lsp--make-request - "textDocument/hover" - (list :textDocument doc-id :position position)) - (lambda (info) (if info (lsp-ui-sideline--push-info symbol tag bounds info)))))))))))) - -(defun lsp-ui-sideline--stop-p () - "Return non-nil if the sideline should not be display." - (or (region-active-p) - (bound-and-true-p company-pseudo-tooltip-overlay) - (bound-and-true-p lsp-ui-peek--overlay))) - -(defun lsp-ui-sideline--hide-before-company (command) - "Disable the sideline before company's overlay appears. -COMMAND is `company-pseudo-tooltip-frontend' parameter." - (when (memq command '(post-command update)) - (lsp-ui-sideline--delete-ov) - (setq lsp-ui-sideline--tag nil))) - -(defun lsp-ui-sideline () - "Show informations of the current line." - (if (lsp-ui-sideline--stop-p) - (progn (setq lsp-ui-sideline--tag nil) - (lsp-ui-sideline--delete-ov)) - (if (and (equal (lsp-ui-sideline--calculate-tag) lsp-ui-sideline--tag) - (equal (window-text-width) lsp-ui-sideline--last-width)) - (lsp-ui-sideline--highlight-current (point)) - (lsp-ui-sideline--delete-ov) - (when lsp-ui-sideline--timer - (cancel-timer lsp-ui-sideline--timer)) - (let ((buf (current-buffer))) - (setq lsp-ui-sideline--timer - (run-with-idle-timer lsp-ui-sideline-delay - nil - (lambda () - ;; run lsp-ui only if current-buffer is the same. - (when (equal buf (current-buffer)) - (lsp-ui-sideline--run))))))))) - -(defun lsp-ui-sideline-toggle-symbols-info () - "Toggle display of symbols informations. -This does not toggle display of flycheck diagnostics or code actions." - (interactive) - (when (bound-and-true-p lsp-ui-sideline-mode) - (setq lsp-ui-sideline-show-hover - (not lsp-ui-sideline-show-hover)) - (lsp-ui-sideline--run))) - -(defun lsp-ui-sideline--diagnostics-changed () - "Handler for flycheck notifications." - (setq lsp-ui-sideline--tag nil) - (lsp-ui-sideline)) - -(define-minor-mode lsp-ui-sideline-mode - "Minor mode for showing information of current line." - :init-value nil - :group lsp-ui-sideline - (cond - (lsp-ui-sideline-mode - (add-hook 'post-command-hook 'lsp-ui-sideline nil t) - (advice-add 'company-pseudo-tooltip-frontend :before 'lsp-ui-sideline--hide-before-company) - (add-hook 'lsp-after-diagnostics-hook 'lsp-ui-sideline--diagnostics-changed nil t) - (setq-local flycheck-display-errors-function nil)) - (t - (setq lsp-ui-sideline--tag nil) - (advice-remove 'company-pseudo-tooltip-frontend 'lsp-ui-sideline--hide-before-company) - (lsp-ui-sideline--delete-ov) - (remove-hook 'lsp-after-diagnostics-hook 'lsp-ui-sideline--diagnostics-changed) - (remove-hook 'post-command-hook 'lsp-ui-sideline t)))) - -(defun lsp-ui-sideline-enable (enable) - "Enable/disable `lsp-ui-sideline-mode'." - (lsp-ui-sideline-mode (if enable 1 -1))) - -(provide 'lsp-ui-sideline) -;;; lsp-ui-sideline.el ends here |