Skip to content

Commit bfebebd

Browse files
committed
Allow vals in using clauses of givens
1 parent 6f29a76 commit bfebebd

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ object Parsers {
6161
case ExtensionFollow // extension clause, following extension parameter
6262

6363
def isClass = // owner is a class
64-
this == Class || this == CaseClass
64+
this == Class || this == CaseClass || this == Given
6565
def takesOnlyUsingClauses = // only using clauses allowed for this owner
6666
this == Given || this == ExtensionFollow
6767
def acceptsVariance =
@@ -3283,7 +3283,7 @@ object Parsers {
32833283
val isAbstractOwner = paramOwner == ParamOwner.Type || paramOwner == ParamOwner.TypeParam
32843284
val start = in.offset
32853285
var mods = annotsAsMods() | Param
3286-
if paramOwner == ParamOwner.Class || paramOwner == ParamOwner.CaseClass then
3286+
if paramOwner.isClass then
32873287
mods |= PrivateLocal
32883288
if isIdent(nme.raw.PLUS) && checkVarianceOK() then
32893289
mods |= Covariant
@@ -4001,6 +4001,13 @@ object Parsers {
40014001
val nameStart = in.offset
40024002
val name = if isIdent && followingIsGivenSig() then ident() else EmptyTermName
40034003

4004+
def adjustDefParams(paramss: List[ParamClause]): List[ParamClause] =
4005+
paramss.nestedMap: param =>
4006+
if !param.mods.isAllOf(PrivateLocal) then
4007+
syntaxError(em"method parameter ${param.name} may not be `a val`", param.span)
4008+
param.withMods(param.mods &~ (AccessFlags | ParamAccessor | Mutable) | Param)
4009+
.asInstanceOf[List[ParamClause]]
4010+
40044011
val gdef =
40054012
val tparams = typeParamClauseOpt(ParamOwner.Given)
40064013
newLineOpt()
@@ -4022,16 +4029,17 @@ object Parsers {
40224029
mods1 |= Lazy
40234030
ValDef(name, parents.head, subExpr())
40244031
else
4025-
DefDef(name, joinParams(tparams, vparamss), parents.head, subExpr())
4032+
DefDef(name, adjustDefParams(joinParams(tparams, vparamss)), parents.head, subExpr())
40264033
else if (isStatSep || isStatSeqEnd) && parentsIsType then
40274034
if name.isEmpty then
40284035
syntaxError(em"anonymous given cannot be abstract")
4029-
DefDef(name, joinParams(tparams, vparamss), parents.head, EmptyTree)
4036+
DefDef(name, adjustDefParams(joinParams(tparams, vparamss)), parents.head, EmptyTree)
40304037
else
4031-
val tparams1 = tparams.map(tparam => tparam.withMods(tparam.mods | PrivateLocal))
4032-
val vparamss1 = vparamss.map(_.map(vparam =>
4033-
vparam.withMods(vparam.mods &~ Param | ParamAccessor | Protected)))
4034-
val constr = makeConstructor(tparams1, vparamss1)
4038+
val vparamss1 = vparamss.nestedMap: vparam =>
4039+
if vparam.mods.is(Private)
4040+
then vparam.withMods(vparam.mods &~ PrivateLocal | Protected)
4041+
else vparam
4042+
val constr = makeConstructor(tparams, vparamss1)
40354043
val templ =
40364044
if isStatSep || isStatSeqEnd then Template(constr, parents, Nil, EmptyValDef, Nil)
40374045
else withTemplate(constr, parents)

0 commit comments

Comments
 (0)