blob: f0104e7156027343fa318553d1001adb49bcb730 (
plain) (
tree)
|
|
package dotty.tools.dotc
package transform
import core._
import DenotTransformers.SymTransformer
import Phases.Phase
import Contexts.Context
import Flags._
import SymDenotations.SymDenotation
import collection.mutable
import TreeTransforms.MiniPhaseTransform
import dotty.tools.dotc.transform.TreeTransforms.TransformerInfo
/** Lift nested classes to toplevel */
class Flatten extends MiniPhaseTransform with SymTransformer { thisTransform =>
import ast.tpd._
override def phaseName = "flatten"
def transformSym(ref: SymDenotation)(implicit ctx: Context) = {
if (ref.isClass && !ref.is(Package) && !ref.owner.is(Package)) {
ref.copySymDenotation(
name = ref.flatName,
owner = ref.enclosingPackageClass)
}
else ref
}
private val liftedDefs = new mutable.ListBuffer[Tree]
private def liftIfNested(tree: Tree)(implicit ctx: Context, info: TransformerInfo) =
if (ctx.owner is Package) tree
else {
transformFollowing(tree).foreachInThicket(liftedDefs += _)
EmptyTree
}
override def transformStats(stats: List[Tree])(implicit ctx: Context, info: TransformerInfo) =
if (ctx.owner is Package) {
val liftedStats = stats ++ liftedDefs
liftedDefs.clear
liftedStats
}
else stats
override def transformTypeDef(tree: TypeDef)(implicit ctx: Context, info: TransformerInfo) =
liftIfNested(tree)
}
|