in rsc/src/main/scala/rsc/parse/scala/Modifiers.scala [81:151]
private def defnFlags(modTokens: BitSet): List[Mod] = {
def addFlag(flags: List[Mod], flag: Mod): List[Mod] = {
val isRepeated = flags.exists(_.productPrefix == flag.productPrefix)
if (isRepeated) reportOffset(in.offset, RepeatedModifier)
flags :+ flag
}
def loop(flags: List[Mod]): List[Mod] = {
if (modTokens.contains(NEWLINE)) {
newLineOpt()
}
if (modTokens.contains(in.token)) {
val start = in.offset
val flag = {
in.token match {
case ABSTRACT =>
in.nextToken()
atPos(start)(ModAbstract())
case FINAL =>
in.nextToken()
atPos(start)(ModFinal())
case LAZY =>
in.nextToken()
atPos(start)(ModLazy())
case IMPLICIT =>
in.nextToken()
atPos(start)(ModImplicit())
case OVERRIDE =>
in.nextToken()
atPos(start)(ModOverride())
case PRIVATE =>
in.nextToken()
if (in.token == LBRACKET) {
inBrackets {
if (in.token == THIS) {
in.nextToken()
atPos(start)(ModPrivateThis())
} else {
atPos(start)(ModPrivateWithin(ambigId()))
}
}
} else {
atPos(start)(ModPrivate())
}
case PROTECTED =>
in.nextToken()
if (in.token == LBRACKET) {
inBrackets {
if (in.token == THIS) {
in.nextToken()
atPos(start)(ModProtectedThis())
} else {
atPos(start)(ModProtectedWithin(ambigId()))
}
}
} else {
atPos(start)(ModProtected())
}
case SEALED =>
in.nextToken()
atPos(start)(ModSealed())
case _ =>
crash(tokenRepl(in.token))
}
}
loop(addFlag(flags, flag))
} else {
flags
}
}
loop(Nil)
}