4

次のような不完全な一致

def foo[A](t: Seq[A]) = t match {
    Seq(x) => x
}

多くの場合(常にではありませんが、通常は)実行時にクラッシュする私の側の間違いです。Scala は警告しますが、インクリメンタル ビルドでは、ファイルが既にコンパイルされている可能性があるため、警告を見逃すことになります。

おそらく注釈によって、グローバルまたはローカルのいずれかで、scalaに警告をエラーに変える方法はありますか?

4

2 に答える 2

4

警告をエラーとして (またはその逆に) 任意に報告するカスタム レポーターを提供することは可能ですが、API は現在文字列ベースであるため、入力された警告ではなく文字列メッセージをフィルター処理します。

特定の警告で失敗する組み込みの方法はありませんが、-Xlint -Xfatal-warnings警告をエスカレートする通常の方法です。

警告の抑制が要求されましたが、危険と見なされました。致命的な警告の場合、良性と見なされる警告を抑制する必要があります。

非推奨が残っている場合は、非推奨のメソッドから呼び出すことで、警告 (-Xfatal-warnings で失敗する) を抑制することができます。そのメソッドがローカルの場合、警告は生成されません。

scala> @deprecated("","") def f = 8
f: Int

scala> f
<console>:9: warning: method f is deprecated: 
              f
              ^
scala> object A {
     | def a = {
     | @deprecated("","") def _f = f
     | _f
     | }}
defined object A

scala> A.a
res1: Int = 8

ローカルの非推奨トリック自体は非推奨になりましたが、転送コンパニオンを引き続き使用できます。

scala> @deprecated("","") def f = 8
f: Int

scala> f
warning: there was one deprecation warning; re-run with -deprecation for details
res0: Int = 8

scala> @deprecated("","") class C { def g = f }; object C extends C
defined class C
defined object C

scala> C.g
res1: Int = 8
于 2013-07-06T19:36:04.120 に答える
0

ビルド プロセスについて質問することを検討してください。

  1. コードのコミット/チェックインの直前に、完全でクリーンなビルド (インクリメンタルではない) を実行し、単体テストを実行する必要があります。これは、SBT またはビルド プロセスの (潜在的な、残りの) バグを回避するためです。もちろん、エラーや警告がないか結果を監視する必要があります。

  2. 継続的インテグレーション(自動、スケジュールされたビルド/テスト) を行っていますか、または行うべきでしょうか? そのような間、警告がどのように対処されるか (無視されるか、ビルドの失敗/警告をトリガーする) を制御するか、導入することができます。

  3. scalacコマンドラインからこれを行う方法がわかりません。他のすべてのアプローチがニーズを満たさない場合は、最後の手段として検討し、ビルド ツールに適している場合にのみ、次のscalac名前の のラッパー スクリプトを作成しますscalac

    • 真実を呼び起こすscalac
    • 出力を監視します。特定のエラーが出力されたときにエラーを返し、おそらくターゲット クラス ファイル [エラー ステートメントからキャプチャされた] を削除して、問題をさらに強制します。
于 2013-07-06T02:46:33.273 に答える