Skip to content

Commit 6e535f7

Browse files
committed
Merge pull request #1112 from dotty-staging/value-classes-private-this-param
Value classes: add support for private[this] parameter
2 parents 3a8fa8b + 1ebbba3 commit 6e535f7

File tree

5 files changed

+22
-7
lines changed

5 files changed

+22
-7
lines changed

src/dotty/tools/dotc/transform/Getters.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import Constants._
1212
import TreeTransforms._
1313
import Flags._
1414
import Decorators._
15+
import ValueClasses._
1516

1617
/** Performs the following rewritings for fields of a class:
1718
*
@@ -34,7 +35,7 @@ import Decorators._
3435
*
3536
* Omitted from the rewritings are
3637
*
37-
* - private[this] fields in non-trait classes
38+
* - private[this] fields in classes (excluding traits, value classes)
3839
* - fields generated for static modules (TODO: needed?)
3940
* - parameters, static fields, and fields coming from Java
4041
*
@@ -53,7 +54,7 @@ class Getters extends MiniPhaseTransform with SymTransformer { thisTransform =>
5354
override def transformSym(d: SymDenotation)(implicit ctx: Context): SymDenotation = {
5455
def noGetterNeeded =
5556
d.is(NoGetterNeeded) ||
56-
d.initial.asInstanceOf[SymDenotation].is(PrivateLocal) && !d.owner.is(Trait) && !d.is(Flags.Lazy) ||
57+
d.initial.asInstanceOf[SymDenotation].is(PrivateLocal) && !d.owner.is(Trait) && !isDerivedValueClass(d.owner) && !d.is(Flags.Lazy) ||
5758
d.is(Module) && d.isStatic ||
5859
d.isSelfSym
5960
if (d.isTerm && (d.is(Lazy) || d.owner.isClass) && d.info.isValueType && !noGetterNeeded) {

src/dotty/tools/dotc/typer/RefChecks.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -715,8 +715,6 @@ object RefChecks {
715715
case List(param) =>
716716
if (param.is(Mutable))
717717
ctx.error("value class parameter must not be a var", param.pos)
718-
if (param.is(PrivateLocal))
719-
ctx.error("value class parameter must not be private[this]", param.pos)
720718
case _ =>
721719
ctx.error("value class needs to have exactly one val parameter", clazz.pos)
722720
}

test/dotc/tests.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ class tests extends CompilerTest {
189189
@Test def neg_validateRefchecks = compileFile(negDir, "validate-refchecks", xerrors = 2)
190190
@Test def neg_skolemize = compileFile(negDir, "skolemize", xerrors = 2)
191191
@Test def neg_nested_bounds = compileFile(negDir, "nested_bounds", xerrors = 1)
192-
@Test def neg_valueClasses = compileFile(negDir, "valueClasses", xerrors = 4)
192+
@Test def neg_valueClasses = compileFile(negDir, "valueClasses", xerrors = 2)
193193

194194
@Test def run_all = runFiles(runDir)
195195

tests/neg/valueClasses.scala

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,3 @@ class B1 {
66
class B2(x: Int) extends AnyVal // error: value class may not be a local class
77
}
88
}
9-
class C(private[this] val u: Int) extends AnyVal // error: value class parameter must not be private[this]
10-
class D(u: Int) extends AnyVal // error: value class parameter must not be private[this]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package privatethisparam
2+
3+
class Meter[T](x: T) extends AnyVal {
4+
def zero: T = x
5+
}
6+
7+
class Meter2(private[this] val x: Int) extends AnyVal {
8+
def foo = x
9+
}
10+
11+
object Test {
12+
def bar = new Meter2(42)
13+
def useZero = new Meter(5).zero
14+
def test: Unit = {
15+
val m1 = new Meter(1)
16+
m1.zero
17+
}
18+
}

0 commit comments

Comments
 (0)