@@ -139,23 +139,25 @@ trait MethodSynthesis {
139
139
if (nme.isSetterName(name))
140
140
ValOrValWithSetterSuffixError (tree)
141
141
142
- tree.symbol = (
142
+ tree.symbol =
143
143
if (mods.isLazy) {
144
144
val lazyValGetter = LazyValGetter (tree).createAndEnterSymbol()
145
145
enterLazyVal(tree, lazyValGetter)
146
146
} else {
147
- if (mods.isPrivateLocal)
147
+ if (mods.isPrivateLocal && mods.isCaseAccessor )
148
148
PrivateThisCaseClassParameterError (tree)
149
- val getter = Getter (tree).createAndEnterSymbol()
149
+ val getter = Getter (tree)
150
+ val getterSym = getter.createAndEnterSymbol()
150
151
// Create the setter if necessary.
151
152
if (mods.isMutable)
152
153
Setter (tree).createAndEnterSymbol()
153
154
154
- // If abstract, the tree gets the getter's symbol. Otherwise, create a field.
155
- if (mods.isDeferred) getter setPos tree.pos
155
+ // Create a field if the getter requires storage, otherwise,
156
+ // the getter's abstract and the tree gets the getter's symbol.
157
+ if (getter.noFieldNeeded) getterSym setPos tree.pos
156
158
else enterStrictVal(tree)
157
159
}
158
- )
160
+
159
161
160
162
enterBeans(tree)
161
163
}
@@ -177,11 +179,11 @@ trait MethodSynthesis {
177
179
}
178
180
179
181
def addDerivedTrees (typer : Typer , stat : Tree ): List [Tree ] = stat match {
180
- case vd @ ValDef (mods, name, tpt, rhs) if ! noFinishGetterSetter (vd) =>
182
+ case vd @ ValDef (mods, name, tpt, rhs) if deriveAccessors (vd) =>
181
183
// If we don't save the annotations, they seem to wander off.
182
184
val annotations = stat.symbol.initialize.annotations
183
185
val trees = (
184
- allValDefDerived(vd )
186
+ ( Field (vd) :: standardAccessors(vd) ::: beanAccessors(vd) )
185
187
map (acc => atPos(vd.pos.focus)(acc derive annotations))
186
188
filterNot (_ eq EmptyTree )
187
189
)
@@ -221,11 +223,11 @@ trait MethodSynthesis {
221
223
stat :: Nil
222
224
}
223
225
224
- def standardAccessors (vd : ValDef ): List [DerivedFromValDef ] = (
226
+ def standardAccessors (vd : ValDef ): List [DerivedFromValDef ] =
225
227
if (vd.mods.isMutable && ! vd.mods.isLazy) List (Getter (vd), Setter (vd))
226
228
else if (vd.mods.isLazy) List (LazyValGetter (vd))
227
229
else List (Getter (vd))
228
- )
230
+
229
231
def beanAccessors (vd : ValDef ): List [DerivedFromValDef ] = {
230
232
val setter = if (vd.mods.isMutable) List (BeanSetter (vd)) else Nil
231
233
if (vd.symbol hasAnnotation BeanPropertyAttr )
@@ -234,11 +236,6 @@ trait MethodSynthesis {
234
236
BooleanBeanGetter (vd) :: setter
235
237
else Nil
236
238
}
237
- def allValDefDerived (vd : ValDef ) = {
238
- val field = if (vd.mods.isDeferred || (vd.mods.isLazy && hasUnitType(vd.symbol))) Nil
239
- else List (Field (vd))
240
- field ::: standardAccessors(vd) ::: beanAccessors(vd)
241
- }
242
239
243
240
// Take into account annotations so that we keep annotated unit lazy val
244
241
// to get better error message already from the cps plugin itself
@@ -310,6 +307,8 @@ trait MethodSynthesis {
310
307
def derivedSym : Symbol = tree.symbol
311
308
def derivedTree : Tree = EmptyTree
312
309
310
+ def noFieldNeeded = isDeferred || (mods.isLazy && hasUnitType(basisSym))
311
+
313
312
def isSetter = false
314
313
def isDeferred = mods.isDeferred
315
314
def keepClean = false // whether annotations whose definitions are not meta-annotated should be kept.
@@ -341,10 +340,10 @@ trait MethodSynthesis {
341
340
case (p :: Nil ) :: _ => p
342
341
case _ => NoSymbol
343
342
}
344
- private def setterRhs = (
345
- if (mods. isDeferred || derivedSym.isOverloaded) EmptyTree
343
+ private def setterRhs =
344
+ if (isDeferred || derivedSym.isOverloaded) EmptyTree
346
345
else Assign (fieldSelection, Ident (setterParam))
347
- )
346
+
348
347
private def setterDef = DefDef (derivedSym, setterRhs)
349
348
override def derivedTree : Tree = if (setterParam == NoSymbol ) EmptyTree else setterDef
350
349
}
@@ -385,8 +384,8 @@ trait MethodSynthesis {
385
384
}
386
385
}
387
386
case class Getter (tree : ValDef ) extends BaseGetter (tree) {
388
- override def derivedSym = if (mods. isDeferred) basisSym else basisSym.getterIn(enclClass)
389
- private def derivedRhs = if (mods. isDeferred) EmptyTree else fieldSelection
387
+ override def derivedSym = if (isDeferred) basisSym else basisSym.getterIn(enclClass)
388
+ private def derivedRhs = if (isDeferred) EmptyTree else fieldSelection
390
389
private def derivedTpt = {
391
390
// For existentials, don't specify a type for the getter, even one derived
392
391
// from the symbol! This leads to incompatible existentials for the field and
@@ -400,7 +399,7 @@ trait MethodSynthesis {
400
399
// Range position errors ensue if we don't duplicate this in some
401
400
// circumstances (at least: concrete vals with existential types.)
402
401
case ExistentialType (_, _) => TypeTree () setOriginal (tree.tpt.duplicate setPos tree.tpt.pos.focus)
403
- case _ if mods. isDeferred => TypeTree () setOriginal tree.tpt // keep type tree of original abstract field
402
+ case _ if isDeferred => TypeTree () setOriginal tree.tpt // keep type tree of original abstract field
404
403
case tp => TypeTree (tp)
405
404
}
406
405
tpt setPos tree.tpt.pos.focus
@@ -432,10 +431,9 @@ trait MethodSynthesis {
432
431
override def derivedTree : DefDef = {
433
432
val ValDef (_, _, tpt0, rhs0) = tree
434
433
val rhs1 = context.unit.transformed.getOrElse(rhs0, rhs0)
435
- val body = (
436
- if (tree.symbol.owner.isTrait || hasUnitType(basisSym)) rhs1
437
- else gen.mkAssignAndReturn(basisSym, rhs1)
438
- )
434
+ val body = if (noFieldNeeded) rhs1
435
+ else gen.mkAssignAndReturn(basisSym, rhs1)
436
+
439
437
derivedSym setPos tree.pos // cannot set it at createAndEnterSymbol because basisSym can possibly still have NoPosition
440
438
val ddefRes = DefDef (derivedSym, new ChangeOwnerAndModuleClassTraverser (basisSym, derivedSym)(body))
441
439
// ValDef will have its position focused whereas DefDef will have original correct rangepos
@@ -462,8 +460,13 @@ trait MethodSynthesis {
462
460
// By default annotations go to the field, except if the field is
463
461
// generated for a class parameter (PARAMACCESSOR).
464
462
override def keepClean = ! mods.isParamAccessor
463
+
464
+ override def derivedSym =
465
+ if (noFieldNeeded) NoSymbol
466
+ else super .derivedSym
467
+
465
468
override def derivedTree = (
466
- if (mods.isDeferred ) EmptyTree
469
+ if (derivedSym eq NoSymbol ) EmptyTree
467
470
else if (mods.isLazy) copyValDef(tree)(mods = mods | flagsExtra, name = this .name, rhs = EmptyTree ).setPos(tree.pos.focus)
468
471
else copyValDef(tree)(mods = mods | flagsExtra, name = this .name)
469
472
)
0 commit comments