Sorbet を既存のコードに導入する際、気にするのが strictness level (# typed: XXX
の XXX の部分) の選択だと思います。最初はほとんどのファイルを typed: false
で始めると思いますが、結局これはどういうエラーを検知するのか (検知してしまうのか) 気になると思います。
公式のリファレンス (https://sorbet.org/docs/static) に解説はありますが、どういうエラーが起きうるのかについて抽象的な説明です。また、実際に Sorbet を実行したとき、「あれ、これ typed: false
でも怒られるの?」みたいに、結構想像とギャップが出ると思います。
この記事では具体的にどの strictness level でどのようなエラーが起きうるかの調べ方を紹介します。
1. ソースコードからエラーを探す
早速ですが、悲しいことにどのエラーがどの strictness level で起きうるかは、ドキュメント化されておらず、ソースコードを読むしかありません。
が、幸いにも、エラーの定義は特定のディレクトリにまとまっていて、定義も読みやすいです。今回はそれを見ます。
sorbet リポジトリの core/errors ディレクトリ に定義があります。
このディレクトリには、Sorbet の実行ステップ1に対応した、複数の .h
ファイルが置かれていて、それぞれに以下のようなエラー定義が書かれています。
#ifndef SORBET_CORE_ERRORS_DESUGAR_H
#define SORBET_CORE_ERRORS_DESUGAR_H
#include "core/Error.h"
namespace sorbet::core::errors::Desugar {
constexpr ErrorClass InvalidSingletonDef{3001, StrictLevel::True};
constexpr ErrorClass IntegerOutOfRange{3002, StrictLevel::True};
constexpr ErrorClass UnsupportedNode{3003, StrictLevel::False};
constexpr ErrorClass FloatOutOfRange{3004, StrictLevel::True};
constexpr ErrorClass NoConstantReassignment{3005, StrictLevel::True};
// constexpr ErrorClass SimpleSuperclass{3006, StrictLevel::True};
constexpr ErrorClass UnnamedBlockParameter{3007, StrictLevel::Strict};
constexpr ErrorClass UndefUsage{3008, StrictLevel::Strict};
constexpr ErrorClass UnsupportedRestArgsDestructure{3009, StrictLevel::True};
constexpr ErrorClass CodeInRBI{3010, StrictLevel::False};
constexpr ErrorClass DuplicatedHashKeys{3011, StrictLevel::False};
} // namespace sorbet::core::errors::Desugar
#endif
constexpr ErrorClass
から始まる各行がエラーの定義で、 最初の数字がエラーコード、次の StrictLevel::
に続く部分が 「どの strictness level 以上からエラーがレポートされるか」を表します。
(※ strictness level の大小関係は、 ignore < false < true < strict < strong です。例えば、 false でレポートされるエラーは、true, strict でもレポートされます。)
例えば、 DuplicatedHashKeys
は、エラーコードが 3011 で、 StrictLevel::False
なので、 typed: false
でもエラーがレポートされます。
エラーコードは、リファレンスの参照に使うほか、 srb
コマンドの --suppress-error-code
, --isolate-error-code
オプションで、特定のエラーを無視したい、あるいはそれだけレポートしてほしいときに使います。
2. 公式のエラーリファレンスを参照する
エラーコードと、どの strictness level でレポートされるかがわかったので、次はエラーの説明を見ます。
Sorbet のエラーに関しては、公式のエラーリファレンス (https://sorbet.org/docs/error-reference, https://srb.help/) を参照すると良いです。 エラー表示でこのページに誘導されるので、見たことある人も多いでしょう。
例えば、先程の DuplicatedHashKeys
(エラーコード: 3011) の解説は、https://sorbet.org/docs/error-reference#3011 から見れて、内容は以下の通りです。
-
Sorbet の実行ステップについて詳しく知りたければ、開発者向けのドキュメントですが、 https://github.com/sorbet/sorbet/blob/0.5.10932.20230725174316-166024b5c/docs/internals.md を参照すると良いです。 ↩