Skip to content

Commit 90deb4f

Browse files
committed
Collect package imports in TreeMapWithImplicits
Fixes #11538
1 parent e1de43d commit 90deb4f

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@ class TreeMapWithImplicits extends tpd.TreeMap {
6969
nestedCtx
7070
}
7171

72+
private def nestedPackageScopeCtx(tree: PackageDef)(using Context): Context =
73+
tree.stats.foldLeft(ctx.withOwner(tree.symbol)) {
74+
case (acc, stat: Import) => ctx.importContext(stat, stat.symbol)
75+
case (acc, _) => acc
76+
}
77+
7278
private def patternScopeCtx(pattern: Tree)(using Context): Context = {
7379
val nestedCtx = ctx.fresh.setNewScope
7480
new TreeTraverser {
@@ -100,8 +106,10 @@ class TreeMapWithImplicits extends tpd.TreeMap {
100106
}
101107
case EmptyValDef =>
102108
tree
103-
case _: PackageDef | _: MemberDef =>
104-
super.transform(tree)(using localCtx)
109+
case tree: PackageDef =>
110+
super.transform(tree)(using nestedPackageScopeCtx(tree))
111+
case _: MemberDef =>
112+
super.transform(tree)(using localCtx)
105113
case impl @ Template(constr, parents, self, _) =>
106114
cpy.Template(tree)(
107115
transformSub(constr),

tests/pos/i11538a.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package a:
2+
3+
trait Printer[A]:
4+
def print(a: A): Unit
5+
6+
given Printer[String] with
7+
def print(s: String) = println(s)
8+
9+
package b:
10+
11+
import a.{given, *}
12+
13+
object test:
14+
import scala.compiletime.{error, summonFrom}
15+
16+
inline def summonStringPrinter =
17+
summonFrom {
18+
case given Printer[String] => ()
19+
case _ => error("Couldn't find a printer")
20+
}
21+
22+
val summoned = summon[Printer[String]]
23+
val summonedFrom = summonStringPrinter

tests/pos/i11538b.scala

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package a:
2+
type Foo
3+
given foo: Foo = ???
4+
5+
import a.{Foo, given}
6+
object test:
7+
inline def summonInlineFoo = scala.compiletime.summonInline[Foo]
8+
val summoned = summon[Foo]
9+
val summonedInline = summonInlineFoo

0 commit comments

Comments
 (0)