The Scala 3 compiler (Dotty) providing advanced type inference, metaprogramming capabilities, and enhanced performance for modern Scala development
Primary compilation interfaces providing batch compilation capabilities, programmatic usage patterns, and build tool integration for the Scala 3 compiler.
Main class providing command-line compilation interface with standard argument processing.
/**
* Main entry point for the Scala 3 compiler
* Extends Driver with default settings for command-line usage
*/
object Main extends Driver {
/**
* Command-line entry point for batch compilation
* @param args Array of command-line arguments including source files and options
*/
def main(args: Array[String]): Unit
}Usage Examples:
// Command-line style compilation
dotty.tools.dotc.Main.main(Array(
"src/main/scala/MyClass.scala",
"-d", "target/classes",
"-classpath", "lib/dependency.jar"
))
// With compiler flags
dotty.tools.dotc.Main.main(Array(
"src/main/scala/MyClass.scala",
"-Xfatal-warnings",
"-feature",
"-deprecation"
))Core compiler driver providing customizable compilation process with multiple entry points for different use cases.
/**
* Core compiler driver with customizable compilation process
* Provides multiple entry points for different integration scenarios
*/
class Driver {
/**
* Simple compilation entry point with default reporter
* @param args Array of compilation arguments
* @return Reporter containing compilation results and diagnostics
*/
def process(args: Array[String]): Reporter
/**
* Principal compilation entry point with custom reporter and callback
* @param args Array of compilation arguments
* @param reporter Custom reporter for handling diagnostics (null for default)
* @param callback Custom callback for compilation events (null for no callback)
* @return Reporter containing compilation results and diagnostics
*/
def process(args: Array[String], reporter: Reporter | Null, callback: CompilerCallback | Null): Reporter
/**
* Java reflection-friendly entry point using SimpleReporter interface
* @param args Array of compilation arguments
* @param simple SimpleReporter implementation for Java interop
* @param callback CompilerCallback for compilation events
* @return ReporterResult with compilation outcome
*/
def process(args: Array[String], simple: SimpleReporter | Null, callback: CompilerCallback | Null): ReporterResult
/**
* Setup compilation context from command-line arguments
* @param args Array of compilation arguments
* @param rootCtx Root compilation context
* @return Option containing source files and configured context, or None if setup failed
*/
def setup(args: Array[String], rootCtx: Context): Option[(List[AbstractFile], Context)]
}Usage Examples:
import dotty.tools.dotc.Driver
import dotty.tools.dotc.interfaces.{SimpleReporter, CompilerCallback}
val driver = new Driver
// Simple compilation
val reporter = driver.process(Array("MyFile.scala", "-d", "output"))
if (reporter.hasErrors) {
println("Compilation failed")
}
// With custom reporter
val customReporter = new SimpleReporter {
override def report(diagnostic: Diagnostic): Unit = {
println(s"[${diagnostic.level}] ${diagnostic.message}")
}
}
val callback = new CompilerCallback {
override def onClassGenerated(source, generatedClass, className) = {
println(s"Generated: $className")
}
}
val result = driver.process(
Array("MyFile.scala", "-classpath", "lib/*"),
customReporter,
callback
)Central compiler class managing compilation phases, runs, and overall compilation orchestration.
/**
* Central class managing compilation phases and runs
* Coordinates the entire compilation pipeline
*/
class Compiler {
/**
* Complete list of compilation phases organized by phase groups
* Each inner list represents phases that can run in parallel
* @return Nested list of Phase objects representing the compilation pipeline
*/
def phases: List[List[Phase]]
/**
* Create a new compilation run within the given context
* @param ctx Compilation context
* @return New Run instance for processing source files
*/
def newRun(using Context): Run
/**
* Generate unique run identifier for tracking compilation runs
* @return Unique integer identifier for the next compilation run
*/
def nextRunId: Int
/**
* Reset compiler state for clean compilation
* Clears caches and resets internal state
* @param ctx Compilation context
*/
def reset()(using Context): Unit
}Represents a single compilation run responsible for processing source files through the compilation pipeline.
/**
* Represents a single compilation run with file processing
* Manages the execution of compilation phases on a set of source files
*/
class Run {
/**
* Compile the given source files
* @param files List of source files to compile
*/
def compile(files: List[AbstractFile])(using Context): Unit
/**
* Get the unique identifier for this compilation run
* @return Integer run ID
*/
def runId: Int
/**
* Check if this compilation run produced any errors
* @return True if errors were reported during compilation
*/
def hasErrors: Boolean
}Represents a single source file being compiled with associated metadata and compilation state.
/**
* Represents a single source file being compiled
* Contains source content, parsing results, and compilation metadata
*/
class CompilationUnit {
/**
* The source file being compiled
*/
def source: SourceFile
/**
* The abstract syntax tree for this compilation unit
*/
def untpdTree: Tree[?]
/**
* The typed abstract syntax tree (available after typing phase)
*/
def tpdTree: Tree[?]
}Usage Examples:
import dotty.tools.dotc.{Compiler, Driver}
import dotty.tools.dotc.core.Contexts._
// Custom compiler usage
class MyCompiler extends Compiler {
override def phases =
List(List(/* custom phases */)) ++ super.phases
}
val driver = new Driver {
override def newCompiler(using Context) = new MyCompiler
}
// Using compiler directly
given Context = initContext()
val compiler = new Compiler
val run = compiler.newRun
// run.compile(sourceFiles)/**
* Abstract representation of a file or directory
* Used throughout the compiler for source files and output locations
*/
abstract class AbstractFile {
def name: String
def path: String
def isDirectory: Boolean
def exists: Boolean
}/**
* Represents a source file with content and metadata
*/
class SourceFile {
def file: AbstractFile
def content: Array[Char]
def lineIndices: Array[Int]
}/**
* Base class for compilation reporting
* Handles diagnostics, errors, and warnings during compilation
*/
abstract class Reporter {
def hasErrors: Boolean
def hasWarnings: Boolean
def errorCount: Int
def warningCount: Int
}Install with Tessl CLI
npx tessl i tessl/maven-org-scala-lang--scala3-compiler-3