LoginSignup
5
0

Sorbet で `typed: false` で起きうるエラーを調べる方法

Last updated at Posted at 2023-07-28

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 ファイルが置かれていて、それぞれに以下のようなエラー定義が書かれています。

desugar.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 から見れて、内容は以下の通りです。

スクリーンショット 2023-07-28 14.11.46.png

  1. Sorbet の実行ステップについて詳しく知りたければ、開発者向けのドキュメントですが、 https://github.com/sorbet/sorbet/blob/0.5.10932.20230725174316-166024b5c/docs/internals.md を参照すると良いです。

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0