Skip to content

Commit 392d7bd

Browse files
committed
Implement SymbolOps members in kernel
1 parent 0338205 commit 392d7bd

File tree

5 files changed

+220
-166
lines changed

5 files changed

+220
-166
lines changed

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
@@ -1425,31 +1425,125 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
14251425
def isPackageSymbol(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol] =
14261426
if (symbol.is(core.Flags.Package)) Some(symbol) else None
14271427

1428+
def PackageSymbol_tree(self: PackageSymbol)(implicit ctx: Context): PackageDef =
1429+
FromSymbol.packageDefFromSym(self)
1430+
14281431
type ClassSymbol = core.Symbols.ClassSymbol
14291432

14301433
def isClassSymbol(symbol: Symbol)(implicit ctx: Context): Option[ClassSymbol] =
14311434
if (symbol.isClass) Some(symbol.asClass) else None
14321435

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

14351502
def isTypeSymbol(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol] =
14361503
if (symbol.isType) Some(symbol.asType) else None
14371504

1505+
def TypeSymbol_tree(self: TypeSymbol)(implicit ctx: Context): TypeDef =
1506+
FromSymbol.typeDefFromSym(self)
1507+
def TypeSymbol_isTypeParam(self: TypeSymbol)(implicit ctx: Context): Boolean =
1508+
self.isTypeParam
1509+
14381510
type DefSymbol = core.Symbols.TermSymbol
14391511

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

1443-
type BindSymbol = core.Symbols.TermSymbol
1515+
def DefSymbol_tree(self: DefSymbol)(implicit ctx: Context): DefDef =
1516+
FromSymbol.defDefFromSym(self)
14441517

1445-
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol] =
1446-
if (symbol.isTerm && symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1518+
def DefSymbol_signature(self: DefSymbol)(implicit ctx: Context): Signature =
1519+
self.signature
14471520

14481521
type ValSymbol = core.Symbols.TermSymbol
14491522

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

1526+
def ValSymbol_tree(self: ValSymbol)(implicit ctx: Context): ValDef =
1527+
FromSymbol.valDefFromSym(self)
1528+
1529+
def ValSymbol_moduleClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol] = {
1530+
val sym = self.moduleClass
1531+
if (sym.exists) Some(sym.asClass) else None
1532+
}
1533+
1534+
def ValSymbol_companionClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol] = {
1535+
val sym = self.companionClass
1536+
if (sym.exists) Some(sym.asClass) else None
1537+
}
1538+
1539+
type BindSymbol = core.Symbols.TermSymbol
1540+
1541+
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol] =
1542+
if (symbol.isTerm && symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1543+
1544+
def BindSymbol_tree(self: BindSymbol)(implicit ctx: Context): Bind =
1545+
FromSymbol.bindFromSym(self)
1546+
14531547
type NoSymbol = core.Symbols.NoSymbol.type
14541548

14551549
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 & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@ import dotty.tools.dotc.util.{SourcePosition, Spans}
66
class ReflectionImpl private (ctx: Contexts.Context, pos: SourcePosition)
77
extends scala.tasty.Reflection
88
with CoreImpl
9-
with CommentOpsImpl
10-
with SymbolOpsImpl {
9+
with CommentOpsImpl {
1110

1211
val kernel: KernelImpl = new KernelImpl(ctx, pos)
1312

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
@@ -1168,31 +1168,90 @@ trait Kernel {
11681168

11691169
def isPackageSymbol(symbol: Symbol)(implicit ctx: Context): Option[PackageSymbol]
11701170

1171+
def PackageSymbol_tree(self: PackageSymbol)(implicit ctx: Context): PackageDef
1172+
11711173
/** Symbol of a class definition. This includes anonymous class definitions and the class of a module object. */
11721174
type ClassSymbol <: Symbol
11731175

11741176
def isClassSymbol(symbol: Symbol)(implicit ctx: Context): Option[ClassSymbol]
11751177

1178+
/** ClassDef tree of this defintion */
1179+
def ClassSymbol_tree(self: ClassSymbol)(implicit ctx: Context): ClassDef
1180+
1181+
/** Fields directly declared in the class */
1182+
def ClassSymbol_fields(self: Symbol)(implicit ctx: Context): List[Symbol]
1183+
1184+
/** Field with the given name directly declared in the class */
1185+
def ClassSymbol_field(self: Symbol)(name: String)(implicit ctx: Context): Option[Symbol]
1186+
1187+
/** Get non-private named methods defined directly inside the class */
1188+
def ClassSymbol_classMethod(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol]
1189+
1190+
/** Get all non-private methods defined directly inside the class, exluding constructors */
1191+
def ClassSymbol_classMethods(self: Symbol)(implicit ctx: Context): List[DefSymbol]
1192+
1193+
/** Get named non-private methods declared or inherited */
1194+
def ClassSymbol_method(self: Symbol)(name: String)(implicit ctx: Context): List[DefSymbol]
1195+
1196+
/** Get all non-private methods declared or inherited */
1197+
def ClassSymbol_methods(self: Symbol)(implicit ctx: Context): List[DefSymbol]
1198+
1199+
/** Fields of a case class type -- only the ones declared in primary constructor */
1200+
def ClassSymbol_caseFields(self: Symbol)(implicit ctx: Context): List[ValSymbol]
1201+
1202+
/** The class symbol of the companion module class */
1203+
def ClassSymbol_companionClass(self: Symbol)(implicit ctx: Context): Option[ClassSymbol]
1204+
1205+
/** The symbol of the companion module */
1206+
def ClassSymbol_companionModule(self: Symbol)(implicit ctx: Context): Option[ValSymbol]
1207+
1208+
/** The symbol of the class of the companion module */
1209+
def ClassSymbol_moduleClass(self: Symbol)(implicit ctx: Context): Option[Symbol]
1210+
1211+
def ClassSymbol_of(fullName: String)(implicit ctx: Context): ClassSymbol
1212+
11761213
/** Symbol of a type (parameter or member) definition. */
11771214
type TypeSymbol <: Symbol
11781215

11791216
def isTypeSymbol(symbol: Symbol)(implicit ctx: Context): Option[TypeSymbol]
11801217

1218+
def TypeSymbol_isTypeParam(self: TypeSymbol)(implicit ctx: Context): Boolean
1219+
1220+
/** TypeDef tree of this definition */
1221+
def TypeSymbol_tree(self: TypeSymbol)(implicit ctx: Context): TypeDef
1222+
11811223
/** Symbol representing a method definition. */
11821224
type DefSymbol <: Symbol
11831225

11841226
def isDefSymbol(symbol: Symbol)(implicit ctx: Context): Option[DefSymbol]
11851227

1228+
/** DefDef tree of this defintion */
1229+
def DefSymbol_tree(self: DefSymbol)(implicit ctx: Context): DefDef
1230+
1231+
/** Signature of this defintion */
1232+
def DefSymbol_signature(self: DefSymbol)(implicit ctx: Context): Signature
1233+
11861234
/** Symbol representing a value definition. This includes `val`, `lazy val`, `var`, `object` and parameter definitions. */
11871235
type ValSymbol <: Symbol
11881236

11891237
def isValSymbol(symbol: Symbol)(implicit ctx: Context): Option[ValSymbol]
11901238

1239+
/** ValDef tree of this defintion */
1240+
def ValSymbol_tree(self: ValSymbol)(implicit ctx: Context): ValDef
1241+
1242+
/** The class symbol of the companion module class */
1243+
def ValSymbol_moduleClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol]
1244+
1245+
def ValSymbol_companionClass(self: ValSymbol)(implicit ctx: Context): Option[ClassSymbol]
1246+
11911247
/** Symbol representing a bind definition. */
11921248
type BindSymbol <: Symbol
11931249

11941250
def isBindSymbol(symbol: Symbol)(implicit ctx: Context): Option[BindSymbol]
11951251

1252+
/** Bind pattern of this definition */
1253+
def BindSymbol_tree(self: BindSymbol)(implicit ctx: Context): Bind
1254+
11961255
/** No symbol available. */
11971256
type NoSymbol <: Symbol
11981257

0 commit comments

Comments
 (0)