@@ -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
@@ -1425,31 +1425,125 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
1425
1425
def isPackageSymbol (symbol : Symbol )(implicit ctx : Context ): Option [PackageSymbol ] =
1426
1426
if (symbol.is(core.Flags .Package )) Some (symbol) else None
1427
1427
1428
+ def PackageSymbol_tree (self : PackageSymbol )(implicit ctx : Context ): PackageDef =
1429
+ FromSymbol .packageDefFromSym(self)
1430
+
1428
1431
type ClassSymbol = core.Symbols .ClassSymbol
1429
1432
1430
1433
def isClassSymbol (symbol : Symbol )(implicit ctx : Context ): Option [ClassSymbol ] =
1431
1434
if (symbol.isClass) Some (symbol.asClass) else None
1432
1435
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
+
1433
1500
type TypeSymbol = core.Symbols .TypeSymbol
1434
1501
1435
1502
def isTypeSymbol (symbol : Symbol )(implicit ctx : Context ): Option [TypeSymbol ] =
1436
1503
if (symbol.isType) Some (symbol.asType) else None
1437
1504
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
+
1438
1510
type DefSymbol = core.Symbols .TermSymbol
1439
1511
1440
1512
def isDefSymbol (symbol : Symbol )(implicit ctx : Context ): Option [DefSymbol ] =
1441
1513
if (symbol.isTerm && symbol.is(core.Flags .Method )) Some (symbol.asTerm) else None
1442
1514
1443
- type BindSymbol = core.Symbols .TermSymbol
1515
+ def DefSymbol_tree (self : DefSymbol )(implicit ctx : Context ): DefDef =
1516
+ FromSymbol .defDefFromSym(self)
1444
1517
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
1447
1520
1448
1521
type ValSymbol = core.Symbols .TermSymbol
1449
1522
1450
1523
def isValSymbol (symbol : Symbol )(implicit ctx : Context ): Option [ValSymbol ] =
1451
1524
if (symbol.isTerm && ! symbol.is(core.Flags .Method ) && ! symbol.is(core.Flags .Case )) Some (symbol.asTerm) else None
1452
1525
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
+
1453
1547
type NoSymbol = core.Symbols .NoSymbol .type
1454
1548
1455
1549
def isNoSymbol (symbol : Symbol )(implicit ctx : Context ): Boolean = symbol ne core.Symbols .NoSymbol
0 commit comments