用於靜態打字LUA開發的IDE。
源自Emmylua。

self是真實的類型@shape的支持@not類型鑄件@type返回語句上的註釋






最新版本可在Intellij或Jetbrains插件網站中下載。
luanalysy源自Emmylua,並支持Emmylua提供的所有基本編輯和重構功能。
除了基本的LUA編輯功能之外,Luanalysis還支持靜態類型高級代碼庫所需的大量其他功能。
*注意*:功能以實現的順序大致列出,絕不是重要的順序。
查看靜態打字的一種好方法是結帳Luanalysis演示項目。

除了定義新類型外, @type標籤現在還可以用來施放LUA表達式的結果。
這對於艾米多德塊註釋的新添加支持最有用,因為我們可以輕鬆地指定內聯類型鑄件:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444078f50f50f61e74e620b7505b58c65/src/src/type_casts.lua
Emmylua試圖簡單地檢查前者是否是後者的“亞型”,試圖確定某種類型是否可以分配給其他類型,但是未實現複雜類型的適當類型差異。例如,根據參數和返回值類型,函數可能是其他功能類型的協變或違反的:

Emmylua不會報告上述錯誤。
此外,工會方差檢測已得到固定:

如上所述,Emmylua的當前發布不會捕獲此錯誤。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744444078f50f50f61e74e620b7505b58c65/src/src/string_literals.lua.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd74444444078f50f50f61e74e620b7505b58c65/src/src/function_generics_scope.lua
IE類型檢查現在可以在函數“ lambdas”中工作,該功能分配給具有EmmyDoc定義的變量。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd74444444078f50f61e74e620b7505b58c65/src/src/src/lambda_params.lua
各種改進,例如Emmydoc“數組”現在可以分配給兼容表類型

當前的Emmylua版本將在這里報告錯誤,即使這是合理的。
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444078f50f50f61e74e620b7505b58c65/src/tables.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744444078f50f50f61e74e620b7505b58c65/src/src/src/generic_class_fields.lua.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444078f50f50f61e74e620b7505b58c65/src/src/function_generics_generics.lua#l226-l226-l226-l226-l249
當前的Emmylua版本無法在幾種情況下正確推斷泛型,因此報告不存在錯誤的錯誤,並且錯過了應該存在錯誤的錯誤,例如
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444078f50f50f61e74e620b7505b58c65/src/src/function_generics.generics.lua#l154-l154-l181
默認情況下,類型安全錯誤現在報告為錯誤而不是警告。這是通過三件事使這是可行的:
指定複雜類型的能力的許多改進
鍵入安全錯誤修復
鑄件
特別是鑄造意味著,如果用戶正在做某件事,則類型系統認為不安全,但是他們知道在運行時會很好,他們只能添加鑄件來表示這一點,並且錯誤將消失。

禁止使用通用參數的陰影,並且錯誤報告:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd74444078f50f50f61e74e620b7505b58c65/src/src/generic_class_scope.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744444078f50f50f61e74e620b7505b58c65/src/src/src/generic_class_fields.fields.lua.lua#l444-l44-l45
self是真實的類型改進的類型檢查self ,例如,可以將self分配給與方法的父類型匹配的變量。但是,由於可以將類型分配給self ,因為可以將類別分配給自我(在這種情況下, self是指更具體的類型)。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444444078f50f50f50f61e74e620b7505b58c65/src/src/self.lua

當前的Emmylua發布將允許這種無效的分配。
當函數返回多個值時,當前的Emmylua釋放將推斷並將其放入緩存中。這是不准確的,因為一般類型分析可能會根據所分配的值而導致相同的通用參數被不同解決,因此在這種情況下不能使用緩存。目前,這既導致錯誤丟失,又導致其他錯誤,具體取決於分配。
@shape的支持可以將形狀定義與類相似的定義,除了違反性是由成員而不是繼承層次結構的兼容確定的。
當使用“結構”(例如JSON)而不是OOP類時,這是最有用的。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd7444444078f50f50f50f61e74e620b7505b58c65/src/src/shape.lua
使形狀特別有用的是,它們像類一樣支持仿製藥和繼承(在定義時間,而不是分配):
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9c9fd7444444444444078f50f61e74e620b7505b58c65/src/src/shape.lua#l36-l74
更好的是,類型檢查不僅是對不兼容的“表格”的報告,而且檢查的檢查知道如何遍歷桌面文字並提供兩個形狀之間不兼容的詳細註釋

別名現在可以採用通用參數,就像類或形狀一樣。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744444078f50f61e74e620b7505b58c65/src/src/generic_alias.lua
功能類型現在可以使用…: T作為vararg T :

現在,我們支持variadic返回值:

在內部, TyTuple已被TyMultipleResults取代,以反映出該構造不是固定尺寸的事實。此外,現在在更多位置正確處理多個結果。
利用變異返回值等的LUA內置輸入的各種改進。
現在,我們可以鍵入表的所有屬性,而不僅僅是字符串常數。鑑於Luanalysis還增加了對原始文字類型的支持,我們可以使用很多不同的方式

在這裡,我們有常規的字符串標識符字段,數字字段[1] , [2]和[3]和[boolean]字段。最後一個真的很強大,因為它不是常數,它是一種真實的類型。
我們可以鍵入自定義數據結構,例如
--- @class Dictionary < K , V >
--- @field [ K] V這將適用於任何K ,並且所有內容都將按照您的期望進行靜態鍵入檢查。
還有用於表類型的語法,它適用於表文字和匿名類(即未明確鍵入的表):

現在,我們支持具有可選參數列表和可選返回值的fun類型,即fun: boolean fun(arg: boolean) 。 fun (既沒有指定)也適用於後代,但在功能上等同於現有function類型。
部分鍵入功能對於實現回調和處理程序模式非常有用。例如,擁有一個可擴展的事件系統很常見,每個事件都有唯一的參數,但是處理程序必須返回true以表明已處理該事件:

這是另一個非常有用的功能。現在,我們可以正確地表明一個對像是可召喚的(即一個表的table具有__call方法)。

這是通過使用現有的@overload EmmyDoc關鍵字來完成的,並且類似地工作,即我們可以指定許多過載,並且類型檢查和完成將按照您的期望工作:

可以將元組作為具有數字字面索引的形狀實現:

或作為表麵類型的別名:

如上所述,當元組與數組兼容時,可以將其分配給一個,但反之亦然。
@type註釋支持類型列表。在聲明變量時可以使用:

或用於通過表達式返回的多個結果(例如函數調用):

@not類型鑄件@not類型鑄件消除了聯合的類型。它在各種情況下都是有用的,其中最直接的是消除nil :

像@type一樣,也是支持用於施放函數多個返回值的類型列表,並且本身可以消除工會:

當您只想從聯合中消除類型時,使用@not cast通常更安全,因為@type鑄件本質上可以禁用所有類型檢查分配的檢查,在@type cast中, @not Cast只是不包括某些類型。
@type返回語句上的註釋返回語句現在接受類型註釋,這是鍵入匿名lambdas返回值的類型安全方法。

與類型鑄件不同,這些是類型的安全:

現在懶洋洋地解決了別名類型,這使我們能夠鍵入遞歸數據結構。例如,JSON:

功能API可能會返回未知數的結果。但是,當調用這些功能時,您傾向於知道您期望有多少結果。
@not nil nil :

一種變異類型也可以施放到另一種類型:

現在,我們支持短和長函數類型定義中的可選參數,例如

重要的是,可選的不是nil | type 。

除非可選參數類型本身在其類型定義中作為聯合的nil ,否則您不能提供nil 。在LUA中實現功能時,這是理想的選擇,例如,如果實現使用[ select('#', …) ]](https://www.lua.org/manual/5.3/manual.html.html.html#pdf-select)。但是,除此之外,LUA定期用作腳本語言,將LUA函數綁定到其他語言的實現,這些語言支持過載等。在其中參數的數量和類型很重要。
還已經實施了防止錯誤的可選參數順序的檢查:
用以下方式構建插件
./gradlew build有關Jetbrains平台SDK的更多詳細信息,請參考官方文檔。
所得的插件.zip最終將進入目錄./build/distributions/ 。
要安裝您構建的.zip ,您需要轉到Intellij的…
首選項 - >插件 - >設置COG圖標 - >從磁盤安裝插件...

選擇.zip ,然後在提示時重新啟動Intellij。
Luanalysis:Benjamin Dobell
emmylua作者:@tangzx阿唐
貢獻者
請參閱GitHub以獲取完整的貢獻者列表。
感謝Luanalysis的讚助商和支持者,這些贊助商和支持者有助於確保持續發展的盧納分析。