VSCode使用LSP進行Swift開發

LSP簡介

LSP的全稱是Language Server Protocol,是微軟推出的一項標準化協議,旨在用來統一開發工具與Language Server以前的通訊。它支持語言的自動補全、定義跳轉、查看定義、查看引用、lint、語法高亮等等,但具體實現要看各類語言的LS支持是否完善。在這以前,各類IDE都須要本身實現一套相似的東西,顯得比較重複。藉助於LSP,開發工具只要按規則接入該協議,即可以享受到各類語言提供的服務。html

目前支持的語言彙總在這裏,下圖只截出了部分,維護者有民間組織,微軟,還有正牌。好比對swift的支持就是Apple維護的sourcekit-lspnode

image.png

LSP如何工做

官網上有段介紹LSP是如何工做的。git

client和server以前使用JSONRPC進行通訊,採用request-response的方式,以下圖。github

image.png

主要步驟:shell

  1. 用戶打開文檔,client發送textDocument/didOpen通知,告訴服務器。這時文件內容保存在內存中。
  2. 用戶編輯文檔,client發送textDocument/didChange通知,而後server會發回textDocument/publishDiagnostics通知,會分析出error和warning。client根據這些error和warning進行對應的UI顯示。
  3. 用戶執行跳轉到符號定義,client發起textDocument/definition請求,server返回相關的位置信息。
  4. 用戶關閉文檔,client發送textDocument/didClose通知,文件內容更新到磁盤。

下面來看下具體的request和response,以textDocument/definition來舉例。npm

request: 其主要參數是method,params。params會帶上當前的文件信息,要查詢定義的符號信息(第幾行,第幾個字符)json

{
    "jsonrpc": "2.0",
    "id" : 1,
    "method": "textDocument/definition",
    "params": {
        "textDocument": {
            "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/use.cpp"
        },
        "position": {
            "line": 3,
            "character": 12
        }
    }
}
複製代碼

response: 響應包括符號定義的文件位置,符號的起始和終止位置。swift

{
    "jsonrpc": "2.0",
    "id": 1,
    "result": {
        "uri": "file:///p%3A/mseng/VSCode/Playgrounds/cpp/provide.cpp",
        "range": {
            "start": {
                "line": 0,
                "character": 4
            },
            "end": {
                "line": 0,
                "character": 11
            }
        }
    }
}
複製代碼

LSP定義

LSP中定義了不少method,用來區分不一樣事件。包括請求和通知。sublime-text

initialize,是client發給server的第一個請求。 Shutdown,關閉請求。 textDocument/definition,查看符號定義的請求。 ...xcode

詳細定義文檔在這裏。

VSCode中安裝swift LSP

衆所周知,VSCode是一款功能強大的編輯器,其提供了很是豐富的插件來支持各類語言的開發,而且它是衆多編輯器中率先支持LSP的。

Swift For LSP還在早期開發的階段,所以並無提供安裝包或者插件。因此目前咱們只能手動下載安裝。步驟以下:

安裝XCode

這步應該能夠略過。

安裝VSCode

這步應該也能夠略過。

安裝最新swift toolChain

Swift.org下載最新的主幹包,安裝好以後,到XCode->Preferences->Components選擇剛安裝的toolchain。或者這裏不選擇,在vscode中設置toolchain的路徑。

image.png

安裝node和npm

因爲VSCode的插件都是用js/ts來寫的,因此須要js的運行環境。推薦直接下載安裝包來安裝。

驗證是否裝好了,能夠執行如下命令

nmp --version
複製代碼

編譯並安裝SourceKit-LSP

clone倉庫:

git clone https://github.com/apple/sourcekit-lsp.git
複製代碼

跳轉到sourcekit-lsp目錄:

cd sourcekit-lsp
複製代碼

編譯:

swift build
複製代碼

編譯成功後,會在.build/debug找到二進制文件。咱們將其移到/usr/local/bin目錄下,以即可以直接使用。

mv .build/debug/sourcekit-lsp /usr/local/bin
複製代碼

這個命令會啓動lsp的進程。

sourcekit-lsp
複製代碼

安裝SourceKit-LSP插件

該插件的做用是讓VSCodeSourceKit-LSP之間能夠進行通訊。

  1. 進入到sourceKit-lsp下面的Editors/vscode/目錄
cd Editors/vscode/
複製代碼
  1. 執行npm run createDevPackage
npm run createDevPackage
複製代碼

若是在這步遇到npm ERR! 404 Not Found: flatmap-stream@0.1.1的問題,能夠嘗試刪除lock文件,清除緩存試試。

rm package-lock.json
npm cache clean --force
複製代碼
  1. 安裝sourcekit-lsp-vscode-dev.vsix
code --install-extension out/sourcekit-lsp-vscode-dev.vsix
複製代碼

首先要在VSCode中安裝code命令,cmd+shift+p,輸入shell command,而後安裝code命令。如圖所示。

image.png

重啓VSCode。

  1. 配置sourcekit-lsp

使用快捷鍵cmd,(或者preference-->settings),進入settings頁面,搜索sourcekit-lspToolChain Path中填入以前下載安裝的toolchain路徑。好比個人是/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2018-11-25-a.xctoolchain

image.png

以上就配置完成了。

最後,打開一個swift的xcode工程,鼠標停留在關鍵字上,會展現出具體的定義。以下圖。

image.png

將設置中的Trace Server打開,設置成message,能夠看到請求/響應/通知信息;設置成verbose,會更加詳細,具體字段以及內容。其中請求是有id編號的,通知沒有。

  • 打開工程時,log以下。會依次發送initializeinitializedtextDocument/didOpenwindow/logMessage是server發過來的通知。
[Trace - 3:00:00 PM] Sending request 'initialize - (0)'.
[Trace - 3:00:00 PM] Received notification 'window/logMessage'.
could not open compilation database for /Users/liusilan/Documents/workspace/my/LeetCode/countSegments noEntry
[Trace - 3:00:00 PM] Received notification 'window/logMessage'.
failed to open IndexStoreDB: indexstoredb_index_create error: index store path does not exist: /Users/liusilan/Documents/workspace/my/LeetCode/countSegments/.build/debug/index/store
[Trace - 3:00:00 PM] Received response 'initialize - (0)' in 234ms.
[Trace - 3:00:00 PM] Sending notification 'initialized'.
[Trace - 3:00:00 PM] Sending notification 'textDocument/didOpen'.
[Trace - 3:00:00 PM] Received notification 'textDocument/publishDiagnostics'.
[Trace - 3:00:01 PM] Received notification 'textDocument/publishDiagnostics'.
複製代碼
  • 在進行編輯時,log以下。發送textDocument/didChange,server會返回textDocument/publishDiagnostics
[Trace - 2:58:57 PM] Sending notification 'textDocument/didChange'.
[Trace - 2:58:57 PM] Received notification 'textDocument/publishDiagnostics'.
[Trace - 2:58:57 PM] Received notification 'textDocument/publishDiagnostics'.
複製代碼
  • 鼠標停留時,會發送textDocument/hover
[Trace - 2:53:43 PM] Sending request 'textDocument/hover - (3)'.
[Trace - 2:53:43 PM] Received response 'textDocument/hover - (3)' in 3ms.
複製代碼
  • 光標點在某行時,會發送textDocument/documentHighlight
[Trace - 2:55:07 PM] Sending request 'textDocument/documentHighlight - (22)'.
[Trace - 2:55:07 PM] Received response 'textDocument/documentHighlight - (22)' in 2ms.
複製代碼
  • 按住cmd鍵,查看符號定義時,會發送textDocument/definition
[Trace - 2:55:40 PM] Sending request 'textDocument/definition - (43)'.
[Trace - 2:55:40 PM] Received response 'textDocument/definition - (43)' in 8ms.
複製代碼

關於versbose打印的信息,你們能夠嘗試設置看看。

另外,SouceKit-LSP也是支持Sublime Text的,具體配置能夠參照sublime-text配置

Suorcekit-LSP支持的特性

目前,由於它還在早期開發中,支持的功能還不是不少,相信之後會愈來愈完善。

Feature Status Notes
Swift
C/C++/ObjC clangd is not available in the recommended toolchain. You can try out C/C++/ObjC support by building clangd from source and putting it in PATH.
Code completion
Quick Help (Hover)
Diagnostics
Fix-its
Jump to Definition
Find References
Background Indexing Build project to update the index using Indexing While Building
Workspace Symbols
Refactoring
Formatting
Folding
Syntax Highlighting Not currently part of LSP.
Document Symbols

VSCode調試swift

調試在開發過程當中是必不可少的,以前老是生成xcodeproj,而後在xcode中進行調試,總歸有些不太方便。

VSCode中調試swift也挺簡單的,步驟以下:

  1. 安裝插件CoreLLDB

    QQ20190108-4.png

  2. 配置launch.json

在插件安裝完成以後,打開swift工程,按F5,會出現配置彈框,以下。

點擊Open launch.json進行配置,具體配置以下:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        // Running executables
        {
            "type": "lldb",
            "request": "launch",
            "name": "Run your Executable",
            "program": "${workspaceFolder}/.build/debug/xxx",
            "args": [],
            "cwd": "${workspaceFolder}",
            "preLaunchTask": "swift-build"
        }
    ]
}
複製代碼

注意將"program": "${workspaceFolder}/.build/debug/xxx",中的xxx改爲本身工程可執行文件的名字。

  1. 配置task.json

launch.json配置好後,繼續按F5,此時會出現配置task的彈窗,以下圖。

QQ20190108-2.png

點擊Configure Task進行配置,以下:

{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        // compile your SPM project
        {
            "label": "swift-build",
            "type": "shell",
            "command": "swift build"
        },
        // compile your SPM tests
        {
            "label": "swift-build-tests",
            "type": "process",
            "command": "swift",
            "group": "build",
            "args": [
                "build",
                "--build-tests"
            ]
        }]
}
複製代碼

至此,所有配置完成。按F5開始調試,若是仍然出現彈窗,則說明某個地方沒配置好,需對比下上面的配置。

最後就能夠愉快的調試了。

QQ20190108-3.png
相關文章
相關標籤/搜索