@@ -1532,13 +1532,15 @@ object Parsers {
1532
1532
* PolyFunType ::= HKTypeParamClause '=>' Type
1533
1533
* | HKTypeParamClause ‘->’ [CaptureSet] Type -- under pureFunctions
1534
1534
* FunTypeArgs ::= InfixType
1535
- * | `(' [ [ ‘['erased'] FunArgType {`,' FunArgType } ] `)'
1536
- * | '(' [ ‘['erased'] TypedFunParam {',' TypedFunParam } ')'
1535
+ * | `(' [ FunArgType {`,' FunArgType } ] `)'
1536
+ * | '(' [ TypedFunParam {',' TypedFunParam } ')'
1537
+ * MatchType ::= InfixType `match` <<< TypeCaseClauses >>>
1537
1538
*/
1538
1539
def typ (): Tree =
1539
1540
val start = in.offset
1540
1541
var imods = Modifiers ()
1541
1542
var erasedArgs : ListBuffer [Boolean ] = ListBuffer ()
1543
+
1542
1544
def functionRest (params : List [Tree ]): Tree =
1543
1545
val paramSpan = Span (start, in.lastOffset)
1544
1546
atSpan(start, in.offset) {
@@ -1567,7 +1569,8 @@ object Parsers {
1567
1569
else
1568
1570
accept(ARROW )
1569
1571
1570
- val resultType = if isPure then capturesAndResult(typ) else typ()
1572
+ val resultType =
1573
+ if isPure then capturesAndResult(typ) else typ()
1571
1574
if token == TLARROW then
1572
1575
for case ValDef (_, tpt, _) <- params do
1573
1576
if isByNameType(tpt) then
@@ -1585,98 +1588,93 @@ object Parsers {
1585
1588
Function (params, resultType)
1586
1589
}
1587
1590
1588
- var isValParamList = false
1591
+ def typeRest (t : Tree ) = in.token match
1592
+ case ARROW | CTXARROW =>
1593
+ erasedArgs.addOne(false )
1594
+ functionRest(t :: Nil )
1595
+ case MATCH =>
1596
+ matchType(t)
1597
+ case FORSOME =>
1598
+ syntaxError(ExistentialTypesNoLongerSupported ())
1599
+ t
1600
+ case _ if isPureArrow =>
1601
+ erasedArgs.addOne(false )
1602
+ functionRest(t :: Nil )
1603
+ case _ =>
1604
+ if erasedArgs.contains(true ) && ! t.isInstanceOf [FunctionWithMods ] then
1605
+ syntaxError(ErasedTypesCanOnlyBeFunctionTypes (), implicitKwPos(start))
1606
+ t
1589
1607
1590
- val t =
1591
- if (in.token == LPAREN ) {
1608
+ var isValParamList = false
1609
+ if in.token == LPAREN then
1610
+ in.nextToken()
1611
+ if in.token == RPAREN then
1592
1612
in.nextToken()
1593
- if (in.token == RPAREN ) {
1594
- in.nextToken()
1595
- functionRest(Nil )
1596
- }
1597
- else {
1598
- val paramStart = in.offset
1599
- def addErased () =
1600
- erasedArgs.addOne(isErasedKw)
1601
- if isErasedKw then { in.skipToken(); }
1602
- addErased()
1603
- val ts = in.currentRegion.withCommasExpected {
1613
+ functionRest(Nil )
1614
+ else
1615
+ val paramStart = in.offset
1616
+ def addErased () =
1617
+ erasedArgs.addOne(isErasedKw)
1618
+ if isErasedKw then in.skipToken()
1619
+ addErased()
1620
+ val args =
1621
+ in.currentRegion.withCommasExpected:
1604
1622
funArgType() match
1605
1623
case Ident (name) if name != tpnme.WILDCARD && in.isColon =>
1606
1624
isValParamList = true
1607
- def funParam (start : Offset , mods : Modifiers ) = {
1608
- atSpan(start) {
1625
+ def funParam (start : Offset , mods : Modifiers ) =
1626
+ atSpan(start):
1609
1627
addErased()
1610
1628
typedFunParam(in.offset, ident(), imods)
1611
- }
1612
- }
1613
1629
commaSeparatedRest(
1614
1630
typedFunParam(paramStart, name.toTermName, imods),
1615
1631
() => funParam(in.offset, imods))
1616
1632
case t =>
1617
- def funParam () = {
1618
- addErased()
1619
- funArgType()
1620
- }
1621
- commaSeparatedRest(t, funParam)
1622
- }
1623
- accept(RPAREN )
1624
- if isValParamList || in.isArrow || isPureArrow then
1625
- functionRest(ts)
1626
- else {
1627
- val ts1 = ts.mapConserve { t =>
1628
- if isByNameType(t) then
1629
- syntaxError(ByNameParameterNotSupported (t), t.span)
1630
- stripByNameType(t)
1631
- else
1632
- t
1633
- }
1634
- val tuple = atSpan(start) { makeTupleOrParens(ts1) }
1635
- infixTypeRest(
1636
- refinedTypeRest(
1637
- withTypeRest(
1638
- annotTypeRest(
1639
- simpleTypeRest(tuple)))))
1640
- }
1641
- }
1642
- }
1643
- else if (in.token == LBRACKET ) {
1644
- val start = in.offset
1645
- val tparams = typeParamClause(ParamOwner .TypeParam )
1646
- if (in.token == TLARROW )
1647
- atSpan(start, in.skipToken())(LambdaTypeTree (tparams, toplevelTyp()))
1648
- else if (in.token == ARROW || isPureArrow(nme.PUREARROW )) {
1649
- val arrowOffset = in.skipToken()
1650
- val body = toplevelTyp()
1651
- atSpan(start, arrowOffset) {
1652
- getFunction(body) match {
1653
- case Some (f) =>
1654
- PolyFunction (tparams, body)
1655
- case None =>
1656
- syntaxError(em " Implementation restriction: polymorphic function types must have a value parameter " , arrowOffset)
1657
- Ident (nme.ERROR .toTypeName)
1658
- }
1659
- }
1660
- }
1661
- else { accept(TLARROW ); typ() }
1662
- }
1663
- else if (in.token == INDENT ) enclosed(INDENT , typ())
1664
- else infixType()
1665
-
1666
- in.token match
1667
- case ARROW | CTXARROW =>
1668
- erasedArgs.addOne(false )
1669
- functionRest(t :: Nil )
1670
- case MATCH => matchType(t)
1671
- case FORSOME => syntaxError(ExistentialTypesNoLongerSupported ()); t
1672
- case _ =>
1673
- if isPureArrow then
1674
- erasedArgs.addOne(false )
1675
- functionRest(t :: Nil )
1633
+ def funArg () =
1634
+ addErased()
1635
+ funArgType()
1636
+ commaSeparatedRest(t, funArg)
1637
+ accept(RPAREN )
1638
+ if isValParamList || in.isArrow || isPureArrow then
1639
+ functionRest(args)
1676
1640
else
1677
- if (erasedArgs.contains(true ) && ! t.isInstanceOf [FunctionWithMods ])
1678
- syntaxError(ErasedTypesCanOnlyBeFunctionTypes (), implicitKwPos(start))
1679
- t
1641
+ val args1 = args.mapConserve: t =>
1642
+ if isByNameType(t) then
1643
+ syntaxError(ByNameParameterNotSupported (t), t.span)
1644
+ stripByNameType(t)
1645
+ else
1646
+ t
1647
+ val tuple = atSpan(start):
1648
+ makeTupleOrParens(args1)
1649
+ typeRest :
1650
+ infixTypeRest :
1651
+ refinedTypeRest :
1652
+ withTypeRest :
1653
+ annotTypeRest :
1654
+ simpleTypeRest(tuple)
1655
+ else if in.token == LBRACKET then
1656
+ val start = in.offset
1657
+ val tparams = typeParamClause(ParamOwner .TypeParam )
1658
+ if in.token == TLARROW then
1659
+ atSpan(start, in.skipToken()):
1660
+ LambdaTypeTree (tparams, toplevelTyp())
1661
+ else if in.token == ARROW || isPureArrow(nme.PUREARROW ) then
1662
+ val arrowOffset = in.skipToken()
1663
+ val body = toplevelTyp()
1664
+ atSpan(start, arrowOffset):
1665
+ getFunction(body) match
1666
+ case Some (f) =>
1667
+ PolyFunction (tparams, body)
1668
+ case None =>
1669
+ syntaxError(em " Implementation restriction: polymorphic function types must have a value parameter " , arrowOffset)
1670
+ Ident (nme.ERROR .toTypeName)
1671
+ else
1672
+ accept(TLARROW )
1673
+ typ()
1674
+ else if in.token == INDENT then
1675
+ enclosed(INDENT , typ())
1676
+ else
1677
+ typeRest(infixType())
1680
1678
end typ
1681
1679
1682
1680
private def makeKindProjectorTypeDef (name : TypeName ): TypeDef = {
@@ -1713,7 +1711,7 @@ object Parsers {
1713
1711
private def implicitKwPos (start : Int ): Span =
1714
1712
Span (start, start + nme.IMPLICITkw .asSimpleName.length)
1715
1713
1716
- /** TypedFunParam ::= id ':' Type */
1714
+ /** TypedFunParam ::= [`erased`] id ':' Type */
1717
1715
def typedFunParam (start : Offset , name : TermName , mods : Modifiers = EmptyModifiers ): ValDef =
1718
1716
atSpan(start) {
1719
1717
acceptColon()
@@ -2068,7 +2066,7 @@ object Parsers {
2068
2066
*/
2069
2067
def paramType (): Tree = paramTypeOf(paramValueType)
2070
2068
2071
- /** ParamValueType ::= [`into`] Type [`*']
2069
+ /** ParamValueType ::= Type [`*']
2072
2070
*/
2073
2071
def paramValueType (): Tree = {
2074
2072
val t = maybeInto(toplevelTyp)
@@ -2425,7 +2423,7 @@ object Parsers {
2425
2423
Match (t, inBracesOrIndented(caseClauses(() => caseClause())))
2426
2424
}
2427
2425
2428
- /** `match' `{' TypeCaseClauses `}'
2426
+ /** `match' <<< TypeCaseClauses >>>
2429
2427
*/
2430
2428
def matchType (t : Tree ): MatchTypeTree =
2431
2429
atSpan(startOffset(t), accept(MATCH )) {
@@ -2435,7 +2433,7 @@ object Parsers {
2435
2433
/** FunParams ::= Bindings
2436
2434
* | id
2437
2435
* | `_'
2438
- * Bindings ::= `(' [[‘erased’] Binding {`,' Binding}] `)'
2436
+ * Bindings ::= `(' [Binding {`,' Binding}] `)'
2439
2437
*/
2440
2438
def funParams (mods : Modifiers , location : Location ): List [Tree ] =
2441
2439
if in.token == LPAREN then
@@ -3173,7 +3171,7 @@ object Parsers {
3173
3171
* | AccessModifier
3174
3172
* | override
3175
3173
* | opaque
3176
- * LocalModifier ::= abstract | final | sealed | open | implicit | lazy | erased | inline | transparent
3174
+ * LocalModifier ::= abstract | final | sealed | open | implicit | lazy | inline | transparent | infix | erased
3177
3175
*/
3178
3176
def modifiers (allowed : BitSet = modifierTokens, start : Modifiers = Modifiers ()): Modifiers = {
3179
3177
@ tailrec
0 commit comments