Skip to content

Do not compute PackageDef members in extractor #4578

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 13 additions & 9 deletions compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 -----------------------------------------------
Expand Down Expand Up @@ -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
}
}
Expand Down Expand Up @@ -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]]

Expand Down
11 changes: 8 additions & 3 deletions library/src/scala/tasty/Tasty.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 --------------------------------------------------
Expand Down Expand Up @@ -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

Expand Down
4 changes: 2 additions & 2 deletions library/src/scala/tasty/util/ShowExtractors.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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) =>
Expand Down
4 changes: 3 additions & 1 deletion tests/pos/tasty/definitions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -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 ---------------------------------

Expand Down