Skip to content

Commit 486b731

Browse files
Merge pull request #4895 from dotty-staging/add-tasty-reflect-std-definitions
Add standard definitions on Tasty reflect
2 parents 84966d2 + a9cd2fe commit 486b731

File tree

8 files changed

+594
-22
lines changed

8 files changed

+594
-22
lines changed

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

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,39 @@ package dotty.tools.dotc.tastyreflect
33
import dotty.tools.dotc.ast.tpd
44
import dotty.tools.dotc.core.Contexts.Context
55
import dotty.tools.dotc.core.Flags._
6+
import dotty.tools.dotc.core.StdNames._
67
import dotty.tools.dotc.core.Symbols._
8+
import dotty.tools.dotc.core.Types._
79

810
object FromSymbol {
911

10-
def definition(sym: Symbol)(implicit ctx: Context): tpd.Tree = {
11-
if (sym.is(Package)) packageDef(sym)
12+
def definitionFromSym(sym: Symbol)(implicit ctx: Context): tpd.Tree = {
13+
if (sym.is(Package)) packageDefFromSym(sym)
1214
else if (sym == defn.AnyClass) tpd.EmptyTree // FIXME
1315
else if (sym == defn.NothingClass) tpd.EmptyTree // FIXME
1416
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)
17+
else if (sym.isType) typeDefFromSym(sym.asType)
18+
else if (sym.is(Method)) defDefFromSym(sym.asTerm)
19+
else valDefFromSym(sym.asTerm)
1820
}
1921

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

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

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

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

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

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

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

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ 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+
import dotty.tools.dotc.tastyreflect.FromSymbol._
19+
20+
class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty with StandardDefinitions { self =>
1921

2022
// ===== Quotes ===================================================
2123

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

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

4547
def source: java.nio.file.Path = ctx.compilationUnit.source.file.jpath
4648
}
@@ -86,7 +88,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
8688
}
8789

8890
def PackageClauseDeco(pack: PackageClause): PackageClauseAPI = new PackageClauseAPI {
89-
def definition(implicit ctx: Context): Definition = FromSymbol.packageDef(pack.symbol)
91+
def definition(implicit ctx: Context): Definition = packageDefFromSym(pack.symbol)
9092
}
9193

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

148150
def name(implicit ctx: Context): String = definition.symbol.name.toString
149151

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

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

265267
def PackageDefDeco(pdef: PackageDef): PackageDefAPI = new PackageDefAPI {
266268

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

269271
def members(implicit ctx: Context): List[Statement] = {
270272
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
273+
else pdef.symbol.info.decls.iterator.map(definitionFromSym).toList
272274
}
273275
}
274276

@@ -277,7 +279,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
277279
object PackageDef extends PackageDefExtractor {
278280
def unapply(x: PackageDef)(implicit ctx: Context): Option[(String, PackageDef)] = x match {
279281
case x: PackageDefinition =>
280-
Some((x.symbol.name.toString, FromSymbol.packageDef(x.symbol.owner)))
282+
Some((x.symbol.name.toString, packageDefFromSym(x.symbol.owner)))
281283
case _ => None
282284
}
283285
}
@@ -825,7 +827,7 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s
825827
def unapply(x: Type)(implicit ctx: Context): Option[(Definition, TypeOrBounds /* Type | NoPrefix */)] = x match {
826828
case tp: Types.NamedType =>
827829
tp.designator match {
828-
case sym: Symbol => Some((FromSymbol.definition(sym), tp.prefix))
830+
case sym: Symbol => Some((definitionFromSym(sym), tp.prefix))
829831
case _ => None
830832
}
831833
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)