Skip to content

Commit 3d06998

Browse files
committed
wip
1 parent 370cfb0 commit 3d06998

File tree

9 files changed

+102
-39
lines changed

9 files changed

+102
-39
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ object FromSymbol {
1414
else if (sym.isClass) classDef(sym.asClass)
1515
else if (sym.isType) typeDefFromSym(sym.asType)
1616
else if (sym.is(Method)) defDefFromSym(sym.asTerm)
17+
else if (sym.is(Case)) bindFromSym(sym.asTerm)
1718
else valDefFromSym(sym.asTerm)
1819
}
1920

@@ -34,6 +35,11 @@ object FromSymbol {
3435

3536
def defDefFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.DefDef = tpd.DefDef(sym)
3637

37-
def valDefFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.ValDef = tpd.ValDef(sym)
38+
def valDefFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.ValDef = {
39+
assert(!sym.is(Method) && !sym.is(Case))
40+
tpd.ValDef(sym)
41+
}
42+
43+
def bindFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.Bind = tpd.Bind(sym, ???)
3844

3945
}

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

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,11 @@ trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with TastyCoreImpl {
5252
case _ => throw new Exception("not a ValSymbol")
5353
}
5454

55+
def asBind(implicit ctx: Context): BindSymbol = symbol match {
56+
case IsBindSymbol(symbol) => symbol
57+
case _ => throw new Exception("not a BindSymbol")
58+
}
59+
5560
def asType(implicit ctx: Context): TypeSymbol = symbol match {
5661
case IsTypeSymbol(symbol) => symbol.asType
5762
case _ => throw new Exception("not a TypeSymbol")
@@ -70,6 +75,24 @@ trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with TastyCoreImpl {
7075

7176
}
7277

78+
object IsPackageSymbol extends IsPackageSymbolExtractor {
79+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol] =
80+
if (symbol.is(Flags.Package)) Some(symbol) else None
81+
}
82+
83+
def PackageSymbolDeco(symbol: PackageSymbol): PackageSymbolAPI = new PackageSymbolAPI {
84+
def tree(implicit ctx: Context): PackageDef = FromSymbol.packageDefFromSym(symbol)
85+
}
86+
87+
object IsTypeSymbol extends IsTypeSymbolExtractor {
88+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol] =
89+
if (symbol.isType) Some(symbol.asType) else None
90+
}
91+
92+
def TypeSymbolDeco(symbol: TypeSymbol): TypeSymbolAPI = new TypeSymbolAPI {
93+
def tree(implicit ctx: Context): TypeDef = FromSymbol.typeDefFromSym(symbol)
94+
}
95+
7396
object IsClassSymbol extends IsClassSymbolExtractor {
7497
def unapply(symbol: Symbol)(implicit ctx: Context): Option[ClassSymbol] =
7598
if (symbol.isClass) Some(symbol.asClass) else None
@@ -90,29 +113,20 @@ trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with TastyCoreImpl {
90113

91114
object IsValSymbol extends IsValSymbolExtractor {
92115
def unapply(symbol: Symbol)(implicit ctx: Context): Option[ValSymbol] =
93-
if (symbol.isTerm && !symbol.is(Flags.Method)) Some(symbol.asTerm) else None
116+
if (symbol.isTerm && !symbol.is(Flags.Method) && !symbol.is(Flags.Case)) Some(symbol.asTerm) else None
94117
}
95118

96119
def ValSymbolDeco(symbol: ValSymbol): ValSymbolAPI = new ValSymbolAPI {
97120
def tree(implicit ctx: Context): ValDef = FromSymbol.valDefFromSym(symbol)
98121
}
99122

100-
object IsTypeSymbol extends IsTypeSymbolExtractor {
101-
def unapply(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol] =
102-
if (symbol.isType) Some(symbol.asType) else None
123+
object IsBindSymbol extends IsBindSymbolExtractor {
124+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol] =
125+
if (symbol.isTerm && symbol.is(Flags.Case)) Some(symbol.asTerm) else None // TODO
103126
}
104127

105-
def TypeSymbolDeco(symbol: TypeSymbol): TypeSymbolAPI = new TypeSymbolAPI {
106-
def tree(implicit ctx: Context): TypeDef = FromSymbol.typeDefFromSym(symbol)
107-
}
108-
109-
object IsPackageSymbol extends IsPackageSymbolExtractor {
110-
def unapply(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol] =
111-
if (symbol.is(Flags.Package)) Some(symbol) else None
112-
}
113-
114-
def PackageSymbolDeco(symbol: PackageSymbol): PackageSymbolAPI = new PackageSymbolAPI {
115-
def tree(implicit ctx: Context): PackageDef = FromSymbol.packageDefFromSym(symbol)
128+
def BindSymbolDeco(symbol: BindSymbol): BindSymbolAPI = new BindSymbolAPI {
129+
def tree(implicit ctx: Context): Bind = FromSymbol.bindFromSym(symbol)
116130
}
117131

118132
object NoSymbol extends NoSymbolExtractor {

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ trait TastyCoreImpl extends scala.tasty.reflect.TastyCore {
2626
type CaseDef = tpd.CaseDef
2727

2828
type Pattern = tpd.Tree
29+
type Value = tpd.Tree
30+
type Bind = tpd.Bind
31+
type Unapply = tpd.Tree
32+
type Alternative = tpd.Alternative
33+
type TypeTest = tpd.Typed
2934

3035
type TypeOrBoundsTree = tpd.Tree
3136
type TypeTree = tpd.Tree
@@ -56,5 +61,7 @@ trait TastyCoreImpl extends scala.tasty.reflect.TastyCore {
5661
type ClassSymbol = core.Symbols.ClassSymbol
5762
type TypeSymbol = core.Symbols.TypeSymbol
5863
type DefSymbol = core.Symbols.TermSymbol
64+
type BindSymbol = core.Symbols.TermSymbol
5965
type ValSymbol = core.Symbols.TermSymbol
66+
type NoSymbol = core.Symbols.NoSymbol.type
6067
}

library/src/scala/tasty/reflect/SymbolOps.scala

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,25 @@ trait SymbolOps extends TastyCore {
2525
def asDef(implicit ctx: Context): DefSymbol
2626
def asVal(implicit ctx: Context): ValSymbol
2727
def asType(implicit ctx: Context): TypeSymbol
28-
29-
def treeOpt(implicit ctx: Context): Option[Definition]
28+
def asBind(implicit ctx: Context): BindSymbol
3029

3130
def annots(implicit ctx: Context): List[Term]
3231

3332
}
3433
implicit def SymbolDeco(symbol: Symbol): SymbolAPI
3534

35+
// PackageSymbol
36+
37+
val IsPackageSymbol: IsPackageSymbolExtractor
38+
abstract class IsPackageSymbolExtractor {
39+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol]
40+
}
41+
42+
trait PackageSymbolAPI {
43+
def tree(implicit ctx: Context): PackageDef
44+
}
45+
implicit def PackageSymbolDeco(symbol: PackageSymbol): PackageSymbolAPI
46+
3647
// ClassSymbol
3748

3849
val IsClassSymbol: IsClassSymbolExtractor
@@ -45,6 +56,18 @@ trait SymbolOps extends TastyCore {
4556
}
4657
implicit def ClassSymbolDeco(symbol: ClassSymbol): ClassSymbolAPI
4758

59+
// TypeSymbol
60+
61+
val IsTypeSymbol: IsTypeSymbolExtractor
62+
abstract class IsTypeSymbolExtractor {
63+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol]
64+
}
65+
66+
trait TypeSymbolAPI {
67+
def tree(implicit ctx: Context): TypeDef
68+
}
69+
implicit def TypeSymbolDeco(symbol: TypeSymbol): TypeSymbolAPI
70+
4871
// DefSymbol
4972

5073
val IsDefSymbol: IsDefSymbolExtractor
@@ -69,29 +92,17 @@ trait SymbolOps extends TastyCore {
6992
}
7093
implicit def ValSymbolDeco(symbol: ValSymbol): ValSymbolAPI
7194

72-
// TypeSymbol
73-
74-
val IsTypeSymbol: IsTypeSymbolExtractor
75-
abstract class IsTypeSymbolExtractor {
76-
def unapply(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol]
77-
}
78-
79-
trait TypeSymbolAPI {
80-
def tree(implicit ctx: Context): TypeDef
81-
}
82-
implicit def TypeSymbolDeco(symbol: TypeSymbol): TypeSymbolAPI
83-
84-
// PackageSymbol
95+
// BindSymbol
8596

86-
val IsPackageSymbol: IsPackageSymbolExtractor
87-
abstract class IsPackageSymbolExtractor {
88-
def unapply(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol]
97+
val IsBindSymbol: IsBindSymbolExtractor
98+
abstract class IsBindSymbolExtractor {
99+
def unapply(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol]
89100
}
90101

91-
trait PackageSymbolAPI {
92-
def tree(implicit ctx: Context): PackageDef
102+
trait BindSymbolAPI {
103+
def tree(implicit ctx: Context): Bind
93104
}
94-
implicit def PackageSymbolDeco(symbol: PackageSymbol): PackageSymbolAPI
105+
implicit def BindSymbolDeco(symbol: BindSymbol): BindSymbolAPI
95106

96107
// NoSymbol
97108

library/src/scala/tasty/reflect/TastyCore.scala

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ package scala.tasty.reflect
101101
* +- TypeSymbol
102102
* +- DefSymbol
103103
* +- ValSymbol
104+
* +- BindSymbol
104105
* +- NoSymbol
105106
*
106107
* Aliases:
@@ -135,6 +136,11 @@ trait TastyCore {
135136

136137
/** Pattern tree of the pattern part of a CaseDef */
137138
type Pattern
139+
type Value <: Pattern
140+
type Bind <: Pattern
141+
type Unapply <: Pattern
142+
type Alternative <: Pattern
143+
type TypeTest <: Pattern
138144

139145
/** Tree representing a type written in the source */
140146
type TypeOrBoundsTree
@@ -177,6 +183,7 @@ trait TastyCore {
177183
type TypeSymbol <: Symbol
178184
type DefSymbol <: Symbol
179185
type ValSymbol <: Symbol
186+
type BindSymbol <: Symbol
180187
type NoSymbol <: Symbol
181188

182189
}

tests/run/tasty-definitions-2/Macro_1.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ object Foo {
88

99
def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = {
1010
import tasty._
11-
def definitionString(tree: Tree): Expr[String] = tree.symbol.treeOpt.get.show.toExpr
11+
def definitionString(tree: Tree): Expr[String] = tree.symbol match {
12+
case IsDefSymbol(sym) => sym.tree.show.toExpr
13+
case IsValSymbol(sym) => sym.tree.show.toExpr
14+
case IsBindSymbol(sym) => sym.tree.show.toExpr
15+
}
1216
x.toTasty match {
1317
case Term.Inlined(None, Nil, arg) => definitionString(arg)
1418
case arg => definitionString(arg) // TODO should all by name parameters be in an inline node?

tests/run/tasty-definitions-2/Test_2.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,10 @@ object Test {
22
def main(args: Array[String]): Unit = {
33
println(Foo.inspectBody(Foo.foo))
44
println(Foo.inspectBody(Foo.bar))
5+
6+
3 match {
7+
case x =>
8+
println(Foo.inspectBody(x))
9+
}
510
}
611
}

tests/run/tasty-definitions-3/Macro_1.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ object Foo {
88

99
def inspectBodyImpl(x: Expr[Int])(implicit tasty: Tasty): Expr[String] = {
1010
import tasty._
11-
def definitionString(tree: Tree): Expr[String] = tree.symbol.treeOpt.get.show.toExpr
11+
def definitionString(tree: Tree): Expr[String] = tree.symbol match {
12+
case IsDefSymbol(sym) => sym.tree.show.toExpr
13+
case IsValSymbol(sym) => sym.tree.show.toExpr
14+
case IsBindSymbol(sym) => sym.tree.show.toExpr
15+
}
1216
x.toTasty match {
1317
case Term.Inlined(None, Nil, arg) => definitionString(arg)
1418
case arg => definitionString(arg) // TODO should all by name parameters be in an inline node?

tests/run/tasty-definitions-3/Test_2.scala

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ object Test {
33
def main(args: Array[String]): Unit = {
44
println(Foo.inspectBody(foo))
55
println(Foo.inspectBody(bar))
6+
7+
3 match {
8+
case x =>
9+
println(Foo.inspectBody(x))
10+
}
611
}
712

813
def foo: Int = 1 + 2

0 commit comments

Comments
 (0)