From fe14afb67ecfeef0c7d6bc6588a1ec1c04b21fb8 Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Wed, 8 Feb 2017 21:10:58 +1100 Subject: Simplify syntax `enum' only allowed as a prefix of classes, dropped from traits and objects. --- compiler/src/dotty/tools/dotc/ast/Desugar.scala | 3 +-- compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala | 4 ++-- compiler/src/dotty/tools/dotc/parsing/Parsers.scala | 9 +++------ compiler/src/dotty/tools/dotc/parsing/Scanners.scala | 8 ++++++-- compiler/src/dotty/tools/dotc/parsing/Tokens.scala | 4 ++-- 5 files changed, 14 insertions(+), 14 deletions(-) (limited to 'compiler') diff --git a/compiler/src/dotty/tools/dotc/ast/Desugar.scala b/compiler/src/dotty/tools/dotc/ast/Desugar.scala index 75c7078a1..87994a87b 100644 --- a/compiler/src/dotty/tools/dotc/ast/Desugar.scala +++ b/compiler/src/dotty/tools/dotc/ast/Desugar.scala @@ -923,7 +923,7 @@ object desugar { case (gen: GenFrom) :: (rest @ (GenFrom(_, _) :: _)) => val cont = makeFor(mapName, flatMapName, rest, body) Apply(rhsSelect(gen, flatMapName), makeLambda(gen.pat, cont)) - case (enum @ GenFrom(pat, rhs)) :: (rest @ GenAlias(_, _) :: _) => + case (GenFrom(pat, rhs)) :: (rest @ GenAlias(_, _) :: _) => val (valeqs, rest1) = rest.span(_.isInstanceOf[GenAlias]) val pats = valeqs map { case GenAlias(pat, _) => pat } val rhss = valeqs map { case GenAlias(_, rhs) => rhs } @@ -1024,7 +1024,6 @@ object desugar { List(CaseDef(Ident(nme.DEFAULT_EXCEPTION_NAME), EmptyTree, Apply(handler, Ident(nme.DEFAULT_EXCEPTION_NAME)))), finalizer) } - } }.withPos(tree.pos) diff --git a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala index 6b73a9456..47f201a09 100644 --- a/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala @@ -828,11 +828,11 @@ object JavaParsers { val superclazz = Apply(TypeApply( Select(New(javaLangDot(tpnme.Enum)), nme.CONSTRUCTOR), List(enumType)), List(Literal(Constant(null)),Literal(Constant(0)))) - val enum = atPos(start, nameOffset) { + val enumclazz = atPos(start, nameOffset) { TypeDef(name, makeTemplate(superclazz :: interfaces, body, List(), true)).withMods(mods | Flags.Enum) } - addCompanionObject(consts ::: statics ::: predefs, enum) + addCompanionObject(consts ::: statics ::: predefs, enumclazz) } def enumConst(enumType: Tree) = { diff --git a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala index 1084b5784..7ec44e342 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Parsers.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Parsers.scala @@ -2044,8 +2044,8 @@ object Parsers { } } - /** TmplDef ::= ([`case' | `enum]'] ‘class’ | [`enum'] trait’) ClassDef - * | [`case' | `enum'] `object' ObjectDef + /** TmplDef ::= ([`case' | `enum]'] ‘class’ | trait’) ClassDef + * | [`case'] `object' ObjectDef * | `enum' EnumDef */ def tmplDef(start: Int, mods: Modifiers): Tree = { @@ -2062,10 +2062,7 @@ object Parsers { objectDef(start, posMods(start, mods | Case | Module)) case ENUM => val mods1 = addMod(mods, atPos(in.skipToken()) { Mod.Enum() }) - in.token match { - case CLASS | TRAIT | OBJECT => tmplDef(start, mods1) - case _ => enumDef(start, mods) - } + if (in.token == CLASS) tmplDef(start, mods1) else enumDef(start, mods) case _ => syntaxErrorOrIncomplete("expected start of definition") EmptyTree diff --git a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala index 847f600c0..4b1d02093 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Scanners.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Scanners.scala @@ -294,7 +294,10 @@ object Scanners { if (!sepRegions.isEmpty && sepRegions.head == lastToken) sepRegions = sepRegions.tail case ARROW => - if (!sepRegions.isEmpty && sepRegions.head == lastToken) + if (!sepRegions.isEmpty && sepRegions.head == ARROW) + sepRegions = sepRegions.tail + case EXTENDS => + if (!sepRegions.isEmpty && sepRegions.head == ARROW) sepRegions = sepRegions.tail case STRINGLIT => if (inMultiLineInterpolation) @@ -330,7 +333,8 @@ object Scanners { if (isAfterLineEnd() && (canEndStatTokens contains lastToken) && (canStartStatTokens contains token) && - (sepRegions.isEmpty || sepRegions.head == RBRACE)) { + (sepRegions.isEmpty || sepRegions.head == RBRACE || + sepRegions.head == ARROW && token == CASE)) { next copyFrom this // todo: make offset line-end of previous line? offset = if (lineStartOffset <= offset) lineStartOffset else lastLineStartOffset diff --git a/compiler/src/dotty/tools/dotc/parsing/Tokens.scala b/compiler/src/dotty/tools/dotc/parsing/Tokens.scala index 6109dda2a..d2ea9240c 100644 --- a/compiler/src/dotty/tools/dotc/parsing/Tokens.scala +++ b/compiler/src/dotty/tools/dotc/parsing/Tokens.scala @@ -194,7 +194,7 @@ object Tokens extends TokensCommon { /** XML mode */ final val XMLSTART = 96; enter(XMLSTART, "$XMLSTART$<") // TODO: deprecate - final val alphaKeywords = tokenRange(IF, INLINE) + final val alphaKeywords = tokenRange(IF, ENUM) final val symbolicKeywords = tokenRange(USCORE, VIEWBOUND) final val symbolicTokens = tokenRange(COMMA, VIEWBOUND) final val keywords = alphaKeywords | symbolicKeywords @@ -215,7 +215,7 @@ object Tokens extends TokensCommon { final val canStartBindingTokens = identifierTokens | BitSet(USCORE, LPAREN) - final val templateIntroTokens = BitSet(CLASS, TRAIT, OBJECT, CASECLASS, CASEOBJECT) + final val templateIntroTokens = BitSet(CLASS, TRAIT, OBJECT, ENUM, CASECLASS, CASEOBJECT) final val dclIntroTokens = BitSet(DEF, VAL, VAR, TYPE) -- cgit v1.2.3