aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/parsing/Parsers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2015-10-21 17:45:52 +0200
committerMartin Odersky <odersky@gmail.com>2015-10-22 12:21:25 +0200
commit1eb26f570fe37c6753e0936d745507a0092baded (patch)
tree6af73e69619699508f045551162aba5adc255494 /src/dotty/tools/dotc/parsing/Parsers.scala
parent4e49976c8f4a19fd8533a0bb8543c4a2f2076f64 (diff)
downloaddotty-1eb26f570fe37c6753e0936d745507a0092baded.tar.gz
dotty-1eb26f570fe37c6753e0936d745507a0092baded.tar.bz2
dotty-1eb26f570fe37c6753e0936d745507a0092baded.zip
Hardening of Parser against illegal flag combinations
Avoids accidental combinations of term and type flags.
Diffstat (limited to 'src/dotty/tools/dotc/parsing/Parsers.scala')
-rw-r--r--src/dotty/tools/dotc/parsing/Parsers.scala28
1 files changed, 19 insertions, 9 deletions
diff --git a/src/dotty/tools/dotc/parsing/Parsers.scala b/src/dotty/tools/dotc/parsing/Parsers.scala
index 02a86022e..4b22eac95 100644
--- a/src/dotty/tools/dotc/parsing/Parsers.scala
+++ b/src/dotty/tools/dotc/parsing/Parsers.scala
@@ -1343,7 +1343,7 @@ object Parsers {
private def flagOfToken(tok: Int): FlagSet = tok match {
case ABSTRACT => Abstract
case FINAL => Final
- case IMPLICIT => Implicit
+ case IMPLICIT => ImplicitCommon
case LAZY => Lazy
case OVERRIDE => Override
case PRIVATE => Private
@@ -1377,12 +1377,21 @@ object Parsers {
|| flags1.isTypeFlags && flags2.isTypeFlags
)
- def addFlag(mods: Modifiers, flag: FlagSet): Modifiers =
+ def addFlag(mods: Modifiers, flag: FlagSet): Modifiers = {
+ def incompatible(kind: String) = {
+ syntaxError(s"modifier(s) `${mods.flags}' not allowed for $kind")
+ Modifiers(flag)
+ }
if (compatible(mods.flags, flag)) mods | flag
- else {
- syntaxError(s"illegal modifier combination: ${mods.flags} and $flag")
- mods
+ else flag match {
+ case Trait => incompatible("trait")
+ case Method => incompatible("method")
+ case Mutable => incompatible("variable")
+ case _ =>
+ syntaxError(s"illegal modifier combination: ${mods.flags} and $flag")
+ mods
}
+ }
/** AccessQualifier ::= "[" (Id | this) "]"
*/
@@ -1726,6 +1735,7 @@ object Parsers {
}
makeConstructor(Nil, vparamss, rhs).withMods(mods)
} else {
+ val mods1 = addFlag(mods, Method)
val name = ident()
val tparams = typeParamClauseOpt(ParamOwner.Def)
val vparamss = paramClauses(name)
@@ -1735,7 +1745,7 @@ object Parsers {
if (atScala2Brace) tpt = scalaUnit else accept(EQUALS)
expr()
} else EmptyTree
- DefDef(name, tparams, vparamss, tpt, rhs).withMods(mods | Method)
+ DefDef(name, tparams, vparamss, tpt, rhs).withMods(mods1)
}
}
@@ -1792,7 +1802,7 @@ object Parsers {
*/
def tmplDef(start: Int, mods: Modifiers): Tree = in.token match {
case TRAIT =>
- classDef(posMods(start, mods | Trait))
+ classDef(posMods(start, addFlag(mods, Trait)))
case CLASS =>
classDef(posMods(start, mods))
case CASECLASS =>
@@ -2009,7 +2019,7 @@ object Parsers {
}
def localDef(start: Int, implicitFlag: FlagSet): Tree =
- defOrDcl(start, defAnnotsMods(localModifierTokens) | implicitFlag)
+ defOrDcl(start, addFlag(defAnnotsMods(localModifierTokens), implicitFlag))
/** BlockStatSeq ::= { BlockStat semi } [ResultExpr]
* BlockStat ::= Import
@@ -2038,7 +2048,7 @@ object Parsers {
if (in.token == IMPLICIT) {
val start = in.skipToken()
if (isIdent) stats += implicitClosure(start, Location.InBlock)
- else stats += localDef(start, Implicit)
+ else stats += localDef(start, ImplicitCommon)
} else {
stats += localDef(in.offset, EmptyFlags)
}