Skip to content

Commit 0cf3d3d

Browse files
committed
Implement SymbolOps members in kernel
1 parent 35f6e27 commit 0cf3d3d

File tree

6 files changed

+220
-175
lines changed

6 files changed

+220
-175
lines changed

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

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

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

Lines changed: 98 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package tastyreflect
33

44
import dotty.tools.dotc.ast.{Trees, tpd, untpd}
55
import dotty.tools.dotc.ast.tpd.TreeOps
6-
import dotty.tools.dotc.core.{Constants, NameKinds, Names, Types}
6+
import dotty.tools.dotc.core._
77
import dotty.tools.dotc.core.Flags._
88
import dotty.tools.dotc.core.StdNames.nme
99
import dotty.tools.dotc.core.quoted.PickledQuotes
@@ -1410,31 +1410,125 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
14101410
def isPackageSymbol(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol] =
14111411
if (symbol.is(core.Flags.Package)) Some(symbol) else None
14121412

1413+
def PackageSymbol_tree(self: PackageSymbol)(implicit ctx: Context): PackageDef =
1414+
FromSymbol.packageDefFromSym(self)
1415+
14131416
type ClassSymbol = core.Symbols.ClassSymbol
14141417

14151418
def isClassSymbol(symbol: Symbol)(implicit ctx: Context): Option[ClassSymbol] =
14161419
if (symbol.isClass) Some(symbol.asClass) else None
14171420

1421+
def ClassSymbol_tree(self: ClassSymbol)(implicit ctx: Context): ClassDef =
1422+
FromSymbol.classDef(self)
1423+
1424+
def ClassSymbol_fields(self: Symbol)(implicit ctx: Context): List[Symbol] =
1425+
self.unforcedDecls.filter(isField)
1426+
1427+
def ClassSymbol_field(self: Symbol)(name: String)(implicit ctx: Context): Option[Symbol] = {
1428+
val sym = self.unforcedDecls.find(sym => sym.name == name.toTermName)
1429+
if (sym.exists && isField(sym)) Some(sym) else None
1430+
}
1431+
1432+
def ClassSymbol_classMethod(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol] = {
1433+
self.typeRef.decls.iterator.collect {
1434+
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
1435+
}.toList
1436+
}
1437+
1438+
def ClassSymbol_classMethods(self: Symbol)(implicit ctx: Context): List[DefSymbol] = {
1439+
self.typeRef.decls.iterator.collect {
1440+
case sym if isMethod(sym) => sym.asTerm
1441+
}.toList
1442+
}
1443+
1444+
def ClassSymbol_method(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol] = {
1445+
self.typeRef.allMembers.iterator.map(_.symbol).collect {
1446+
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
1447+
}.toList
1448+
}
1449+
1450+
def ClassSymbol_methods(self: Symbol)(implicit ctx: Context): List[DefSymbol] = {
1451+
self.typeRef.allMembers.iterator.map(_.symbol).collect {
1452+
case sym if isMethod(sym) => sym.asTerm
1453+
}.toList
1454+
}
1455+
1456+
private def isMethod(sym: Symbol)(implicit ctx: Context): Boolean =
1457+
sym.isTerm && sym.is(Flags.Method) && !sym.isConstructor
1458+
1459+
def ClassSymbol_caseFields(self: Symbol)(implicit ctx: Context): List[ValSymbol] = {
1460+
if (!self.isClass) Nil
1461+
else self.asClass.paramAccessors.collect {
1462+
case sym if sym.is(Flags.CaseAccessor) => sym.asTerm
1463+
}
1464+
}
1465+
1466+
def ClassSymbol_companionClass(self: Symbol)(implicit ctx: Context): Option[ClassSymbol] = {
1467+
val sym = self.companionModule.companionClass
1468+
if (sym.exists) Some(sym.asClass) else None
1469+
}
1470+
1471+
def ClassSymbol_companionModule(self: Symbol)(implicit ctx: Context): Option[ValSymbol] = {
1472+
val sym = self.companionModule
1473+
if (sym.exists) Some(sym.asTerm) else None
1474+
}
1475+
1476+
def ClassSymbol_moduleClass(self: Symbol)(implicit ctx: Context): Option[Symbol] = {
1477+
val sym = self.moduleClass
1478+
if (sym.exists) Some(sym.asTerm) else None
1479+
}
1480+
1481+
private def isField(sym: Symbol)(implicit ctx: Context): Boolean = sym.isTerm && !sym.is(Flags.Method)
1482+
1483+
def ClassSymbol_of(fullName: String)(implicit ctx: Context): ClassSymbol = ctx.requiredClass(fullName)
1484+
14181485
type TypeSymbol = core.Symbols.TypeSymbol
14191486

14201487
def isTypeSymbol(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol] =
14211488
if (symbol.isType) Some(symbol.asType) else None
14221489

1490+
def TypeSymbol_tree(self: TypeSymbol)(implicit ctx: Context): TypeDef =
1491+
FromSymbol.typeDefFromSym(self)
1492+
def TypeSymbol_isTypeParam(self: TypeSymbol)(implicit ctx: Context): Boolean =
1493+
self.isTypeParam
1494+
14231495
type DefSymbol = core.Symbols.TermSymbol
14241496

14251497
def isDefSymbol(symbol: Symbol)(implicit ctx: Context): Option[DefSymbol] =
14261498
if (symbol.isTerm && symbol.is(core.Flags.Method)) Some(symbol.asTerm) else None
14271499

1428-
type BindSymbol = core.Symbols.TermSymbol
1500+
def DefSymbol_tree(self: DefSymbol)(implicit ctx: Context): DefDef =
1501+
FromSymbol.defDefFromSym(self)
14291502

1430-
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol] =
1431-
if (symbol.isTerm && symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1503+
def DefSymbol_signature(self: DefSymbol)(implicit ctx: Context): Signature =
1504+
self.signature
14321505

14331506
type ValSymbol = core.Symbols.TermSymbol
14341507

14351508
def isValSymbol(symbol: Symbol)(implicit ctx: Context): Option[ValSymbol] =
14361509
if (symbol.isTerm && !symbol.is(core.Flags.Method) && !symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
14371510

1511+
def ValSymbol_tree(self: ValSymbol)(implicit ctx: Context): ValDef =
1512+
FromSymbol.valDefFromSym(self)
1513+
1514+
def ValSymbol_moduleClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol] = {
1515+
val sym = self.moduleClass
1516+
if (sym.exists) Some(sym.asClass) else None
1517+
}
1518+
1519+
def ValSymbol_companionClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol] = {
1520+
val sym = self.companionClass
1521+
if (sym.exists) Some(sym.asClass) else None
1522+
}
1523+
1524+
type BindSymbol = core.Symbols.TermSymbol
1525+
1526+
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol] =
1527+
if (symbol.isTerm && symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1528+
1529+
def BindSymbol_tree(self: BindSymbol)(implicit ctx: Context): Bind =
1530+
FromSymbol.bindFromSym(self)
1531+
14381532
type NoSymbol = core.Symbols.NoSymbol.type
14391533

14401534
def isNoSymbol(symbol: Symbol)(implicit ctx: Context): Boolean = symbol ne core.Symbols.NoSymbol

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import dotty.tools.dotc.core._
44
import dotty.tools.dotc.util.{SourcePosition, Spans}
55

66
class ReflectionImpl private (ctx: Contexts.Context, pos: SourcePosition)
7-
extends scala.tasty.Reflection
8-
with CoreImpl
9-
with SymbolOpsImpl {
7+
extends scala.tasty.Reflection {
108

119
val kernel: KernelImpl = new KernelImpl(ctx, pos)
1210

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

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

library/src/scala/tasty/reflect/Kernel.scala

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,31 +1156,90 @@ trait Kernel {
11561156

11571157
def isPackageSymbol(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol]
11581158

1159+
def PackageSymbol_tree(self: PackageSymbol)(implicit ctx: Context): PackageDef
1160+
11591161
/** Symbol of a class definition. This includes anonymous class definitions and the class of a module object. */
11601162
type ClassSymbol <: Symbol
11611163

11621164
def isClassSymbol(symbol: Symbol)(implicit ctx: Context): Option[ClassSymbol]
11631165

1166+
/** ClassDef tree of this defintion */
1167+
def ClassSymbol_tree(self: ClassSymbol)(implicit ctx: Context): ClassDef
1168+
1169+
/** Fields directly declared in the class */
1170+
def ClassSymbol_fields(self: Symbol)(implicit ctx: Context): List[Symbol]
1171+
1172+
/** Field with the given name directly declared in the class */
1173+
def ClassSymbol_field(self: Symbol)(name: String)(implicit ctx: Context): Option[Symbol]
1174+
1175+
/** Get non-private named methods defined directly inside the class */
1176+
def ClassSymbol_classMethod(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol]
1177+
1178+
/** Get all non-private methods defined directly inside the class, exluding constructors */
1179+
def ClassSymbol_classMethods(self: Symbol)(implicit ctx: Context): List[DefSymbol]
1180+
1181+
/** Get named non-private methods declared or inherited */
1182+
def ClassSymbol_method(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol]
1183+
1184+
/** Get all non-private methods declared or inherited */
1185+
def ClassSymbol_methods(self: Symbol)(implicit ctx: Context): List[DefSymbol]
1186+
1187+
/** Fields of a case class type -- only the ones declared in primary constructor */
1188+
def ClassSymbol_caseFields(self: Symbol)(implicit ctx: Context): List[ValSymbol]
1189+
1190+
/** The class symbol of the companion module class */
1191+
def ClassSymbol_companionClass(self: Symbol)(implicit ctx: Context): Option[ClassSymbol]
1192+
1193+
/** The symbol of the companion module */
1194+
def ClassSymbol_companionModule(self: Symbol)(implicit ctx: Context): Option[ValSymbol]
1195+
1196+
/** The symbol of the class of the companion module */
1197+
def ClassSymbol_moduleClass(self: Symbol)(implicit ctx: Context): Option[Symbol]
1198+
1199+
def ClassSymbol_of(fullName: String)(implicit ctx: Context): ClassSymbol
1200+
11641201
/** Symbol of a type (parameter or member) definition. */
11651202
type TypeSymbol <: Symbol
11661203

11671204
def isTypeSymbol(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol]
11681205

1206+
def TypeSymbol_isTypeParam(self: TypeSymbol)(implicit ctx: Context): Boolean
1207+
1208+
/** TypeDef tree of this definition */
1209+
def TypeSymbol_tree(self: TypeSymbol)(implicit ctx: Context): TypeDef
1210+
11691211
/** Symbol representing a method definition. */
11701212
type DefSymbol <: Symbol
11711213

11721214
def isDefSymbol(symbol: Symbol)(implicit ctx: Context): Option[DefSymbol]
11731215

1216+
/** DefDef tree of this defintion */
1217+
def DefSymbol_tree(self: DefSymbol)(implicit ctx: Context): DefDef
1218+
1219+
/** Signature of this defintion */
1220+
def DefSymbol_signature(self: DefSymbol)(implicit ctx: Context): Signature
1221+
11741222
/** Symbol representing a value definition. This includes `val`, `lazy val`, `var`, `object` and parameter definitions. */
11751223
type ValSymbol <: Symbol
11761224

11771225
def isValSymbol(symbol: Symbol)(implicit ctx: Context): Option[ValSymbol]
11781226

1227+
/** ValDef tree of this defintion */
1228+
def ValSymbol_tree(self: ValSymbol)(implicit ctx: Context): ValDef
1229+
1230+
/** The class symbol of the companion module class */
1231+
def ValSymbol_moduleClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol]
1232+
1233+
def ValSymbol_companionClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol]
1234+
11791235
/** Symbol representing a bind definition. */
11801236
type BindSymbol <: Symbol
11811237

11821238
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol]
11831239

1240+
/** Bind pattern of this definition */
1241+
def BindSymbol_tree(self: BindSymbol)(implicit ctx: Context): Bind
1242+
11841243
/** No symbol available. */
11851244
type NoSymbol <: Symbol
11861245

0 commit comments

Comments
 (0)