@@ -3549,7 +3549,7 @@ object Parsers {
35493549 syntaxError(i " extension clause can only define methods " , stat.span)
35503550 }
35513551
3552- /** GivenDef ::= [GivenSig] (AnnotType [‘=’ Expr] | ConstrApps TemplateBody )
3552+ /** GivenDef ::= [GivenSig] (AnnotType [‘=’ Expr] | StructuralInstance )
35533553 * GivenSig ::= [id] [DefTypeParamClause] {UsingParamClauses} ‘:’
35543554 */
35553555 def givenDef (start : Offset , mods : Modifiers , givenMod : Mod ) = atSpan(start, nameStart) {
@@ -3569,9 +3569,8 @@ object Parsers {
35693569 if ! (name.isEmpty && noParams) then accept(COLON )
35703570 val parents =
35713571 if isSimpleLiteral then rejectWildcardType(annotType()) :: Nil
3572- else constrApps ()
3572+ else constrApp() :: withConstrApps ()
35733573 val parentsIsType = parents.length == 1 && parents.head.isType
3574- newLineOptWhenFollowedBy(LBRACE )
35753574 if in.token == EQUALS && parentsIsType then
35763575 accept(EQUALS )
35773576 mods1 |= Final
@@ -3580,17 +3579,17 @@ object Parsers {
35803579 ValDef (name, parents.head, subExpr())
35813580 else
35823581 DefDef (name, joinParams(tparams, vparamss), parents.head, subExpr())
3583- else if isTemplateBodyStart then
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
35843587 val tparams1 = tparams.map(tparam => tparam.withMods(tparam.mods | PrivateLocal ))
35853588 val vparamss1 = vparamss.map(_.map(vparam =>
35863589 vparam.withMods(vparam.mods &~ Param | ParamAccessor | Protected )))
3587- val templ = templateBodyOpt (makeConstructor(tparams1, vparamss1), parents, Nil )
3590+ val templ = withTemplate (makeConstructor(tparams1, vparamss1), parents)
35883591 if noParams then ModuleDef (name, templ)
35893592 else TypeDef (name.toTypeName, templ)
3590- else
3591- if name.isEmpty then
3592- syntaxError(em " anonymous given cannot be abstract " )
3593- DefDef (name, joinParams(tparams, vparamss), parents.head, EmptyTree )
35943593 end gdef
35953594 finalizeDef(gdef, mods1, start)
35963595 }
@@ -3780,6 +3779,14 @@ object Parsers {
37803779 vd
37813780 }
37823781
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+
37833790/* -------- STATSEQS ------------------------------------------- */
37843791
37853792 /** Create a tree representing a packaging */
0 commit comments