@@ -62,7 +62,7 @@ object Parsers {
62
62
case ExtensionFollow // extension clause, following extension parameter
63
63
64
64
def isClass = // owner is a class
65
- this == Class || this == CaseClass
65
+ this == Class || this == CaseClass || this == Given
66
66
def takesOnlyUsingClauses = // only using clauses allowed for this owner
67
67
this == Given || this == ExtensionFollow
68
68
def acceptsVariance =
@@ -3291,7 +3291,7 @@ object Parsers {
3291
3291
val isAbstractOwner = paramOwner == ParamOwner .Type || paramOwner == ParamOwner .TypeParam
3292
3292
val start = in.offset
3293
3293
var mods = annotsAsMods() | Param
3294
- if paramOwner == ParamOwner . Class || paramOwner == ParamOwner . CaseClass then
3294
+ if paramOwner.isClass then
3295
3295
mods |= PrivateLocal
3296
3296
if isIdent(nme.raw.PLUS ) && checkVarianceOK() then
3297
3297
mods |= Covariant
@@ -4011,6 +4011,14 @@ object Parsers {
4011
4011
val nameStart = in.offset
4012
4012
val name = if isIdent && followingIsGivenSig() then ident() else EmptyTermName
4013
4013
4014
+ // TODO Change syntax description
4015
+ def adjustDefParams (paramss : List [ParamClause ]): List [ParamClause ] =
4016
+ paramss.nestedMap: param =>
4017
+ if ! param.mods.isAllOf(PrivateLocal ) then
4018
+ syntaxError(em " method parameter ${param.name} may not be `a val` " , param.span)
4019
+ param.withMods(param.mods &~ (AccessFlags | ParamAccessor | Mutable ) | Param )
4020
+ .asInstanceOf [List [ParamClause ]]
4021
+
4014
4022
val gdef =
4015
4023
val tparams = typeParamClauseOpt(ParamOwner .Given )
4016
4024
newLineOpt()
@@ -4032,16 +4040,17 @@ object Parsers {
4032
4040
mods1 |= Lazy
4033
4041
ValDef (name, parents.head, subExpr())
4034
4042
else
4035
- DefDef (name, joinParams(tparams, vparamss), parents.head, subExpr())
4043
+ DefDef (name, adjustDefParams( joinParams(tparams, vparamss) ), parents.head, subExpr())
4036
4044
else if (isStatSep || isStatSeqEnd) && parentsIsType then
4037
4045
if name.isEmpty then
4038
4046
syntaxError(em " anonymous given cannot be abstract " )
4039
- DefDef (name, joinParams(tparams, vparamss), parents.head, EmptyTree )
4047
+ DefDef (name, adjustDefParams( joinParams(tparams, vparamss) ), parents.head, EmptyTree )
4040
4048
else
4041
- val tparams1 = tparams.map(tparam => tparam.withMods(tparam.mods | PrivateLocal ))
4042
- val vparamss1 = vparamss.map(_.map(vparam =>
4043
- vparam.withMods(vparam.mods &~ Param | ParamAccessor | Protected )))
4044
- val constr = makeConstructor(tparams1, vparamss1)
4049
+ val vparamss1 = vparamss.nestedMap: vparam =>
4050
+ if vparam.mods.is(Private )
4051
+ then vparam.withMods(vparam.mods &~ PrivateLocal | Protected )
4052
+ else vparam
4053
+ val constr = makeConstructor(tparams, vparamss1)
4045
4054
val templ =
4046
4055
if isStatSep || isStatSeqEnd then Template (constr, parents, Nil , EmptyValDef , Nil )
4047
4056
else withTemplate(constr, parents)
0 commit comments