@@ -147,24 +147,32 @@ object desugar {
147147
148148// ----- Desugar methods -------------------------------------------------
149149
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+
150162 /** var x: Int = expr
151163 * ==>
152164 * def x: Int = expr
153165 * def x_=($1: <TypeTree()>): Unit = ()
154166 *
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
159168 */
160169 def valDef (vdef0 : ValDef )(using Context ): Tree = {
161- val vdef @ ValDef (name , tpt, rhs) = vdef0
170+ val vdef @ ValDef (_ , tpt, rhs) = vdef0
162171 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)) {
168176 // TODO: copy of vdef as getter needed?
169177 // val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
170178 // right now vdef maps via expandedTree to a thicket which concerns itself.
@@ -173,7 +181,7 @@ object desugar {
173181 // The rhs gets filled in later, when field is generated and getter has parameters (see Memoize miniphase)
174182 val setterRhs = if (vdef.rhs.isEmpty) EmptyTree else unitLiteral
175183 val setter = cpy.DefDef (vdef)(
176- name = name .setterName,
184+ name = valName .setterName,
177185 tparams = Nil ,
178186 vparamss = (setterParam :: Nil ) :: Nil ,
179187 tpt = TypeTree (defn.UnitType ),
@@ -887,7 +895,7 @@ object desugar {
887895 mdef.tparams.head.srcPos)
888896 defDef(
889897 cpy.DefDef (mdef)(
890- name = mdef.name .toExtensionName,
898+ name = normalizeName( mdef, ext) .toExtensionName,
891899 tparams = ext.tparams ++ mdef.tparams,
892900 vparamss = mdef.vparamss match
893901 case vparams1 :: vparamss1 if mdef.name.isRightAssocOperatorName =>
@@ -934,8 +942,13 @@ object desugar {
934942 report.error(IllegalRedefinitionOfStandardKind (kind, name), errPos)
935943 name = name.errorName
936944 }
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+ }
939952 name
940953 }
941954
0 commit comments