Eclipse Orion由兩個(gè)不同的部分組成:服務(wù)器端和運行在瀏覽器中的客戶(hù)端。Orion服務(wù)器有兩個(gè)單獨的實(shí)現,其中一個(gè)是用Java編寫(xiě),另一個(gè)是用Node.js編寫(xiě)。針對語(yǔ)言服務(wù)器協(xié)議(LSP),我們選擇使用了Node.js服務(wù)器。
Orion中的LSP集成著(zhù)重在Orion編輯器中獲得對Java語(yǔ)言的支持。眾所周知,Eclipse平臺的JDT插件提供了豐富的功能,使Java開(kāi)發(fā)者能夠把Eclipse作為一個(gè)Java IDE來(lái)使用。JDT是一套插件集合,不僅為Eclipse平臺提供了Java編譯器、調試器,而且還提供了許多Java特定的用戶(hù)界面元素,支持Java應用的開(kāi)發(fā),提供重整、增量編譯和只能編輯等支持。
如何開(kāi)始
首先執行以下步驟來(lái)獲取最新的Orion LSP代碼:
使用Docker
orion.client / modules / orionnode /中有一個(gè)docker文件,可以用于創(chuàng )建Docker映像,其中包含Eclipse jdt.ls的最新版本以及l(fā)sp支持的最新Orion node.js。
構建映像運行:./docker_build.sh
構建完成,可以啟動(dòng)映像:docker run -p 8083:8083 orionlsp
通過(guò)打開(kāi)瀏覽器連接到http://localhost:8083/。
然后檢查Orion服務(wù)器和Orion客戶(hù)端的更改,以便支持Orion編輯器中的Java語(yǔ)言。
選擇架構
在開(kāi)始之前,我們要搞清楚Orion是如何與與語(yǔ)言服務(wù)器進(jìn)行交互的。
LSP服務(wù)器和Node.js服務(wù)器現在在同一臺機器上運行。LSP服務(wù)器本地安裝在Node.js服務(wù)器中名為'server'的文件夾內。這樣做的目的是讓每個(gè)Node.js服務(wù)器運行一個(gè)LSP服務(wù)器。目前,兩臺Orion服務(wù)器之間無(wú)法共享LSP服務(wù)器。
Orion服務(wù)器
在Orion服務(wù)器端,無(wú)法使語(yǔ)言服務(wù)器通信進(jìn)行。我們定義了一個(gè)在服務(wù)器代碼中注冊的擴展名(請參閱server.js中的第100行)。該擴展開(kāi)始偵聽(tīng)用于啟動(dòng)和初始化LSP服務(wù)器的命名套接字。
Orion客戶(hù)端
語(yǔ)言服務(wù)器協(xié)議定義了很多,并且可以向LSP服務(wù)器發(fā)出請求,例如文檔生命周期,代碼格式化,hover事件,搜索引用,代碼補全等等。
目前Orion支持其中的大多數,一旦服務(wù)器在工作空間內啟動(dòng)和初始化,用戶(hù)就可以格式化代碼,獲取問(wèn)題和警告,搜索引用,獲取Javadoc hover,獲取錯誤警告等。
因為現在不支持代碼操作,所以在Orion編輯器中沒(méi)有可用于報告的錯誤和警告的快速修復。
使用Orion插件完成編輯器集成。該插件定義了用于啟動(dòng)語(yǔ)言服務(wù)器的命名套接字。該插件注冊之后,為使用以下內容類(lèi)型的文件進(jìn)行初始化:“text / x-java-source”或“application / x-jsp”。這兩種文件在Orion插件中注冊之后,擴展名為“.java”和“.jsp”。因此,當插件啟動(dòng)和初始化時(shí),它將觸發(fā)命名套接字的連接并發(fā)送'start'事件。然后初始化LSP服務(wù)器,并且讓兩個(gè)套接字用于LSP服務(wù)器和Orion客戶(hù)端之間的雙向通信。Orion插件也用于通過(guò)使用Orion stylers來(lái)注冊Java語(yǔ)言的語(yǔ)法高亮。
其中mJava和mJSP被定義為:
Orion編輯器的每個(gè)功能都已經(jīng)被更新了,以檢查L(cháng)SP服務(wù)器是否已注冊并需要處理。
例如,對于格式化程序,在調用的文件中org.eclipse.orion.client.ui/web/orion/formatter.js,我們檢查是否存在為當前文件內容類(lèi)型注冊的LSP服務(wù)器。為此,我們將所有LSP服務(wù)器注冊到一個(gè)注冊表中,然后加速查找基于特定內容類(lèi)型的LSP服務(wù)器。如果我們找到一個(gè),從協(xié)議調用相應的處理程序來(lái)使用它。在這種情況下,它是執行文檔格式化請求或者文檔范圍格式化請求,要取決于編輯器中的當前選擇。
我們可以這樣做:
我們使用同樣的原理來(lái)實(shí)現所有可以利用LSP服務(wù)器特性的Orion編輯器特性(事件、搜索引用等)。
未來(lái)方向
我們還需要添加LSP中定義的代碼操作請求的支持,以便能夠在Orion編輯器中添加快速修復。
現在,LSP服務(wù)器在Maven和Gradle項目中運行正常。 這是一個(gè)快速發(fā)展的領(lǐng)域,我們相信未來(lái)會(huì )有更多的項目可以適用。就像通用Eclipse編輯器一樣,不僅可以支持Java,還可以支持其它語(yǔ)言。
運行界面: