Skip to content

Commit 869bca6

Browse files
Merge pull request #7313 from dotty-staging/tasty-reflect-symbol-refactorings
Tasty reflect symbol refactorings
2 parents e7f0e2a + d8d28bd commit 869bca6

File tree

24 files changed

+315
-603
lines changed

24 files changed

+315
-603
lines changed

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

Lines changed: 57 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
156156
if (self.symbol.is(core.Flags.JavaDefined)) Nil // FIXME should also support java packages
157157
else self.symbol.info.decls.iterator.map(definitionFromSym).toList
158158

159-
def PackageDef_symbol(self: PackageDef)(given Context): PackageDefSymbol = self.symbol
159+
def PackageDef_symbol(self: PackageDef)(given Context): Symbol = self.symbol
160160

161161
type ClassDef = tpd.TypeDef
162162

@@ -170,7 +170,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
170170
def ClassDef_derived(self: ClassDef)(given Context): List[TypeTree] = ClassDef_rhs(self).derived.asInstanceOf[List[TypeTree]]
171171
def ClassDef_self(self: ClassDef)(given Context): Option[ValDef] = optional(ClassDef_rhs(self).self)
172172
def ClassDef_body(self: ClassDef)(given Context): List[Statement] = ClassDef_rhs(self).body
173-
def ClassDef_symbol(self: ClassDef)(given Context): ClassDefSymbol = self.symbol.asClass
173+
def ClassDef_symbol(self: ClassDef)(given Context): Symbol = self.symbol.asClass
174174
private def ClassDef_rhs(self: ClassDef) = self.rhs.asInstanceOf[tpd.Template]
175175

176176
def ClassDef_copy(original: ClassDef)(name: String, constr: DefDef, parents: List[Term | TypeTree], derived: List[TypeTree], selfOpt: Option[ValDef], body: List[Statement])(given Context): ClassDef = {
@@ -186,9 +186,9 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
186186
}
187187

188188
def TypeDef_rhs(self: TypeDef)(given Context): TypeTree | TypeBoundsTree = self.rhs
189-
def TypeDef_symbol(self: TypeDef)(given Context): TypeDefSymbol = self.symbol.asType
189+
def TypeDef_symbol(self: TypeDef)(given Context): Symbol = self.symbol.asType
190190

191-
def TypeDef_apply(symbol: TypeDefSymbol)(given Context): TypeDef = withDefaultPos(tpd.TypeDef(symbol))
191+
def TypeDef_apply(symbol: Symbol)(given Context): TypeDef = withDefaultPos(tpd.TypeDef(symbol.asType))
192192
def TypeDef_copy(original: TypeDef)(name: String, rhs: TypeTree | TypeBoundsTree)(given Context): TypeDef =
193193
tpd.cpy.TypeDef(original)(name.toTypeName, rhs)
194194

@@ -203,10 +203,10 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
203203
def DefDef_paramss(self: DefDef)(given Context): List[List[ValDef]] = self.vparamss
204204
def DefDef_returnTpt(self: DefDef)(given Context): TypeTree = self.tpt
205205
def DefDef_rhs(self: DefDef)(given Context): Option[Tree] = optional(self.rhs)
206-
def DefDef_symbol(self: DefDef)(given Context): DefDefSymbol = self.symbol.asTerm
206+
def DefDef_symbol(self: DefDef)(given Context): Symbol = self.symbol.asTerm
207207

208-
def DefDef_apply(symbol: DefDefSymbol, rhsFn: List[Type] => List[List[Term]] => Option[Term])(given Context): DefDef =
209-
withDefaultPos(tpd.polyDefDef(symbol, tparams => vparamss => rhsFn(tparams)(vparamss).getOrElse(tpd.EmptyTree)))
208+
def DefDef_apply(symbol: Symbol, rhsFn: List[Type] => List[List[Term]] => Option[Term])(given Context): DefDef =
209+
withDefaultPos(tpd.polyDefDef(symbol.asTerm, tparams => vparamss => rhsFn(tparams)(vparamss).getOrElse(tpd.EmptyTree)))
210210

211211
def DefDef_copy(original: DefDef)(name: String, typeParams: List[TypeDef], paramss: List[List[ValDef]], tpt: TypeTree, rhs: Option[Term])(given Context): DefDef =
212212
tpd.cpy.DefDef(original)(name.toTermName, typeParams, paramss, tpt, rhs.getOrElse(tpd.EmptyTree))
@@ -220,10 +220,10 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
220220

221221
def ValDef_tpt(self: ValDef)(given Context): TypeTree = self.tpt
222222
def ValDef_rhs(self: ValDef)(given Context): Option[Tree] = optional(self.rhs)
223-
def ValDef_symbol(self: ValDef)(given Context): ValDefSymbol = self.symbol.asTerm
223+
def ValDef_symbol(self: ValDef)(given Context): Symbol = self.symbol.asTerm
224224

225-
def ValDef_apply(symbol: ValDefSymbol, rhs: Option[Term])(given Context): ValDef =
226-
tpd.ValDef(symbol, rhs.getOrElse(tpd.EmptyTree))
225+
def ValDef_apply(symbol: Symbol, rhs: Option[Term])(given Context): ValDef =
226+
tpd.ValDef(symbol.asTerm, rhs.getOrElse(tpd.EmptyTree))
227227

228228
def ValDef_copy(original: ValDef)(name: String, tpt: TypeTree, rhs: Option[Term])(given Context): ValDef =
229229
tpd.cpy.ValDef(original)(name.toTermName, tpt, rhs.getOrElse(tpd.EmptyTree))
@@ -319,8 +319,8 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
319319

320320
def This_id(self: This)(given Context): Option[Id] = optional(self.qual)
321321

322-
def This_apply(cls: ClassDefSymbol)(given Context): This =
323-
withDefaultPos(tpd.This(cls))
322+
def This_apply(cls: Symbol)(given Context): This =
323+
withDefaultPos(tpd.This(cls.asClass))
324324

325325
def This_copy(original: Tree)(qual: Option[Id])(given Context): This =
326326
tpd.cpy.This(original)(qual.getOrElse(untpd.EmptyTypeIdent))
@@ -1088,7 +1088,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
10881088

10891089
def Type_simplified(self: Type)(given Context): Type = self.simplified
10901090

1091-
def Type_classSymbol(self: Type)(given Context): Option[ClassDefSymbol] =
1091+
def Type_classSymbol(self: Type)(given Context): Option[Symbol] =
10921092
if (self.classSymbol.exists) Some(self.classSymbol.asClass) else None
10931093

10941094
def Type_typeSymbol(self: Type)(given Context): Symbol = self.typeSymbol
@@ -1100,7 +1100,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
11001100
def Type_memberType(self: Type)(member: Symbol)(given Context): Type =
11011101
member.info.asSeenFrom(self, member.owner)
11021102

1103-
def Type_derivesFrom(self: Type)(cls: ClassDefSymbol)(given Context): Boolean =
1103+
def Type_derivesFrom(self: Type)(cls: Symbol)(given Context): Boolean =
11041104
self.derivesFrom(cls)
11051105

11061106
def Type_isFunctionType(self: Type)(given Context): Boolean =
@@ -1458,6 +1458,16 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
14581458

14591459
def Symbol_flags(self: Symbol)(given Context): Flags = self.flags
14601460

1461+
def Symbol_tree(self: Symbol)(given Context): Tree = {
1462+
assert(!self.is(Case, butNot = Enum | Module))
1463+
FromSymbol.definitionFromSym(self)
1464+
}
1465+
1466+
def Symbol_pattern(self: Symbol)(given ctx: Context): Pattern = {
1467+
assert(self.is(Case, butNot = Enum | Module))
1468+
FromSymbol.definitionFromSym(self)
1469+
}
1470+
14611471
def Symbol_privateWithin(self: Symbol)(given Context): Option[Type] = {
14621472
val within = self.privateWithin
14631473
if (within.exists && !self.is(core.Flags.Protected)) Some(within.typeRef)
@@ -1506,148 +1516,88 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
15061516
def Symbol_isAbstractType(self: Symbol)(given Context): Boolean = self.isAbstractType
15071517
def Symbol_isClassConstructor(self: Symbol)(given Context): Boolean = self.isClassConstructor
15081518

1509-
type PackageDefSymbol = core.Symbols.Symbol
1510-
1511-
def matchPackageDefSymbol(symbol: Symbol)(given Context): Option[PackageDefSymbol] =
1512-
if (symbol.is(core.Flags.Package)) Some(symbol) else None
1513-
1514-
def PackageDefSymbol_tree(self: PackageDefSymbol)(given Context): PackageDef =
1515-
FromSymbol.packageDefFromSym(self)
1516-
1517-
type TypeSymbol = core.Symbols.TypeSymbol
1518-
1519-
def matchTypeSymbol(symbol: Symbol)(given Context): Option[TypeSymbol] =
1520-
if (symbol.isType) Some(symbol.asType) else None
1521-
1522-
type ClassDefSymbol = core.Symbols.ClassSymbol
1523-
1524-
def matchClassDefSymbol(symbol: Symbol)(given Context): Option[ClassDefSymbol] =
1525-
if (symbol.isClass) Some(symbol.asClass) else None
1526-
1527-
def ClassDefSymbol_tree(self: ClassDefSymbol)(given Context): ClassDef =
1528-
FromSymbol.classDef(self)
1529-
1530-
def ClassDefSymbol_fields(self: Symbol)(given Context): List[Symbol] =
1519+
def Symbol_fields(self: Symbol)(given Context): List[Symbol] =
15311520
self.unforcedDecls.filter(isField)
15321521

1533-
def ClassDefSymbol_field(self: Symbol)(name: String)(given Context): Option[Symbol] = {
1522+
def Symbol_field(self: Symbol)(name: String)(given Context): Symbol = {
15341523
val sym = self.unforcedDecls.find(sym => sym.name == name.toTermName)
1535-
if (sym.exists && isField(sym)) Some(sym) else None
1524+
if (isField(sym)) sym else core.Symbols.NoSymbol
15361525
}
15371526

1538-
def ClassDefSymbol_classMethod(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
1527+
def Symbol_classMethod(self: Symbol)(name: String)(given Context): List[Symbol] =
15391528
self.typeRef.decls.iterator.collect {
15401529
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
15411530
}.toList
15421531

1543-
def ClassDefSymbol_classMethods(self: Symbol)(given Context): List[DefDefSymbol] =
1532+
def Symbol_classMethods(self: Symbol)(given Context): List[Symbol] =
15441533
self.typeRef.decls.iterator.collect {
15451534
case sym if isMethod(sym) => sym.asTerm
15461535
}.toList
15471536

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

1550-
def ClassDefSymbol_method(self: Symbol)(name: String)(given Context): List[DefDefSymbol] =
1539+
def Symbol_method(self: Symbol)(name: String)(given Context): List[Symbol] =
15511540
appliedTypeRef(self).allMembers.iterator.map(_.symbol).collect {
15521541
case sym if isMethod(sym) && sym.name.toString == name => sym.asTerm
15531542
}.toList
15541543

1555-
def ClassDefSymbol_methods(self: Symbol)(given Context): List[DefDefSymbol] =
1544+
def Symbol_methods(self: Symbol)(given Context): List[Symbol] =
15561545
appliedTypeRef(self).allMembers.iterator.map(_.symbol).collect {
15571546
case sym if isMethod(sym) => sym.asTerm
15581547
}.toList
15591548

15601549
private def isMethod(sym: Symbol)(given Context): Boolean =
15611550
sym.isTerm && sym.is(Flags.Method) && !sym.isConstructor
15621551

1563-
def ClassDefSymbol_caseFields(self: Symbol)(given Context): List[ValDefSymbol] =
1552+
def Symbol_caseFields(self: Symbol)(given Context): List[Symbol] =
15641553
if (!self.isClass) Nil
15651554
else self.asClass.paramAccessors.collect {
15661555
case sym if sym.is(Flags.CaseAccessor) => sym.asTerm
15671556
}
15681557

1569-
def ClassDefSymbol_companionClass(self: Symbol)(given Context): Option[ClassDefSymbol] = {
1570-
val sym = self.companionModule.companionClass
1571-
if (sym.exists) Some(sym.asClass) else None
1572-
}
1573-
1574-
def ClassDefSymbol_companionModule(self: Symbol)(given Context): Option[ValDefSymbol] = {
1575-
val sym = self.companionModule
1576-
if (sym.exists) Some(sym.asTerm) else None
1577-
}
1578-
1579-
def ClassDefSymbol_moduleClass(self: Symbol)(given Context): Option[Symbol] = {
1580-
val sym = self.moduleClass
1581-
if (sym.exists) Some(sym.asTerm) else None
1582-
}
1583-
15841558
private def isField(sym: Symbol)(given Context): Boolean = sym.isTerm && !sym.is(Flags.Method)
15851559

1586-
def ClassDefSymbol_of(fullName: String)(given ctx: Context): ClassDefSymbol = ctx.requiredClass(fullName)
1560+
def Symbol_of(fullName: String)(given ctx: Context): Symbol =
1561+
ctx.requiredClass(fullName)
15871562

1588-
type TypeDefSymbol = core.Symbols.TypeSymbol
1589-
1590-
def matchTypeDefSymbol(symbol: Symbol)(given Context): Option[TypeDefSymbol] =
1591-
if (symbol.isType) Some(symbol.asType) else None
1592-
1593-
def TypeDefSymbol_tree(self: TypeDefSymbol)(given Context): TypeDef =
1594-
FromSymbol.typeDefFromSym(self)
1595-
def TypeDefSymbol_isTypeParam(self: TypeDefSymbol)(given Context): Boolean =
1563+
def Symbol_isTypeParam(self: Symbol)(given Context): Boolean =
15961564
self.isTypeParam
15971565

1598-
type TypeBindSymbol = core.Symbols.TypeSymbol
1566+
def Symbol_isType(symbol: Symbol)(given Context): Boolean =
1567+
symbol.isType
15991568

1600-
def matchTypeBindSymbol(symbol: Symbol)(given Context): Option[TypeBindSymbol] =
1601-
if (symbol.isType && symbol.is(core.Flags.Case)) Some(symbol.asType) else None
1569+
def Symbol_isTerm(symbol: Symbol)(given Context): Boolean =
1570+
symbol.isTerm
16021571

1603-
def TypeBindSymbol_tree(self: TypeBindSymbol)(given Context): TypeBind =
1604-
FromSymbol.typeBindFromSym(self)
1572+
def Symbol_isPackageDef(symbol: Symbol)(given ctx: Context): Boolean =
1573+
symbol.is(Flags.Package)
16051574

1606-
type TermSymbol = core.Symbols.TermSymbol
1575+
def Symbol_isClassDef(symbol: Symbol)(given Context): Boolean =
1576+
symbol.isClass
16071577

1608-
def matchTermSymbol(symbol: Symbol)(given Context): Option[TermSymbol] =
1609-
if (symbol.isTerm) Some(symbol.asTerm) else None
1578+
def Symbol_isTypeDef(symbol: Symbol)(given ctx: Context): Boolean =
1579+
symbol.isType && !symbol.isClass && !symbol.is(Flags.Case)
16101580

1611-
type DefDefSymbol = core.Symbols.TermSymbol
1581+
def Symbol_isValDef(symbol: Symbol)(given Context): Boolean =
1582+
symbol.isTerm && !symbol.is(core.Flags.Method) && !symbol.is(core.Flags.Case/*, FIXME add this check and fix sourcecode butNot = Enum | Module*/)
16121583

1613-
def matchDefDefSymbol(symbol: Symbol)(given Context): Option[DefDefSymbol] =
1614-
if (symbol.isTerm && symbol.is(core.Flags.Method)) Some(symbol.asTerm) else None
1584+
def Symbol_isDefDef(symbol: Symbol)(given Context): Boolean =
1585+
symbol.is(core.Flags.Method)
16151586

1616-
def DefDefSymbol_tree(self: DefDefSymbol)(given Context): DefDef =
1617-
FromSymbol.defDefFromSym(self)
1587+
def Symbol_isBind(symbol: Symbol)(given Context): Boolean =
1588+
symbol.is(core.Flags.Case, butNot = Enum | Module) && !symbol.isClass
16181589

1619-
def DefDefSymbol_signature(self: DefDefSymbol)(given Context): Signature =
1590+
def Symbol_signature(self: Symbol)(given Context): Signature =
16201591
self.signature
16211592

1622-
type ValDefSymbol = core.Symbols.TermSymbol
1623-
1624-
def matchValDefSymbol(symbol: Symbol)(given Context): Option[ValDefSymbol] =
1625-
if (symbol.isTerm && !symbol.is(core.Flags.Method) && !symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1626-
1627-
def ValDefSymbol_tree(self: ValDefSymbol)(given Context): ValDef =
1628-
FromSymbol.valDefFromSym(self)
1629-
1630-
def ValDefSymbol_moduleClass(self: ValDefSymbol)(given Context): Option[ClassDefSymbol] = {
1631-
val sym = self.moduleClass
1632-
if (sym.exists) Some(sym.asClass) else None
1633-
}
1634-
1635-
def ValDefSymbol_companionClass(self: ValDefSymbol)(given Context): Option[ClassDefSymbol] = {
1636-
val sym = self.companionClass
1637-
if (sym.exists) Some(sym.asClass) else None
1638-
}
1639-
1640-
type BindSymbol = core.Symbols.TermSymbol
16411593

1642-
def matchBindSymbol(symbol: Symbol)(given Context): Option[BindSymbol] =
1643-
if (symbol.isTerm && symbol.is(core.Flags.Case)) Some(symbol.asTerm) else None
1594+
def Symbol_moduleClass(self: Symbol)(given Context): Symbol = self.moduleClass
16441595

1645-
def BindSymbol_tree(self: BindSymbol)(given Context): Bind =
1646-
FromSymbol.bindFromSym(self)
1596+
def Symbol_companionClass(self: Symbol)(given Context): Symbol = self.companionClass
16471597

1648-
type NoSymbol = core.Symbols.NoSymbol.type
1598+
def Symbol_companionModule(self: Symbol)(given Context): Symbol = self.companionModule
16491599

1650-
def matchNoSymbol(symbol: Symbol)(given Context): Boolean = symbol eq core.Symbols.NoSymbol
1600+
def Symbol_noSymbol(given ctx: Context): Symbol = core.Symbols.NoSymbol
16511601

16521602
//
16531603
// FLAGS
@@ -1792,7 +1742,7 @@ class ReflectionCompilerInterface(val rootContext: core.Contexts.Context) extend
17921742
def Definitions_Array_length: Symbol = defn.Array_length.asTerm
17931743
def Definitions_Array_update: Symbol = defn.Array_update.asTerm
17941744

1795-
def Definitions_RepeatedParamClass: ClassDefSymbol = defn.RepeatedParamClass
1745+
def Definitions_RepeatedParamClass: Symbol = defn.RepeatedParamClass
17961746

17971747
def Definitions_OptionClass: Symbol = defn.OptionClass
17981748
def Definitions_NoneModule: Symbol = defn.NoneModule

0 commit comments

Comments
 (0)