in rsc/src/main/scala/rsc/parse/scala/Templates.scala [88:193]
private def templateBraces(earlies: List[Stat], inits: List[Init]): Template = {
banEscapingWildcards {
newLineOptWhenFollowedBy(LBRACE)
if (in.token == LBRACE) {
inBraces {
var self: Option[Self] = None
val stats = List.newBuilder[Stat]
if (in.token.isTermIntro) {
val snapshot = in.snapshot()
val firstStat = term1(InTemplate)
if (in.token == ARROW) {
in.restore(snapshot)
val start = in.offset
val id = {
if (in.token == ID) {
termId()
} else if (in.token == THIS || in.token == USCORE) {
in.nextToken()
atPos(start)(anonId())
} else {
val errOffset = in.offset
reportOffset(errOffset, IllegalSelf)
in.nextToken()
atPos(errOffset)(TermId(gensym.error()))
}
}
val tpt = {
if (in.token == COLON) {
in.nextToken()
Some(infixTpt())
} else {
None
}
}
accept(ARROW)
self = Some(atPos(start)(Self(id, tpt)))
} else {
stats += firstStat
acceptStatSepUnlessAtEnd()
}
}
var exitOnError = false
while (!in.token.isStatSeqEnd && !exitOnError) {
if (in.token == IMPORT) {
stats += `import`()
} else if (in.token.isTermIntro) {
stats += term1(InTemplate)
} else if (in.token.isTemplateDefnIntro) {
val start = in.offset
val mods = defnMods(modTokens.templateDefn)
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) {
exitOnError = in.token.mustStartStat
reportOffset(in.offset, IllegalStartOfDefinition)
}
acceptStatSepUnlessAtEnd()
}
Template(earlies, inits, self, Some(stats.result))
}
} else {
val self = None
val stats = None
Template(earlies, inits, self, stats)
}
}
}