Skip to content

Commit 6290e1a

Browse files
committed
Implement owners
1 parent 4683e5d commit 6290e1a

25 files changed

+295
-169
lines changed

compiler/src/dotty/tools/dotc/tasty/Toolbox.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,13 @@ object Toolbox {
1414

1515
// Statements
1616

17-
override def unapplyPackageDef(arg: Tree) = unapplied(arg, internal.PackageDef.unapplyPackageDef)
17+
override def unapplyPackageClause(arg: Tree) = unapplied(arg, internal.PackageClause.unapplyPackageClause)
1818
override def unapplyImport(arg: Tree) = unapplied(arg, internal.Import.unapplyImport)
1919
override def unapplyValDef(arg: Tree) = unapplied(arg, internal.ValDef.unapplyValDef)
2020
override def unapplyDefDef(arg: Tree) = unapplied(arg, internal.DefDef.unapplyDefDef)
2121
override def unapplyTypeDef(arg: Tree) = unapplied(arg, internal.TypeDef.unapplyTypeDef)
2222
override def unapplyClassDef(arg: Tree) = unapplied(arg, internal.ClassDef.unapplyClassDef)
23+
override def unapplyPackageDef(arg: Tree) = unapplied(arg, internal.PackageDef.unapplyPackageDef)
2324

2425
// Terms
2526

compiler/src/dotty/tools/dotc/tasty/internal/ClassDef.scala

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package internal
33

44
import dotty.tools.dotc.ast.{Trees, tpd}
55
import dotty.tools.dotc.core.Contexts.Context
6+
import dotty.tools.dotc.core.Flags._
7+
import dotty.tools.dotc.core.Symbols.ClassSymbol
68

79
import scala.tasty.trees
810
import scala.tasty.types
@@ -11,6 +13,21 @@ object ClassDef {
1113

1214
def apply(tree: tpd.TypeDef)(implicit ctx: Context): trees.ClassDef = new Impl(tree)
1315

16+
def apply(sym: ClassSymbol)(implicit ctx: Context): trees.ClassDef = {
17+
def toTree(sym: ClassSymbol): tpd.TypeDef = {
18+
val constr = tpd.DefDef(sym.unforcedDecls.find(_.isPrimaryConstructor).asTerm)
19+
val body = sym.unforcedDecls.filter(!_.isPrimaryConstructor).map(s =>
20+
if (s.isClass) toTree(s.asClass)
21+
else if (s.isType) tpd.TypeDef(s.asType)
22+
else if (s.is(Method)) tpd.DefDef(s.asTerm)
23+
else tpd.ValDef(s.asTerm)
24+
)
25+
val superArgs = Nil // TODO
26+
tpd.ClassDef(sym, constr, body, superArgs)
27+
}
28+
new Impl(toTree(sym))
29+
}
30+
1431
def unapplyClassDef(arg: Impl): Option[trees.ClassDef.Data] = {
1532
implicit val ctx: Context = arg.ctx
1633
val Trees.TypeDef(name, impl@Trees.Template(constr, parents, self, _)) = arg.tree
@@ -27,7 +44,7 @@ object ClassDef {
2744

2845
def tpe: types.Type = Type(tree.tpe)(ctx)
2946

30-
def sym: scala.tasty.Symbol = TastySymbol(tree.symbol(ctx))(ctx)
47+
def owner: trees.Definition = Definition(tree.symbol.owner)
3148

3249
override def toString: String = {
3350
import Toolbox.extractor

compiler/src/dotty/tools/dotc/tasty/internal/DefDef.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package internal
33

44
import dotty.tools.dotc.ast.tpd
55
import dotty.tools.dotc.core.Contexts.Context
6+
import dotty.tools.dotc.core.Symbols.TermSymbol
67

78
import scala.tasty.trees
89
import scala.tasty.types
@@ -11,6 +12,8 @@ object DefDef {
1112

1213
def apply(tree: tpd.DefDef)(implicit ctx: Context): trees.DefDef = new Impl(tree)
1314

15+
def apply(sym: TermSymbol)(implicit ctx: Context): trees.DefDef = new Impl(tpd.DefDef(sym))
16+
1417
def unapplyDefDef(arg: Impl): Option[trees.DefDef.Data] = {
1518
val ddef = arg.tree
1619
implicit val localContext: Context = arg.ctx.withOwner(ddef.symbol(arg.ctx))
@@ -21,7 +24,7 @@ object DefDef {
2124

2225
def tpe: types.Type = Type(tree.tpe)(ctx)
2326

24-
def sym: scala.tasty.Symbol = TastySymbol(tree.symbol(ctx))(ctx)
27+
def owner: trees.Definition = Definition(tree.symbol.owner)
2528

2629
override def toString: String = {
2730
import Toolbox.extractor

compiler/src/dotty/tools/dotc/tasty/internal/Definition.scala

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package dotty.tools.dotc.tasty.internal
22

33
import dotty.tools.dotc.ast.tpd
44
import dotty.tools.dotc.core.Contexts.Context
5+
import dotty.tools.dotc.core.Symbols.Symbol
6+
import dotty.tools.dotc.core.Flags._
57

68
import scala.tasty.trees
79

@@ -15,4 +17,20 @@ object Definition {
1517
else TypeDef(tree)
1618
}
1719

18-
}
20+
def apply(sym: Symbol)(implicit ctx: Context): trees.Definition = {
21+
if (sym.is(Package)) PackageDef(sym)
22+
else if (sym.isClass) ClassDef(sym.asClass)
23+
else if (sym.isType) TypeDef(sym.asType)
24+
else if (sym.is(Method)) DefDef(sym.asTerm)
25+
else ValDef(sym.asTerm)
26+
}
27+
28+
private[tasty] object NoDefinition extends trees.Definition {
29+
override def owner: trees.Definition = NoDefinition
30+
31+
override def pos: scala.tasty.Position = ???
32+
33+
override def toString: String = "NoDefinition"
34+
}
35+
36+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package dotty.tools.dotc.tasty
2+
package internal
3+
4+
import dotty.tools.dotc.ast.{Trees, tpd}
5+
import dotty.tools.dotc.core.Contexts.Context
6+
7+
import scala.tasty.trees
8+
9+
object PackageClause {
10+
11+
// TODO make sure all extractors are tested
12+
13+
def apply(tree: tpd.PackageDef)(implicit ctx: Context): trees.PackageClause = new Impl(tree)
14+
15+
def unapplyPackageClause(arg: Impl): Option[trees.PackageClause.Data] = {
16+
implicit val ctx: Context = arg.ctx
17+
val localContext = ctx.withOwner(arg.tree.symbol)
18+
Some(Term(arg.tree.pid), arg.tree.stats.map(TopLevelStatement(_)(localContext)))
19+
}
20+
21+
private[tasty] class Impl(val tree: tpd.PackageDef)(implicit val ctx: Context) extends trees.PackageClause with Positioned {
22+
override def toString: String = {
23+
import Toolbox.extractor
24+
val trees.PackageClause(pkg, body) = this
25+
s"PackageClause($pkg, $body)"
26+
}
27+
}
28+
}
Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,34 @@
11
package dotty.tools.dotc.tasty
22
package internal
33

4-
import dotty.tools.dotc.ast.{Trees, tpd}
54
import dotty.tools.dotc.core.Contexts.Context
5+
import dotty.tools.dotc.core.Symbols.Symbol
66

7+
import scala.tasty
78
import scala.tasty.trees
89

910
object PackageDef {
1011

1112
// TODO make sure all extractors are tested
1213

13-
def apply(tree: tpd.PackageDef)(implicit ctx: Context): trees.PackageDef = new Impl(tree)
14+
def apply(sym: Symbol)(implicit ctx: Context): trees.PackageDef = new Impl(sym)
1415

1516
def unapplyPackageDef(arg: Impl): Option[trees.PackageDef.Data] = {
1617
implicit val ctx: Context = arg.ctx
17-
val localContext = ctx.withOwner(arg.tree.symbol)
18-
Some(Term(arg.tree.pid), arg.tree.stats.map(TopLevelStatement(_)(localContext)))
18+
val localContext = ctx.withOwner(arg.sym)
19+
Some(Name(arg.sym.name), Nil) // FIXME
1920
}
2021

21-
private[tasty] class Impl(val tree: tpd.PackageDef)(implicit val ctx: Context) extends trees.PackageDef with Positioned {
22+
private[tasty] class Impl(val sym: Symbol)(implicit val ctx: Context) extends trees.PackageDef {
23+
24+
override def pos: tasty.Position = ??? // FIXME: A packageDef should not have a position, maybe Definition should not have positions
25+
26+
override def owner: trees.Definition = Definition(sym.owner)
27+
2228
override def toString: String = {
2329
import Toolbox.extractor
24-
val trees.PackageDef(pkg, body) = this
25-
s"Package($pkg, $body)"
30+
val trees.PackageDef(name, members) = this
31+
s"PackageDef($name, $members)"
2632
}
2733
}
2834
}

compiler/src/dotty/tools/dotc/tasty/internal/TastySymbol.scala

Lines changed: 0 additions & 25 deletions
This file was deleted.

compiler/src/dotty/tools/dotc/tasty/internal/TopLevelStatement.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import scala.tasty.trees
77

88
object TopLevelStatement {
99
def apply(tree: tpd.Tree)(implicit ctx: Context): trees.TopLevelStatement = tree match {
10-
case tree: tpd.PackageDef => PackageDef(tree)
10+
case tree: tpd.PackageDef => PackageClause(tree)
1111
case _ => Statement(tree)
1212
}
1313
}

compiler/src/dotty/tools/dotc/tasty/internal/Type.scala

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import dotty.tools.dotc.core.Symbols.Symbol
66
import dotty.tools.dotc.core.Types
77
import dotty.tools.dotc.core.Names
88

9+
import scala.tasty.trees
910
import scala.tasty.types
1011

1112
object Type {
@@ -24,7 +25,7 @@ object Type {
2425
case tp: Types.NamedType =>
2526
implicit val ctx: Context = arg.ctx
2627
tp.designator match {
27-
case sym: Symbol => Some(TastySymbol(sym), TypeOrNoPrefix(tp.prefix))
28+
case sym: Symbol => Some(Definition(sym), TypeOrNoPrefix(tp.prefix))
2829
case _ => None
2930
}
3031
case _ => None
@@ -114,11 +115,20 @@ object Type {
114115

115116
assert(!tpe.isInstanceOf[Types.TypeBounds])
116117

118+
117119
override def toString: String = {
118120
import Toolbox.extractor
121+
def name(sym: trees.Definition): String = sym match {
122+
case trees.ValDef(name, _, _, _) => name.toString
123+
case trees.DefDef(name, _, _, _, _, _) => name.toString
124+
case trees.TypeDef(name, _, _) => name.toString
125+
case trees.ClassDef(name, _, _, _, _, _) => name.toString
126+
case trees.PackageDef(name, _) => name.toString
127+
case _ => "NoDefinition"
128+
}
119129
this match {
120130
case types.ConstantType(value) => s"ConstantType($value)"
121-
case types.SymRef(sym, qual) => s"SymRef($sym, $qual)"
131+
case types.SymRef(sym, qual) => s"SymRef(<${name(sym)}>, $qual)" // Do not print the full definition to avoid cycles
122132
case types.NameRef(name, qual) => s"NameRef($name, $qual)"
123133
case types.Refinement(parent, name, info) => s"Refinement($parent, $name, $info)"
124134
case types.AppliedType(tycon, args) => s"AppliedType($tycon, $args)"

compiler/src/dotty/tools/dotc/tasty/internal/TypeDef.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package internal
33

44
import dotty.tools.dotc.ast.{Trees, tpd}
55
import dotty.tools.dotc.core.Contexts.Context
6+
import dotty.tools.dotc.core.Symbols.TypeSymbol
67

78
import scala.tasty.trees
89
import scala.tasty.types
@@ -11,6 +12,8 @@ object TypeDef {
1112

1213
def apply(tree: tpd.TypeDef)(implicit ctx: Context): trees.TypeDef = new Impl(tree)
1314

15+
def apply(sym: TypeSymbol)(implicit ctx: Context): trees.TypeDef = new Impl(tpd.TypeDef(sym))
16+
1417
def unapplyTypeDef(arg: Impl): Option[trees.TypeDef.Data] = {
1518
val tdef = arg.tree
1619
implicit val localContext: Context = arg.ctx.withOwner(tdef.symbol(arg.ctx))
@@ -25,7 +28,7 @@ object TypeDef {
2528

2629
def tpe: types.Type = Type(tree.tpe)(ctx)
2730

28-
def sym: scala.tasty.Symbol = TastySymbol(tree.symbol(ctx))(ctx)
31+
def owner: trees.Definition = Definition(tree.symbol.owner)
2932

3033
override def toString: String = {
3134
import Toolbox.extractor

0 commit comments

Comments
 (0)