@@ -3549,7 +3549,7 @@ object Parsers {
35493549 syntaxError(i " extension clause can only define methods " , stat.span)
35503550 }
35513551
3552- /** GivenDef ::= [GivenSig] (Type [‘=’ Expr] | StructuralInstance )
3552+ /** GivenDef ::= [GivenSig] (Type [‘=’ Expr] | ConstrApps TemplateBody )
35533553 * GivenSig ::= [id] [DefTypeParamClause] {UsingParamClauses} ‘:’
35543554 */
35553555 def givenDef (start : Offset , mods : Modifiers , givenMod : Mod ) = atSpan(start, nameStart) {
@@ -3567,10 +3567,9 @@ object Parsers {
35673567 newLinesOpt()
35683568 val noParams = tparams.isEmpty && vparamss.isEmpty
35693569 if ! (name.isEmpty && noParams) then accept(COLON )
3570- val parents =
3571- if isSimpleLiteral then toplevelTyp() :: Nil
3572- else constrApp() :: withConstrApps()
3570+ val parents = if isSimpleLiteral then toplevelTyp() :: Nil else constrApps()
35733571 val parentsIsType = parents.length == 1 && parents.head.isType
3572+ newLineOptWhenFollowedBy(LBRACE )
35743573 if in.token == EQUALS && parentsIsType then
35753574 accept(EQUALS )
35763575 mods1 |= Final
@@ -3579,17 +3578,17 @@ object Parsers {
35793578 ValDef (name, parents.head, subExpr())
35803579 else
35813580 DefDef (name, joinParams(tparams, vparamss), parents.head, subExpr())
3582- else if in.token != WITH && parentsIsType then
3583- if name.isEmpty then
3584- syntaxError(em " anonymous given cannot be abstract " )
3585- DefDef (name, joinParams(tparams, vparamss), parents.head, EmptyTree )
3586- else
3581+ else if isTemplateBodyStart then
35873582 val tparams1 = tparams.map(tparam => tparam.withMods(tparam.mods | PrivateLocal ))
35883583 val vparamss1 = vparamss.map(_.map(vparam =>
35893584 vparam.withMods(vparam.mods &~ Param | ParamAccessor | Protected )))
3590- val templ = withTemplate (makeConstructor(tparams1, vparamss1), parents)
3585+ val templ = templateBodyOpt (makeConstructor(tparams1, vparamss1), parents, Nil )
35913586 if noParams then ModuleDef (name, templ)
35923587 else TypeDef (name.toTypeName, templ)
3588+ else
3589+ if name.isEmpty then
3590+ syntaxError(em " anonymous given cannot be abstract " )
3591+ DefDef (name, joinParams(tparams, vparamss), parents.head, EmptyTree )
35933592 end gdef
35943593 finalizeDef(gdef, mods1, start)
35953594 }
@@ -3779,14 +3778,6 @@ object Parsers {
37793778 vd
37803779 }
37813780
3782- /** with Template, with EOL <indent> interpreted */
3783- def withTemplate (constr : DefDef , parents : List [Tree ]): Template =
3784- if in.token != WITH then syntaxError(em " `with` expected " )
3785- possibleTemplateStart() // consumes a WITH token
3786- val (self, stats) = templateBody()
3787- Template (constr, parents, Nil , self, stats)
3788- .withSpan(Span (constr.span.orElse(parents.head.span).start, in.lastOffset))
3789-
37903781/* -------- STATSEQS ------------------------------------------- */
37913782
37923783 /** Create a tree representing a packaging */
0 commit comments