この質問に対する正確な答えは、コンパイラの作成者だけが与えることができますが、継続プラグインのソース コードを見て、それは不可能であると推測できます。
継続のソースを見ると、次のことがわかります。
val anfPhase = new SelectiveANFTransform() {
val global = SelectiveCPSPlugin.this.global
val runsAfter = List("pickler")
}
val cpsPhase = new SelectiveCPSTransform() {
val global = SelectiveCPSPlugin.this.global
val runsAfter = List("selectiveanf")
}
anfPhase フェーズは pickler フェーズの後に実行され、cpsPhase は selectedAnf の後に実行されます。SelectiveANFTransform.scalaを見ると
abstract class SelectiveANFTransform extends PluginComponent with Transform with
TypingTransformers with CPSUtils {
// inherits abstract value `global' and class `Phase' from Transform
import global._ // the global environment
import definitions._ // standard classes and methods
import typer.atOwner // methods to type trees
/** the following two members override abstract members in Transform */
val phaseName: String = "selectiveanf"
scalac -Xshow-phases を使用すると、コンパイル プロセス中にフェーズを確認できます。
parser
namer
packageobjects
typer
superaccessors
pickler
refchecks
selectiveanf
liftcode
selectivecps
uncurry
......
ご覧のとおり、typer フェーズは、selectiveAnf フェーズと selectedCps フェーズの前に適用されます。型推論が typer フェーズで発生することを確認する必要がありますが、これが実際に当てはまり、それが理にかなっている場合、7.tracked と 35.tracked で Int 型を省略できない理由が明確になるはずです。
まだ満足していない場合は、次のオプションを使用して、「ツリー」に一連の変換を実行することでコンパイラが機能することを知っておく必要があります。
- -Xprint: 特定のフェーズが実行された後の scala コードを表示します
- -Xprint: -Yshow-trees は、フェーズが実行された後の scala コードとツリーを表示します
- -YBrowse: 両方をサーフィンするための GUI を開きます。