@@ -61,7 +61,7 @@ object Parsers {
61
61
case ExtensionFollow // extension clause, following extension parameter
62
62
63
63
def isClass = // owner is a class
64
- this == Class || this == CaseClass
64
+ this == Class || this == CaseClass || this == Given
65
65
def takesOnlyUsingClauses = // only using clauses allowed for this owner
66
66
this == Given || this == ExtensionFollow
67
67
def acceptsVariance =
@@ -3283,7 +3283,7 @@ object Parsers {
3283
3283
val isAbstractOwner = paramOwner == ParamOwner .Type || paramOwner == ParamOwner .TypeParam
3284
3284
val start = in.offset
3285
3285
var mods = annotsAsMods() | Param
3286
- if paramOwner == ParamOwner . Class || paramOwner == ParamOwner . CaseClass then
3286
+ if paramOwner.isClass then
3287
3287
mods |= PrivateLocal
3288
3288
if isIdent(nme.raw.PLUS ) && checkVarianceOK() then
3289
3289
mods |= Covariant
@@ -4001,6 +4001,13 @@ object Parsers {
4001
4001
val nameStart = in.offset
4002
4002
val name = if isIdent && followingIsGivenSig() then ident() else EmptyTermName
4003
4003
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
+
4004
4011
val gdef =
4005
4012
val tparams = typeParamClauseOpt(ParamOwner .Given )
4006
4013
newLineOpt()
@@ -4022,16 +4029,17 @@ object Parsers {
4022
4029
mods1 |= Lazy
4023
4030
ValDef (name, parents.head, subExpr())
4024
4031
else
4025
- DefDef (name, joinParams(tparams, vparamss), parents.head, subExpr())
4032
+ DefDef (name, adjustDefParams( joinParams(tparams, vparamss) ), parents.head, subExpr())
4026
4033
else if (isStatSep || isStatSeqEnd) && parentsIsType then
4027
4034
if name.isEmpty then
4028
4035
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 )
4030
4037
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)
4035
4043
val templ =
4036
4044
if isStatSep || isStatSeqEnd then Template (constr, parents, Nil , EmptyValDef , Nil )
4037
4045
else withTemplate(constr, parents)
0 commit comments