静的にタイプされたLUA開発のIDE。
エミルアから派生。

selfは本当のタイプです@shapeのサポートを追加しました@notタイプのキャスト@type Annotations on Return Statements






最新リリースは、Intellij内またはJetBrainsプラグインWebサイトからダウンロードできます。
ルアナリシスはEmmyluaに由来し、Emmyluaが提供するすべての基本的な編集およびリファクタリング機能をサポートしています。
基本的なLUA編集機能を超えて、Luanalysisは、高度なコードベースを静的にタイプするために必要なかなりの量の追加機能をサポートしています。
*注*:機能は、実装された順序で大まかにリストされており、決して重要な順序ではありません。
静的タイピングの観点から何が可能かを見るのに最適な方法は、ルアナリシスデモプロジェクトをチェックアウトすることです。

新しいタイプの定義に加えて、 @typeタグを使用してLUA式の結果をキャストできるようになりました。
これは、インライン型キャストを簡単に指定できるため、EmmyDocブロックコメントの新たに追加されたサポートで最も便利です。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmyluaは、前者が後者の「サブタイプ」であるかどうかを確認するだけで、タイプが別のタイプに割り当てられるかどうかを判断しようとしますが、複雑なタイプの適切なタイプの分散は実装されていません。たとえば、関数は、パラメーターと戻り値タイプに応じて、他の関数タイプの共変量または違反である場合があります。

Emmyluaは上記のエラーを報告しません。
さらに、組合の分散検出が修正されました。

上記のように、Emmyluaの現在のリリースでは、このエラーが発生しません。

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

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua
IEタイプチェックは、emmyDoc定義を備えた変数に割り当てられた「lambdas」内部で動作するようになりました。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
たとえば、emmydocの「アレイ」など、さまざまな改善が互換性のあるテーブルタイプに割り当てられるようになりました。

現在のEmmyluaリリースは、これが健全であるにもかかわらず、ここでエラーを報告します。
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua

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

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l26-l249
現在のemmyluaリリースはいくつかの状況でジェネリックを正しく推測することができないため、エラーが存在しない場合にエラーを誤解している場合、エラーを見逃します。
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l154-l181
デフォルトでは、タイプの安全エラーが警告の代わりにエラーとして報告されるようになりました。これは3つのことで実行可能になります:
複雑なタイプを指定する機能の多くの改善
タイプ安全バグ修正
鋳造
特にキャストは、ユーザーがタイプシステムが安全でないと思う何かをしている場合、実行時に問題があることを知っていることを意味します。キャストを追加してこれを意味し、エラーがなくなることを意味します。

一般的なパラメーターのシャドウイングは禁止されており、エラーレポート:

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

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua#l44-l45
selfは本当のタイプですたとえば、 selfの改善されたタイプチェックは、メソッドのselfタイプに一致する変数に割り当てることができます。ただし、クラスがサブクラス化される可能性があるため、その親タイプをselfに割り当てることはできません(この場合、 selfより具体的なタイプを指します)。

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

現在のEmmyluaリリースにより、この無効な割り当てが可能になります。
関数が複数の値を返すと、現在のEmmyluaリリースは値を推測し、キャッシュに入れます。一般的なタイプの分析により、割り当てられている値に基づいて同じ一般的なパラメーターが異なる方法で解決される可能性があるため、これは不正確です。したがって、この状況ではキャッシュを使用できません。現在、これにより、割り当てに応じて、エラーの欠落と追加の不正確なエラーの両方が発生します。
@shapeのサポートを追加しました違反は、継承階層ではなくメンバーの互換性によって決定されることを除いて、クラスと同様に形状を定義できます。
これは、OOPクラスではなく「構造」(JSONなど)を使用する場合に最も便利です。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
シェイプを特に便利にするのは、クラスのようにジェネリックと継承(定義時に、割り当てではなく)をサポートすることです。
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
さらに良いことに、タイプ検査は、互換性のない「テーブル」全体で報告されているだけでなく、テーブルのリテラルを通過する方法を知っており、2つの形状の間の互換性の詳細な注釈を提供する方法を知っています。

エイリアスは、クラスや形状のように、一般的なパラメーターを取得できるようになりました。

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alias.lua
関数タイプが使用できるようになりました…: T vararg T

現在、Variadic Return Valuesをサポートしています。

内部的には、 TyTuple TyMultipleResultsに置き換えられており、この構成要素が固定サイズではないという事実を反映しています。さらに、複数の結果がより多くの場所で適切に処理されるようになりました。
Variadic Return Valuesなどを利用して、Luaビルトインのタイピングのさまざまな改善。
文字列定数だけでなく、テーブルのすべてのプロパティを入力できるようになりました。ルアナリシスが原始的なリテラルタイプのサポートも追加していることを考えると、私たちはこれを多くの異なる方法で使用できます。

ここには、通常の文字列識別子フィールド、番号リテラルフィールド[1] 、 [2] 、 [3] 、および[boolean]フィールドがあります。その最後のものは本当に強力です。なぜなら、それは一定ではなく、本当のタイプだからです。
例:カスタムデータ構造を入力できます
--- @class Dictionary < K , V >
--- @field [ K] Vこれは、任意のKに対して正しく機能し、すべてが予想どおりに静的にチェックされます。
テーブルタイプの構文もあり、テーブルリテラルと匿名クラス(つまり、明示的に入力されていないテーブル)で動作します。

オプションのパラメーターリストとオプションの返品値fun(arg: boolean)備えたfunタイプをサポートしていますfun: boolean (どちらも指定されていない) fun後世にも機能しますが、既存のfunctionタイプと機能的に同等です。
部分的にタイプされた関数は、コールバックとハンドラーのパターンを実装するのに非常に役立ちます。たとえば、各イベントには一意の引数がある拡張可能なイベントシステムを持つことは非常に一般的ですが、ハンドラーはイベントが処理されたことを示すためにtrue返す必要があります。

これはもう1つの本当に便利な機能です。これで、オブジェクトが呼び出されることを適切に示すことができます(つまり、メタテイブルには__callメソッドがあるtableです)。

これは、既存の@overload EmmyDocキーワードを使用して行われ、同様に機能します。つまり、多くのオーバーロードを指定でき、型チェックと完了は予想どおりに機能します。

タプルは、数字のリテラルインデックスを持つ形状として実装できます。

またはテーブル文字のタイプのエイリアスとして:

上記のように、タプルが配列と互換性がある場合、それは1つに割り当てることができますが、その逆ではありません。
@type Annotationは、タイプのリストをサポートしています。これは、変数を宣言するときに使用できます。

または、式によって返された複数の結果をキャストする場合(たとえば、関数呼び出し):

@notタイプのキャスト@notタイプのキャストは、組合からタイプを排除します。それはさまざまな状況で役立ちますが、その中で最も簡単なのはnil排除することです。

@typeと同様に、関数の複数のリターン値をキャストするためのタイプリストもサポートしており、それ自体が組合を排除できます。

ユニオンからタイプを排除したい場合は、 @not @typeキャストが割り当てのすべてのタイプチェックを本質的に無効にするため、 @typeキャストが@notキャストを除外します。
@type Annotations on Return Statements返品ステートメントは、匿名のラムダの返品値を入力するタイプセーフの方法であるタイプの注釈を受け入れました。

タイプキャストとは異なり、これらはタイプセーフです。

エイリアスタイプがゆっくりと解決され、再帰データ構造を入力できるようになりました。たとえば、JSON:

関数APIは、未知の数の結果を返す場合があります。ただし、これらの関数を呼び出すと、戻って何回の結果を期待するかを知る傾向があります。
バリアードの返品値は、 @notがnilをキャストすることによって具体的なタイプリストにキャストできます。

あるヴァリアジック型は、別の型にキャストすることもできます。

これで、短い形式と長型の機能タイプ定義の両方でオプションのパラメーターをサポートしています。

重要なことに、オプションはnil | typeの場合は短いものではありませんnil | type 。

オプションのパラメータータイプ自体に、そのタイプ定義の組合の一部としてnilが含まれていない限り、 nil提供することはできません。これは、LUAで関数を実装する際に正確な目的で望ましいです。たとえば、実装が[ select('#', …) ](https://www.lua.org/manual/5.3/manual.html#pdf-select)を使用している場合。ただし、それを超えて、LUAはスクリプト言語として定期的に使用され、lua関数呼び出しが、オーバーロードなどをサポートする他の言語の実装に拘束力のある呼び出しを拘束します。
誤ったオプションのパラメーター順序を防ぐための検査も実装されています。
プラグインを構築します:
./gradlew buildJetBrains Platform SDKの詳細については、公式ドキュメントを参照してください。
結果のプラグイン.zip 、ディレクトリ./build/distributions/で終わります。
構築した.zipをインストールするには、Intellijに行く必要があります…
設定 - >プラグイン - >設定コグアイコン - >ディスクからプラグインをインストール...

.zipを選択してから、プロンプトが表示されたら、Intellijを再起動します。
ルアナリシス:ベンジャミン・ドベル
emmylua by:@tangzx阿唐
貢献者
貢献者の完全なリストについては、Githubを参照してください。
ルアナリシスのスポンサーとサポーターに感謝します。