in rsc/src/main/scala/rsc/parse/scala/Paths.scala [111:172]
private def rawPath(): RawPath = {
val start = in.offset
def loop(qual: TermPath): RawPath = {
if (in.token == DOT) {
in.nextToken()
if (in.token == ID) {
val nextId = termId()
loop(atPos(start)(TermSelect(qual, nextId)))
} else {
UnfinishedPath(qual)
}
} else {
FinishedPath(qual)
}
}
if (in.token == ID) {
val firstId = termId()
if (in.token == DOT) {
in.nextToken()
if (in.token == ID) {
val nextId = termId()
loop(atPos(start)(TermSelect(firstId, nextId)))
} else if (in.token == THIS) {
in.nextToken()
val qual = atPos(firstId.pos)(AmbigId(firstId.value))
loop(atPos(start)(TermThis(qual)))
} else if (in.token == SUPER) {
in.nextToken()
val qual = atPos(firstId.pos)(AmbigId(firstId.value))
val mix = {
if (in.token == LBRACKET) {
inBrackets(atPos(in.offset)(ambigId()))
} else {
anonId()
}
}
loop(atPos(start)(TermSuper(qual, mix)))
} else {
UnfinishedPath(firstId)
}
} else {
FinishedPath(firstId)
}
} else if (in.token == THIS) {
in.nextToken()
val qual = anonId()
loop(atPos(start)(TermThis(qual)))
} else if (in.token == SUPER) {
in.nextToken()
val qual = anonId()
val mix = {
if (in.token == LBRACKET) {
inBrackets(atPos(in.offset)(ambigId()))
} else {
anonId()
}
}
loop(atPos(start)(TermSuper(qual, mix)))
} else {
UnstartedPath
}
}