Dotty Documentation



Check Getting Started for instructions on how to obtain the source code of dotty and Eclipse or IntelliJ-IDEA. This document details common workflow patterns when working with Dotty before using the debugging tools.

Compiling files with dotc

As we have seen you can compile a test file either from sbt:

$ sbt
> dotc <OPTIONS> <FILE>

or from terminal:

$ dotc <OPTIONS> <FILE>

Here are some useful debugging <OPTIONS>:

  • -Xprint:PHASE1,PHASE2,... or -Xprint:all: prints the AST after each specified phase. Phase names can be found by examining the* classes for their phaseName field e.g., -Xprint:erasure. You can discover all phases in the class
  • -Ylog:PHASE1,PHASE2,... or -Ylog:all: enables ctx.log("") logging for the specified phase.
  • -Ycheck:all verifies the consistency of AST nodes between phases, in particular checks that types do not change. Some phases currently can't be Ychecked, therefore in the tests we run: -Ycheck:tailrec,resolveSuper,mixin,restoreScopes,labelDef.
  • the last frontier of debugging (before actual debugging) is the range of logging capabilities that can be enabled through the object. Change any of the desired printer from noPrinter to default and this will give you the full logging capability of the compiler.

Inspecting Trees with Type Stealer

There is no power mode for the REPL yet, but you can inspect types with the type stealer:

$ sbt 
> repl
scala> import; import; import Contexts._,Types._

Now, you can define types and access their representation. For example:

scala> val s = stealType("class O { type X }", "O#X")
scala> implicit val ctx: Context = s._1
scala> val t = s._2(0)
t: = TypeRef(TypeRef(ThisType(TypeRef(NoPrefix,<empty>)),O),X)
scala> val u = t.asInstanceOf[TypeRef].underlying
u: = TypeBounds(TypeRef(ThisType(TypeRef(NoPrefix,scala)),Nothing), TypeRef(ThisType(TypeRef(NoPrefix,scala)),Any))


Many objects in the dotc compiler implement a Showable trait (e.g. Tree, Symbol, Type). These objects may be prettyprinted using the .show method