From b3c27ebe60c31845b13bb7981149f834c1eacea8 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 11 Jun 2019 08:00:14 +0200 Subject: [PATCH] lang/javscript: unify lsp & tide initialization The goal was to enable lsp (if +lsp is enabled), failing that it would fall back on tide. This also adds lsp+tide support for tsx files opened in web-mode. --- modules/lang/javascript/config.el | 51 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/modules/lang/javascript/config.el b/modules/lang/javascript/config.el index d98e7d64a..30aff0221 100644 --- a/modules/lang/javascript/config.el +++ b/modules/lang/javascript/config.el @@ -126,27 +126,36 @@ ;; ;;; Tools +(defun +javascript|init-lsp-or-tide-maybe () + "Start `lsp' or `tide' in the current buffer. + +LSP will be used if the +lsp flag is enabled for :lang javascript AND if the +current buffer represents a file in a project. + +If LSP fails to start (e.g. no available server or project), then we fall back +to tide." + (let ((buffer-file-name (buffer-file-name (buffer-base-buffer)))) + (when (or (derived-mode-p 'js-mode 'typescript-mode) + (and (eq major-mode 'web-mode) + (string= "tsx" (file-name-extension buffer-file-name)))) + (cond ((not buffer-file-name) + ;; necessary because `tide-setup' and `lsp' will error if not a + ;; file-visiting buffer + (add-hook 'after-save-hook #'+javascript|init-tide-or-lsp-maybe nil 'local)) + ((executable-find "node") + (when (featurep! +lsp) + (lsp!)) + ;; fall back to tide + (when (and (not (bound-and-true-p lsp-mode)) + (require 'tide nil t)) + (tide-setup)) + (remove-hook 'after-save-hook #'+javascript|init-tide-or-lsp-maybe 'local)))))) + +(add-hook! (js-mode typescript-mode web-mode) #'+javascript|init-tide-maybe) + + (def-package! tide :defer t - :init - (defun +javascript|init-tide-maybe () - "Enable `tide-mode' if node is available, `lsp-mode' isn't enabled and this -buffer represents a real file." - (unless (bound-and-true-p lsp-mode) - (cond ((not buffer-file-name) - ;; necessary because `tide-setup' will error if not a file-visiting buffer - (add-hook 'after-save-hook #'+javascript|init-tide-maybe nil 'local)) - ((executable-find "node") - (tide-setup) - (remove-hook 'after-save-hook #'+javascript|init-tide-maybe 'local)) - ((message "Couldn't find `node', aborting tide server"))))) - (add-hook! (js2-mode typescript-mode) #'+javascript|init-tide-maybe) - - (defun +javascript|init-tide-in-web-mode () - "Enable `tide-mode' if in a *.tsx file (and `lsp-mode' isn't active)." - (when (string= (file-name-extension (or buffer-file-name "")) "tsx") - (+javascript|init-tide-maybe))) - (add-hook 'web-mode-hook #'+javascript|init-tide-in-web-mode) :config (setq tide-completion-detailed t tide-always-show-documentation t) @@ -176,10 +185,6 @@ buffer represents a real file." "roi" #'tide-organize-imports)) -(when (featurep! +lsp) - (add-hook! (js2-mode typescript-mode) #'lsp!)) - - (def-package! xref-js2 :when (featurep! :tools lookup) :after (:or js2-mode rjsx-mode)