A type might refer to an identifier defined in a
tree or in the classpath, to each valid identifier
corresponds a symbol looked
up in the symbol table for the current scope
Each phase of the compiler pipeline simplifies the trees and types
until they can be easily expressed using Java bytecode
All of these data structures are immutable (or look immutable but use caching under the hood)
Parser: From source file to Untyped Tree
obj.fun(5)
obj.fun(5)
Apply(Select(Ident("obj"), "fun"), Literal(5))
Dotty internals: the middle-end
Simplifing types and trees with successive transformations