Skip to content

Commit 852b423

Browse files
committed
WIP
1 parent 303934f commit 852b423

File tree

10 files changed

+56
-34
lines changed

10 files changed

+56
-34
lines changed

compiler/src/dotty/tools/dotc/tastyreflect/TreeOpsImpl.scala

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
2121
}
2222

2323
object PackageClause extends PackageClauseModule {
24-
def apply(pid: Ref, stats: List[Tree])(implicit ctx: Context): PackageClause =
24+
def apply(pid: Term.Ref, stats: List[Tree])(implicit ctx: Context): PackageClause =
2525
tpd.PackageDef(pid.asInstanceOf[tpd.RefTree], stats)
2626

27-
def unapply(tree: Tree)(implicit ctx: Context): Option[(Ref, List[Tree])] = tree match {
27+
def unapply(tree: Tree)(implicit ctx: Context): Option[(Term.Ref, List[Tree])] = tree match {
2828
case x: tpd.PackageDef => Some((x.pid, x.stats))
2929
case _ => None
3030
}
@@ -34,8 +34,6 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
3434

3535
}
3636

37-
// ----- Statements -----------------------------------------------
38-
3937
object Import extends ImportModule {
4038
def apply(expr: Term, selectors: List[ImportSelector])(implicit ctx: Context): Import =
4139
tpd.Import(expr, selectors)
@@ -51,6 +49,15 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
5149
def selector(implicit ctx: Context): List[ImportSelector] = imp.selectors
5250
}
5351

52+
object IsStatement extends IsStatementModule {
53+
/** Matches any Statement and returns it */
54+
def unapply(tree: Tree)(implicit ctx: Context): Option[Statement] = tree match {
55+
case IsDefinition(tree) => Some(tree)
56+
case tree if tree.isTerm => Some(tree)
57+
case _ => None
58+
}
59+
}
60+
5461
// ----- Definitions ----------------------------------------------
5562

5663
object IsDefinition extends IsDefinitionModule {
@@ -537,7 +544,8 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
537544
def apply(stats: List[Statement], expr: Term)(implicit ctx: Context): Block =
538545
tpd.Block(stats, expr)
539546

540-
def copy(original: Tree)(stats: List[Statement], expr: Term)(implicit ctx: Context): Block = ???
547+
def copy(original: Tree)(stats: List[Statement], expr: Term)(implicit ctx: Context): Block =
548+
tpd.cpy.Block(original)(stats, expr)
541549

542550
def unapply(x: Term)(implicit ctx: Context): Option[(List[Statement], Term)] = x match {
543551
case IsBlock(x) => Some((x.stats, x.expr))
@@ -562,7 +570,8 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
562570
def apply(call: Option[TermOrTypeTree], bindings: List[Definition], expansion: Term)(implicit ctx: Context): Inlined =
563571
tpd.Inlined(call.getOrElse(tpd.EmptyTree), bindings.map { case b: tpd.MemberDef => b }, expansion)
564572

565-
def copy(original: Tree)(call: Option[TermOrTypeTree], bindings: List[Definition], expansion: Term)(implicit ctx: Context): Inlined = ???
573+
def copy(original: Tree)(call: Option[TermOrTypeTree], bindings: List[Definition], expansion: Term)(implicit ctx: Context): Inlined =
574+
tpd.cpy.Inlined(original)(call.getOrElse(tpd.EmptyTree), bindings.asInstanceOf[List[tpd.MemberDef]], expansion)
566575

567576
def unapply(x: Term)(implicit ctx: Context): Option[(Option[TermOrTypeTree], List[Statement], Term)] = x match {
568577
case x: tpd.Inlined =>
@@ -737,10 +746,9 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with CoreImpl with Helpers
737746

738747
object SelectOuter extends SelectOuterModule {
739748

740-
def apply(call: Option[TermOrTypeTree], bindings: List[Definition], expansion: Term)(implicit ctx: Context): Inlined =
741-
tpd.Inlined(call.getOrElse(tpd.EmptyTree), bindings.map { case b: tpd.MemberDef => b }, expansion)
749+
def apply(qualifier: Term, levels: Int, tpe: Type)(implicit ctx: Context): SelectOuter = ???
742750

743-
def copy(original: Tree)(call: Option[TermOrTypeTree], bindings: List[Definition], expansion: Term)(implicit ctx: Context): Inlined = ???
751+
def copy(original: Tree)(qualifier: Term, levels: Int, tpe: Type)(implicit ctx: Context): SelectOuter = ???
744752

745753
def unapply(x: Term)(implicit ctx: Context): Option[(Term, Int, Type)] = x match {
746754
case x: tpd.Select =>

library/src/scala/tasty/reflect/TreeOps.scala

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,15 @@ trait TreeOps extends Core {
1818

1919
val PackageClause: PackageClauseModule
2020
abstract class PackageClauseModule {
21-
def apply(pid: Ref, stats: List[Tree])(implicit ctx: Context): PackageClause
22-
def unapply(tree: Tree)(implicit ctx: Context): Option[(Ref, List[Tree])]
21+
def apply(pid: Term.Ref, stats: List[Tree])(implicit ctx: Context): PackageClause
22+
def unapply(tree: Tree)(implicit ctx: Context): Option[(Term.Ref, List[Tree])]
2323
}
2424

2525
trait PackageClauseAPI {
2626

2727
}
2828
implicit def PackageClauseDeco(pack: PackageClause): PackageClauseAPI
2929

30-
// ----- Statements -----------------------------------------------
31-
3230
val Import: ImportModule
3331
abstract class ImportModule {
3432
def apply(expr: Term, selectors: List[ImportSelector])(implicit ctx: Context): Import
@@ -41,6 +39,13 @@ trait TreeOps extends Core {
4139
}
4240
implicit def ImportDeco(imp: Import): ImportAPI
4341

42+
43+
val IsStatement: IsStatementModule
44+
abstract class IsStatementModule {
45+
/** Matches any Statement and returns it */
46+
def unapply(tree: Tree)(implicit ctx: Context): Option[Statement]
47+
}
48+
4449
// ----- Definitions ----------------------------------------------
4550

4651
val IsDefinition: IsDefinitionModule

library/src/scala/tasty/reflect/TreeUtils.scala

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,20 @@ trait TreeUtils
158158
def transformTree(tree: Tree)(implicit ctx: Context): Tree = {
159159
def localCtx(definition: Definition): Context = definition.symbol.localContext
160160
tree match {
161-
case IsTerm(tree) => transformTerm(tree)
161+
case IsStatement(tree) => transformStatement(tree)
162162
}
163163
}
164164

165+
def transformStatement(tree: Statement)(implicit ctx: Context): Statement = tree match {
166+
case IsTerm(tree) => transformTerm(tree)
167+
168+
}
169+
165170
def transformTerm(tree: Term)(implicit ctx: Context): Term = {
166171
tree match {
167172
case Term.Ident(name) =>
168173
tree
169-
case Term.Select(qualifier, name, sig) =>
174+
case Term.Select(qualifier, name) =>
170175
Term.Select.copy(tree)(transformTerm(qualifier), name)
171176
case Term.This(qual) =>
172177
tree
@@ -186,8 +191,8 @@ trait TreeUtils
186191
// NamedArg.copy(tree)(name, transform(arg))
187192
// case Assign(lhs, rhs) =>
188193
// Assign.copy(tree)(transform(lhs), transform(rhs))
189-
// case Block(stats, expr) =>
190-
// Block.copy(tree)(transformStats(stats), transform(expr))
194+
case Term.Block(stats, expr) =>
195+
Term.Block.copy(tree)(transformStats(stats), transformTerm(expr))
191196
// case If(cond, thenp, elsep) =>
192197
// If.copy(tree)(transform(cond), transform(thenp), transform(elsep))
193198
// case Closure(env, meth, tpt) =>
@@ -269,6 +274,9 @@ trait TreeUtils
269274
???
270275
}
271276

277+
def transformStats(trees: List[Statement])(implicit ctx: Context): List[Statement] =
278+
trees mapConserve (transformStatement(_))
279+
272280
def transformTrees(trees: List[Tree])(implicit ctx: Context): List[Tree] =
273281
trees mapConserve (transformTree(_))
274282

tests/run-separate-compilation/tasty-tree-map.check

Whitespace-only changes.

tests/run-separate-compilation/tasty-tree-map/quoted_1.scala

Lines changed: 0 additions & 17 deletions
This file was deleted.

tests/run/tasty-tree-map.check

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
32
2+
33
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import scala.quoted._
2+
import scala.tasty._
3+
4+
object Macros {
5+
6+
implicit inline def identityMaped[T](x: => T): T = ~impl('(x))
7+
8+
def impl[T: Type](x: Expr[T])(implicit reflection: Reflection): Expr[T] = {
9+
import reflection._
10+
val identityMap = new TreeMap { }
11+
val transformed = identityMap.transformTerm(x.unseal).seal[T]
12+
transformed
13+
}
14+
15+
}

tests/run-separate-compilation/tasty-tree-map/quoted_2.scala renamed to tests/run/tasty-tree-map/quoted_2.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ object Test {
66
def main(args: Array[String]): Unit = {
77
println(identityMaped(32))
88
println(identityMaped(32 + 1))
9+
// TODO add more tests
910
}
1011
}

0 commit comments

Comments
 (0)