Skip to content

Commit fc39792

Browse files
committed
Simplify syntax
`enum' only allowed as a prefix of classes, dropped from traits and objects.
1 parent b20c1be commit fc39792

File tree

6 files changed

+17
-17
lines changed

6 files changed

+17
-17
lines changed

compiler/src/dotty/tools/dotc/ast/Desugar.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,7 @@ object desugar {
912912
case (gen: GenFrom) :: (rest @ (GenFrom(_, _) :: _)) =>
913913
val cont = makeFor(mapName, flatMapName, rest, body)
914914
Apply(rhsSelect(gen, flatMapName), makeLambda(gen.pat, cont))
915-
case (enum @ GenFrom(pat, rhs)) :: (rest @ GenAlias(_, _) :: _) =>
915+
case (GenFrom(pat, rhs)) :: (rest @ GenAlias(_, _) :: _) =>
916916
val (valeqs, rest1) = rest.span(_.isInstanceOf[GenAlias])
917917
val pats = valeqs map { case GenAlias(pat, _) => pat }
918918
val rhss = valeqs map { case GenAlias(_, rhs) => rhs }
@@ -1013,7 +1013,6 @@ object desugar {
10131013
List(CaseDef(Ident(nme.DEFAULT_EXCEPTION_NAME), EmptyTree, Apply(handler, Ident(nme.DEFAULT_EXCEPTION_NAME)))),
10141014
finalizer)
10151015
}
1016-
10171016
}
10181017
}.withPos(tree.pos)
10191018

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -829,11 +829,11 @@ object JavaParsers {
829829
val superclazz = Apply(TypeApply(
830830
Select(New(javaLangDot(tpnme.Enum)), nme.CONSTRUCTOR), List(enumType)),
831831
List(Literal(Constant(null)),Literal(Constant(0))))
832-
val enum = atPos(start, nameOffset) {
832+
val enumclazz = atPos(start, nameOffset) {
833833
TypeDef(name,
834834
makeTemplate(superclazz :: interfaces, body, List(), true)).withMods(mods | Flags.Enum)
835835
}
836-
addCompanionObject(consts ::: statics ::: predefs, enum)
836+
addCompanionObject(consts ::: statics ::: predefs, enumclazz)
837837
}
838838

839839
def enumConst(enumType: Tree) = {

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2032,8 +2032,8 @@ object Parsers {
20322032
}
20332033
}
20342034

2035-
/** TmplDef ::= ([`case' | `enum]'] ‘class’ | [`enum'] trait’) ClassDef
2036-
* | [`case' | `enum'] `object' ObjectDef
2035+
/** TmplDef ::= ([`case' | `enum]'] ‘class’ | trait’) ClassDef
2036+
* | [`case'] `object' ObjectDef
20372037
* | `enum' EnumDef
20382038
*/
20392039
def tmplDef(start: Int, mods: Modifiers): Tree = {
@@ -2050,10 +2050,7 @@ object Parsers {
20502050
objectDef(start, posMods(start, mods | Case | Module))
20512051
case ENUM =>
20522052
val mods1 = addMod(mods, atPos(in.skipToken()) { Mod.Enum() })
2053-
in.token match {
2054-
case CLASS | TRAIT | OBJECT => tmplDef(start, mods1)
2055-
case _ => enumDef(start, mods)
2056-
}
2053+
if (in.token == CLASS) tmplDef(start, mods1) else enumDef(start, mods)
20572054
case _ =>
20582055
syntaxErrorOrIncomplete("expected start of definition")
20592056
EmptyTree

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,10 @@ object Scanners {
294294
if (!sepRegions.isEmpty && sepRegions.head == lastToken)
295295
sepRegions = sepRegions.tail
296296
case ARROW =>
297-
if (!sepRegions.isEmpty && sepRegions.head == lastToken)
297+
if (!sepRegions.isEmpty && sepRegions.head == ARROW)
298+
sepRegions = sepRegions.tail
299+
case EXTENDS =>
300+
if (!sepRegions.isEmpty && sepRegions.head == ARROW)
298301
sepRegions = sepRegions.tail
299302
case STRINGLIT =>
300303
if (inMultiLineInterpolation)
@@ -330,7 +333,8 @@ object Scanners {
330333
if (isAfterLineEnd() &&
331334
(canEndStatTokens contains lastToken) &&
332335
(canStartStatTokens contains token) &&
333-
(sepRegions.isEmpty || sepRegions.head == RBRACE)) {
336+
(sepRegions.isEmpty || sepRegions.head == RBRACE ||
337+
sepRegions.head == ARROW && token == CASE)) {
334338
next copyFrom this
335339
// todo: make offset line-end of previous line?
336340
offset = if (lineStartOffset <= offset) lineStartOffset else lastLineStartOffset

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ object Tokens extends TokensCommon {
192192
/** XML mode */
193193
final val XMLSTART = 96; enter(XMLSTART, "$XMLSTART$<") // TODO: deprecate
194194

195-
final val alphaKeywords = tokenRange(IF, INLINE)
195+
final val alphaKeywords = tokenRange(IF, ENUM)
196196
final val symbolicKeywords = tokenRange(USCORE, VIEWBOUND)
197197
final val symbolicTokens = tokenRange(COMMA, VIEWBOUND)
198198
final val keywords = alphaKeywords | symbolicKeywords
@@ -213,7 +213,7 @@ object Tokens extends TokensCommon {
213213

214214
final val canStartBindingTokens = identifierTokens | BitSet(USCORE, LPAREN)
215215

216-
final val templateIntroTokens = BitSet(CLASS, TRAIT, OBJECT, CASECLASS, CASEOBJECT)
216+
final val templateIntroTokens = BitSet(CLASS, TRAIT, OBJECT, ENUM, CASECLASS, CASEOBJECT)
217217

218218
final val dclIntroTokens = BitSet(DEF, VAL, VAR, TYPE)
219219

docs/docs/internals/syntax.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,15 +330,15 @@ DefDef ::= DefSig [‘:’ Type] ‘=’ Expr
330330
| ‘this’ DefParamClause DefParamClauses DefDef(_, <init>, Nil, vparamss, EmptyTree, expr | Block)
331331
(‘=’ ConstrExpr | [nl] ConstrBlock)
332332
333-
TmplDef ::= ([‘case’ | `enum'] ‘class’ | [`enum'] trait’) ClassDef
334-
| [‘case’ | `enum'] ‘object’ ObjectDef
333+
TmplDef ::= ([‘case’ | `enum'] ‘class’ | trait’) ClassDef
334+
| [‘case’] ‘object’ ObjectDef
335335
| `enum' EnumDef
336336
ClassDef ::= id ClassConstr TemplateOpt ClassDef(mods, name, tparams, templ)
337337
ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsParamClauses with DefDef(_, <init>, Nil, vparamss, EmptyTree, EmptyTree) as first stat
338338
ConstrMods ::= AccessModifier
339339
| Annotation {Annotation} (AccessModifier | ‘this’)
340340
ObjectDef ::= id TemplateOpt ModuleDef(mods, name, template) // no constructor
341-
EnumDef ::= id ClassConstr [`extends' [ConstrApps]] EnumDef(mods, name, tparams, template)
341+
EnumDef ::= id ClassConstr [`extends' [ConstrApps]] EnumDef(mods, name, tparams, template)
342342
[nl] ‘{’ EnumCaseStat {semi EnumCaseStat ‘}’
343343
EnumCaseStat ::= {Annotation [nl]} {Modifier} EnumCase
344344
EnumCase ::= `case' (EnumClassDef | ObjectDef)

0 commit comments

Comments
 (0)