aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/RefChecks.scala
diff options
context:
space:
mode:
authorVladimirNik <vladimir.nikolaev9@gmail.com>2016-02-16 16:53:47 +0100
committerVladimirNik <vladimir.nikolaev9@gmail.com>2016-02-16 23:54:10 +0100
commit71698fa7898633e71ba7d94182d89b76fe91b6ab (patch)
tree39567c983bff1ce653b59af1d7905cf82503bb18 /src/dotty/tools/dotc/typer/RefChecks.scala
parent5e8023335e641c9c05c6517a82764571e7ef6386 (diff)
downloaddotty-71698fa7898633e71ba7d94182d89b76fe91b6ab.tar.gz
dotty-71698fa7898633e71ba7d94182d89b76fe91b6ab.tar.bz2
dotty-71698fa7898633e71ba7d94182d89b76fe91b6ab.zip
Add checks for value classes:
1. Add errors in case of incorrect parameter; 2. Improvement to error message if value class is defined as a local class;
Diffstat (limited to 'src/dotty/tools/dotc/typer/RefChecks.scala')
-rw-r--r--src/dotty/tools/dotc/typer/RefChecks.scala14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/typer/RefChecks.scala b/src/dotty/tools/dotc/typer/RefChecks.scala
index 067694bfd..bb411c6b5 100644
--- a/src/dotty/tools/dotc/typer/RefChecks.scala
+++ b/src/dotty/tools/dotc/typer/RefChecks.scala
@@ -708,7 +708,19 @@ object RefChecks {
if (clazz.is(Abstract))
ctx.error("`abstract' modifier cannot be used with value classes", clazz.pos)
if (!clazz.isStatic)
- ctx.error("value class cannot be an inner class", clazz.pos)
+ ctx.error(s"value class may not be a ${if (clazz.owner.isTerm) "local class" else "member of another class"}", clazz.pos)
+ else {
+ val clParamAccessors = clazz.asClass.paramAccessors.filter(sym => sym.isTerm && !sym.is(Method))
+ clParamAccessors match {
+ case List(param) =>
+ if (param.is(Mutable))
+ ctx.error("value class parameter must not be a var", param.pos)
+ if (param.is(PrivateLocal))
+ ctx.error("value class parameter must not be private[this]", param.pos)
+ case _ =>
+ ctx.error("value class needs to have exactly one val parameter", clazz.pos)
+ }
+ }
stats.foreach(checkValueClassMember)
}
}