Skip to content

Commit 45d840b

Browse files
committed
make Export a standard tree, but remove trees before typer
todo: pickler phase and tasty need to handle exports before keeping them in typer
1 parent c18636d commit 45d840b

File tree

7 files changed

+36
-29
lines changed

7 files changed

+36
-29
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,11 @@ object Trees {
803803
type ThisTree[-T >: Untyped] = Import[T]
804804
}
805805

806+
case class Export[-T >: Untyped] private[ast] (expr: Tree[T], selectors: List[untpd.ImportSelector])(implicit @constructorOnly src: SourceFile)
807+
extends Tree[T] {
808+
type ThisTree[-T >: Untyped] = Export[T]
809+
}
810+
806811
/** package pid { stats } */
807812
case class PackageDef[-T >: Untyped] private[ast] (pid: RefTree[T], stats: List[Tree[T]])(implicit @constructorOnly src: SourceFile)
808813
extends ProxyTree[T] {
@@ -990,6 +995,7 @@ object Trees {
990995
type TypeDef = Trees.TypeDef[T]
991996
type Template = Trees.Template[T]
992997
type Import = Trees.Import[T]
998+
type Export = Trees.Export[T]
993999
type PackageDef = Trees.PackageDef[T]
9941000
type Annotated = Trees.Annotated[T]
9951001
type Thicket = Trees.Thicket[T]
@@ -1200,6 +1206,10 @@ object Trees {
12001206
case tree: Import if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
12011207
case _ => finalize(tree, untpd.Import(expr, selectors)(sourceFile(tree)))
12021208
}
1209+
def Export(tree: Tree)(expr: Tree, selectors: List[untpd.ImportSelector])(using Context): Export = tree match {
1210+
case tree: Export if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
1211+
case _ => finalize(tree, untpd.Export(expr, selectors)(sourceFile(tree)))
1212+
}
12031213
def PackageDef(tree: Tree)(pid: RefTree, stats: List[Tree])(using Context): PackageDef = tree match {
12041214
case tree: PackageDef if (pid eq tree.pid) && (stats eq tree.stats) => tree
12051215
case _ => finalize(tree, untpd.PackageDef(pid, stats)(sourceFile(tree)))
@@ -1350,6 +1360,8 @@ object Trees {
13501360
cpy.Template(tree)(transformSub(constr), transform(tree.parents), Nil, transformSub(self), transformStats(tree.body))
13511361
case Import(expr, selectors) =>
13521362
cpy.Import(tree)(transform(expr), selectors)
1363+
case Export(expr, selectors) =>
1364+
cpy.Export(tree)(transform(expr), selectors)
13531365
case PackageDef(pid, stats) =>
13541366
cpy.PackageDef(tree)(transformSub(pid), transformStats(stats)(using localCtx))
13551367
case Annotated(arg, annot) =>
@@ -1484,6 +1496,8 @@ object Trees {
14841496
this(this(this(this(x, constr), parents), self), tree.body)
14851497
case Import(expr, _) =>
14861498
this(x, expr)
1499+
case Export(expr, _) =>
1500+
this(x, expr)
14871501
case PackageDef(pid, stats) =>
14881502
this(this(x, pid), stats)(using localCtx)
14891503
case Annotated(arg, annot) =>

compiler/src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
361361
def Import(expr: Tree, selectors: List[untpd.ImportSelector])(using Context): Import =
362362
ta.assignType(untpd.Import(expr, selectors), newImportSymbol(ctx.owner, expr))
363363

364+
def Export(expr: Tree, selectors: List[untpd.ImportSelector])(using Context): Export =
365+
ta.assignType(untpd.Export(expr, selectors))
366+
364367
def PackageDef(pid: RefTree, stats: List[Tree])(using Context): PackageDef =
365368
ta.assignType(untpd.PackageDef(pid, stats), pid)
366369

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
118118
case class GenAlias(pat: Tree, expr: Tree)(implicit @constructorOnly src: SourceFile) extends Tree
119119
case class ContextBounds(bounds: TypeBoundsTree, cxBounds: List[Tree])(implicit @constructorOnly src: SourceFile) extends TypTree
120120
case class PatDef(mods: Modifiers, pats: List[Tree], tpt: Tree, rhs: Tree)(implicit @constructorOnly src: SourceFile) extends DefTree
121-
case class Export(expr: Tree, selectors: List[ImportSelector])(implicit @constructorOnly src: SourceFile) extends Tree
122121
case class ExtMethods(tparams: List[TypeDef], vparamss: List[List[ValDef]], methods: List[DefDef])(implicit @constructorOnly src: SourceFile) extends Tree
123122
case class MacroTree(expr: Tree)(implicit @constructorOnly src: SourceFile) extends Tree
124123

@@ -407,6 +406,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
407406
if (derived.isEmpty) new Template(constr, parents, self, body)
408407
else new DerivingTemplate(constr, parents ++ derived, self, body, derived.length)
409408
def Import(expr: Tree, selectors: List[ImportSelector])(implicit src: SourceFile): Import = new Import(expr, selectors)
409+
def Export(expr: Tree, selectors: List[ImportSelector])(implicit src: SourceFile): Export = new Export(expr, selectors)
410410
def PackageDef(pid: RefTree, stats: List[Tree])(implicit src: SourceFile): PackageDef = new PackageDef(pid, stats)
411411
def Annotated(arg: Tree, annot: Tree)(implicit src: SourceFile): Annotated = new Annotated(arg, annot)
412412

@@ -631,10 +631,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
631631
case tree: PatDef if (mods eq tree.mods) && (pats eq tree.pats) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
632632
case _ => finalize(tree, untpd.PatDef(mods, pats, tpt, rhs)(tree.source))
633633
}
634-
def Export(tree: Tree)(expr: Tree, selectors: List[ImportSelector])(using Context): Tree = tree match {
635-
case tree: Export if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
636-
case _ => finalize(tree, untpd.Export(expr, selectors)(tree.source))
637-
}
638634
def ExtMethods(tree: Tree)(tparams: List[TypeDef], vparamss: List[List[ValDef]], methods: List[DefDef])(using Context): Tree = tree match
639635
case tree: ExtMethods if (tparams eq tree.tparams) && (vparamss eq tree.vparamss) && (methods == tree.methods) => tree
640636
case _ => finalize(tree, untpd.ExtMethods(tparams, vparamss, methods)(tree.source))
@@ -702,8 +698,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
702698
cpy.ContextBounds(tree)(transformSub(bounds), transform(cxBounds))
703699
case PatDef(mods, pats, tpt, rhs) =>
704700
cpy.PatDef(tree)(mods, transform(pats), transform(tpt), transform(rhs))
705-
case Export(expr, selectors) =>
706-
cpy.Export(tree)(transform(expr), selectors)
707701
case ExtMethods(tparams, vparamss, methods) =>
708702
cpy.ExtMethods(tree)(transformSub(tparams), vparamss.mapConserve(transformSub(_)), transformSub(methods))
709703
case ImportSelector(imported, renamed, bound) =>
@@ -763,8 +757,6 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
763757
this(this(x, bounds), cxBounds)
764758
case PatDef(mods, pats, tpt, rhs) =>
765759
this(this(this(x, pats), tpt), rhs)
766-
case Export(expr, _) =>
767-
this(x, expr)
768760
case ExtMethods(tparams, vparamss, methods) =>
769761
this(vparamss.foldLeft(this(x, tparams))(apply), methods)
770762
case ImportSelector(imported, renamed, bound) =>

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3726,7 +3726,7 @@ object Parsers {
37263726
else if (in.token == IMPORT)
37273727
stats ++= importClause(IMPORT, mkImport(outermost))
37283728
else if (in.token == EXPORT)
3729-
stats ++= importClause(EXPORT, Export.apply)
3729+
stats ++= importClause(EXPORT, Export(_,_))
37303730
else if isIdent(nme.extension) && followingIsExtension() then
37313731
stats += extension()
37323732
else if isDefIntro(modifierTokens) then
@@ -3780,7 +3780,7 @@ object Parsers {
37803780
if (in.token == IMPORT)
37813781
stats ++= importClause(IMPORT, mkImport())
37823782
else if (in.token == EXPORT)
3783-
stats ++= importClause(EXPORT, Export.apply)
3783+
stats ++= importClause(EXPORT, Export(_,_))
37843784
else if isIdent(nme.extension) && followingIsExtension() then
37853785
stats += extension()
37863786
else if (isDefIntro(modifierTokensOrCase))

compiler/src/dotty/tools/dotc/typer/Namer.scala

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ class Namer { typer: Typer =>
5454
val TypedAhead : Property.Key[tpd.Tree] = new Property.Key
5555
val ExpandedTree : Property.Key[untpd.Tree] = new Property.Key
5656
val ExportForwarders: Property.Key[List[tpd.MemberDef]] = new Property.Key
57-
val WildcardExport : Property.Key[Unit] = new Property.Key
5857
val SymOfTree : Property.Key[Symbol] = new Property.Key
5958
val Deriver : Property.Key[typer.Deriver] = new Property.Key
6059

@@ -1038,21 +1037,17 @@ class Namer { typer: Typer =>
10381037
&& mbr.matchesImportBound(if mbr.symbol.is(Given) then givenBound else wildcardBound)
10391038
then addForwarder(alias, mbr, span)
10401039

1041-
def addForwarders(sels: List[untpd.ImportSelector], seen: List[TermName]): Boolean = sels match
1040+
def addForwarders(sels: List[untpd.ImportSelector], seen: List[TermName]): Unit = sels match
10421041
case sel :: sels1 =>
10431042
if sel.isWildcard then
10441043
addWildcardForwarders(seen, sel.span)
1045-
true
10461044
else
10471045
if sel.rename != nme.WILDCARD then
10481046
addForwardersNamed(sel.name, sel.rename, sel.span)
10491047
addForwarders(sels1, sel.name :: seen)
10501048
case _ =>
1051-
false
10521049

1053-
val hasWildcard = addForwarders(selectors, Nil)
1054-
if hasWildcard then
1055-
exp.pushAttachment(WildcardExport, ())
1050+
addForwarders(selectors, Nil)
10561051
val forwarders = buf.toList
10571052
exp.pushAttachment(ExportForwarders, forwarders)
10581053
forwarders

compiler/src/dotty/tools/dotc/typer/TypeAssigner.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,9 @@ trait TypeAssigner {
507507
def assignType(tree: untpd.Import, sym: Symbol)(using Context): Import =
508508
tree.withType(sym.termRef)
509509

510+
def assignType(tree: untpd.Export)(using Context): Export =
511+
tree.withType(defn.AnyType)
512+
510513
def assignType(tree: untpd.Annotated, arg: Tree, annot: Tree)(using Context): Annotated = {
511514
assert(tree.isType) // annotating a term is done via a Typed node, can't use Annotate directly
512515
tree.withType(AnnotatedType(arg.tpe, Annotation(annot)))

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,10 +2247,16 @@ class Typer extends Namer
22472247
assignType(cpy.Import(imp)(expr1, selectors1), sym)
22482248
}
22492249

2250-
def typedExportExpr(tree: untpd.Export)(using Context): Tree = {
2251-
val expr1 = typedExpr(tree.expr, AnySelectionProto)
2250+
def typedExport(exp: untpd.Export)(using Context): Export = {
2251+
val expr1 = typedExpr(exp.expr, AnySelectionProto)
22522252
checkLegalImportPath(expr1)
2253-
expr1
2253+
val selectors1: List[untpd.ImportSelector] = exp.selectors.mapConserve { sel =>
2254+
if sel.bound.isEmpty then sel
2255+
else cpy.ImportSelector(sel)(
2256+
sel.imported, sel.renamed, untpd.TypedSplice(typedType(sel.bound)))
2257+
.asInstanceOf[untpd.ImportSelector]
2258+
}
2259+
assignType(cpy.Export(exp)(expr1, selectors1))
22542260
}
22552261

22562262
def typedPackageDef(tree: untpd.PackageDef)(using Context): Tree =
@@ -2487,6 +2493,7 @@ class Typer extends Namer
24872493
case tree: untpd.Function => typedFunction(tree, pt)
24882494
case tree: untpd.Closure => typedClosure(tree, pt)
24892495
case tree: untpd.Import => typedImport(tree, retrieveSym(tree))
2496+
case tree: untpd.Export => typedExport(tree)
24902497
case tree: untpd.Match => typedMatch(tree, pt)
24912498
case tree: untpd.Return => typedReturn(tree)
24922499
case tree: untpd.WhileDo => typedWhileDo(tree)
@@ -2649,14 +2656,7 @@ class Typer extends Namer
26492656
case Thicket(stats) :: rest =>
26502657
traverse(stats ::: rest)
26512658
case (stat: untpd.Export) :: rest =>
2652-
if stat.hasAttachment(WildcardExport) then
2653-
val expr = typedExportExpr(stat)
2654-
expr.tpe.classSymbol match
2655-
case cls if cls.isClass =>
2656-
ctx.owner.asClass.addExportDependency(cls.asClass)
2657-
case _ =>
2658-
end if
2659-
2659+
// buf += typed(stat)
26602660
buf ++= stat.attachmentOrElse(ExportForwarders, Nil)
26612661
// no attachment can happen in case of cyclic references
26622662
traverse(rest)

0 commit comments

Comments
 (0)