@@ -147,24 +147,32 @@ 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
- val vdef @ ValDef (name , tpt, rhs) = vdef0
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
- if (setterNeeded) {
172
+
173
+ val valName = normalizeName(vdef, tpt).asTermName
174
+
175
+ if (isSetterNeeded(vdef)) {
168
176
// TODO: copy of vdef as getter needed?
169
177
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
170
178
// right now vdef maps via expandedTree to a thicket which concerns itself.
@@ -173,7 +181,7 @@ object desugar {
173
181
// The rhs gets filled in later, when field is generated and getter has parameters (see Memoize miniphase)
174
182
val setterRhs = if (vdef.rhs.isEmpty) EmptyTree else unitLiteral
175
183
val setter = cpy.DefDef (vdef)(
176
- name = name .setterName,
184
+ name = valName .setterName,
177
185
tparams = Nil ,
178
186
vparamss = (setterParam :: Nil ) :: Nil ,
179
187
tpt = TypeTree (defn.UnitType ),
@@ -887,7 +895,7 @@ object desugar {
887
895
mdef.tparams.head.srcPos)
888
896
defDef(
889
897
cpy.DefDef (mdef)(
890
- name = mdef.name .toExtensionName,
898
+ name = normalizeName( mdef, ext) .toExtensionName,
891
899
tparams = ext.tparams ++ mdef.tparams,
892
900
vparamss = mdef.vparamss match
893
901
case vparams1 :: vparamss1 if mdef.name.isRightAssocOperatorName =>
@@ -934,8 +942,13 @@ object desugar {
934
942
report.error(IllegalRedefinitionOfStandardKind (kind, name), errPos)
935
943
name = name.errorName
936
944
}
937
- if name.isExtensionName && (! mdef.mods.is(ExtensionMethod ) || name.dropExtension.isExtensionName) then
938
- report.error(em " illegal method name: $name may not start with `extension_` " , errPos)
945
+ mdef match {
946
+ case vdef : ValDef if name.isExtension && isSetterNeeded(vdef) =>
947
+ report.error(em " illegal setter name: `extension_=` " , errPos)
948
+ case memDef if name.isExtensionName && ! mdef.mods.is(ExtensionMethod ) =>
949
+ report.error(em " illegal name: $name may not start with `extension_` " , errPos)
950
+ case _ =>
951
+ }
939
952
name
940
953
}
941
954
0 commit comments