in rsc/src/main/scala/rsc/parse/scala/Terms.scala [447:523]
def blockStats(): List[Stat] = banEscapingWildcards {
val stats = List.newBuilder[Stat]
var exitOnError = false
while (!in.token.isStatSeqEnd && in.token != CASE && !exitOnError) {
if (in.token == IMPORT) {
stats += `import`()
} else if (in.token.isTermIntro) {
stats += term(InBlock)
} else if (in.token.isLocalDefnIntro) {
val isImplicitLambda = {
if (in.token == IMPLICIT) {
val snapshot = in.snapshot()
in.nextToken()
val result = in.token == ID
in.restore(snapshot)
result
} else {
false
}
}
if (isImplicitLambda) {
stats += implicitLambda(InBlock)
} else {
val start = in.offset
val mods = defnMods(modTokens.localDefn)
val stat = in.token match {
case CASECLASS =>
val modCase = atPos(in.offset)(ModCase())
val modClass = atPos(in.offset)(ModClass())
in.nextToken()
defnClass(mods :+ modCase :+ modClass)
case CASEOBJECT =>
val modCase = atPos(in.offset)(ModCase())
in.nextToken()
defnObject(mods :+ modCase)
case CLASS =>
val modClass = atPos(in.offset)(ModClass())
in.nextToken()
defnClass(mods :+ modClass)
case DEF =>
in.nextToken()
defnDef(mods)
case OBJECT =>
in.nextToken()
defnObject(mods)
case TRAIT =>
val modTrait = atPos(in.offset)(ModTrait())
in.nextToken()
defnClass(mods :+ modTrait)
case TYPE =>
in.nextToken()
defnType(mods)
case VAL =>
val modVal = atPos(in.offset)(ModVal())
in.nextToken()
defnVal(mods :+ modVal)
case VAR =>
val modVar = atPos(in.offset)(ModVar())
in.nextToken()
defnVar(mods :+ modVar)
case _ =>
val errOffset = in.offset
reportOffset(errOffset, ExpectedStartOfDefinition)
atPos(errOffset)(errorStat())
}
stats += stat
}
} else if (!in.token.isStatSep && in.token != CASE) {
exitOnError = in.token.mustStartStat
val errOffset = in.offset
reportOffset(errOffset, IllegalStartOfStatement)
stats += atPos(errOffset)(errorTerm())
}
acceptStatSepUnlessAtEnd(CASE)
}
stats.result
}