Skip to content

Commit 3024efc

Browse files
committed
Putting some of the symbol potential to work.
Renamed the parameter to all the newXXX symbol creators to "newFlags" because I've seen too many bugs which arose from having a parameter name which shadows a field and where mistakes can inflict subtle bugs which won't be found until much later (yes I'm trying to describe "flags" right now.) Opportunistically cleaned up some symbol creations.
1 parent 2ca7d4f commit 3024efc

File tree

10 files changed

+141
-153
lines changed

10 files changed

+141
-153
lines changed

src/compiler/scala/reflect/internal/Definitions.scala

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ trait Definitions extends reflect.api.StandardDefinitions {
1616

1717
private def newClass(owner: Symbol, name: TypeName, parents: List[Type], flags: Long = 0L): Symbol = {
1818
val clazz = owner.newClassSymbol(name, NoPosition, flags)
19-
clazz setInfo ClassInfoType(parents, new Scope, clazz)
20-
owner.info.decls enter clazz
19+
clazz setInfoAndEnter ClassInfoType(parents, new Scope, clazz)
2120
}
2221
private def newMethod(owner: Symbol, name: TermName, formals: List[Type], restpe: Type, flags: Long = 0L): Symbol = {
2322
val msym = owner.newMethod(name.encode, NoPosition, flags)
2423
val params = msym.newSyntheticValueParams(formals)
25-
msym setInfo MethodType(params, restpe)
26-
owner.info.decls enter msym
24+
msym setInfoAndEnter MethodType(params, restpe)
2725
}
2826

2927
// the scala value classes
@@ -130,7 +128,7 @@ trait Definitions extends reflect.api.StandardDefinitions {
130128
// the source level, but _root_ is essentially a function () => <root>.
131129
lazy val RootPackage: Symbol = {
132130
val rp = (
133-
NoSymbol.newValue(nme.ROOTPKG, flags = FINAL | MODULE | PACKAGE | JAVA)
131+
NoSymbol.newValue(nme.ROOTPKG, NoPosition, FINAL | MODULE | PACKAGE | JAVA)
134132
setInfo NullaryMethodType(RootClass.tpe)
135133
)
136134
RootClass.sourceModule = rp
@@ -139,11 +137,11 @@ trait Definitions extends reflect.api.StandardDefinitions {
139137

140138
// This is the actual root of everything, including the package _root_.
141139
lazy val RootClass: ModuleClassSymbol = (
142-
NoSymbol.newModuleClassSymbol(tpnme.ROOT, flags = FINAL | MODULE | PACKAGE | JAVA)
140+
NoSymbol.newModuleClassSymbol(tpnme.ROOT, NoPosition, FINAL | MODULE | PACKAGE | JAVA)
143141
setInfo rootLoader
144142
)
145143
// The empty package, which holds all top level types without given packages.
146-
lazy val EmptyPackage = RootClass.newPackage(nme.EMPTY_PACKAGE_NAME, flags = FINAL)
144+
lazy val EmptyPackage = RootClass.newPackage(nme.EMPTY_PACKAGE_NAME, NoPosition, FINAL)
147145
lazy val EmptyPackageClass = EmptyPackage.moduleClass
148146

149147
lazy val JavaLangPackage = getModule(sn.JavaLang)
@@ -208,8 +206,7 @@ trait Definitions extends reflect.api.StandardDefinitions {
208206
sealed abstract class BottomClassSymbol(name: TypeName, parent: Symbol) extends ClassSymbol(ScalaPackageClass, NoPosition, name) {
209207
locally {
210208
this initFlags ABSTRACT | TRAIT | FINAL
211-
this setInfo ClassInfoType(List(parent.tpe), new Scope, this)
212-
owner.info.decls enter this
209+
this setInfoAndEnter ClassInfoType(List(parent.tpe), new Scope, this)
213210
}
214211
final override def isBottomClass = true
215212
}
@@ -829,12 +826,8 @@ trait Definitions extends reflect.api.StandardDefinitions {
829826
ClassInfoType(List(AnyRefClass.tpe, p), new Scope, clazz)))
830827
}
831828

832-
private def newAlias(owner: Symbol, name: TypeName, alias: Type): Symbol = {
833-
val tpsym = owner.newAliasType(name)
834-
tpsym.setInfo(alias)
835-
owner.info.decls.enter(tpsym)
836-
tpsym
837-
}
829+
private def newAlias(owner: Symbol, name: TypeName, alias: Type): Symbol =
830+
owner.newAliasType(name) setInfoAndEnter alias
838831

839832
/** tcon receives the type parameter symbol as argument */
840833
private def newPolyMethod(owner: Symbol, name: TermName, tcon: Symbol => Type): Symbol =

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

Lines changed: 65 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,18 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
4444
}
4545
/** Create a new free variable. Its owner is NoSymbol.
4646
*/
47-
def newFreeVar(name: TermName, tpe: Type, value: Any, flags: Long = 0L): FreeVar =
48-
new FreeVar(name, value) initFlags flags setInfo tpe
47+
def newFreeVar(name: TermName, tpe: Type, value: Any, newFlags: Long = 0L): FreeVar =
48+
new FreeVar(name, value) initFlags newFlags setInfo tpe
4949

5050
/** The original owner of a class. Used by the backend to generate
5151
* EnclosingMethod attributes.
5252
*/
5353
val originalOwner = perRunCaches.newMap[Symbol, Symbol]()
5454

5555
abstract class AbsSymbolImpl extends AbsSymbol { this: Symbol =>
56-
def newNestedSymbol(name: Name, pos: Position, flags: Long) = name match {
57-
case n: TermName => newTermSymbol(n, pos, flags)
58-
case n: TypeName => newTypeSymbol(n, pos, flags)
56+
def newNestedSymbol(name: Name, pos: Position, newFlags: Long) = name match {
57+
case n: TermName => newTermSymbol(n, pos, newFlags)
58+
case n: TypeName => newTypeSymbol(n, pos, newFlags)
5959
}
6060
def typeSig: Type = info
6161
def typeSigIn(site: Type): Type = site.memberInfo(this)
@@ -99,24 +99,24 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
9999

100100
// ------ creators -------------------------------------------------------------------
101101

102-
final def newValue(name: TermName, pos: Position = NoPosition, flags: Long = 0L): TermSymbol =
103-
newTermSymbol(name, pos, flags)
104-
final def newVariable(name: TermName, pos: Position = NoPosition, flags: Long = 0L): TermSymbol =
105-
newTermSymbol(name, pos, MUTABLE | flags)
106-
final def newValueParameter(name: TermName, pos: Position = NoPosition, flags: Long = 0L): TermSymbol =
107-
newTermSymbol(name, pos, PARAM | flags)
102+
final def newValue(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): TermSymbol =
103+
newTermSymbol(name, pos, newFlags)
104+
final def newVariable(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): TermSymbol =
105+
newTermSymbol(name, pos, MUTABLE | newFlags)
106+
final def newValueParameter(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): TermSymbol =
107+
newTermSymbol(name, pos, PARAM | newFlags)
108108

109109
/** Create local dummy for template (owner of local blocks) */
110110
final def newLocalDummy(pos: Position) =
111111
newTermSymbol(nme.localDummyName(this), pos) setInfo NoType
112-
final def newMethod(name: TermName, pos: Position = NoPosition, flags: Long = 0L): MethodSymbol =
113-
newMethodSymbol(name, pos, METHOD | flags)
112+
final def newMethod(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): MethodSymbol =
113+
newMethodSymbol(name, pos, METHOD | newFlags)
114114
final def newLabel(name: TermName, pos: Position = NoPosition): MethodSymbol =
115115
newMethod(name, pos, LABEL)
116116

117117
/** Propagates ConstrFlags (JAVA, specifically) from owner to constructor. */
118-
final def newConstructor(pos: Position, flags: Long = 0L) =
119-
newMethod(nme.CONSTRUCTOR, pos, getFlag(ConstrFlags) | flags)
118+
final def newConstructor(pos: Position, newFlags: Long = 0L) =
119+
newMethod(nme.CONSTRUCTOR, pos, getFlag(ConstrFlags) | newFlags)
120120

121121
/** Static constructor with info set. */
122122
def newStaticConstructor(pos: Position) =
@@ -131,19 +131,19 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
131131
if (isPackage || !settings.overrideObjects.value) MODULE | FINAL
132132
else MODULE
133133
)
134-
def newLinkedModule(clazz: Symbol, flags: Long = 0L): ModuleSymbol = {
135-
val m = newModuleSymbol(clazz.name.toTermName, clazz.pos, ModuleFlags | flags)
134+
def newLinkedModule(clazz: Symbol, newFlags: Long = 0L): ModuleSymbol = {
135+
val m = newModuleSymbol(clazz.name.toTermName, clazz.pos, ModuleFlags | newFlags)
136136
connectModuleToClass(m, clazz.asInstanceOf[ClassSymbol])
137137
}
138-
final def newModule(name: TermName, pos: Position = NoPosition, flags: Long = 0L): ModuleSymbol = {
139-
val m = newModuleSymbol(name, pos, flags | ModuleFlags)
138+
final def newModule(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): ModuleSymbol = {
139+
val m = newModuleSymbol(name, pos, newFlags | ModuleFlags)
140140
val clazz = newModuleClassSymbol(name.toTypeName, pos, (m getFlag ModuleToClassFlags) | MODULE)
141141
connectModuleToClass(m, clazz)
142142
}
143143

144-
final def newPackage(name: TermName, pos: Position = NoPosition, flags: Long = 0L): ModuleSymbol = {
144+
final def newPackage(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): ModuleSymbol = {
145145
assert(name == nme.ROOT || isPackageClass, this)
146-
newModule(name, pos, JAVA | PACKAGE | flags)
146+
newModule(name, pos, JAVA | PACKAGE | newFlags)
147147
}
148148
final def newThisSym(pos: Position) =
149149
newTermSymbol(nme.this_, pos, SYNTHETIC)
@@ -153,41 +153,41 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
153153
/** Direct symbol factories.
154154
* For internal use; these are unlikely to be what you want.
155155
*/
156-
def newTermSymbol(name: TermName, pos: Position = NoPosition, flags: Long = 0L): TermSymbol =
157-
new TermSymbol(this, pos, name) initFlags flags
156+
def newTermSymbol(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): TermSymbol =
157+
new TermSymbol(this, pos, name) initFlags newFlags
158158

159-
def newAbstractTypeSymbol(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): AbstractTypeSymbol =
160-
new AbstractTypeSymbol(this, pos, name) initFlags flags
159+
def newAbstractTypeSymbol(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): AbstractTypeSymbol =
160+
new AbstractTypeSymbol(this, pos, name) initFlags newFlags
161161

162-
def newAliasTypeSymbol(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): AliasTypeSymbol =
163-
new AliasTypeSymbol(this, pos, name) initFlags flags
162+
def newAliasTypeSymbol(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): AliasTypeSymbol =
163+
new AliasTypeSymbol(this, pos, name) initFlags newFlags
164164

165-
def newModuleSymbol(name: TermName, pos: Position = NoPosition, flags: Long = 0L): ModuleSymbol =
166-
new ModuleSymbol(this, pos, name) initFlags flags
165+
def newModuleSymbol(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): ModuleSymbol =
166+
new ModuleSymbol(this, pos, name) initFlags newFlags
167167

168-
def newMethodSymbol(name: TermName, pos: Position = NoPosition, flags: Long = 0L): MethodSymbol =
169-
new MethodSymbol(this, pos, name) initFlags flags
168+
def newMethodSymbol(name: TermName, pos: Position = NoPosition, newFlags: Long = 0L): MethodSymbol =
169+
new MethodSymbol(this, pos, name) initFlags newFlags
170170

171-
def newClassSymbol(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): ClassSymbol =
172-
new ClassSymbol(this, pos, name) initFlags flags
171+
def newClassSymbol(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): ClassSymbol =
172+
new ClassSymbol(this, pos, name) initFlags newFlags
173173

174-
def newModuleClassSymbol(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): ModuleClassSymbol =
175-
new ModuleClassSymbol(this, pos, name) initFlags flags
174+
def newModuleClassSymbol(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): ModuleClassSymbol =
175+
new ModuleClassSymbol(this, pos, name) initFlags newFlags
176176

177177
/** Derive whether it is an abstract type from the flags; after creation
178178
* the DEFERRED flag will be ignored.
179179
*/
180-
def newTypeSymbol(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): TypeSymbol =
181-
if ((flags & DEFERRED) == 0L)
182-
newAliasTypeSymbol(name, pos, flags)
180+
def newTypeSymbol(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): TypeSymbol =
181+
if ((newFlags & DEFERRED) == 0L)
182+
newAliasTypeSymbol(name, pos, newFlags)
183183
else
184-
newAbstractTypeSymbol(name, pos, flags)
184+
newAbstractTypeSymbol(name, pos, newFlags)
185185

186-
def newTypeSkolemSymbol(name: TypeName, origin: AnyRef, pos: Position = NoPosition, flags: Long = 0L): TypeSkolem =
187-
if ((flags & DEFERRED) == 0L)
188-
new TypeSkolem(this, pos, name, origin) initFlags flags
186+
def newTypeSkolemSymbol(name: TypeName, origin: AnyRef, pos: Position = NoPosition, newFlags: Long = 0L): TypeSkolem =
187+
if ((newFlags & DEFERRED) == 0L)
188+
new TypeSkolem(this, pos, name, origin) initFlags newFlags
189189
else
190-
new TypeSkolem(this, pos, name, origin) with AbstractTypeMixin initFlags flags
190+
new TypeSkolem(this, pos, name, origin) with AbstractTypeMixin initFlags newFlags
191191

192192
/** @param pre type relative to which alternatives are seen.
193193
* for instance:
@@ -228,18 +228,18 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
228228

229229
/** Symbol of a type definition type T = ...
230230
*/
231-
final def newAliasType(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): Symbol =
232-
newAliasTypeSymbol(name, pos, flags)
231+
final def newAliasType(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): Symbol =
232+
newAliasTypeSymbol(name, pos, newFlags)
233233

234234
/** Symbol of an abstract type type T >: ... <: ...
235235
*/
236-
final def newAbstractType(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): Symbol =
237-
newAbstractTypeSymbol(name, pos, DEFERRED | flags)
236+
final def newAbstractType(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): Symbol =
237+
newAbstractTypeSymbol(name, pos, DEFERRED | newFlags)
238238

239239
/** Symbol of a type parameter
240240
*/
241-
final def newTypeParameter(name: TypeName, pos: Position = NoPosition, flags: Long = 0L) =
242-
newAbstractType(name, pos, PARAM | flags)
241+
final def newTypeParameter(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L) =
242+
newAbstractType(name, pos, PARAM | newFlags)
243243

244244
/** Synthetic value parameters when parameter symbols are not available
245245
*/
@@ -257,8 +257,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
257257
skolem setInfo (basis.info cloneInfo skolem)
258258
}
259259

260-
final def newExistential(name: TypeName, pos: Position = NoPosition, flags: Long = 0L): Symbol =
261-
newAbstractType(name, pos, EXISTENTIAL | flags)
260+
final def newExistential(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L): Symbol =
261+
newAbstractType(name, pos, EXISTENTIAL | newFlags)
262262

263263
final def freshExistential(suffix: String): Symbol =
264264
newExistential(freshExistentialName(suffix), pos)
@@ -283,20 +283,20 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
283283
final def newTypeSkolem: Symbol =
284284
owner.newTypeSkolemSymbol(name.toTypeName, this, pos, flags)
285285

286-
final def newClass(name: TypeName, pos: Position = NoPosition) =
287-
newClassSymbol(name, pos)
286+
final def newClass(name: TypeName, pos: Position = NoPosition, newFlags: Long = 0L) =
287+
newClassSymbol(name, pos, newFlags)
288288

289289
final def newModuleClass(name: TypeName, pos: Position = NoPosition) =
290290
newModuleClassSymbol(name, pos)
291291

292292
final def newAnonymousClass(pos: Position) =
293293
newClassSymbol(tpnme.ANON_CLASS_NAME, pos)
294294

295-
final def newAnonymousFunctionClass(pos: Position, flags: Long = 0L) =
296-
newClassSymbol(tpnme.ANON_FUN_NAME, pos, FINAL | SYNTHETIC | flags)
295+
final def newAnonymousFunctionClass(pos: Position, newFlags: Long = 0L) =
296+
newClassSymbol(tpnme.ANON_FUN_NAME, pos, FINAL | SYNTHETIC | newFlags)
297297

298-
final def newAnonymousFunctionValue(pos: Position, flags: Long = 0L) =
299-
newTermSymbol(nme.ANON_FUN_NAME, pos, SYNTHETIC | flags) setInfo NoType
298+
final def newAnonymousFunctionValue(pos: Position, newFlags: Long = 0L) =
299+
newTermSymbol(nme.ANON_FUN_NAME, pos, SYNTHETIC | newFlags) setInfo NoType
300300

301301
/** Refinement types P { val x: String; type T <: Number }
302302
* also have symbols, they are refinementClasses
@@ -307,7 +307,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
307307
/** Create a new getter for current symbol (which must be a field)
308308
*/
309309
final def newGetter: Symbol = (
310-
owner.newMethod(nme.getterName(name.toTermName), flags = getterFlags(flags))
310+
owner.newMethod(nme.getterName(name.toTermName), NoPosition, getterFlags(flags))
311311
setPrivateWithin privateWithin
312312
setInfo MethodType(Nil, tpe)
313313
)
@@ -1002,6 +1002,13 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
10021002
/** Substitute second list of symbols for first in current info. */
10031003
def substInfo(syms0: List[Symbol], syms1: List[Symbol]) = modifyInfo(_.substSym(syms0, syms1))
10041004
def setInfoOwnerAdjusted(info: Type): this.type = setInfo(info atOwner this)
1005+
1006+
/** Set the info and enter this symbol into the owner's scope. */
1007+
def setInfoAndEnter(info: Type): this.type = {
1008+
setInfo(info)
1009+
owner.info.decls enter this
1010+
this
1011+
}
10051012

10061013
/** Set new info valid from start of this phase. */
10071014
final def updateInfo(info: Type): Symbol = {

0 commit comments

Comments
 (0)