Skip to content

Commit a63758c

Browse files
committed
Move all symbol extension method to SymbolAPI
1 parent c17c7c7 commit a63758c

File tree

4 files changed

+47
-73
lines changed

4 files changed

+47
-73
lines changed

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

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1529,70 +1529,60 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
15291529

15301530
def isClassDefSymbol(symbol: Symbol)(given Context): Boolean = symbol.isClass
15311531

1532-
def ClassDefSymbol_fields(self: Symbol)(given Context): List[Symbol] =
1532+
def Symbol_fields(self: Symbol)(given Context): List[Symbol] =
15331533
self.unforcedDecls.filter(isField)
15341534

1535-
def ClassDefSymbol_field(self: Symbol)(name: String)(given Context): Option[Symbol] = {
1535+
def Symbol_field(self: Symbol)(name: String)(given Context): Option[Symbol] = {
15361536
val sym = self.unforcedDecls.find(sym => sym.name == name.toTermName)
15371537
if (sym.exists && isField(sym)) Some(sym) else None
15381538
}
15391539

1540-
def ClassDefSymbol_classMethod(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
1540+
def Symbol_classMethod(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
15411541
self.typeRef.decls.iterator.collect {
15421542
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
15431543
}.toList
15441544

1545-
def ClassDefSymbol_classMethods(self: Symbol)(given Context): List[DefDefSymbol] =
1545+
def Symbol_classMethods(self: Symbol)(given Context): List[DefDefSymbol] =
15461546
self.typeRef.decls.iterator.collect {
15471547
case sym if isMethod(sym) => sym.asTerm
15481548
}.toList
15491549

15501550
private def appliedTypeRef(sym: Symbol): Type = sym.typeRef.appliedTo(sym.typeParams.map(_.typeRef))
15511551

1552-
def ClassDefSymbol_method(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
1552+
def Symbol_method(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
15531553
appliedTypeRef(self).allMembers.iterator.map(_.symbol).collect {
15541554
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
15551555
}.toList
15561556

1557-
def ClassDefSymbol_methods(self: Symbol)(given Context): List[DefDefSymbol] =
1557+
def Symbol_methods(self: Symbol)(given Context): List[DefDefSymbol] =
15581558
appliedTypeRef(self).allMembers.iterator.map(_.symbol).collect {
15591559
case sym if isMethod(sym) => sym.asTerm
15601560
}.toList
15611561

15621562
private def isMethod(sym: Symbol)(given Context): Boolean =
15631563
sym.isTerm && sym.is(Flags.Method) && !sym.isConstructor
15641564

1565-
def ClassDefSymbol_caseFields(self: Symbol)(given Context): List[ValDefSymbol] =
1565+
def Symbol_caseFields(self: Symbol)(given Context): List[ValDefSymbol] =
15661566
if (!self.isClass) Nil
15671567
else self.asClass.paramAccessors.collect {
15681568
case sym if sym.is(Flags.CaseAccessor) => sym.asTerm
15691569
}
15701570

1571-
def ClassDefSymbol_companionClass(self: Symbol)(given Context): Option[ClassDefSymbol] = {
1572-
val sym = self.companionModule.companionClass
1573-
if (sym.exists) Some(sym.asClass) else None
1574-
}
1575-
1576-
def ClassDefSymbol_companionModule(self: Symbol)(given Context): Option[ValDefSymbol] = {
1571+
def Symbol_companionModule(self: Symbol)(given Context): Option[ValDefSymbol] = {
15771572
val sym = self.companionModule
15781573
if (sym.exists) Some(sym.asTerm) else None
15791574
}
15801575

1581-
def ClassDefSymbol_moduleClass(self: Symbol)(given Context): Option[Symbol] = {
1582-
val sym = self.moduleClass
1583-
if (sym.exists) Some(sym.asTerm) else None
1584-
}
1585-
15861576
private def isField(sym: Symbol)(given Context): Boolean = sym.isTerm && !sym.is(Flags.Method)
15871577

1588-
def ClassDefSymbol_of(fullName: String)(given ctx: Context): ClassDefSymbol = ctx.requiredClass(fullName)
1578+
def Symbol_of(fullName: String)(given ctx: Context): ClassDefSymbol = ctx.requiredClass(fullName)
15891579

15901580
type TypeDefSymbol = core.Symbols.TypeSymbol
15911581

15921582
def isTypeDefSymbol(symbol: Symbol)(given Context): Boolean =
15931583
symbol.isType && !symbol.is(core.Flags.Case)
15941584

1595-
def TypeDefSymbol_isTypeParam(self: TypeDefSymbol)(given Context): Boolean =
1585+
def Symbol_isTypeParam(self: Symbol)(given Context): Boolean =
15961586
self.isTypeParam
15971587

15981588
type TypeBindSymbol = core.Symbols.TypeSymbol
@@ -1609,20 +1599,20 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
16091599
def isDefDefSymbol(symbol: Symbol)(given Context): Boolean =
16101600
symbol.isTerm && symbol.is(core.Flags.Method)
16111601

1612-
def DefDefSymbol_signature(self: DefDefSymbol)(given Context): Signature =
1602+
def Symbol_signature(self: Symbol)(given Context): Signature =
16131603
self.signature
16141604

16151605
type ValDefSymbol = core.Symbols.TermSymbol
16161606

16171607
def isValDefSymbol(symbol: Symbol)(given Context): Boolean =
16181608
symbol.isTerm && !symbol.is(core.Flags.Method) && !symbol.is(core.Flags.Case)
16191609

1620-
def ValDefSymbol_moduleClass(self: ValDefSymbol)(given Context): Option[ClassDefSymbol] = {
1610+
def Symbol_moduleClass(self: Symbol)(given Context): Option[ClassDefSymbol] = {
16211611
val sym = self.moduleClass
16221612
if (sym.exists) Some(sym.asClass) else None
16231613
}
16241614

1625-
def ValDefSymbol_companionClass(self: ValDefSymbol)(given Context): Option[ClassDefSymbol] = {
1615+
def Symbol_companionClass(self: Symbol)(given Context): Option[ClassDefSymbol] = {
16261616
val sym = self.companionClass
16271617
if (sym.exists) Some(sym.asClass) else None
16281618
}
@@ -1634,6 +1624,8 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
16341624

16351625
type NoSymbol = core.Symbols.NoSymbol.type
16361626

1627+
def Symbol_noSymbol(given ctx: Context): NoSymbol = core.Symbols.NoSymbol
1628+
16371629
def isNoSymbol(symbol: Symbol)(given Context): Boolean = symbol eq core.Symbols.NoSymbol
16381630

16391631
//

library/src/scala/tasty/reflect/CompilerInterface.scala

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,43 +1264,37 @@ trait CompilerInterface {
12641264
def isClassDefSymbol(symbol: Symbol)(given ctx: Context): Boolean
12651265

12661266
/** Fields directly declared in the class */
1267-
def ClassDefSymbol_fields(self: Symbol)(given ctx: Context): List[Symbol]
1267+
def Symbol_fields(self: Symbol)(given ctx: Context): List[Symbol]
12681268

12691269
/** Field with the given name directly declared in the class */
1270-
def ClassDefSymbol_field(self: Symbol)(name: String)(given ctx: Context): Option[Symbol]
1270+
def Symbol_field(self: Symbol)(name: String)(given ctx: Context): Option[Symbol]
12711271

12721272
/** Get non-private named methods defined directly inside the class */
1273-
def ClassDefSymbol_classMethod(self: Symbol)(name: String)(given ctx: Context): List[DefDefSymbol]
1273+
def Symbol_classMethod(self: Symbol)(name: String)(given ctx: Context): List[DefDefSymbol]
12741274

12751275
/** Get all non-private methods defined directly inside the class, excluding constructors */
1276-
def ClassDefSymbol_classMethods(self: Symbol)(given ctx: Context): List[DefDefSymbol]
1276+
def Symbol_classMethods(self: Symbol)(given ctx: Context): List[DefDefSymbol]
12771277

12781278
/** Get named non-private methods declared or inherited */
1279-
def ClassDefSymbol_method(self: Symbol)(name: String)(given ctx: Context): List[DefDefSymbol]
1279+
def Symbol_method(self: Symbol)(name: String)(given ctx: Context): List[DefDefSymbol]
12801280

12811281
/** Get all non-private methods declared or inherited */
1282-
def ClassDefSymbol_methods(self: Symbol)(given ctx: Context): List[DefDefSymbol]
1282+
def Symbol_methods(self: Symbol)(given ctx: Context): List[DefDefSymbol]
12831283

12841284
/** Fields of a case class type -- only the ones declared in primary constructor */
1285-
def ClassDefSymbol_caseFields(self: Symbol)(given ctx: Context): List[ValDefSymbol]
1286-
1287-
/** The class symbol of the companion module class */
1288-
def ClassDefSymbol_companionClass(self: Symbol)(given ctx: Context): Option[ClassDefSymbol]
1285+
def Symbol_caseFields(self: Symbol)(given ctx: Context): List[ValDefSymbol]
12891286

12901287
/** The symbol of the companion module */
1291-
def ClassDefSymbol_companionModule(self: Symbol)(given ctx: Context): Option[ValDefSymbol]
1288+
def Symbol_companionModule(self: Symbol)(given ctx: Context): Option[ValDefSymbol]
12921289

1293-
/** The symbol of the class of the companion module */
1294-
def ClassDefSymbol_moduleClass(self: Symbol)(given ctx: Context): Option[Symbol]
1295-
1296-
def ClassDefSymbol_of(fullName: String)(given ctx: Context): ClassDefSymbol
1290+
def Symbol_of(fullName: String)(given ctx: Context): ClassDefSymbol
12971291

12981292
/** Symbol of a type (parameter or member) definition. */
12991293
type TypeDefSymbol <: TypeSymbol
13001294

13011295
def isTypeDefSymbol(symbol: Symbol)(given ctx: Context): Boolean
13021296

1303-
def TypeDefSymbol_isTypeParam(self: TypeDefSymbol)(given ctx: Context): Boolean
1297+
def Symbol_isTypeParam(self: Symbol)(given ctx: Context): Boolean
13041298

13051299
/** Symbol representing a bind definition. */
13061300
type TypeBindSymbol <: TypeSymbol
@@ -1317,17 +1311,17 @@ trait CompilerInterface {
13171311
def isDefDefSymbol(symbol: Symbol)(given ctx: Context): Boolean
13181312

13191313
/** Signature of this definition */
1320-
def DefDefSymbol_signature(self: DefDefSymbol)(given ctx: Context): Signature
1314+
def Symbol_signature(self: Symbol)(given ctx: Context): Signature
13211315

13221316
/** Symbol representing a value definition. This includes `val`, `lazy val`, `var`, `object` and parameter definitions. */
13231317
type ValDefSymbol <: TermSymbol
13241318

13251319
def isValDefSymbol(symbol: Symbol)(given ctx: Context): Boolean
13261320

13271321
/** The class symbol of the companion module class */
1328-
def ValDefSymbol_moduleClass(self: ValDefSymbol)(given ctx: Context): Option[ClassDefSymbol]
1322+
def Symbol_moduleClass(self: Symbol)(given ctx: Context): Option[ClassDefSymbol]
13291323

1330-
def ValDefSymbol_companionClass(self: ValDefSymbol)(given ctx: Context): Option[ClassDefSymbol]
1324+
def Symbol_companionClass(self: Symbol)(given ctx: Context): Option[ClassDefSymbol]
13311325

13321326
/** Symbol representing a bind definition. */
13331327
type BindSymbol <: TermSymbol
@@ -1337,6 +1331,8 @@ trait CompilerInterface {
13371331
/** No symbol available. */
13381332
type NoSymbol <: Symbol
13391333

1334+
def Symbol_noSymbol(given ctx: Context): NoSymbol
1335+
13401336
def isNoSymbol(symbol: Symbol)(given ctx: Context): Boolean
13411337

13421338
//

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

Lines changed: 16 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ trait SymbolOps extends Core {
99
object Symbol {
1010
/** The ClassSymbol of a global class definition */
1111
def classSymbol(fullName: String)(given ctx: Context): ClassDefSymbol =
12-
internal.ClassDefSymbol_of(fullName)
12+
internal.Symbol_of(fullName)
13+
14+
def noSymbol(given ctx: Context): Symbol =
15+
internal.Symbol_noSymbol
1316
}
1417

1518
implicit class SymbolAPI(self: Symbol) {
@@ -101,69 +104,52 @@ trait SymbolOps extends Core {
101104
def isBind(given ctx: Context): Boolean = internal.isBindSymbol(self)
102105
def isPackageDef(given ctx: Context): Boolean = internal.isPackageDefSymbol(self)
103106
def isNoSymbol(given ctx: Context): Boolean = internal.isNoSymbol(self)
104-
}
105-
106-
implicit class ClassDefSymbolAPI(self: ClassDefSymbol) {
107107

108108
/** Fields directly declared in the class */
109109
def fields(given ctx: Context): List[Symbol] =
110-
internal.ClassDefSymbol_fields(self)
110+
internal.Symbol_fields(self)
111111

112112
/** Field with the given name directly declared in the class */
113113
def field(name: String)(given ctx: Context): Option[Symbol] =
114-
internal.ClassDefSymbol_field(self)(name)
114+
internal.Symbol_field(self)(name)
115115

116116
/** Get non-private named methods defined directly inside the class */
117117
def classMethod(name: String)(given ctx: Context): List[DefDefSymbol] =
118-
internal.ClassDefSymbol_classMethod(self)(name)
118+
internal.Symbol_classMethod(self)(name)
119119

120120
/** Get all non-private methods defined directly inside the class, exluding constructors */
121121
def classMethods(given ctx: Context): List[DefDefSymbol] =
122-
internal.ClassDefSymbol_classMethods(self)
122+
internal.Symbol_classMethods(self)
123123

124124
/** Get named non-private methods declared or inherited */
125125
def method(name: String)(given ctx: Context): List[DefDefSymbol] =
126-
internal.ClassDefSymbol_method(self)(name)
126+
internal.Symbol_method(self)(name)
127127

128128
/** Get all non-private methods declared or inherited */
129129
def methods(given ctx: Context): List[DefDefSymbol] =
130-
internal.ClassDefSymbol_methods(self)
130+
internal.Symbol_methods(self)
131131

132132
/** Fields of a case class type -- only the ones declared in primary constructor */
133133
def caseFields(given ctx: Context): List[ValDefSymbol] =
134-
internal.ClassDefSymbol_caseFields(self)
135-
136-
/** The class symbol of the companion module class */
137-
def companionClass(given ctx: Context): Option[ClassDefSymbol] =
138-
internal.ClassDefSymbol_companionClass(self)
134+
internal.Symbol_caseFields(self)
139135

140136
/** The symbol of the companion module */
141137
def companionModule(given ctx: Context): Option[ValDefSymbol] =
142-
internal.ClassDefSymbol_companionModule(self)
143-
144-
/** The symbol of the class of the companion module */
145-
def moduleClass(given ctx: Context): Option[Symbol] =
146-
internal.ClassDefSymbol_moduleClass(self)
147-
}
138+
internal.Symbol_companionModule(self)
148139

149-
implicit class TypeDefSymbolAPI(self: TypeDefSymbol) {
150140
def isTypeParam(given ctx: Context): Boolean =
151-
internal.TypeDefSymbol_isTypeParam(self)
152-
}
141+
internal.Symbol_isTypeParam(self)
153142

154-
implicit class DefDefSymbolAPI(self: DefDefSymbol) {
155143
/** Signature of this defintion */
156144
def signature(given ctx: Context): Signature =
157-
internal.DefDefSymbol_signature(self)
158-
}
145+
internal.Symbol_signature(self)
159146

160-
implicit class ValDefSymbolAPI(self: ValDefSymbol) {
161147
/** The class symbol of the companion module class */
162148
def moduleClass(given ctx: Context): Option[ClassDefSymbol] =
163-
internal.ValDefSymbol_moduleClass(self)
149+
internal.Symbol_moduleClass(self)
164150

165151
def companionClass(given ctx: Context): Option[ClassDefSymbol] =
166-
internal.ValDefSymbol_companionClass(self)
152+
internal.Symbol_companionClass(self)
167153
}
168154

169155
}

tests/run-macros/gestalt-type-toolbox-reflect/Macro_1.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ object TypeToolbox {
9898
import qctx.tasty._
9999
val sym = tp.unseal.symbol
100100
val companionClassOpt =
101-
if sym.isClassDef then sym.asClassDef.companionClass
101+
if sym.isClassDef then sym.asClassDef.companionModule.getOrElse(Symbol.noSymbol).companionClass
102102
else if sym.isValDef then sym.asValDef.companionClass
103103
else None
104104
Expr(companionClassOpt.map(_.fullName).getOrElse(""))

0 commit comments

Comments
 (0)