Skip to content

Commit b0933d3

Browse files
committed
Adapt given instance definitions
1 parent 4b76087 commit b0933d3

File tree

4 files changed

+14
-24
lines changed

4 files changed

+14
-24
lines changed

compiler/src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */

docs/docs/internals/syntax.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,8 @@ ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsParamClauses
385385
ConstrMods ::= {Annotation} [AccessModifier]
386386
ObjectDef ::= id [Template] ModuleDef(mods, name, template) // no constructor
387387
EnumDef ::= id ClassConstr InheritClauses EnumBody
388-
GivenDef ::= [GivenSig] (Type [‘=’ Expr] | StructuralInstance)
388+
GivenDef ::= [GivenSig] (Type [‘=’ Expr] | ConstrApps TemplateBody)
389389
GivenSig ::= [id] [DefTypeParamClause] {UsingParamClause} ‘:’ -- one of `id`, `DefParamClause`, `UsingParamClause` must be present
390-
StructuralInstance ::= ConstrApp {‘with’ ConstrApp} TemplateBody
391390
Extension ::= ‘extension’ [DefTypeParamClause] ‘(’ DefParam ‘)’
392391
{UsingParamClause}] ExtMethods
393392
ExtMethods ::= ExtMethod | [nl] ‘{’ ExtMethod {semi ExtMethod ‘}’

docs/docs/reference/contextual/givens.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,10 @@ Here is the syntax for given instances:
153153
```
154154
TmplDef ::= ...
155155
| ‘given’ GivenDef
156-
GivenDef ::= [GivenSig] StructuralInstance
156+
GivenDef ::= [GivenSig] ConstrApps TemplateBody
157157
| [GivenSig] Type ‘=’ Expr
158158
| [GivenSig] Type
159159
GivenSig ::= [id] [DefTypeParamClause] {UsingParamClause} ‘:’
160-
StructuralInstance ::= ConstrApp {‘with’ ConstrApp} ‘with’ TemplateBody
161160
```
162161

163162
A given instance starts with the reserved word `given` and an optional _signature_. The signature

tests/pos-custom-args/erased/i7868.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@ object Coproduct {
1212

1313
object At {
1414

15-
given atHead[Head, Tail]: At[Head +: Tail, Head, 0] with {
15+
given atHead[Head, Tail]: At[Head +: Tail, Head, 0] {
1616
def cast: Head <:< Head +: Tail = summon[Head <:< Head +: Tail]
1717
}
1818

1919
given atTail[Head, Tail, Value, NextIndex <: Int]
2020
(using atNext: At[Tail, Value, NextIndex])
21-
: At[Head +: Tail, Value, S[NextIndex]] with
21+
: At[Head +: Tail, Value, S[NextIndex]]
22+
with
2223
val cast: Value <:< Head +: Tail = atNext.cast
2324

2425
given [A](using A): (() => A) = { () => summon[A]}

0 commit comments

Comments
 (0)