in rsc/src/main/scala/rsc/outline/Outliner.scala [213:372]
private def resolveSym(env: Env, path: Path): SymbolResolution = {
path.id.sym match {
case NoSymbol =>
path match {
case id: AmbigId =>
val resolution = env.resolve(id.value)
resolution match {
case resolution: AmbiguousResolution =>
if (env.isSynthetic) reporter.append(AmbiguousMember(env, id, resolution))
else reporter.append(AmbiguousId(id, resolution))
resolution
case _: BlockedResolution =>
resolution
case _: FailedResolution =>
if (env.isSynthetic) reporter.append(UnboundMember(env, id))
else reporter.append(UnboundId(id))
resolution
case ResolvedSymbol(sym) =>
id.sym = sym
resolution
}
case AmbigSelect(qual, id) =>
val resolution = resolveScope(env, qual)
resolution match {
case resolution: BlockedResolution =>
resolution
case resolution: FailedResolution =>
resolution
case ResolvedScope(qualScope) =>
val env1 = Env(env.root, List(qualScope))
resolveSym(env1, id)
}
case id: NamedId =>
val resolution = env.resolve(id.name)
resolution match {
case resolution: AmbiguousResolution =>
if (env.isSynthetic) reporter.append(AmbiguousMember(env, id, resolution))
else reporter.append(AmbiguousId(id, resolution))
resolution
case _: BlockedResolution =>
resolution
case _: FailedResolution =>
if (env.isSynthetic) reporter.append(UnboundMember(env, id))
else reporter.append(UnboundId(id))
resolution
case ResolvedSymbol(sym) =>
id.sym = sym
resolution
}
case TermSelect(qual: Path, id) =>
val resolution = resolveScope(env, qual)
resolution match {
case resolution: BlockedResolution =>
resolution
case resolution: FailedResolution =>
resolution
case ResolvedScope(qualScope) =>
val env1 = Env(env.root, List(qualScope))
resolveSym(env1, id)
}
case TermSelect(qual, id) =>
reporter.append(IllegalOutline(path))
ErrorResolution
case TermSuper(qual, mix) =>
// FIXME: https://github.com/twitter/rsc/issues/96
reporter.append(IllegalOutline(path))
ErrorResolution
case TermThis(qual) =>
val resolution = {
qual match {
case AmbigId(value) => env.resolveThis(value)
case AnonId() => env.resolveThis()
}
}
resolution match {
case resolution: AmbiguousResolution =>
reporter.append(AmbiguousId(qual, resolution))
resolution
case _: BlockedResolution =>
resolution
case _: FailedResolution =>
reporter.append(UnboundId(qual))
resolution
case ResolvedSymbol(qualSym) =>
qual.sym = qualSym
resolution
}
case TptProject(qual: Path, id) =>
val resolution = resolveScope(env, qual)
resolution match {
case resolution: BlockedResolution =>
resolution
case resolution: FailedResolution =>
resolution
case ResolvedScope(qualScope) =>
// FIXME: https://github.com/twitter/rsc/issues/91
val env1 = Env(env.root, List(qualScope))
resolveSym(env1, id)
}
case TptProject(qual, id) =>
// FIXME: https://github.com/twitter/rsc/issues/91
reporter.append(IllegalOutline(path))
ErrorResolution
case TptSelect(qual, id) =>
val resolution = resolveScope(env, qual)
resolution match {
case resolution: BlockedResolution =>
resolution
case resolution: FailedResolution =>
resolution
case ResolvedScope(qualScope) =>
val env1 = Env(env.root, List(qualScope))
val resolution1 = env1.resolve(id.name)
resolution1 match {
case resolution1: AmbiguousResolution =>
reporter.append(AmbiguousMember(env1, id, resolution1))
resolution1
case _: BlockedResolution =>
resolution1
case _: FailedResolution =>
env.lang match {
case ScalaLanguage | UnknownLanguage =>
reporter.append(UnboundMember(env1, id))
resolution1
case JavaLanguage =>
val resolution2 = {
val qualSym2 = qualScope.sym.companionSymbol
if (symtab.scopes.contains(qualSym2)) {
val scope2 = symtab.scopes(qualSym2)
val env2 = Env(env.root, List(scope2))
env2.resolve(id.name)
} else {
resolution1
}
}
resolution2 match {
case _: AmbiguousResolution =>
resolution1
case _: BlockedResolution =>
resolution2
case _: FailedResolution =>
resolution1
case ResolvedSymbol(sym) =>
qual.id.sym = sym
id.sym = sym
resolution2
}
}
case ResolvedSymbol(sym) =>
id.sym = sym
resolution1
}
}
case TptSingleton(qual) =>
resolveSym(env, qual)
}
case sym =>
ResolvedSymbol(sym)
}
}