Skip to content

Commit 8a64ed8

Browse files
committed
Towards better reflection APIs.
1 parent 7abc466 commit 8a64ed8

File tree

21 files changed

+886
-430
lines changed

21 files changed

+886
-430
lines changed

src/compiler/scala/reflect/internal/Scopes.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,13 +331,12 @@ trait Scopes extends api.Scopes { self: SymbolTable =>
331331
*/
332332
def scopeTransform(owner: Symbol)(op: => Scope): Scope = op
333333

334-
def newScopeWith(elems: Symbol*) = {
334+
def newScopeWith(elems: Symbol*): Scope = {
335335
val scope = newScope
336336
elems foreach scope.enter
337337
scope
338338
}
339339

340-
341340
/** The empty scope (immutable).
342341
*/
343342
object EmptyScope extends Scope {

src/compiler/scala/reflect/internal/SymbolTable.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ abstract class SymbolTable extends api.Universe
1818
with Constants
1919
with BaseTypeSeqs
2020
with InfoTransformers
21+
with transform.Transforms
2122
with StdNames
2223
with AnnotationInfos
2324
with AnnotationCheckers

src/compiler/scala/reflect/internal/Symbols.scala

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,24 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
4141
*/
4242
val originalOwner = perRunCaches.newMap[Symbol, Symbol]()
4343

44+
abstract class AbsSymbolImpl extends AbsSymbol { this: Symbol =>
45+
def newNestedSymbol(pos: Position, name: Name) = name match {
46+
case n: TermName => newValue(pos, n)
47+
case n: TypeName => newAliasType(pos, n)
48+
}
49+
def typeSig: Type = info
50+
def typeSigIn(site: Type): Type = site.memberInfo(this)
51+
def asType: Type = tpe
52+
def asTypeIn(site: Type): Type = site.memberType(this)
53+
def asTypeConstructor: Type = typeConstructor
54+
def setInternalFlags(flag: Long): this.type = { setFlag(flag); this }
55+
def setTypeSig(tpe: Type): this.type = { setInfo(tpe); this }
56+
def setAnnotations(annots: AnnotationInfo*): this.type = { setAnnotations(annots.toList); this }
57+
}
58+
4459
/** The class for all symbols */
4560
abstract class Symbol(initOwner: Symbol, initPos: Position, initName: Name)
46-
extends AbsSymbol
61+
extends AbsSymbolImpl
4762
with HasFlags
4863
with Annotatable[Symbol] {
4964

src/compiler/scala/reflect/internal/Trees.scala

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -248,12 +248,6 @@ trait Trees extends api.Trees { self: SymbolTable =>
248248

249249
def This(sym: Symbol): Tree = This(sym.name.toTypeName) setSymbol sym
250250

251-
def Select(qualifier: Tree, sym: Symbol): Select =
252-
Select(qualifier, sym.name) setSymbol sym
253-
254-
def Ident(sym: Symbol): Ident =
255-
Ident(sym.name) setSymbol sym
256-
257251
/** Block factory that flattens directly nested blocks.
258252
*/
259253
def Block(stats: Tree*): Block = stats match {

src/compiler/scala/reflect/internal/Types.scala

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,8 +235,17 @@ trait Types extends api.Types { self: SymbolTable =>
235235
override def tpe_=(t: Type) = if (t != NoType) throw new UnsupportedOperationException("tpe_=("+t+") inapplicable for <empty>")
236236
}
237237

238+
abstract class AbsTypeImpl extends AbsType { this: Type =>
239+
def declaration(name: Name): Symbol = decl(name)
240+
def nonPrivateDeclaration(name: Name): Symbol = nonPrivateDecl(name)
241+
def allDeclarations = decls
242+
def allMembers = members
243+
def typeArguments = typeArgs
244+
def erasedType = transformedType(this)
245+
}
246+
238247
/** The base class for all types */
239-
abstract class Type extends AbsType with Annotatable[Type] {
248+
abstract class Type extends AbsTypeImpl with Annotatable[Type] {
240249
/** Types for which asSeenFrom always is the identity, no matter what
241250
* prefix or owner.
242251
*/
@@ -1063,7 +1072,7 @@ trait Types extends api.Types { self: SymbolTable =>
10631072
/** A base class for types that represent a single value
10641073
* (single-types and this-types).
10651074
*/
1066-
abstract class SingletonType extends SubType with SimpleTypeProxy {
1075+
abstract class SingletonType extends SubType with SimpleTypeProxy with AbsSingletonType {
10671076
def supertype = underlying
10681077
override def isTrivial = false
10691078
override def isStable = true
@@ -1435,7 +1444,7 @@ trait Types extends api.Types { self: SymbolTable =>
14351444
override def isHigherKinded = (
14361445
parents.nonEmpty &&
14371446
(parents forall (_.isHigherKinded)) &&
1438-
!phase.erasedTypes // @MO to AM: please check this class!
1447+
!phase.erasedTypes
14391448
)
14401449

14411450
override def typeParams =

src/compiler/scala/reflect/internal/transform/Transforms.scala

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,36 @@ package transform
44

55
trait Transforms { self: SymbolTable =>
66

7-
object refChecks extends { val global: Transforms.this.type = self } with RefChecks
8-
object uncurry extends { val global: Transforms.this.type = self } with UnCurry
9-
object erasure extends { val global: Transforms.this.type = self } with Erasure
7+
/** We need to encode laziness by hand here because the three components refChecks, uncurry and erasure
8+
* are overwritten by objects in Global.
9+
* It would be best of objects could override lazy values. See SI-5187.
10+
* In the absence of this, the Lazy functionality should probably be somewhere
11+
* in the standard library. Or is it already?
12+
*/
13+
private class Lazy[T](op: => T) {
14+
private var value: T = _
15+
private var _isDefined = false
16+
def isDefined = _isDefined
17+
def force: T = {
18+
if (!isDefined) { value = op; _isDefined = true }
19+
value
20+
}
21+
}
22+
23+
private val refChecksLazy = new Lazy(new { val global: Transforms.this.type = self } with RefChecks)
24+
private val uncurryLazy = new Lazy(new { val global: Transforms.this.type = self } with UnCurry)
25+
private val erasureLazy = new Lazy(new { val global: Transforms.this.type = self } with Erasure)
26+
27+
def refChecks = refChecksLazy.force
28+
def uncurry = uncurryLazy.force
29+
def erasure = erasureLazy.force
1030

1131
def transformedType(sym: Symbol) =
1232
erasure.transformInfo(sym,
1333
uncurry.transformInfo(sym,
1434
refChecks.transformInfo(sym, sym.info)))
1535

36+
def transformedType(tpe: Type) =
37+
erasure.scalaErasure(uncurry.uncurry(tpe))
38+
1639
}

src/compiler/scala/reflect/internal/transform/UnCurry.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ trait UnCurry {
1717
case _ => false
1818
}
1919

20-
protected val uncurry: TypeMap = new TypeMap {
20+
val uncurry: TypeMap = new TypeMap {
2121
def apply(tp0: Type): Type = {
2222
// tp0.typeSymbolDirect.initialize
2323
val tp = expandAlias(tp0)

src/compiler/scala/reflect/runtime/Mirror.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class Mirror extends Universe with RuntimeTypes with TreeBuildUtil with ToolBoxe
3838
override def classToType(jclazz: java.lang.Class[_]): Type = typeToScala(jclazz)
3939
override def classToSymbol(jclazz: java.lang.Class[_]): Symbol = classToScala(jclazz)
4040

41+
override def typeToClass(tpe: Type): java.lang.Class[_] = typeToJavaClass(tpe)
42+
override def symbolToClass(sym: Symbol): java.lang.Class[_] = classToJava(sym)
43+
4144
}
4245

4346
object Mirror extends Mirror

src/compiler/scala/reflect/runtime/TreeBuildUtil.scala

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
package scala.reflect.runtime
1+
package scala.reflect
2+
package runtime
23

3-
trait TreeBuildUtil extends Universe {
4+
trait TreeBuildUtil extends Universe with api.TreeBuildUtil {
45

5-
def staticClass(name: String): Symbol = definitions.getClass(newTypeName(name))
6-
def staticModule(name: String): Symbol = definitions.getModule(newTermName(name))
6+
def staticClass(fullname: String): Symbol = definitions.getClass(newTypeName(fullname))
7+
def staticModule(fullname: String): Symbol = definitions.getModule(newTermName(fullname))
78

8-
def thisModuleType(name: String) =
9-
definitions.getModule(name).moduleClass.thisType
9+
def thisModuleType(fullname: String) =
10+
definitions.getModule(fullname).moduleClass.thisType
1011

1112
/** Selects type symbol with given name from the defined members of prefix type
1213
*/
@@ -40,9 +41,9 @@ trait TreeBuildUtil extends Universe {
4041
selectIn(owner.info, idx)
4142
}
4243

43-
4444
def freeVar(name: String, info: Type, value: Any) = new FreeVar(name, info, value)
4545

46-
def newScopeWith(decls: List[Symbol]) = new Scope(decls)
46+
def modifiersFromInternalFlags(flags: Long, privateWithin: Name, annotations: List[Tree]): Modifiers =
47+
Modifiers(flags, privateWithin, annotations)
4748

4849
}

src/compiler/scala/reflect/runtime/Universe.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import internal.{SomePhase, NoPhase, Phase, TreeGen}
88
* It also provides methods to go from Java members to Scala members,
99
* using the code in JavaConversions.
1010
*/
11-
class Universe extends SymbolTable with internal.transform.Transforms {
11+
class Universe extends SymbolTable {
1212

1313
type AbstractFileType = AbstractFile
1414

src/compiler/scala/tools/nsc/Global.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb
417417
} with Pickler
418418

419419
// phaseName = "refchecks"
420-
object refChecks extends {
420+
override object refChecks extends {
421421
val global: Global.this.type = Global.this
422422
val runsAfter = List[String]("pickler")
423423
val runsRightAfter = None
@@ -431,7 +431,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb
431431
} with LiftCode
432432

433433
// phaseName = "uncurry"
434-
object uncurry extends {
434+
override object uncurry extends {
435435
val global: Global.this.type = Global.this
436436
val runsAfter = List[String]("refchecks", "liftcode")
437437
val runsRightAfter = None
@@ -459,7 +459,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter) extends Symb
459459
} with SpecializeTypes
460460

461461
// phaseName = "erasure"
462-
object erasure extends {
462+
override object erasure extends {
463463
val global: Global.this.type = Global.this
464464
val runsAfter = List[String]("explicitouter")
465465
val runsRightAfter = Some("explicitouter")

0 commit comments

Comments
 (0)