ruby-type-inferenceプロジェクトは、Rubyの動的性質の問題に取り組み、より信頼性の高いシンボル解像度とタイプの推論を提供するためのまったく新しいアプローチです。いくつかの実行時間データを収集して、メソッドのタイプ契約を構築します。
メソッドが呼び出されるたびに、特定のタイプのいくつかの議論が渡されています。タイプトラッカーは、そのような引数の組み合わせをすべて収集し、遭遇したすべての引数タイプのタプルを満たす特別な契約を構築します。
アプローチには独自の長所と短所があります。
この実装は、いつでも任意のタイプ契約をマージする可能性を提供することにより、指定されたカバレッジの問題に対処します。
簡単に使用するには、ルビミン用のRuby Dynamic Code Insightプラグインをインストールする必要があります。その後、このプラグインでは、Arg_scanner gemをインストールする必要があります。インストール中に問題がある場合は、arg_scannerインストール命令を参照してください。
その後、Type Trackerの下でプログラムを実行する可能性があります。

または、 rubymine-type-trackerバイナリを介してターミナルでプログラムを実行することもできます(ただし、プロジェクトをルベミンで開いたままにしておく必要があります)。例えば:
rubymine-type-tracker bin/rails server
rubymine-type-trackerバイナリは、Arg_scanner GEMに含まれています。
Type Trackerの下でプログラムを実行した後にどのような利点があるかを理解するためのfeats.mdを参照してください。
Arg_scannerは、Rubyプロセスに接続し、ランタイムのタイプワイズデータフローへのすべてのメソッド呼び出しをトレースしてインターセプトするネイティブ拡張機能を備えたGEMです。
使用に関する詳細については、 arg_scannerドキュメントを参照してください。
Type Contract Processor Serverは、着信タイプデータ( arg_scannerから)のリッスンを行い、コンパクト形式に処理します。
保存されたデータは、後でコード分析を改善するために使用でき、他のユーザーと共有することもできます。
コード分析クライアント(Rubymine/IJ+Rubyプラグイン)は、契約データを使用して、コードの完了、より良い解像度など、ユーザーに機能を提供します。
( TODO )Signature Serverは、ユーザーから匿名で契約を受け取り、人気のある宝石向けのコンパイルされた契約コレクションを提供します。
arg_scannerジェムは、タイプ情報の収集に使用されます。ターゲットSDKに手動でインストールでき、MRI Rubyが少なくとも2.3を必要とします。
タイプトラッカーを使用する可能性は2つあります。 (i) ij/rubymineプラグインを使用するか、 (ii)ルビーコードからそれを必要とする。
プラグインを実行する最も簡単な方法(およびその開発に最も便利なもの)は、IJ Ultimate Snapshotに対する特別なGradleタスクでそれを実行することです。
./gradlew ide-plugin:runIde
タスクは、プラグインをコンパイルし、IJ ultimateを実行して「インストールされた」プラグインを実行します。その場合、手動で何かを実行する必要はありません。
既存のルベミンインスタンスで試してみたい場合は、次のようにしてください。
./gradlew ide-plugin:buildPlugin経由で構築しますFile | Settings | Plugins | Install plugin from disk...ide-plugin/build/distributionsのプラグインを見つけて選択します。APIの変更により、プラグインは古いRMインスタンスと互換性がない場合があることに注意してください。
スクリプトのデータを収集するには、契約サーバーが稼働する必要があります。実行して実行できます
./gradlew contract-creator:runServer --args path-to-db.mv.db path-to-db.mv.dbは、タイプ契約が保存されるパス(H2データベースファイル)です。
Rubyスクリプトを実行して、 arg-scannerバイナリを介して処理されます。
契約サーバーによって収集されたデータを使用します。
プロジェクトが単なるインキュベーションであるため、あらゆる種類のアイデア、ユースケース、貢献、質問は大歓迎です。賢明なリクエストのために問題を作成してください。