Skip to content

Commit a8818cc

Browse files
Merge pull request #4991 from dotty-staging/use-tasty-reflect-symbols
Use symbol instead of definition tree in TASTy reflect
2 parents 784601f + 0d726cc commit a8818cc

23 files changed

+334
-297
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ trait ContextOpsImpl extends scala.tasty.reflect.ContextOps with TastyCoreImpl {
99
val rootContext: Contexts.Context
1010

1111
def ContextDeco(ctx: Context): ContextAPI = new ContextAPI {
12-
def owner: Definition = definitionFromSym(ctx.owner)(ctx)
12+
def owner: Symbol = ctx.owner
1313

1414
def source: java.nio.file.Path = ctx.compilationUnit.source.file.jpath
1515
}

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

Lines changed: 51 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,54 +11,58 @@ trait StandardDefinitions extends scala.tasty.reflect.StandardDefinitions {
1111

1212
val definitions: DefinitionsApi = new DefinitionsApi {
1313

14-
def RootPackage: PackageDef = packageDefFromSym(defn.RootPackage)
15-
16-
def ScalaPackage: PackageDef = packageDefFromSym(defn.ScalaPackageVal)
17-
18-
def AnyClass: ClassDef = classDef(defn.AnyClass)
19-
def AnyValClass: ClassDef = classDef(defn.AnyValClass)
20-
def ObjectClass: ClassDef = classDef(defn.ObjectClass)
21-
def AnyRefClass: TypeDef = typeDefFromSym(defn.AnyRefAlias)
22-
def NullClass: ClassDef = classDef(defn.AnyClass)
23-
def NothingClass: ClassDef = classDef(defn.NothingClass)
24-
def UnitClass: ClassDef = classDef(defn.UnitClass)
25-
def ByteClass: ClassDef = classDef(defn.ByteClass)
26-
def ShortClass: ClassDef = classDef(defn.ShortClass)
27-
def CharClass: ClassDef = classDef(defn.CharClass)
28-
def IntClass: ClassDef = classDef(defn.IntClass)
29-
def LongClass: ClassDef = classDef(defn.LongClass)
30-
def FloatClass: ClassDef = classDef(defn.FloatClass)
31-
def DoubleClass: ClassDef = classDef(defn.DoubleClass)
32-
def BooleanClass: ClassDef = classDef(defn.BooleanClass)
33-
def StringClass: ClassDef = classDef(defn.StringClass)
34-
def ClassClass: ClassDef = classDef(defn.ClassClass)
35-
def ArrayClass: ClassDef = classDef(defn.ArrayClass)
36-
def PredefModule: ValDef = valDefFromSym(defn.ScalaPredefModule.asTerm)
37-
38-
def JavaLangPackage: PackageDef = packageDefFromSym(defn.JavaLangPackageVal)
39-
40-
def ArrayModule: ValDef = valDefFromSym(defn.ArrayClass.companionModule.asTerm)
41-
42-
def Array_apply: DefDef = defDefFromSym(defn.Array_apply.asTerm)
43-
def Array_clone: DefDef = defDefFromSym(defn.Array_clone.asTerm)
44-
def Array_length: DefDef = defDefFromSym(defn.Array_length.asTerm)
45-
def Array_update: DefDef = defDefFromSym(defn.Array_update.asTerm)
46-
47-
def RepeatedParamClass: ClassDef = classDef(defn.RepeatedParamClass)
48-
49-
def OptionClass: TypeDef = classDef(defn.OptionClass)
50-
def NoneModule: ValDef = valDefFromSym(defn.NoneClass.companionModule.asTerm)
51-
def SomeModule: ValDef = valDefFromSym(defn.SomeClass.companionModule.asTerm)
52-
53-
def ProductClass: ClassDef = classDef(defn.ProductClass)
54-
def FunctionClass(arity: Int, isImplicit: Boolean = false, isErased: Boolean = false): ClassDef =
55-
classDef(defn.FunctionClass(arity, isImplicit, isErased).asClass)
56-
def TupleClass(arity: Int): ClassDef = classDef(defn.TupleType(arity).classSymbol.asClass)
57-
58-
59-
def ScalaPrimitiveValueClasses: List[ClassDef] =
14+
def RootPackage: Symbol = defn.RootPackage
15+
def RootClass: Symbol = defn.RootClass
16+
17+
def EmptyPackageClass: Symbol = defn.EmptyPackageClass
18+
19+
def ScalaPackage: Symbol = defn.ScalaPackageVal
20+
def ScalaPackageClass: Symbol = defn.ScalaPackageClass
21+
22+
def AnyClass: Symbol = defn.AnyClass
23+
def AnyValClass: Symbol = defn.AnyValClass
24+
def ObjectClass: Symbol = defn.ObjectClass
25+
def AnyRefClass: Symbol = defn.AnyRefAlias
26+
def NullClass: Symbol = defn.AnyClass
27+
def NothingClass: Symbol = defn.NothingClass
28+
def UnitClass: Symbol = defn.UnitClass
29+
def ByteClass: Symbol = defn.ByteClass
30+
def ShortClass: Symbol = defn.ShortClass
31+
def CharClass: Symbol = defn.CharClass
32+
def IntClass: Symbol = defn.IntClass
33+
def LongClass: Symbol = defn.LongClass
34+
def FloatClass: Symbol = defn.FloatClass
35+
def DoubleClass: Symbol = defn.DoubleClass
36+
def BooleanClass: Symbol = defn.BooleanClass
37+
def StringClass: Symbol = defn.StringClass
38+
def ClassClass: Symbol = defn.ClassClass
39+
def ArrayClass: Symbol = defn.ArrayClass
40+
def PredefModule: Symbol = defn.ScalaPredefModule.asTerm
41+
42+
def JavaLangPackage: Symbol = defn.JavaLangPackageVal
43+
44+
def ArrayModule: Symbol = defn.ArrayClass.companionModule.asTerm
45+
46+
def Array_apply: Symbol = defn.Array_apply.asTerm
47+
def Array_clone: Symbol = defn.Array_clone.asTerm
48+
def Array_length: Symbol = defn.Array_length.asTerm
49+
def Array_update: Symbol = defn.Array_update.asTerm
50+
51+
def RepeatedParamClass: Symbol = defn.RepeatedParamClass
52+
53+
def OptionClass: Symbol = defn.OptionClass
54+
def NoneModule: Symbol = defn.NoneClass.companionModule.asTerm
55+
def SomeModule: Symbol = defn.SomeClass.companionModule.asTerm
56+
57+
def ProductClass: Symbol = defn.ProductClass
58+
def FunctionClass(arity: Int, isImplicit: Boolean = false, isErased: Boolean = false): Symbol =
59+
defn.FunctionClass(arity, isImplicit, isErased).asClass
60+
def TupleClass(arity: Int): Symbol = defn.TupleType(arity).classSymbol.asClass
61+
62+
63+
def ScalaPrimitiveValueClasses: List[Symbol] =
6064
UnitClass :: BooleanClass :: ScalaNumericValueClasses
61-
def ScalaNumericValueClasses: List[ClassDef] =
65+
def ScalaNumericValueClasses: List[Symbol] =
6266
ByteClass :: ShortClass :: IntClass :: LongClass :: FloatClass :: DoubleClass :: CharClass :: Nil
6367

6468
def UnitType: Type = defn.UnitType
Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,49 @@
1-
package dotty.tools.dotc.tastyreflect
1+
package dotty.tools.dotc
2+
package tastyreflect
23

34
import dotty.tools.dotc.core.Symbols._
45

56
trait SymbolOpsImpl extends scala.tasty.reflect.SymbolOps with TastyCoreImpl {
67

78
def SymbolDeco(symbol: Symbol): SymbolAPI = new SymbolAPI {
8-
def isEmpty: Boolean = symbol eq NoSymbol
9-
def localContext(implicit ctx: Context): Context = ctx.withOwner(symbol)
9+
10+
def exists(implicit ctx: Context): Boolean = symbol eq NoSymbol
11+
def isClass(implicit ctx: Context): Boolean = symbol.isClass
12+
13+
def flags(implicit ctx: Context): FlagSet = new FlagSet(symbol.flags)
14+
15+
def privateWithin(implicit ctx: Context): Option[Type] = {
16+
val within = symbol.privateWithin
17+
if (within.exists && !symbol.is(core.Flags.Protected)) Some(within.typeRef)
18+
else None
19+
}
20+
21+
def protectedWithin(implicit ctx: Context): Option[Type] = {
22+
val within = symbol.privateWithin
23+
if (within.exists && symbol.is(core.Flags.Protected)) Some(within.typeRef)
24+
else None
25+
}
26+
27+
def name(implicit ctx: Context): String = symbol.name.toString
28+
def fullName(implicit ctx: Context): String = symbol.fullName.toString
29+
30+
def owner(implicit ctx: Context): Symbol = symbol.owner
31+
32+
def localContext(implicit ctx: Context): Context = {
33+
if (symbol.exists) ctx.withOwner(symbol)
34+
else ctx
35+
}
36+
1037
def tree(implicit ctx: Context): Option[Definition] =
11-
if (isEmpty) None else Some(FromSymbol.definitionFromSym(symbol))
38+
if (exists) None else Some(FromSymbol.definitionFromSym(symbol))
39+
40+
def annots(implicit ctx: Context): List[Term] = {
41+
symbol.annotations.flatMap {
42+
case _: core.Annotations.LazyBodyAnnotation => Nil
43+
case annot => annot.tree :: Nil
44+
}
45+
}
46+
1247
}
1348

1449
}

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

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -60,36 +60,7 @@ trait TreeOpsImpl extends scala.tasty.reflect.TreeOps with TastyCoreImpl with He
6060
}
6161

6262
def DefinitionDeco(definition: Definition): DefinitionAPI = new DefinitionAPI {
63-
6463
def name(implicit ctx: Context): String = definition.symbol.name.toString
65-
66-
def owner(implicit ctx: Context): Definition = definitionFromSym(definition.symbol.owner)
67-
68-
def flags(implicit ctx: Context): FlagSet =
69-
new FlagSet(definition.symbol.flags)
70-
71-
def privateWithin(implicit ctx: Context): Option[Type] = {
72-
val within = definition.symbol.privateWithin
73-
if (within.exists && !definition.symbol.is(core.Flags.Protected)) Some(within.typeRef)
74-
else None
75-
}
76-
77-
def protectedWithin(implicit ctx: Context): Option[Type] = {
78-
val within = definition.symbol.privateWithin
79-
if (within.exists && definition.symbol.is(core.Flags.Protected)) Some(within.typeRef)
80-
else None
81-
}
82-
83-
def annots(implicit ctx: Context): List[Term] = {
84-
definition.symbol.annotations.flatMap {
85-
case _: core.Annotations.LazyBodyAnnotation => Nil
86-
case annot => annot.tree :: Nil
87-
}
88-
}
89-
90-
def localContext(implicit ctx: Context): Context =
91-
if (definition.hasType && definition.symbol.exists) ctx.withOwner(definition.symbol)
92-
else ctx
9364
}
9465

9566
// ClassDef

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ trait TypeOrBoundsOpsImpl extends scala.tasty.reflect.TypeOrBoundsOps with Tasty
5151
}
5252

5353
object SymRef extends SymRefExtractor {
54-
def unapply(x: TypeOrBounds)(implicit ctx: Context): Option[(Definition, TypeOrBounds /* Type | NoPrefix */)] = x match {
54+
def unapply(x: TypeOrBounds)(implicit ctx: Context): Option[(Symbol, TypeOrBounds /* Type | NoPrefix */)] = x match {
5555
case tp: Types.NamedType =>
5656
tp.designator match {
57-
case sym: Symbol => Some((definitionFromSym(sym), tp.prefix))
57+
case sym: Symbol => Some((sym, tp.prefix))
5858
case _ => None
5959
}
6060
case _ => None

library/src/scala/tasty/reflect/ContextOps.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package reflect
44
trait ContextOps extends TastyCore {
55

66
trait ContextAPI {
7-
def owner: Definition
7+
def owner: Symbol
88

99
/** Returns the source file being compiled. The path is relative to the current working directory. */
1010
def source: java.nio.file.Path

0 commit comments

Comments
 (0)