joaotavora / eglot

A client for Language Server Protocol servers
GNU General Public License v3.0
2.26k stars 200 forks source link

Problems when expanding a LSP snippet inside another LSP snippet with company-mode #230

Open netjune opened 5 years ago

netjune commented 5 years ago

error message:

condition-case: Company: backend company-capf error "Assertion failed: (memq pfield (yas--snippet-fields psnippet))" with args (post-completion RPCMsg)

elisp backstrace:

Debugger entered--Lisp error: (cl-assertion-failed ((memq pfield (yas--snippet-fields psnippet)) nil))
  cl--assertion-failed((memq pfield (yas--snippet-fields psnippet)))
  (or (memq pfield (progn (or (and (memq (type-of psnippet) cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list (quote yas--snippet) psnippet))) (aref psnippet 2))) (cl--assertion-failed (quote (memq pfield (yas--snippet-fields psnippet)))))
  (progn (or (memq pfield (progn (or (and (memq (type-of psnippet) cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list (quote yas--snippet) psnippet))) (aref psnippet 2))) (cl--assertion-failed (quote (memq pfield (yas--snippet-fields psnippet))))) nil)
  (let ((psnippet (car-safe (prog1 psnippets (setq psnippets (cdr psnippets)))))) (progn (or (memq pfield (progn (or (and (memq ... cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list ... psnippet))) (aref psnippet 2))) (cl--assertion-failed (quote (memq pfield (yas--snippet-fields psnippet))))) nil) (yas--advance-end-maybe pfield (overlay-end overlay)) (setq pfield (progn (or (and (memq (type-of psnippet) cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list (quote yas--snippet) psnippet))) (aref psnippet 7))))
  (while (and pfield psnippets) (let ((psnippet (car-safe (prog1 psnippets (setq psnippets (cdr psnippets)))))) (progn (or (memq pfield (progn (or (and ... t) (signal ... ...)) (aref psnippet 2))) (cl--assertion-failed (quote (memq pfield (yas--snippet-fields psnippet))))) nil) (yas--advance-end-maybe pfield (overlay-end overlay)) (setq pfield (progn (or (and (memq (type-of psnippet) cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list (quote yas--snippet) psnippet))) (aref psnippet 7)))))
  (let ((pfield field) (psnippets (yas-active-snippets beg end))) (while (and pfield psnippets) (let ((psnippet (car-safe (prog1 psnippets (setq psnippets ...))))) (progn (or (memq pfield (progn (or ... ...) (aref psnippet 2))) (cl--assertion-failed (quote (memq pfield ...)))) nil) (yas--advance-end-maybe pfield (overlay-end overlay)) (setq pfield (progn (or (and (memq ... cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list ... psnippet))) (aref psnippet 7))))))
  (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) cl-struct-yas--field-tags) t) (signal (quote wrong-type-argument) (list (quote yas--field) field))) (let* ((v field)) (aset v 7 t))) (let ((pfield field) (psnippets (yas-active-snippets beg end))) (while (and pfield psnippets) (let ((psnippet (car-safe (prog1 psnippets ...)))) (progn (or (memq pfield (progn ... ...)) (cl--assertion-failed (quote ...))) nil) (yas--advance-end-maybe pfield (overlay-end overlay)) (setq pfield (progn (or (and ... t) (signal ... ...)) (aref psnippet 7)))))) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet))()
  funcall((lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and (memq (type-of field) cl-struct-yas--field-tags) t) (signal (quote wrong-type-argument) (list (quote yas--field) field))) (let* ((v field)) (aset v 7 t))) (let ((pfield field) (psnippets (yas-active-snippets beg end))) (while (and pfield psnippets) (let ((psnippet (car-safe ...))) (progn (or (memq pfield ...) (cl--assertion-failed ...)) nil) (yas--advance-end-maybe pfield (overlay-end overlay)) (setq pfield (progn (or ... ...) (aref psnippet 7)))))) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet)))
  (let nil (funcall (quote (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and (memq ... cl-struct-yas--field-tags) t) (signal (quote wrong-type-argument) (list ... field))) (let* ((v field)) (aset v 7 t))) (let ((pfield field) (psnippets (yas-active-snippets beg end))) (while (and pfield psnippets) (let (...) (progn ... nil) (yas--advance-end-maybe pfield ...) (setq pfield ...)))) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet)))))
  eval((let nil (funcall (quote (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and ... t) (signal ... ...)) (let* (...) (aset v 7 t))) (let ((pfield field) (psnippets ...)) (while (and pfield psnippets) (let ... ... ... ...))) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet))))))
  (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval (car ...)))) envvar)) (body (function (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn (yas--skip-and-clear field end))) (progn (or (and ... t) (signal ... ...)) (let* (...) (aset v 7 t))) (let ((pfield field) (psnippets ...)) (while (and pfield psnippets) (let ... ... ... ...))) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons (list (car-safe (prog1 syms (setq syms ...))) (list (quote quote) (car-safe (prog1 vals ...)))) binds))) (eval (list (quote let) binds (list (quote funcall) (list (quote quote) body)))))
  (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function (lambda (v-f) (eval ...))) envvar)) (body (function (lambda nil (if (yas--skip-and-clear-field-p field beg end length) (progn ...)) (progn (or ... ...) (let* ... ...)) (let (... ...) (while ... ...)) (save-excursion (yas--field-update-display field)) (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons (list (car-safe (prog1 syms ...)) (list (quote quote) (car-safe ...))) binds))) (eval (list (quote let) binds (list (quote funcall) (list (quote quote) body))))))
  (let ((envvar (progn (or (and (memq (type-of snippet) cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list (quote yas--snippet) snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function (lambda ... ...)) envvar)) (body (function (lambda nil (if ... ...) (progn ... ...) (let ... ...) (save-excursion ...) (yas--update-mirrors snippet)))) (binds nil)) (while syms (setq binds (cons (list (car-safe ...) (list ... ...)) binds))) (eval (list (quote let) binds (list (quote funcall) (list (quote quote) body)))))))
  (progn (let ((envvar (progn (or (and (memq ... cl-struct-yas--snippet-tags) t) (signal (quote wrong-type-argument) (list ... snippet))) (aref snippet 1)))) (progn (let* ((syms (mapcar (function car) envvar)) (vals (mapcar (function ...) envvar)) (body (function (lambda nil ... ... ... ... ...))) (binds nil)) (while syms (setq binds (cons (list ... ...) binds))) (eval (list (quote let) binds (list (quote funcall) (list ... body))))))))
  (unwind-protect (progn (let ((envvar (progn (or (and ... t) (signal ... ...)) (aref snippet 1)))) (progn (let* ((syms (mapcar ... envvar)) (vals (mapcar ... envvar)) (body (function ...)) (binds nil)) (while syms (setq binds (cons ... binds))) (eval (list (quote let) binds (list ... ...))))))) (set-match-data save-match-data-internal (quote evaporate)))
  (let ((save-match-data-internal (match-data))) (unwind-protect (progn (let ((envvar (progn (or ... ...) (aref snippet 1)))) (progn (let* ((syms ...) (vals ...) (body ...) (binds nil)) (while syms (setq binds ...)) (eval (list ... binds ...)))))) (set-match-data save-match-data-internal (quote evaporate))))
  (if (yas--snippet-live-p snippet) (let ((save-match-data-internal (match-data))) (unwind-protect (progn (let ((envvar (progn ... ...))) (progn (let* (... ... ... ...) (while syms ...) (eval ...))))) (set-match-data save-match-data-internal (quote evaporate)))) (lwarn (quote (yasnippet zombie)) :warning "Killing zombie snippet!") (delete-overlay overlay))
  (let* ((inhibit-modification-hooks nil) (yas--inhibit-overlay-hooks t) (field (overlay-get overlay (quote yas--field))) (snippet (overlay-get yas--active-field-overlay (quote yas--snippet)))) (if (yas--snippet-live-p snippet) (let ((save-match-data-internal (match-data))) (unwind-protect (progn (let ((envvar ...)) (progn (let* ... ... ...)))) (set-match-data save-match-data-internal (quote evaporate)))) (lwarn (quote (yasnippet zombie)) :warning "Killing zombie snippet!") (delete-overlay overlay)))
  (if (or (not after\?) yas--inhibit-overlay-hooks (not (overlayp yas--active-field-overlay)) (not (overlay-buffer overlay)) (yas--undo-in-progress)) nil (let* ((inhibit-modification-hooks nil) (yas--inhibit-overlay-hooks t) (field (overlay-get overlay (quote yas--field))) (snippet (overlay-get yas--active-field-overlay (quote yas--snippet)))) (if (yas--snippet-live-p snippet) (let ((save-match-data-internal (match-data))) (unwind-protect (progn (let (...) (progn ...))) (set-match-data save-match-data-internal (quote evaporate)))) (lwarn (quote (yasnippet zombie)) :warning "Killing zombie snippet!") (delete-overlay overlay))))
  yas--on-field-overlay-modification(#<overlay from 491 to 493 in port_device_dev.go> t 493 493 4)
  delete-region(493 497)
  (cond (textEdit (delete-region (+ (- (point) (length comp)) (if bounds (- (cdr bounds) (car bounds)) 0)) (point)) (let ((object-once textEdit)) (let* ((--cl-rest-- object-once) (range (car (cdr ...))) (newText (car (cdr ...)))) (eglot--call-with-interface (assoc (quote TextEdit) eglot--lsp-interface-alist) object-once (function (lambda nil (let* ... ...)))))) (if (cl-plusp (length additionalTextEdits)) (progn (eglot--apply-text-edits additionalTextEdits)))) (snippet-fn (delete-region (- (point) (length comp)) (point)) (funcall snippet-fn insertText)))
  (let ((snippet-fn (and (eql insertTextFormat 2) (eglot--snippet-expansion-fn)))) (cond (textEdit (delete-region (+ (- (point) (length comp)) (if bounds (- (cdr bounds) (car bounds)) 0)) (point)) (let ((object-once textEdit)) (let* ((--cl-rest-- object-once) (range (car ...)) (newText (car ...))) (eglot--call-with-interface (assoc (quote TextEdit) eglot--lsp-interface-alist) object-once (function (lambda nil ...))))) (if (cl-plusp (length additionalTextEdits)) (progn (eglot--apply-text-edits additionalTextEdits)))) (snippet-fn (delete-region (- (point) (length comp)) (point)) (funcall snippet-fn insertText))))
  (closure ((additionalTextEdits) (textEdit :range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg") (insertText . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg"))))) (insertTextFormat . 1) (--cl-rest-- :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (object-once :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (_status . finished) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (strings #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 51)) :newText "RPCMsg"))))) (metadata metadata (display-sort-function closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp ... ...)))))) (sort-completions closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp (or ... "") (or ... "")))))) (completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) nil (let ((snippet-fn (and (eql insertTextFormat 2) (eglot--snippet-expansion-fn)))) (cond (textEdit (delete-region (+ (- (point) (length comp)) (if bounds (- ... ...) 0)) (point)) (let ((object-once textEdit)) (let* ((--cl-rest-- object-once) (range ...) (newText ...)) (eglot--call-with-interface (assoc ... eglot--lsp-interface-alist) object-once (function ...)))) (if (cl-plusp (length additionalTextEdits)) (progn (eglot--apply-text-edits additionalTextEdits)))) (snippet-fn (delete-region (- (point) (length comp)) (point)) (funcall snippet-fn insertText)))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function))()
  funcall((closure ((additionalTextEdits) (textEdit :range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg") (insertText . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg"))))) (insertTextFormat . 1) (--cl-rest-- :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (object-once :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (_status . finished) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (strings #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 51)) :newText "RPCMsg"))))) (metadata metadata (display-sort-function closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda ... ...))))) (sort-completions closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp ... ...))))) (completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) nil (let ((snippet-fn (and (eql insertTextFormat 2) (eglot--snippet-expansion-fn)))) (cond (textEdit (delete-region (+ (- ... ...) (if bounds ... 0)) (point)) (let ((object-once textEdit)) (let* (... ... ...) (eglot--call-with-interface ... object-once ...))) (if (cl-plusp (length additionalTextEdits)) (progn (eglot--apply-text-edits additionalTextEdits)))) (snippet-fn (delete-region (- (point) (length comp)) (point)) (funcall snippet-fn insertText)))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function)))
  eglot--call-with-interface((CompletionItem (:label) (:kind :detail :documentation :deprecated :preselect :sortText :filterText :insertText :insertTextFormat :textEdit :additionalTextEdits :commitCharacters :command :data)) (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (closure ((additionalTextEdits) (textEdit :range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg") (insertText . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg"))))) (insertTextFormat . 1) (--cl-rest-- :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (object-once :label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")))) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (_status . finished) (comp . #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) (strings #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 51)) :newText "RPCMsg"))))) (metadata metadata (display-sort-function closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda ... ...))))) (sort-completions closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp ... ...))))) (completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) nil (let ((snippet-fn (and (eql insertTextFormat 2) (eglot--snippet-expansion-fn)))) (cond (textEdit (delete-region (+ (- ... ...) (if bounds ... 0)) (point)) (let ((object-once textEdit)) (let* (... ... ...) (eglot--call-with-interface ... object-once ...))) (if (cl-plusp (length additionalTextEdits)) (progn (eglot--apply-text-edits additionalTextEdits)))) (snippet-fn (delete-region (- (point) (length comp)) (point)) (funcall snippet-fn insertText)))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function)))
  (let* ((--cl-rest-- object-once) (insertTextFormat (car (cdr (plist-member --cl-rest-- (quote :insertTextFormat))))) (insertText (car (cdr (plist-member --cl-rest-- (quote :insertText))))) (textEdit (car (cdr (plist-member --cl-rest-- (quote :textEdit))))) (additionalTextEdits (car (cdr (plist-member --cl-rest-- (quote :additionalTextEdits)))))) (eglot--call-with-interface (assoc (quote CompletionItem) eglot--lsp-interface-alist) object-once (function (lambda nil (let ((snippet-fn (and ... ...))) (cond (textEdit (delete-region ... ...) (let ... ...) (if ... ...)) (snippet-fn (delete-region ... ...) (funcall snippet-fn insertText)))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function)))))
  (let ((object-once (get-text-property 0 (quote eglot--lsp-completion) comp))) (let* ((--cl-rest-- object-once) (insertTextFormat (car (cdr (plist-member --cl-rest-- (quote :insertTextFormat))))) (insertText (car (cdr (plist-member --cl-rest-- (quote :insertText))))) (textEdit (car (cdr (plist-member --cl-rest-- (quote :textEdit))))) (additionalTextEdits (car (cdr (plist-member --cl-rest-- (quote :additionalTextEdits)))))) (eglot--call-with-interface (assoc (quote CompletionItem) eglot--lsp-interface-alist) object-once (function (lambda nil (let ((snippet-fn ...)) (cond (textEdit ... ... ...) (snippet-fn ... ...))) (eglot--signal-textDocument/didChange) (eglot-eldoc-function))))))
  (let ((comp (if (get-text-property 0 (quote eglot--lsp-completion) comp) comp (cl-find comp strings :test (function string=))))) (let ((object-once (get-text-property 0 (quote eglot--lsp-completion) comp))) (let* ((--cl-rest-- object-once) (insertTextFormat (car (cdr (plist-member --cl-rest-- ...)))) (insertText (car (cdr (plist-member --cl-rest-- ...)))) (textEdit (car (cdr (plist-member --cl-rest-- ...)))) (additionalTextEdits (car (cdr (plist-member --cl-rest-- ...))))) (eglot--call-with-interface (assoc (quote CompletionItem) eglot--lsp-interface-alist) object-once (function (lambda nil (let (...) (cond ... ...)) (eglot--signal-textDocument/didChange) (eglot-eldoc-function)))))))
  (closure ((strings #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 51)) :newText "RPCMsg"))))) (metadata metadata (display-sort-function closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp ... ...)))))) (sort-completions closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp (or ... "") (or ... "")))))) (completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (comp _status) (let ((comp (if (get-text-property 0 (quote eglot--lsp-completion) comp) comp (cl-find comp strings :test (function string=))))) (let ((object-once (get-text-property 0 (quote eglot--lsp-completion) comp))) (let* ((--cl-rest-- object-once) (insertTextFormat (car (cdr ...))) (insertText (car (cdr ...))) (textEdit (car (cdr ...))) (additionalTextEdits (car (cdr ...)))) (eglot--call-with-interface (assoc (quote CompletionItem) eglot--lsp-interface-alist) object-once (function (lambda nil (let ... ...) (eglot--signal-textDocument/didChange) (eglot-eldoc-function))))))))(#("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)) finished)
  funcall((closure ((strings #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #0 :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 51)) :newText "RPCMsg"))))) (metadata metadata (display-sort-function closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda ... ...))))) (sort-completions closure ((completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (completions) (sort completions (function (lambda (a b) (string-lessp ... ...))))) (completion-capability :triggerCharacters ["."]) (server . #<eglot-lsp-server eglot-lsp-server>) (bounds 491 . 493) eglot--managed-mode t) (comp _status) (let ((comp (if (get-text-property 0 (quote eglot--lsp-completion) comp) comp (cl-find comp strings :test (function string=))))) (let ((object-once (get-text-property 0 (quote eglot--lsp-completion) comp))) (let* ((--cl-rest-- object-once) (insertTextFormat (car ...)) (insertText (car ...)) (textEdit (car ...)) (additionalTextEdits (car ...))) (eglot--call-with-interface (assoc (quote CompletionItem) eglot--lsp-interface-alist) object-once (function (lambda nil ... ... ...))))))) #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)) finished)
  (if exit-function (funcall exit-function arg (if (eq (try-completion arg table pred) t) (quote finished) (quote sole))))
  (let* ((res company-capf--current-completion-data) (exit-function (plist-get (nthcdr 4 res) :exit-function)) (table (nth 3 res)) (pred (plist-get (nthcdr 4 res) :predicate))) (if exit-function (funcall exit-function arg (if (eq (try-completion arg table pred) t) (quote finished) (quote sole)))))
  company--capf-post-completion(#("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  (cond ((eq command (quote interactive)) (company-begin-backend (quote company-capf))) ((eq command (quote prefix)) (let ((res (company--capf-data))) (if res (progn (let ((length ...) (prefix ...)) (cond (... ...) (length ...) (t prefix))))))) ((eq command (quote candidates)) (let ((res (company--capf-data))) (company-capf--save-current-data res) (if res (progn (let* ((table ...) (pred ...) (meta ...) (sortfun ...) (candidates ...) (last ...) (base-size ...)) (if base-size (progn ...)) (if sortfun (progn ...)) (if (not ...) (let ... ...) candidates)))))) ((eq command (quote sorted)) (let ((res company-capf--current-completion-data)) (if res (progn (let ((meta ...)) (cdr (assq ... meta))))))) ((eq command (quote match)) (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) :company-match))) (if f (funcall f arg) (let* ((match-start nil) (pos -1) (prop-value nil) (faces nil) (has-face-p nil) chunks (limit (length arg))) (while (< pos limit) (setq pos (if ... 0 ...)) (setq prop-value (or ... ...) faces (if ... prop-value ...) has-face-p (memq ... faces)) (cond (... ...) (... ... ...))) (nreverse chunks))))) ((eq command (quote duplicates)) t) ((eq command (quote meta)) (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) :company-docsig))) (if f (progn (funcall f arg))))) ((eq command (quote doc-buffer)) (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) :company-doc-buffer))) (if f (progn (funcall f arg))))) ((eq command (quote location)) (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) :company-location))) (if f (progn (funcall f arg))))) ((eq command (quote annotation)) (let ((f (plist-get (nthcdr 4 company-capf--current-completion-data) :annotation-function))) (if f (progn (funcall f arg))))) ((eq command (quote require-match)) (plist-get (nthcdr 4 (company--capf-data)) :company-require-match)) ((or (eq command (quote init)) (not (eq command (quote post-completion)))) nil) (t (company--capf-post-completion arg)))
  company-capf(post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  apply(company-capf (post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))))
  (if (functionp company-backend) (apply company-backend args) (apply (function company--multi-backend-adapter) company-backend args))
  (condition-case err (if (functionp company-backend) (apply company-backend args) (apply (function company--multi-backend-adapter) company-backend args)) ((debug user-error) (user-error "Company: backend %s user-error: %s" company-backend (error-message-string err))) ((debug error) (error "Company: backend %s error \"%s\" with args %s" company-backend (error-message-string err) args)))
  company-call-backend-raw(post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  apply(company-call-backend-raw (post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))))
  (let ((value (apply fun args))) (if (not (eq (car-safe value) :async)) value (let ((res (quote trash)) (start (time-to-seconds))) (funcall (cdr value) (function (lambda (result) (setq res result)))) (while (eq res (quote trash)) (if (> (- (time-to-seconds) start) company-async-timeout) (error "Company: backend %s async timeout with args %s" backend args) (sleep-for company-async-wait))) res)))
  company--force-sync(company-call-backend-raw (post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference))) company-capf)
  company-call-backend(post-completion #("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  (let ((company-backend backend)) (run-hook-with-args (quote company-completion-finished-hook) result) (company-call-backend (quote post-completion) result))
  (if (stringp result) (let ((company-backend backend)) (run-hook-with-args (quote company-completion-finished-hook) result) (company-call-backend (quote post-completion) result)) (run-hook-with-args (quote company-completion-cancelled-hook) result))
  (progn (if (stringp result) (let ((company-backend backend)) (run-hook-with-args (quote company-completion-finished-hook) result) (company-call-backend (quote post-completion) result)) (run-hook-with-args (quote company-completion-cancelled-hook) result)) (run-hook-with-args (quote company-after-completion-hook) result))
  (if prefix (progn (if (stringp result) (let ((company-backend backend)) (run-hook-with-args (quote company-completion-finished-hook) result) (company-call-backend (quote post-completion) result)) (run-hook-with-args (quote company-completion-cancelled-hook) result)) (run-hook-with-args (quote company-after-completion-hook) result)))
  (let ((prefix company-prefix) (backend company-backend)) (setq company-backend nil company-prefix nil company-candidates nil company-candidates-length nil company-candidates-cache nil company-candidates-predicate nil company-common nil company-selection 0 company-selection-changed nil company--manual-action nil company--manual-prefix nil company--point-max nil company-point nil) (if company-timer (progn (cancel-timer company-timer))) (company-echo-cancel t) (company-search-mode 0) (company-call-frontends (quote hide)) (company-enable-overriding-keymap nil) (if prefix (progn (if (stringp result) (let ((company-backend backend)) (run-hook-with-args (quote company-completion-finished-hook) result) (company-call-backend (quote post-completion) result)) (run-hook-with-args (quote company-completion-cancelled-hook) result)) (run-hook-with-args (quote company-after-completion-hook) result))))
  company-cancel(#("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  company-finish(#("RPCMsg" 0 1 (eglot--lsp-completion (:label "RPCMsg" :kind 7 :detail "struct" :insertText #("RPCMsg" 0 1 (eglot--lsp-completion #2)) :insertTextFormat 1 :textEdit (:range (:start (:line 36 :character 45) :end (:line 36 :character 47)) :newText "RPCMsg")) font-lock-face completions-common-part) 1 2 (font-lock-face completions-common-part) 2 3 (font-lock-face completions-first-difference)))
  (let ((result (nth company-selection company-candidates))) (company-finish result))
  (progn (let ((result (nth company-selection company-candidates))) (company-finish result)))
  (if (company-manual-begin) (progn (let ((result (nth company-selection company-candidates))) (company-finish result))))
  company-complete-selection()
  funcall-interactively(company-complete-selection)
  call-interactively(company-complete-selection nil nil)
  command-execute(company-complete-selection)
joaotavora commented 5 years ago

It would help to know what exactly you were doing when this happened. Can you provide a recipe from Emacs -Q?

This is possibly one for Yasnippet and/or company.

netjune commented 5 years ago

Yes. It can be reproduced from emacs -Q. I have packed all elisp files and snippet, and uploaded it to http://119.37.194.6/upload/test_eglot-2.tar.bz2.

  1. download the above file
  2. extract the file to ~/test/ttt
  3. emacs -Q and eval the following code:

(add-to-list 'load-path "~/test/ttt") (load "~/test/ttt/autoloads.el")

(setq yas-snippet-dirs '("~/test/ttt/snippets"))

(defun my-find-project (dir) `(my . ,dir))

(setq project-find-functions (list #'my-find-project))

(cl-defmethod project-roots ((project (head my))) (list (cdr project)))

(add-hook 'go-mode-hook 'my-lsp-enable-eglot)

(defun my-lsp-enable-eglot () (interactive) (unless (bound-and-true-p eglot--managed-mode) (message "=== enable eglot: %s" buffer-file-name)

  (flymake-mode 1)
  (company-mode 1)
  (yas-minor-mode 1)

  (setq-local company-backends '(company-capf))
  (setq-local company-minimum-prefix-length 2)
  (setq-local company-transformers nil)

  (eglot-ensure)))

4. I have made a screencast for the rest steps. 
http://119.37.194.6/upload/company-capf_error_on_nested_snippet.mp4
netjune commented 5 years ago

I have tested company-irony(a backend of company-mode for c/c++ mode). And it supports this usecase well.

joaotavora commented 5 years ago

Yes. It can be reproduced from emacs -Q

Perhaps I didn't make myself clear. Everything can be reproduced from emacs -Q as you load a large enough chunk of your configuration. I just wanted a minimal reproduction recipe for this, something potentially simpler than your recipe (by the way, I think 3 package-installs would have sufficed since all the three packages are in GNU ELPA).

Anyway, you forgot to include the Go LSP server for it to be usable. In the future, try to reproduce things with the Python or CCLS server.

But don't worry, I just wanted to have an idea of what you were doing, something more than a simple error line, which is what you provided in the original recipe.

netjune commented 5 years ago

I think 3 package-installs would have sufficed since all the three packages are in GNU ELPA

I have hardly used package-install. So I forgot it when reporting the issue. Yes, three packages in test_eglot-2.tar.bz2. But I'm using the master branch of them, not the version in GNU ELPA.

Anyway, you forgot to include the Go LSP server for it to be usable.

Yes. I forgot it so easily. And also versions of the packages, emacs, OS. It is go_langserver(the master branch). It can be installed with go get github.com/sourcegraph/go-langserver.

joaotavora commented 5 years ago

I have hardly used package-install.

No problem. Just remember it's the simplest (and quite effective) means of installing packages in Emacs.

The versions of company and yasnippet in ELPA are probably good. Even the version of eglot there is also probably good for reproducing the problem.

netjune commented 5 years ago

Just remember it's the simplest (and quite effective) means of installing packages in Emacs.

OK. I will do it next time.