Skip to content

Commit 02660c7

Browse files
committed
Support exports in tasty reflect
1 parent e39a177 commit 02660c7

File tree

7 files changed

+64
-3
lines changed

7 files changed

+64
-3
lines changed

compiler/src/dotty/tools/dotc/decompiler/DecompilationPrinter.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class DecompilationPrinter extends Phase {
4343
if (ctx.settings.printTasty.value)
4444
println(TastyPrinter.show(unit.pickled.head._2()))
4545
else {
46+
import dotty.tools.dotc.core.Decorators.i
4647
val unitFile = unit.source.toString.replace("\\", "/").replace(".class", ".tasty")
4748
out.println(s"/** Decompiled from $unitFile */")
4849
out.println(QuoteContextImpl.showDecompiledTree(unit.tpdTree))

compiler/src/dotty/tools/dotc/transform/FirstTransform.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
152152
}
153153

154154
override def transformOther(tree: Tree)(using Context): Tree = tree match {
155-
case tree: GenericApply[Type] => EmptyTree
155+
case tree: (GenericImport[_]) => EmptyTree
156156
case tree: NamedArg => transformAllDeep(tree.arg)
157157
case tree => if (tree.isType) toTypeTree(tree) else tree
158158
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,7 +508,7 @@ trait TypeAssigner {
508508
tree.withType(sym.termRef)
509509

510510
def assignType(tree: untpd.Export)(using Context): Export =
511-
tree.withType(defn.AnyType)
511+
tree.withType(ImportType(tree.expr.asInstanceOf[tpd.Tree]))
512512

513513
def assignType(tree: untpd.Annotated, arg: Tree, annot: Tree)(using Context): Annotated = {
514514
assert(tree.isType) // annotating a term is done via a Typed node, can't use Annotate directly

compiler/src/scala/quoted/internal/impl/QuoteContextImpl.scala

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,30 @@ class QuoteContextImpl private (ctx: Context) extends QuoteContext, QuoteUnpickl
168168
end extension
169169
end ImportMethodsImpl
170170

171+
type Export = tpd.Export
172+
173+
object ExportTypeTest extends TypeTest[Tree, Export]:
174+
def unapply(x: Tree): Option[Export & x.type] = x match
175+
case tree: (tpd.Export & x.type) => Some(tree)
176+
case _ => None
177+
end ExportTypeTest
178+
179+
object Export extends ExportModule:
180+
def apply(expr: Term, selectors: List[ImportSelector]): Export =
181+
withDefaultPos(tpd.Export(expr, selectors))
182+
def copy(original: Tree)(expr: Term, selectors: List[ImportSelector]): Export =
183+
tpd.cpy.Export(original)(expr, selectors)
184+
def unapply(tree: Export): Option[(Term, List[ImportSelector])] =
185+
Some((tree.expr, tree.selectors))
186+
end Export
187+
188+
object ExportMethodsImpl extends ExportMethods:
189+
extension (self: Export):
190+
def expr: Term = self.expr
191+
def selectors: List[ImportSelector] = self.selectors
192+
end extension
193+
end ExportMethodsImpl
194+
171195
type Statement = tpd.Tree
172196

173197
object StatementTypeTest extends TypeTest[Tree, Statement]:

compiler/src/scala/quoted/internal/impl/printers/Extractors.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ object Extractors {
123123
this += ", " += self += ", " ++= body += ")"
124124
case Import(expr, selectors) =>
125125
this += "Import(" += expr += ", " ++= selectors += ")"
126+
case Export(expr, selectors) =>
127+
this += "Export(" += expr += ", " ++= selectors += ")"
126128
case PackageClause(pid, stats) =>
127129
this += "PackageClause(" += pid += ", " ++= stats += ")"
128130
case Inferred() =>

compiler/src/scala/quoted/internal/impl/printers/SourceCode.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@ object SourceCode {
126126
this += "."
127127
printImportSelectors(selectors)
128128

129+
case Export(expr, selectors) =>
130+
this += "export "
131+
printTree(expr)
132+
this += "."
133+
printImportSelectors(selectors)
134+
129135
case cdef @ ClassDef(name, DefDef(_, targs, argss, _, _), parents, derived, self, stats) =>
130136
printDefAnnotations(cdef)
131137

@@ -214,7 +220,7 @@ object SourceCode {
214220
}
215221
val stats1 = stats.collect {
216222
case stat: Definition if keepDefinition(stat) => stat
217-
case stat @ Import(_, _) => stat
223+
case stat @ (Import(_, _) | Export(_, _)) => stat
218224
case stat: Term => stat
219225
}
220226

library/src/scala/quoted/QuoteContext.scala

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ trait QuoteContext { self: internal.QuoteUnpickler & internal.QuoteMatching =>
8282
*
8383
* +- Tree -+- PackageClause
8484
* +- Import
85+
* +- Export
86+
* |
8587
* +- Statement -+- Definition --+- ClassDef
8688
* | | +- TypeDef
8789
* | | +- DefDef
@@ -288,6 +290,32 @@ trait QuoteContext { self: internal.QuoteUnpickler & internal.QuoteMatching =>
288290
end extension
289291
end ImportMethods
290292

293+
/** Tree representing an export clause in the source code.
294+
* Export forwarders generated from this clause appear in the same scope.
295+
*/
296+
type Export <: Statement
297+
298+
given TypeTest[Tree, Export] = ExportTypeTest
299+
protected val ExportTypeTest: TypeTest[Tree, Export]
300+
301+
val Export: ExportModule
302+
303+
trait ExportModule { this: Export.type =>
304+
def apply(expr: Term, selectors: List[ImportSelector]): Export
305+
def copy(original: Tree)(expr: Term, selectors: List[ImportSelector]): Export
306+
def unapply(tree: Export): Option[(Term, List[ImportSelector])]
307+
}
308+
309+
given ExportMethods as ExportMethods = ExportMethodsImpl
310+
protected val ExportMethodsImpl: ExportMethods
311+
312+
trait ExportMethods:
313+
extension (self: Export):
314+
def expr: Term
315+
def selectors: List[ImportSelector]
316+
end extension
317+
end ExportMethods
318+
291319
/** Tree representing a statement in the source code */
292320
type Statement <: Tree
293321

0 commit comments

Comments
 (0)