Skip to content

Commit 3bdedb4

Browse files
committed
Add top-level definitions to scope in TreeMapWithImplicits
Fixes #11479
1 parent a4f3436 commit 3bdedb4

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import Trees._
55
import core.Contexts._
66
import core.ContextOps.enter
77
import core.Flags._
8+
import core.NameOps._
89
import core.Symbols._
910
import core.TypeError
1011

@@ -69,6 +70,18 @@ class TreeMapWithImplicits extends tpd.TreeMap {
6970
nestedCtx
7071
}
7172

73+
private def nestedPackageScopeCtx(sym: Symbol)(using Context): Context = {
74+
val nestedCtx = ctx.fresh.setNewScope
75+
for
76+
packageDecl <- sym.moduleClass.asClass.info.decls.toList
77+
if packageDecl.isTerm && packageDecl.name.isPackageObjectName
78+
decl <- packageDecl.info.decls.toList
79+
if decl.isOneOf(GivenOrImplicit)
80+
do
81+
nestedCtx.enter(decl)
82+
nestedCtx
83+
}
84+
7285
private def patternScopeCtx(pattern: Tree)(using Context): Context = {
7386
val nestedCtx = ctx.fresh.setNewScope
7487
new TreeTraverser {
@@ -100,8 +113,10 @@ class TreeMapWithImplicits extends tpd.TreeMap {
100113
}
101114
case EmptyValDef =>
102115
tree
103-
case _: PackageDef | _: MemberDef =>
104-
super.transform(tree)(using localCtx)
116+
case _: PackageDef =>
117+
super.transform(tree)(using nestedPackageScopeCtx(tree.symbol)(using localCtx))
118+
case _: MemberDef =>
119+
super.transform(tree)(using localCtx)
105120
case impl @ Template(constr, parents, self, _) =>
106121
cpy.Template(tree)(
107122
transformSub(constr),

tests/pos-macros/i11479/Macro_1.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
trait Foo
2+
given Foo: Foo with {}
3+
inline def summonFoo(): Foo = scala.compiletime.summonInline[Foo]

tests/pos-macros/i11479/Test_2.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
def test: Unit = summonFoo()

0 commit comments

Comments
 (0)