Skip to content

Commit dd34566

Browse files
committed
WIP Add standard definitions on Tasty reflect
Based on scala.reflect
1 parent 429c1f2 commit dd34566

File tree

8 files changed

+653
-24
lines changed

8 files changed

+653
-24
lines changed
Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,40 @@
11
package dotty.tools.dotc.tastyreflect
22

33
import dotty.tools.dotc.ast.tpd
4-
import dotty.tools.dotc.core.Contexts.Context
54
import dotty.tools.dotc.core.Flags._
5+
import dotty.tools.dotc.core.StdNames._
66
import dotty.tools.dotc.core.Symbols._
7+
import dotty.tools.dotc.core.Types._
78

8-
object FromSymbol {
9+
trait FromSymbol { tasty: TastyImpl =>
910

10-
def definition(sym: Symbol)(implicit ctx: Context): tpd.Tree = {
11-
if (sym.is(Package)) packageDef(sym)
11+
def definitionFromSym(sym: Symbol)(implicit ctx: Context): tpd.Tree = {
12+
if (sym.is(Package)) packageDefFromSym(sym)
1213
else if (sym == defn.AnyClass) tpd.EmptyTree // FIXME
1314
else if (sym == defn.NothingClass) tpd.EmptyTree // FIXME
1415
else if (sym.isClass) classDef(sym.asClass)
15-
else if (sym.isType) typeDef(sym.asType)
16-
else if (sym.is(Method)) defDef(sym.asTerm)
17-
else valDef(sym.asTerm)
16+
else if (sym.isType) typeDefFromSym(sym.asType)
17+
else if (sym.is(Method)) defDefFromSym(sym.asTerm)
18+
else valDefFromSym(sym.asTerm)
1819
}
1920

20-
def packageDef(sym: Symbol)(implicit ctx: Context): PackageDefinition = PackageDefinitionImpl(sym)
21+
def packageDefFromSym(sym: Symbol)(implicit ctx: Context): PackageDefinition = PackageDefinitionImpl(sym)
2122

22-
def classDef(cls: ClassSymbol)(implicit ctx: Context): tpd.Tree = {
23-
val constrSym = cls.unforcedDecls.find(_.isPrimaryConstructor)
24-
if (!constrSym.exists) return tpd.EmptyTree
23+
def classDef(cls: ClassSymbol)(implicit ctx: Context): ClassDef = {
24+
val constrSym = cls.unforcedDecls.find(_.isPrimaryConstructor).orElse(
25+
// Dummy constructor for classes such as `<refinement>`
26+
ctx.newSymbol(cls, nme.CONSTRUCTOR, EmptyFlags, NoType)
27+
)
2528
val constr = tpd.DefDef(constrSym.asTerm)
2629
val parents = cls.classParents.map(tpd.TypeTree(_))
27-
val body = cls.unforcedDecls.filter(!_.isPrimaryConstructor).map(s => definition(s))
30+
val body = cls.unforcedDecls.filter(!_.isPrimaryConstructor).map(s => definitionFromSym(s))
2831
tpd.ClassDefWithParents(cls, constr, parents, body)
2932
}
3033

31-
def typeDef(sym: TypeSymbol)(implicit ctx: Context): tpd.TypeDef = tpd.TypeDef(sym)
34+
def typeDefFromSym(sym: TypeSymbol)(implicit ctx: Context): tpd.TypeDef = tpd.TypeDef(sym)
3235

33-
def defDef(sym: TermSymbol)(implicit ctx: Context): tpd.DefDef = tpd.DefDef(sym)
36+
def defDefFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.DefDef = tpd.DefDef(sym)
3437

35-
def valDef(sym: TermSymbol)(implicit ctx: Context): tpd.ValDef = tpd.ValDef(sym)
38+
def valDefFromSym(sym: TermSymbol)(implicit ctx: Context): tpd.ValDef = tpd.ValDef(sym)
3639

3740
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package dotty.tools.dotc.tastyreflect
2+
3+
import dotty.tools.dotc.core.Symbols._
4+
5+
trait StandardDefinitions extends scala.tasty.reflect.StandardDefinitions with FromSymbol {
6+
tasty: TastyImpl =>
7+
8+
private implicit def ctx: Context = rootContext
9+
10+
val definitions: DefinitionsApi = new DefinitionsApi {
11+
12+
def ScalaPackageClass: PackageDef = packageDefFromSym(defn.ScalaPackageClass)
13+
def ScalaPackage: ValDef = ???
14+
15+
def AnyClass: ClassDef = classDef(defn.AnyClass)
16+
def AnyValClass: ClassDef = classDef(defn.AnyValClass)
17+
def ObjectClass: ClassDef = classDef(defn.ObjectClass)
18+
def AnyRefClass: TypeDef = typeDefFromSym(defn.AnyRefAlias)
19+
def NullClass: ClassDef = classDef(defn.AnyClass)
20+
def NothingClass: ClassDef = classDef(defn.NothingClass)
21+
def UnitClass: ClassDef = classDef(defn.UnitClass)
22+
def ByteClass: ClassDef = classDef(defn.ByteClass)
23+
def ShortClass: ClassDef = classDef(defn.ShortClass)
24+
def CharClass: ClassDef = classDef(defn.CharClass)
25+
def IntClass: ClassDef = classDef(defn.IntClass)
26+
def LongClass: ClassDef = classDef(defn.LongClass)
27+
def FloatClass: ClassDef = classDef(defn.FloatClass)
28+
def DoubleClass: ClassDef = classDef(defn.DoubleClass)
29+
def BooleanClass: ClassDef = classDef(defn.BooleanClass)
30+
def StringClass: ClassDef = classDef(defn.StringClass)
31+
def ClassClass: ClassDef = classDef(defn.ClassClass)
32+
def ArrayClass: ClassDef = classDef(defn.ArrayClass)
33+
def ListClass: ClassDef = ???
34+
def PredefModule: ValDef = valDefFromSym(defn.ScalaPredefModule.asTerm)
35+
36+
def JavaLangPackage: PackageDefinition = ???
37+
38+
def JavaLangPackageClass: PackageDef = packageDefFromSym(defn.JavaLangPackageVal)
39+
40+
def ArrayModule: ValDef = ???
41+
def ArrayModule_overloadedApply: DefDef = ???
42+
43+
def Array_apply: DefDef = defDefFromSym(defn.Array_apply.asTerm)
44+
def Array_clone: DefDef = defDefFromSym(defn.Array_clone.asTerm)
45+
def Array_length: DefDef = defDefFromSym(defn.Array_length.asTerm)
46+
def Array_update: DefDef = defDefFromSym(defn.Array_update.asTerm)
47+
48+
def JavaRepeatedParamClass: ClassDef = ???
49+
def RepeatedParamClass: ClassDef = classDef(defn.RepeatedParamClass)
50+
51+
def ListModule: ValDef = ???
52+
def List_apply: DefDef = ???
53+
54+
def NilModule: ValDef = ???
55+
56+
def OptionClass: TypeDef = classDef(defn.OptionClass)
57+
def NoneModule: ValDef = ???
58+
def SomeModule: ValDef = ???
59+
60+
def ProductClass: VarArityClassApi = ???
61+
def FunctionClass(isImplicit: Boolean = false, isErased: Boolean = false): VarArityClassApi = new VarArityClassApi {
62+
def apply(arity: Int): TypeDef = classDef(defn.FunctionClass(arity, isImplicit, isErased).asClass)
63+
}
64+
def TupleClass: VarArityClassApi = ???
65+
66+
def ScalaPrimitiveValueClasses: List[ClassDef] =
67+
UnitClass :: BooleanClass :: ScalaNumericValueClasses
68+
def ScalaNumericValueClasses: List[ClassDef] =
69+
ByteClass :: ShortClass :: IntClass :: LongClass :: FloatClass :: DoubleClass :: CharClass :: Nil
70+
71+
def UnitTpe: Type = defn.UnitType
72+
def ByteTpe: Type = defn.ByteType
73+
def ShortTpe: Type = defn.ShortType
74+
def CharTpe: Type = defn.CharType
75+
def IntTpe: Type = defn.IntType
76+
def LongTpe: Type = defn.LongType
77+
def FloatTpe: Type = defn.FloatType
78+
def DoubleTpe: Type = defn.DoubleType
79+
def BooleanTpe: Type = defn.BooleanType
80+
def AnyTpe: Type = defn.AnyType
81+
def AnyValTpe: Type = defn.AnyValType
82+
def AnyRefTpe: Type = defn.AnyRefType
83+
def ObjectTpe: Type = defn.ObjectType
84+
def NothingTpe: Type = defn.NothingType
85+
def NullTpe: Type = defn.NullType
86+
}
87+
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import scala.quoted
1515
import scala.reflect.ClassTag
1616
import scala.tasty.util.{Show, ShowExtractors, ShowSourceCode}
1717

18-
class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { self =>
18+
class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty with FromSymbol with StandardDefinitions { self =>
1919

2020
// ===== Quotes ===================================================
2121

@@ -40,7 +40,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
4040
type Context = Contexts.Context
4141

4242
def ContextDeco(ctx: Context): ContextAPI = new ContextAPI {
43-
def owner: Definition = FromSymbol.definition(ctx.owner)(ctx)
43+
def owner: Definition = definitionFromSym(ctx.owner)(ctx)
4444

4545
def source: java.nio.file.Path = ctx.compilationUnit.source.file.jpath
4646
}
@@ -86,7 +86,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
8686
}
8787

8888
def PackageClauseDeco(pack: PackageClause): PackageClauseAPI = new PackageClauseAPI {
89-
def definition(implicit ctx: Context): Definition = FromSymbol.packageDef(pack.symbol)
89+
def definition(implicit ctx: Context): Definition = packageDefFromSym(pack.symbol)
9090
}
9191

9292
// ----- Statements -----------------------------------------------
@@ -147,7 +147,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
147147

148148
def name(implicit ctx: Context): String = definition.symbol.name.toString
149149

150-
def owner(implicit ctx: Context): Definition = FromSymbol.definition(definition.symbol.owner)
150+
def owner(implicit ctx: Context): Definition = definitionFromSym(definition.symbol.owner)
151151

152152
def flags(implicit ctx: Context): FlagSet =
153153
new FlagSet(definition.symbol.flags)
@@ -264,11 +264,11 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
264264

265265
def PackageDefDeco(pdef: PackageDef): PackageDefAPI = new PackageDefAPI {
266266

267-
def owner(implicit ctx: Context): PackageDefinition = FromSymbol.packageDef(pdef.symbol.owner)
267+
def owner(implicit ctx: Context): PackageDefinition = packageDefFromSym(pdef.symbol.owner)
268268

269269
def members(implicit ctx: Context): List[Statement] = {
270270
if (pdef.symbol.is(core.Flags.JavaDefined)) Nil // FIXME should also support java packages
271-
else pdef.symbol.info.decls.iterator.map(FromSymbol.definition).toList
271+
else pdef.symbol.info.decls.iterator.map(definitionFromSym).toList
272272
}
273273
}
274274

@@ -277,7 +277,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
277277
object PackageDef extends PackageDefExtractor {
278278
def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, PackageDef)] = x match {
279279
case x: PackageDefinition =>
280-
Some((x.symbol.name.toString, FromSymbol.packageDef(x.symbol.owner)))
280+
Some((x.symbol.name.toString, packageDefFromSym(x.symbol.owner)))
281281
case _ => None
282282
}
283283
}
@@ -819,7 +819,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
819819
def unapply(x: Type)(implicit ctx: Context): Option[(Definition, TypeOrBounds /* Type | NoPrefix */)] = x match {
820820
case tp: Types.NamedType =>
821821
tp.designator match {
822-
case sym: Symbol => Some((FromSymbol.definition(sym), tp.prefix))
822+
case sym: Symbol => Some((definitionFromSym(sym), tp.prefix))
823823
case _ => None
824824
}
825825
case _ => None

library/src/scala/tasty/Tasty.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package scala.tasty
22

33
import scala.reflect.ClassTag
4+
import scala.tasty.reflect.StandardDefinitions
45
import scala.tasty.util.Show
56

6-
abstract class Tasty { tasty =>
7+
abstract class Tasty extends StandardDefinitions { tasty =>
78

89
// ===== Quotes ===================================================
910

0 commit comments

Comments
 (0)