manateelazycat / lsp-bridge

A blazingly fast LSP client for Emacs
GNU General Public License v3.0
1.41k stars 202 forks source link

flutter 能支持在widget定义后面添加widget名称吗? #739

Closed getong closed 10 months ago

getong commented 10 months ago

lsp-dart 这个在多层嵌套代码中很实用。

这个是使用lsp-dart产出的效果。

manateelazycat commented 10 months ago

应该是最新版支持的 lsp-bridge-enable-inlay-hint 选项, 你更新到最新版没有这个提示吗?

getong commented 10 months ago

flutter-rust 我更新到最新的版本了,rust代码有效果,但flutter没有效果。

manateelazycat commented 10 months ago

给一个测试代码?

getong commented 10 months ago

https://github.com/bizz84/complete-flutter-course/ complete-flutter-course/ecommerce_app/lib/main.dart

lsp-dart2

code with andrea

getong commented 10 months ago

emacs config

(use-package flutter
  :straight t
  :after dart-mode
  :config
  (defun my/flutter-goto-logs-buffer()
    "Go to buffer logs buffer."
    (interactive)
    (let ((buffer (get-buffer flutter-buffer-name)))
      (unless buffer
        (user-error "flutter is not running."))
      (switch-to-buffer buffer)
      (goto-line (point-max))))
  :bind (:map dart-mode-map
              ("C-c C-r" . #'flutter-run-or-hot-reload)
              ("C-c C-l" . #'my/flutter-goto-logs-buffer))
  :hook (dart-mode . flutter-test-mode)
  :custom
  ;; sdk path will be the parent-parent directory of flutter cli
  (flutter-sdk-path (directory-file-name
                     (file-name-directory
                      (directory-file-name
                       (file-name-directory (file-truename (executable-find "flutter")))))))
  )

;;Optional Flutter packages, run app from desktop without emulator
(use-package hover
  :straight t)

(use-package flutter-l10n-flycheck
  :straight t
  :after flutter
  :config (flutter-l10n-flycheck-setup))

(use-package dart-mode
  :straight t
  :mode
  ("\\.dart\\'" . dart-mode)
  ;;:defines (projectile-project-root-files-bottom-up)
  :if (or (executable-find "dart") (executable-find "flutter"))
  :bind (:map dart-mode-map
              ("C-c C-f" . dart-format-buffer)
              ("C-c C-c" . my/dart-run-file))
  :config
  (defun my/dart-run-file ()
    "Execute the code of the current file."
    (interactive)
    (compile (format "dart %s" (buffer-file-name))))
  ;;   (with-eval-after-load "projectile"
  ;;     (add-to-list 'projectile-project-root-files-bottom-up "pubspec.yaml")
  ;;     (add-to-list 'projectile-project-root-files-bottom-up "BUILD")
  ;;     (add-to-list 'projectile-globally-ignored-file-suffixes "inject.dart")
  ;;     (add-to-list 'projectile-globally-ignored-file-suffixes "inject.summary")
  ;;     )
  :hook
  ((dart-mode . flutter-test-mode)
   ;; (dart-mode . lsp-mode)
   )
  )

(use-package lsp-bridge
  :straight '(lsp-bridge :type git :host github :repo "manateelazycat/lsp-bridge"
                         :files (:defaults "*.el" "*.py" "acm" "core" "langserver" "multiserver" "resources")
                         :build (:not compile))
  :defer t
  :commands (lsp-bridge-mode)
  ;; (add-hook 'lsp-bridge-mode-hook #'lsp-bridge-mode-hook-func)

  :hook
  ((
    dart-mode
    python-mode
    ;; emacs-lisp-mode
    lua-mode
    c++-mode
    go-mode
    c-mode) . lsp-bridge-mode)
  ((rust-mode rustic-mode) . setup-lsp-bridge-rust-mode)

  :bind (:map lsp-bridge-mode-map
              ("M-." . lsp-bridge-find-def)
              ("M-n ." . lsp-bridge-find-def-other-window)
              ("M-n i" . lsp-bridge-find-impl)
              ("M-n I" . lsp-bridge-find-impl-other-window)
              ("M-," . lsp-bridge-find-def-return)
              ("M-?" . lsp-bridge-find-references)
              ("M-n r" . lsp-bridge-rename)
              ("M-n l" . lsp-bridge-diagnostic-list)
              ("M-n n" . lsp-bridge-diagnostic-jump-next)
              ("M-n p" . lsp-bridge-diagnostic-jump-prev)
              ("M-n h" . lsp-bridge-popup-documentation)
              ("M-n u" . lsp-bridge-popup-documentation-scroll-up)
              ("M-n d" . lsp-bridge-popup-documentation-scroll-down)
              ;; ("C-c M-f" . lsp-bridge-code-format)  ;; replace by blacken
              )
  :custom
  (tabnine-bridge-binaries-folder (expand-file-name "~/.backup-emacs/tabnine-bridge/tabnine-binaries"))
  (lsp-bridge-enable-log   nil)
  (lsp-bridge-symbols-enable-which-func t)
  (acm-enable-icon         t)
  (acm-enable-doc          t)
  (acm-enable-tabnine      t)
  (acm-enable-quick-access t)
  (lsp-bridge-enable-inlay-hint t)
  (lsp-bridge-find-def-select-in-open-windows t)
  (lsp-bridge-signature-show-function 'lsp-bridge-signature-show-with-frame)
  (lsp-bridge-signature-show-with-frame-position 'top-right)
  (lsp-bridge-enable-completion-in-minibuffer t)
  (acm-backend-yas-match-by-trigger-keyword t)
  ;; (lsp-bridge-signature-show-function 'lsp-bridge-signature-posframe)
  (lsp-bridge-c-lsp-server "ccls")
  (acm-enable-codeium t)
  (lsp-bridge-enable-signature-help t)
  (lsp-bridge-complete-manually t)
  (codeium-download-url-prefix "https://ghproxy.com/https://github.com/Exafunction/codeium/releases/download/language-server-v")
  :config
  ;; (global-lsp-bridge-mode)
  (defun find-rust-prj-root (dir)
    "Find the Rust project root of DIR."
    (file-truename(locate-dominating-file dir "Cargo.toml")))
  (defun setup-lsp-bridge-rust-mode ()
    (setq-local lsp-bridge-get-project-path-by-filepath #'find-rust-prj-root)
    (lsp-bridge-mode)
    )
  )
manateelazycat commented 10 months ago

我看了一下, 你截图这个应该不是 inlay hint 协议, 我分析了 dart 启动日志, 它初始化返回的时候明确返回了 inlayHintProvider: false (通过 lsp-bridge-enable-log 选项打开可以看到)

你这个应该是 dart lsp server 自己实现的私有协议 https://github.com/dart-lang/sdk/blob/master/pkg/analysis_server/tool/lsp_spec/README.md#darttextdocumentpublishclosinglabels-notification

manateelazycat commented 10 months ago

我这边看了一下, 主要是我的 dart 环境没配好, 导致打开任意 dart 文件都有很多类型错误诊断。

想推进这个功能, 需要你提供帮助:

  1. 修改 dart-analysis-server.json 文件内容为

    {
    "name": "dart-analysis-server",
    "languageId": "dart",
    "command": [
    "dart",
    "language-server",
    "--client-id",
    "emacs.lsp-bridge"
    ],
    "settings": {},
    "initializationOptions": {
    "closingLabels": true
    }
    }
  2. 打开 lsp-bridge-enable-log 选项 (仅调试用, 正常写代码需要关闭这个选项, 这个选项耗费性能) 然后检查 lsp-bridge buffer, 搜索 dart/textDocument/publishClosingLabels 消息, 如果有 range 字段的信息, 请粘贴到 github 上

  3. 理论上 dart 私有协议 closingLabels 的消息可以对接到 LSP 标准 inlay hint 协议上

getong commented 10 months ago

the output:

--- [09:51:56.211519] Recv dart/textDocument/publishClosingLabels notification from 'dart-analysis-server' for project complete-flutter-course
{
   "jsonrpc": "2.0",
   "method": "dart/textDocument/publishClosingLabels",
   "params": {
      "labels": [
         {
            "label": "ProviderContainer",
            "range": {
               "end": {
                  "character": 3,
                  "line": 30
               },
               "start": {
                  "character": 20,
                  "line": 25
               }
            }
         },
         {
            "label": "UncontrolledProviderScope",
            "range": {
               "end": {
                  "character": 3,
                  "line": 41
               },
               "start": {
                  "character": 9,
                  "line": 38
               }
            }
         }
      ],
      "uri": "file:///Users/gerald/test/flutter/complete-flutter-course/ecommerce_app/lib/main.dart"
   }
}
manateelazycat commented 10 months ago

我这边没有完整的 Dart 环境, 没法获取 closing label 消息。

我根据你返回的消息, 盲写了一个补丁 https://github.com/manateelazycat/lsp-bridge/commit/574f97729af33c59666e0a38cd31d64eae20611a

你可以更新测试看看, 欢迎发PR 。 ;)

getong commented 10 months ago

lsp-dart3

有效果了,太感谢了。可以微调一下吗?追加的widget名称放在分号后面可能比较好,而且跟前面的代码是有空格间隔的。你可以看看上面的效果图,对比一下。

manateelazycat commented 10 months ago

我加了一个 https://github.com/manateelazycat/lsp-bridge/commit/61b2bcb841c1e1f14aafdb9b9371fe1613aa4f63 补丁, 更新看看吧。

getong commented 10 months ago

效果很好,非常感谢。