@@ -147,26 +147,33 @@ object desugar {
147
147
148
148
// ----- Desugar methods -------------------------------------------------
149
149
150
+ /** Setter generation is needed for:
151
+ * - non-private class members
152
+ * - all trait members
153
+ * - all package object members
154
+ */
155
+ def isSetterNeeded (valDef : ValDef )(using Context ): Boolean = {
156
+ val mods = valDef.mods
157
+ mods.is(Mutable )
158
+ && ctx.owner.isClass
159
+ && (! mods.is(Private ) || ctx.owner.is(Trait ) || ctx.owner.isPackageObject)
160
+ }
161
+
150
162
/** var x: Int = expr
151
163
* ==>
152
164
* def x: Int = expr
153
165
* def x_=($1: <TypeTree()>): Unit = ()
154
166
*
155
- * Generate the setter only for
156
- * - non-private class members
157
- * - all trait members
158
- * - all package object members
167
+ * Generate setter where needed
159
168
*/
160
169
def valDef (vdef0 : ValDef )(using Context ): Tree = {
161
170
val vdef @ ValDef (_, tpt, rhs) = vdef0
162
171
val mods = vdef.mods
163
- val setterNeeded =
164
- mods.is(Mutable )
165
- && ctx.owner.isClass
166
- && (! mods.is(Private ) || ctx.owner.is(Trait ) || ctx.owner.isPackageObject)
167
- val valName = normalizeName(vdef, tpt).asTermName
168
172
169
- if (setterNeeded) {
173
+ val setterForValNeeded = isSetterNeeded(vdef)
174
+ val valName = normalizeName(vdef, tpt, setterForValNeeded).asTermName
175
+
176
+ if (setterForValNeeded) {
170
177
// TODO: copy of vdef as getter needed?
171
178
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
172
179
// right now vdef maps via expandedTree to a thicket which concerns itself.
@@ -632,7 +639,7 @@ object desugar {
632
639
val (clsDerived, companionDerived) =
633
640
if (mods.is(Module )) (impl.derived, Nil ) else (Nil , impl.derived)
634
641
635
- // The thicket which is the desugared version of the companion object
642
+ // The thicket which is the dessetterNeededugared version of the companion object
636
643
// synthetic object C extends parentTpt derives class-derived { defs }
637
644
def companionDefs (parentTpt : Tree , defs : List [Tree ]) = {
638
645
val mdefs = moduleDef(
@@ -926,7 +933,7 @@ object desugar {
926
933
* method is an extension method.
927
934
* 3. If the name is missing (this can be the case for instance definitions), invent one instead.
928
935
*/
929
- def normalizeName (mdef : MemberDef , impl : Tree )(using Context ): Name = {
936
+ def normalizeName (mdef : MemberDef , impl : Tree , setterForValNeeded : Boolean = false )(using Context ): Name = {
930
937
var name = mdef.name
931
938
if (name.isEmpty) name = name.likeSpaced(inventGivenOrExtensionName(impl))
932
939
def errPos = mdef.source.atSpan(mdef.nameSpan)
@@ -936,7 +943,7 @@ object desugar {
936
943
name = name.errorName
937
944
}
938
945
mdef match {
939
- case vdef : ValDef if name.isExtension && vdef.mods.is( Mutable ) =>
946
+ case vdef : ValDef if setterForValNeeded && name.isExtension =>
940
947
report.error(em " illegal setter name: `extension_=` " , errPos)
941
948
case memDef if name.isExtensionName && ! mdef.mods.is(ExtensionMethod ) =>
942
949
report.error(em " illegal name: $name may not start with `extension_` " , errPos)
0 commit comments