aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-02-08 21:10:58 +1100
committerMartin Odersky <odersky@gmail.com>2017-04-04 13:20:45 +0200
commitfe14afb67ecfeef0c7d6bc6588a1ec1c04b21fb8 (patch)
tree0c236f39f0496553b988b329e10c44639220e7eb
parentca039bae393a1d32720d6517baae434b91eefefd (diff)
downloaddotty-fe14afb67ecfeef0c7d6bc6588a1ec1c04b21fb8.tar.gz
dotty-fe14afb67ecfeef0c7d6bc6588a1ec1c04b21fb8.tar.bz2
dotty-fe14afb67ecfeef0c7d6bc6588a1ec1c04b21fb8.zip
Simplify syntax
`enum' only allowed as a prefix of classes, dropped from traits and objects.
-rw-r--r--compiler/src/dotty/tools/dotc/ast/Desugar.scala3
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/JavaParsers.scala4
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/Parsers.scala9
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/Scanners.scala8
-rw-r--r--compiler/src/dotty/tools/dotc/parsing/Tokens.scala4
-rw-r--r--docs/docs/internals/syntax.md6
6 files changed, 17 insertions, 17 deletions
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)
diff --git a/docs/docs/internals/syntax.md b/docs/docs/internals/syntax.md
index 804a0f57a..f89a0f490 100644
--- a/docs/docs/internals/syntax.md
+++ b/docs/docs/internals/syntax.md
@@ -330,15 +330,15 @@ DefDef ::= DefSig [‘:’ Type] ‘=’ Expr
| ‘this’ DefParamClause DefParamClauses DefDef(_, <init>, Nil, vparamss, EmptyTree, expr | Block)
(‘=’ ConstrExpr | [nl] ConstrBlock)
-TmplDef ::= ([‘case’ | `enum'] ‘class’ | [`enum'] trait’) ClassDef
- | [‘case’ | `enum'] ‘object’ ObjectDef
+TmplDef ::= ([‘case’ | `enum'] ‘class’ | trait’) ClassDef
+ | [‘case’] ‘object’ ObjectDef
| `enum' EnumDef
ClassDef ::= id ClassConstr TemplateOpt ClassDef(mods, name, tparams, templ)
ClassConstr ::= [ClsTypeParamClause] [ConstrMods] ClsParamClauses with DefDef(_, <init>, Nil, vparamss, EmptyTree, EmptyTree) as first stat
ConstrMods ::= AccessModifier
| Annotation {Annotation} (AccessModifier | ‘this’)
ObjectDef ::= id TemplateOpt ModuleDef(mods, name, template) // no constructor
-EnumDef ::= id ClassConstr [`extends' [ConstrApps]] EnumDef(mods, name, tparams, template)
+EnumDef ::= id ClassConstr [`extends' [ConstrApps]] EnumDef(mods, name, tparams, template)
[nl] ‘{’ EnumCaseStat {semi EnumCaseStat ‘}’
EnumCaseStat ::= {Annotation [nl]} {Modifier} EnumCase
EnumCase ::= `case' (EnumClassDef | ObjectDef)