in rsc/src/main/scala/rsc/parse/scala/Terms.scala [50:187]
def term1(location: Location): Term = {
val start = in.offset
in.token match {
case IF =>
in.nextToken()
val cond = inParens(term())
newLinesOpt()
val thenp = term()
val elsep = {
if (in.token == ELSE) {
in.nextToken()
Some(term())
} else {
None
}
}
TermIf(cond, thenp, elsep)
case WHILE =>
in.nextToken()
val cond = inParens(term())
newLinesOpt()
val body = term()
TermWhile(cond, body)
case DO =>
in.nextToken()
val body = term()
if (in.token.isStatSep) in.nextToken()
accept(WHILE)
val cond = inParens(term())
TermDo(body, cond)
case TRY =>
in.nextToken()
val expr = term()
val catchpOpt = {
if (in.token == CATCH) {
in.nextToken()
Some(term())
} else {
None
}
}
val finallyp = {
if (in.token == FINALLY) {
in.nextToken()
Some(term())
} else {
None
}
}
catchpOpt match {
case Some(TermPartialFunction(cases)) =>
TermTry(expr, cases, finallyp)
case Some(catchp) =>
TermTryWithHandler(expr, catchp, finallyp)
case None =>
TermTry(expr, Nil, finallyp)
}
case THROW =>
in.nextToken()
TermThrow(term())
case RETURN =>
in.nextToken()
val term = {
if (in.token.isTermIntro) {
Some(this.term())
} else {
None
}
}
TermReturn(term)
case FOR =>
in.nextToken()
val enumerators: List[Enumerator] = {
if (in.token == LPAREN) {
inParens(this.enumerators())
} else if (in.token == LBRACE) {
inBraces(this.enumerators())
} else {
accept(LPAREN)
List()
}
}
newLinesOpt()
if (in.token == YIELD) {
in.nextToken()
val body = term()
TermForYield(enumerators, body)
} else {
val body = term()
TermFor(enumerators, body)
}
case _ =>
val unfinished = postfixTerm()
in.token match {
case EQUALS =>
unfinished match {
case TermId(_) | TermSelect(_, _) | TermApply(_, _) =>
in.nextToken()
val lhs = unfinished
val rhs = term()
atPos(start)(TermAssign(lhs, rhs))
case _ =>
unfinished
}
case COLON =>
in.nextToken()
in.token match {
case USCORE =>
in.nextToken()
if (in.token == ID && in.idValue == "*") {
in.nextToken()
TermRepeat(unfinished)
} else {
val errOffset = in.offset
reportOffset(errOffset, ExpectedId(_, "*", in.token))
atPos(errOffset)(errorTerm())
}
case AT =>
val term = unfinished
val mods = termAnnotateMods()
TermAnnotate(term, mods)
case _ =>
val term = unfinished
val tpt = {
if (location == Elsewhere) this.tpt()
else this.infixTpt()
}
TermAscribe(term, tpt)
}
case MATCH =>
in.nextToken()
val term = unfinished
TermMatch(term, inBraces(this.cases()))
case _ =>
unfinished
}
}
}