Skip to content

Commit 5402b85

Browse files
committed
Fix #9926: Normalize value definitions
* Make `extension` variable names illegal * Fix #9772: Disallow `extension_` for immutable values
1 parent 5899de2 commit 5402b85

File tree

4 files changed

+26
-16
lines changed

4 files changed

+26
-16
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -158,14 +158,15 @@ object desugar {
158158
* - all package object members
159159
*/
160160
def valDef(vdef0: ValDef)(using Context): Tree = {
161-
val vdef @ ValDef(name, tpt, rhs) = vdef0
161+
val vdef @ ValDef(_, tpt, rhs) = vdef0
162162
val mods = vdef.mods
163163
val setterNeeded =
164164
mods.is(Mutable)
165165
&& ctx.owner.isClass
166166
&& (!mods.is(Private) || ctx.owner.is(Trait) || ctx.owner.isPackageObject)
167+
val valName = normalizeName(vdef, tpt).asTermName
168+
167169
if (setterNeeded) {
168-
val valName = normalizeName(vdef, tpt).asTermName
169170
// TODO: copy of vdef as getter needed?
170171
// val getter = ValDef(mods, name, tpt, rhs) withPos vdef.pos?
171172
// right now vdef maps via expandedTree to a thicket which concerns itself.
@@ -888,7 +889,7 @@ object desugar {
888889
mdef.tparams.head.srcPos)
889890
defDef(
890891
cpy.DefDef(mdef)(
891-
name = mdef.name.toExtensionName,
892+
name = normalizeName(mdef, ext).toExtensionName,
892893
tparams = ext.tparams ++ mdef.tparams,
893894
vparamss = mdef.vparamss match
894895
case vparams1 :: vparamss1 if mdef.name.isRightAssocOperatorName =>
@@ -938,7 +939,7 @@ object desugar {
938939
mdef match {
939940
case vdef: ValDef if name.isExtension && vdef.mods.is(Mutable) =>
940941
report.error(em"illegal variable name: `extension`", errPos)
941-
case memDef if name.isExtensionName && (!mdef.mods.is(ExtensionMethod) || name.dropExtension.isExtensionName) =>
942+
case memDef if name.isExtensionName && !mdef.mods.is(ExtensionMethod) =>
942943
report.error(em"illegal name: $name may not start with `extension_`", errPos)
943944
case _ =>
944945
}

compiler/src/dotty/tools/dotc/core/NameOps.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ object NameOps {
133133
else name.toTermName
134134
}
135135

136+
/** Does the name match `extension`? */
137+
def isExtension: Boolean = name.toString == "extension"
138+
136139
/** Does this name start with `extension_`? */
137140
def isExtensionName: Boolean = name match
138141
case name: SimpleName => name.startsWith("extension_")

tests/neg/illegal-extension.check

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,16 @@
11
-- 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_`
2+
2 | def extension_n: String = "illegal method" // error: illegal name: extension_n may not start with `extension_`
33
| ^^^^^^^^^^^
4-
| illegal method name: extension_n may not start with `extension_`
4+
| illegal name: extension_n may not start with `extension_`
55
-- 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_`
6+
4 | val extension_val = 23 // error: illegal name: extension_val may not start with `extension_`
77
| ^^^^^^^^^^^^^
8-
| illegal value name: extension_val may not start with `extension_`
8+
| illegal name: extension_val may not start with `extension_`
9+
-- Error: tests/neg/illegal-extension.scala:5:14 -----------------------------------------------------------------------
10+
5 | private var extension = Nil // error: not allowed because it matches `extension`
11+
| ^^^^^^^^^
12+
| illegal variable name: `extension`
13+
-- Error: tests/neg/illegal-extension.scala:8:23 -----------------------------------------------------------------------
14+
8 |extension (x: Any) def extension_foo: String = "foo" // error: illegal name: extension_foo may not start with `extension_`
15+
| ^^^^^^^^^^^^^
16+
| illegal name: extension_foo may not start with `extension_`

tests/neg/illegal-extension.scala

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
trait A {
2-
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
2+
def extension_n: String = "illegal method" // error: illegal name: extension_n may not start with `extension_`
3+
type extension_type = Int // allowed because it's a type alias
4+
val extension_val = 23 // error: illegal name: extension_val may not start with `extension_`
5+
private var extension = Nil // error: not allowed because it matches `extension`
66
}
77

8-
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-
}
8+
extension (x: Any) def extension_foo: String = "foo" // error: illegal name: extension_foo may not start with `extension_`
9+
extension (some: Any) def valid_extension_name: String = "bar"

0 commit comments

Comments
 (0)