Skip to content

Commit 02ab05d

Browse files
committed
Fix #9772: Normalize value definitions
* Restrict names for mutable values which lead to setter generation during desugaring
1 parent 371d8f5 commit 02ab05d

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ object desugar {
165165
&& ctx.owner.isClass
166166
&& (!mods.is(Private) || ctx.owner.is(Trait) || ctx.owner.isPackageObject)
167167
if (setterNeeded) {
168+
val valName = normalizeName(vdef, tpt).asTermName
168169
// TODO: copy of vdef as getter needed?
169170
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
170171
// right now vdef maps via expandedTree to a thicket which concerns itself.
@@ -173,7 +174,7 @@ object desugar {
173174
// The rhs gets filled in later, when field is generated and getter has parameters (see Memoize miniphase)
174175
val setterRhs = if (vdef.rhs.isEmpty) EmptyTree else unitLiteral
175176
val setter = cpy.DefDef(vdef)(
176-
name = name.setterName,
177+
name = valName.setterName,
177178
tparams = Nil,
178179
vparamss = (setterParam :: Nil) :: Nil,
179180
tpt = TypeTree(defn.UnitType),
@@ -933,8 +934,13 @@ object desugar {
933934
report.error(IllegalRedefinitionOfStandardKind(kind, name), errPos)
934935
name = name.errorName
935936
}
936-
if name.isExtensionName && (!mdef.mods.is(ExtensionMethod) || name.dropExtension.isExtensionName) then
937-
report.error(em"illegal method name: $name may not start with `extension_`", errPos)
937+
mdef match {
938+
case vdef: ValDef if name.isExtension && vdef.mods.is(Mutable) =>
939+
report.error(em"illegal variable name: `extension`", errPos)
940+
case memDef if name.isExtensionName && (!mdef.mods.is(ExtensionMethod) || name.dropExtension.isExtensionName) =>
941+
report.error(em"illegal name: $name may not start with `extension_`", errPos)
942+
case _ =>
943+
}
938944
name
939945
}
940946

tests/neg/illegal-extension.check

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
-- Error: tests/neg/illegal-extension.scala:2:6 ------------------------------------------------------------------------
2+
2 | def extension_n: String = "illegal method" // error: illegal method name: extension_n may not start with `extension_`
3+
| ^^^^^^^^^^^
4+
| illegal method name: extension_n may not start with `extension_`
5+
-- Error: tests/neg/illegal-extension.scala:4:6 ------------------------------------------------------------------------
6+
4 | var extension_val = 23 // error: illegal value name: extension_val may not start with `extension_`
7+
| ^^^^^^^^^^^^^
8+
| illegal value name: extension_val may not start with `extension_`

tests/neg/illegal-extension.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
trait A {
22
def extension_n: String = "illegal method" // error: illegal method name: extension_n may not start with `extension_`
3+
type extension_type = Int
4+
var extension_val = 23 // error: illegal value name: extension_val may not start with `extension_`
5+
val extension_private = "good" // allowed because it's immutable
36
}
47

58
extension (x: Any) def extension_foo: String = "foo" // error: illegal method name: extension_foo may not start with `extension_`
9+
class B {
10+
private var extension_private_var = "good" // allowed because the owner is a class
11+
}

0 commit comments

Comments
 (0)