diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala index eff0e56fa831..8a08a9a525af 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala @@ -82,7 +82,7 @@ object TastyImpl extends scala.tasty.Tasty { } def PackageClauseDeco(x: PackageClause): AbstractPackageClause = new AbstractPackageClause { - override def definition: Definition = ??? + def definition(implicit ctx: Context): Definition = FromSymbol.packageDef(x.symbol) } // ----- Statements ----------------------------------------------- @@ -207,17 +207,19 @@ object TastyImpl extends scala.tasty.Tasty { type PackageDef = PackageDefinition + def PackageDefDeco(t: PackageDef): AbstractPackageDef = new AbstractPackageDef { + def members(implicit ctx: Context): List[Statement] = { + if (t.symbol.is(core.Flags.JavaDefined)) Nil // FIXME should also support java packages + else t.symbol.info.decls.iterator.map(FromSymbol.definition).toList + } + } + def packageDefClassTag: ClassTag[PackageDef] = implicitly[ClassTag[PackageDef]] object PackageDef extends PackageDefExtractor { - def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, List[Statement])] = x match { + def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, PackageDef)] = x match { case x: PackageDefinition => - // FIXME Do not do this eagerly as it forces everithing in the package to be loaded. - // An alternative would be to add it as an extension method instead. - val definitions = - if (x.symbol.is(core.Flags.JavaDefined)) Nil // FIXME should also support java packages - else x.symbol.info.decls.iterator.map(FromSymbol.definition).toList - Some(x.symbol.name.toString, definitions) + Some((x.symbol.name.toString, FromSymbol.packageDef(x.symbol.owner))) case _ => None } } @@ -589,7 +591,9 @@ object TastyImpl extends scala.tasty.Tasty { type TypeBoundsTree = tpd.TypeBoundsTree - def TypeBoundsTreeDeco(x: TypeBoundsTree): AbstractTypeBoundsTree = ??? + def TypeBoundsTreeDeco(x: TypeBoundsTree): AbstractTypeBoundsTree = new AbstractTypeBoundsTree { + def tpe(implicit ctx: Context): TypeBounds = x.tpe.bounds + } def typeBoundsTreeClassTag: ClassTag[TypeBoundsTree] = implicitly[ClassTag[TypeBoundsTree]] diff --git a/library/src/scala/tasty/Tasty.scala b/library/src/scala/tasty/Tasty.scala index 164bebfac77c..7398237254b0 100644 --- a/library/src/scala/tasty/Tasty.scala +++ b/library/src/scala/tasty/Tasty.scala @@ -68,7 +68,7 @@ abstract class Tasty { tasty => } trait AbstractPackageClause { - def definition: Definition + def definition(implicit ctx: Context): Definition } implicit def PackageClauseDeco(x: PackageClause): AbstractPackageClause @@ -165,11 +165,16 @@ abstract class Tasty { tasty => type PackageDef <: Definition + trait AbstractPackageDef { + def members(implicit ctx: Context): List[Statement] + } + implicit def PackageDefDeco(t: PackageDef): AbstractPackageDef + implicit def packageDefClassTag: ClassTag[PackageDef] val PackageDef: PackageDefExtractor abstract class PackageDefExtractor { - def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, List[Statement])] + def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, PackageDef)] } // ----- Parents -------------------------------------------------- @@ -426,7 +431,7 @@ abstract class Tasty { tasty => type TypeBoundsTree <: TypeOrBoundsTree trait AbstractTypeBoundsTree { - def tpe: TypeBounds + def tpe(implicit ctx: Context): TypeBounds } implicit def TypeBoundsTreeDeco(x: TypeBoundsTree): AbstractTypeBoundsTree diff --git a/library/src/scala/tasty/util/ShowExtractors.scala b/library/src/scala/tasty/util/ShowExtractors.scala index ea46507351f8..021063204eb3 100644 --- a/library/src/scala/tasty/util/ShowExtractors.scala +++ b/library/src/scala/tasty/util/ShowExtractors.scala @@ -75,8 +75,8 @@ class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case parent @ TypeTree() => this += parent }) this += ", " += self += ", " ++= body += ")" - case PackageDef(name, members) => - this += "PackageDef(\"" += name += "\", " ++= members += ")" + case PackageDef(name, owner) => + this += "PackageDef(\"" += name += "\", " += owner += ")" case Import(expr, selectors) => this += "Import(" += expr += ", " ++= selectors += ")" case PackageClause(pid, stats) => diff --git a/tests/pos/tasty/definitions.scala b/tests/pos/tasty/definitions.scala index 1c0d85f7c291..0548a2bceaf1 100644 --- a/tests/pos/tasty/definitions.scala +++ b/tests/pos/tasty/definitions.scala @@ -43,7 +43,9 @@ object definitions { self: Option[ValDef], body: List[Statement]) extends Definition { def mods: List[Modifier] = ??? } - case class PackageDef(name: String, members: List[Statement]) extends Definition + case class PackageDef(name: String, override val owner: PackageDef) extends Definition { + def members: List[Statement] = ??? + } // ------ Terms ---------------------------------