Skip to content

Commit 6f7285b

Browse files
committed
record wildcard export dependencies in ClassSymbol
1 parent b66ea6d commit 6f7285b

File tree

4 files changed

+34
-5
lines changed

4 files changed

+34
-5
lines changed

compiler/src/dotty/tools/dotc/core/Symbols.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,14 @@ object Symbols {
370370

371371
private var myTree: TreeOrProvider = tpd.EmptyTree
372372

373+
private val myExportDependencies: util.HashSet[ClassSymbol] = util.HashSet()
374+
375+
def addExportDependency(dependency: ClassSymbol)(using Context): Unit =
376+
if !ctx.isAfterTyper then
377+
myExportDependencies += dependency
378+
379+
def exportDependencies: Iterator[ClassSymbol] = myExportDependencies.iterator
380+
373381
/** If this is a top-level class and `-Yretain-trees` (or `-from-tasty`) is set.
374382
* Returns the TypeDef tree (possibly wrapped inside PackageDefs) for this class, otherwise EmptyTree.
375383
* This will force the info of the class.

compiler/src/dotty/tools/dotc/sbt/ExtractDependencies.scala

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,13 +328,15 @@ private class ExtractDependenciesCollector extends tpd.TreeTraverser { thisTreeT
328328

329329
private def addInheritanceDependencies(tree: Template)(using Context): Unit =
330330
if (tree.parents.nonEmpty) {
331+
val cls = tree.symbol.owner.asClass
331332
val depContext =
332-
if (tree.symbol.owner.isLocal) LocalDependencyByInheritance
333+
if cls.isLocal then LocalDependencyByInheritance
333334
else DependencyByInheritance
334335
val from = resolveDependencySource
335-
tree.parents.foreach { parent =>
336+
for parent <- tree.parents do
336337
_dependencies += ClassDependency(from, parent.tpe.classSymbol, depContext)
337-
}
338+
for dep <- cls.exportDependencies if dep != cls do
339+
_dependencies += ClassDependency(from, dep, depContext)
338340
}
339341

340342
private def ignoreDependency(sym: Symbol)(using Context) =

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ 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
5758
val SymOfTree : Property.Key[Symbol] = new Property.Key
5859
val Deriver : Property.Key[typer.Deriver] = new Property.Key
5960

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

1040-
def addForwarders(sels: List[untpd.ImportSelector], seen: List[TermName]): Unit = sels match
1041+
def addForwarders(sels: List[untpd.ImportSelector], seen: List[TermName]): Boolean = sels match
10411042
case sel :: sels1 =>
10421043
if sel.isWildcard then
10431044
addWildcardForwarders(seen, sel.span)
1045+
true
10441046
else
10451047
if sel.rename != nme.WILDCARD then
10461048
addForwardersNamed(sel.name, sel.rename, sel.span)
10471049
addForwarders(sels1, sel.name :: seen)
10481050
case _ =>
1051+
false
10491052

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

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2236,6 +2236,12 @@ class Typer extends Namer
22362236
assignType(cpy.Import(imp)(expr1, selectors1), sym)
22372237
}
22382238

2239+
def typedExportExpr(tree: untpd.Export)(using Context): Tree = {
2240+
val expr1 = typedExpr(tree.expr, AnySelectionProto)
2241+
checkLegalImportPath(expr1)
2242+
expr1
2243+
}
2244+
22392245
def typedPackageDef(tree: untpd.PackageDef)(using Context): Tree =
22402246
val pid1 = withMode(Mode.InPackageClauseName)(typedExpr(tree.pid, AnySelectionProto))
22412247
val pkg = pid1.symbol
@@ -2631,6 +2637,14 @@ class Typer extends Namer
26312637
case Thicket(stats) :: rest =>
26322638
traverse(stats ::: rest)
26332639
case (stat: untpd.Export) :: rest =>
2640+
if stat.hasAttachment(WildcardExport) then
2641+
val expr = typedExportExpr(stat)
2642+
expr.tpe.classSymbol match
2643+
case cls if cls.isClass =>
2644+
ctx.owner.asClass.addExportDependency(cls.asClass)
2645+
case _ =>
2646+
end if
2647+
26342648
buf ++= stat.attachmentOrElse(ExportForwarders, Nil)
26352649
// no attachment can happen in case of cyclic references
26362650
traverse(rest)

0 commit comments

Comments
 (0)