@@ -3549,7 +3549,7 @@ object Parsers {
3549
3549
syntaxError(i " extension clause can only define methods " , stat.span)
3550
3550
}
3551
3551
3552
- /** GivenDef ::= [GivenSig] (AnnotType [‘=’ Expr] | ConstrApps TemplateBody )
3552
+ /** GivenDef ::= [GivenSig] (AnnotType [‘=’ Expr] | StructuralInstance )
3553
3553
* GivenSig ::= [id] [DefTypeParamClause] {UsingParamClauses} ‘:’
3554
3554
*/
3555
3555
def givenDef (start : Offset , mods : Modifiers , givenMod : Mod ) = atSpan(start, nameStart) {
@@ -3569,9 +3569,8 @@ object Parsers {
3569
3569
if ! (name.isEmpty && noParams) then accept(COLON )
3570
3570
val parents =
3571
3571
if isSimpleLiteral then rejectWildcardType(annotType()) :: Nil
3572
- else constrApps ()
3572
+ else constrApp() :: withConstrApps ()
3573
3573
val parentsIsType = parents.length == 1 && parents.head.isType
3574
- newLineOptWhenFollowedBy(LBRACE )
3575
3574
if in.token == EQUALS && parentsIsType then
3576
3575
accept(EQUALS )
3577
3576
mods1 |= Final
@@ -3580,17 +3579,17 @@ object Parsers {
3580
3579
ValDef (name, parents.head, subExpr())
3581
3580
else
3582
3581
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
3584
3587
val tparams1 = tparams.map(tparam => tparam.withMods(tparam.mods | PrivateLocal ))
3585
3588
val vparamss1 = vparamss.map(_.map(vparam =>
3586
3589
vparam.withMods(vparam.mods &~ Param | ParamAccessor | Protected )))
3587
- val templ = templateBodyOpt (makeConstructor(tparams1, vparamss1), parents, Nil )
3590
+ val templ = withTemplate (makeConstructor(tparams1, vparamss1), parents)
3588
3591
if noParams then ModuleDef (name, templ)
3589
3592
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 )
3594
3593
end gdef
3595
3594
finalizeDef(gdef, mods1, start)
3596
3595
}
@@ -3780,6 +3779,14 @@ object Parsers {
3780
3779
vd
3781
3780
}
3782
3781
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
+
3783
3790
/* -------- STATSEQS ------------------------------------------- */
3784
3791
3785
3792
/** Create a tree representing a packaging */
0 commit comments