Skip to content

Commit ee6733a

Browse files
authored
Merge pull request #14809 from dotty-staging/fix-14789
Handle SummonFrom in reflect TreeAccumulator
2 parents e835668 + 1d58335 commit ee6733a

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

library/src/scala/quoted/Quotes.scala

+21-2
Original file line numberDiff line numberDiff line change
@@ -4621,6 +4621,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
46214621
case Bind(_, body) => foldTree(x, body)(owner)
46224622
case Unapply(fun, implicits, patterns) => foldTrees(foldTrees(foldTree(x, fun)(owner), implicits)(owner), patterns)(owner)
46234623
case Alternatives(patterns) => foldTrees(x, patterns)(owner)
4624+
case SummonFrom(cases) => foldTrees(x, cases)(owner)
4625+
case _ => throw MatchError(tree.show(using Printer.TreeStructure))
46244626
}
46254627
}
46264628
end TreeAccumulator
@@ -4662,7 +4664,7 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
46624664
def transformTree(tree: Tree)(owner: Symbol): Tree = {
46634665
tree match {
46644666
case tree: PackageClause =>
4665-
PackageClause.copy(tree)(transformTerm(tree.pid).asInstanceOf[Ref], transformTrees(tree.stats)(tree.symbol))
4667+
PackageClause.copy(tree)(transformTerm(tree.pid)(owner).asInstanceOf[Ref], transformTrees(tree.stats)(tree.symbol))
46664668
case tree: Import =>
46674669
Import.copy(tree)(transformTerm(tree.expr)(owner), tree.selectors)
46684670
case tree: Export =>
@@ -4685,6 +4687,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
46854687
Alternatives.copy(pattern)(transformTrees(pattern.patterns)(owner))
46864688
case TypedOrTest(inner, tpt) =>
46874689
TypedOrTest.copy(tree)(transformTree(inner)(owner), transformTypeTree(tpt)(owner))
4690+
case _ =>
4691+
throw MatchError(tree.show(using Printer.TreeStructure))
46884692
}
46894693
}
46904694

@@ -4708,11 +4712,20 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
47084712
val owner = tree.symbol
47094713
TypeDef.copy(tree)(tree.name, transformTree(tree.rhs)(owner))
47104714
case tree: ClassDef =>
4711-
ClassDef.copy(tree)(tree.name, tree.constructor, tree.parents, tree.self, tree.body)
4715+
val constructor @ DefDef(_, _, _, _) = transformStatement(tree.constructor)(tree.symbol)
4716+
val parents = tree.parents.map(transformTree(_)(tree.symbol))
4717+
val self = tree.self.map { slf =>
4718+
transformStatement(slf)(tree.symbol) match
4719+
case self: ValDef => self
4720+
}
4721+
val body = tree.body.map(transformStatement(_)(tree.symbol))
4722+
ClassDef.copy(tree)(tree.name, constructor, parents, self, body)
47124723
case tree: Import =>
47134724
Import.copy(tree)(transformTerm(tree.expr)(owner), tree.selectors)
47144725
case tree: Export =>
47154726
tree
4727+
case _ =>
4728+
throw MatchError(tree.show(using Printer.TreeStructure))
47164729
}
47174730
}
47184731

@@ -4758,6 +4771,10 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
47584771
Repeated.copy(tree)(transformTerms(elems)(owner), transformTypeTree(elemtpt)(owner))
47594772
case Inlined(call, bindings, expansion) =>
47604773
Inlined.copy(tree)(call, transformSubTrees(bindings)(owner), transformTerm(expansion)(owner))
4774+
case SummonFrom(cases) =>
4775+
SummonFrom.copy(tree)(transformCaseDefs(cases)(owner))
4776+
case _ =>
4777+
throw MatchError(tree.show(using Printer.TreeStructure))
47614778
}
47624779
}
47634780

@@ -4786,6 +4803,8 @@ trait Quotes { self: runtime.QuoteUnpickler & runtime.QuoteMatching =>
47864803
TypeBind.copy(tree)(tree.name, tree.body)
47874804
case tree: TypeBlock =>
47884805
TypeBlock.copy(tree)(tree.aliases, tree.tpt)
4806+
case _ =>
4807+
throw MatchError(tree.show(using Printer.TreeStructure))
47894808
}
47904809

47914810
def transformCaseDef(tree: CaseDef)(owner: Symbol): CaseDef = {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import scala.quoted.*
2+
import scala.tasty.inspector.*
3+
4+
@main def Test = {
5+
// Artefact of the current test infrastructure
6+
// TODO improve infrastructure to avoid needing this code on each test
7+
val classpath = dotty.tools.dotc.util.ClasspathFromClassloader(this.getClass.getClassLoader).split(java.io.File.pathSeparator).find(_.contains("runWithCompiler")).get
8+
val allTastyFiles = dotty.tools.io.Path(classpath).walkFilter(_.extension == "tasty").map(_.toString).toList
9+
val tastyFiles = allTastyFiles.filter(_.contains("App"))
10+
11+
// in dotty-example-project
12+
val inspector = new Inspector {
13+
def inspect(using Quotes)(tastys: List[Tasty[quotes.type]]): Unit = {
14+
import quotes.reflect.*
15+
val traverser = new TreeTraverser {
16+
override def traverseTree(tree: Tree)(owner: Symbol): Unit = {
17+
try {
18+
super.traverseTree(tree)(owner)
19+
} catch {
20+
case e =>
21+
report.error(s"unexpected error ${e}", tree.pos)
22+
throw e
23+
}
24+
}
25+
}
26+
val mapper = new TreeMap { }
27+
tastys.foreach{ tasty =>
28+
traverser.traverseTree(tasty.ast)(tasty.ast.symbol)
29+
mapper.transformTree(tasty.ast)(tasty.ast.symbol)
30+
}
31+
}
32+
}
33+
TastyInspector.inspectTastyFiles(tastyFiles)(inspector)
34+
}
35+
36+
object App {
37+
import scala.compiletime.*
38+
39+
transparent inline def summonFirst0[T]: Any =
40+
inline erasedValue[T] match
41+
case _: (a *: b) => summonFrom {
42+
case instance: `a` => instance
43+
case _ => summonFirst0[b]
44+
}
45+
}

0 commit comments

Comments
 (0)