@@ -3,7 +3,7 @@ package tastyreflect
3
3
4
4
import dotty .tools .dotc .ast .{Trees , tpd , untpd }
5
5
import dotty .tools .dotc .ast .tpd .TreeOps
6
- import dotty .tools .dotc .core .{ Constants , NameKinds , Names , Types }
6
+ import dotty .tools .dotc .core ._
7
7
import dotty .tools .dotc .core .Flags ._
8
8
import dotty .tools .dotc .core .StdNames .nme
9
9
import dotty .tools .dotc .core .quoted .PickledQuotes
@@ -1410,31 +1410,125 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
1410
1410
def isPackageSymbol (symbol : Symbol )(implicit ctx : Context ): Option [PackageSymbol ] =
1411
1411
if (symbol.is(core.Flags .Package )) Some (symbol) else None
1412
1412
1413
+ def PackageSymbol_tree (self : PackageSymbol )(implicit ctx : Context ): PackageDef =
1414
+ FromSymbol .packageDefFromSym(self)
1415
+
1413
1416
type ClassSymbol = core.Symbols .ClassSymbol
1414
1417
1415
1418
def isClassSymbol (symbol : Symbol )(implicit ctx : Context ): Option [ClassSymbol ] =
1416
1419
if (symbol.isClass) Some (symbol.asClass) else None
1417
1420
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
+
1418
1485
type TypeSymbol = core.Symbols .TypeSymbol
1419
1486
1420
1487
def isTypeSymbol (symbol : Symbol )(implicit ctx : Context ): Option [TypeSymbol ] =
1421
1488
if (symbol.isType) Some (symbol.asType) else None
1422
1489
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
+
1423
1495
type DefSymbol = core.Symbols .TermSymbol
1424
1496
1425
1497
def isDefSymbol (symbol : Symbol )(implicit ctx : Context ): Option [DefSymbol ] =
1426
1498
if (symbol.isTerm && symbol.is(core.Flags .Method )) Some (symbol.asTerm) else None
1427
1499
1428
- type BindSymbol = core.Symbols .TermSymbol
1500
+ def DefSymbol_tree (self : DefSymbol )(implicit ctx : Context ): DefDef =
1501
+ FromSymbol .defDefFromSym(self)
1429
1502
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
1432
1505
1433
1506
type ValSymbol = core.Symbols .TermSymbol
1434
1507
1435
1508
def isValSymbol (symbol : Symbol )(implicit ctx : Context ): Option [ValSymbol ] =
1436
1509
if (symbol.isTerm && ! symbol.is(core.Flags .Method ) && ! symbol.is(core.Flags .Case )) Some (symbol.asTerm) else None
1437
1510
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
+
1438
1532
type NoSymbol = core.Symbols .NoSymbol .type
1439
1533
1440
1534
def isNoSymbol (symbol : Symbol )(implicit ctx : Context ): Boolean = symbol ne core.Symbols .NoSymbol
0 commit comments