in rsc/src/main/scala/rsc/outline/Scheduler.scala [52:182]
private def assignSym(env: Env, outline: Outline): Unit = {
val scope = {
outline match {
case DefnPackage(_, TermSelect(qual: TermPath, _), _) =>
val parentPackage = DefnPackage(Mods(Nil), qual, Nil).withPos(outline.pos)
apply(env, parentPackage)
symtab.scopes(qual.id.sym)
case DefnPackageObject(_, id, _, _, _, _) =>
val parentPackage = DefnPackage(Mods(Nil), id, Nil).withPos(outline.pos)
apply(env, parentPackage)
symtab.scopes(id.sym)
case _ =>
env.owner
}
}
outline match {
case outline: DefnField =>
outline.lang match {
case ScalaLanguage | UnknownLanguage =>
// FIXME: https://github.com/twitter/rsc/issues/93
val getter = DefnMethod(
outline.mods.dupe,
TermId(outline.id.value).withPos(outline.id.pos),
Nil,
Nil,
outline.tpt.map(_.dupe),
outline.rhs.map(_.dupe)).withPos(outline.pos)
apply(env, getter)
if (outline.hasVar) {
val param =
Param(Mods(Nil), TermId("x$1"), outline.tpt.map(_.dupe), None).withPos(outline.pos)
val setter = DefnMethod(
// FIXME: https://github.com/twitter/rsc/issues/93
outline.mods.filter(!_.isInstanceOf[ModImplicit]),
TermId(outline.id.value + "_=").withPos(outline.id.pos),
Nil,
List(List(param)),
Some(TptId("Unit").withSym(UnitClass)),
outline.rhs.map(_.dupe)
).withPos(outline.pos)
apply(env, setter)
}
if (outline.hasBean) {
// FIXME: https://github.com/twitter/rsc/issues/293
val beanGetter = DefnMethod(
outline.mods.filter(!_.isInstanceOf[ModVal]),
TermId("get" + outline.id.value.capitalize).withPos(outline.id.pos),
Nil,
List(List()),
outline.tpt.map(_.dupe),
outline.rhs.map(_.dupe)
).withPos(outline.pos)
apply(env, beanGetter)
}
case JavaLanguage =>
val sym = TermSymbol(scope.sym, outline.id.value)
scope.enter(outline.id.name, sym)
outline.id.sym = sym
symtab.outlines.put(sym, outline)
symtab.envs.put(sym, env)
}
case outline =>
val sym = {
if (scope.sym.isGlobal) {
outline match {
case outline: DefnClass =>
TypeSymbol(scope.sym, outline.id.value)
case outline: DefnConstant =>
TermSymbol(scope.sym, outline.id.value)
case outline: DefnDef =>
if (outline.hasVal) {
TermSymbol(scope.sym, outline.id.value)
} else {
def loop(attempt: Int): String = {
val disambig = if (attempt == 0) s"()" else s"(+$attempt)"
val sym = MethodSymbol(scope.sym, outline.id.value, disambig)
if (symtab.outlines.contains(sym)) loop(attempt + 1)
else sym
}
loop(0)
}
case outline: DefnField =>
crash(outline)
case outline: DefnObject =>
TermSymbol(scope.sym, outline.id.value)
case outline: DefnPackage =>
PackageSymbol(scope.sym, outline.id.value)
case outline: DefnPackageObject =>
TermSymbol(scope.sym, "package")
case outline: DefnType =>
TypeSymbol(scope.sym, outline.id.value)
case outline: Param =>
val gensym = gensyms(outline)
outline.id match {
case AnonId() => ParamSymbol(scope.sym, gensym.anon())
case id: NamedId => ParamSymbol(scope.sym, id.value)
}
case outline: PatVar =>
val gensym = gensyms(outline)
outline.id match {
case AnonId() => TermSymbol(scope.sym, gensym.anon())
case id: NamedId => TermSymbol(scope.sym, id.value)
}
case outline: Self =>
SelfSymbol(scope.sym)
case outline: TypeParam =>
val gensym = gensyms(outline)
outline.id match {
case AnonId() => TypeParamSymbol(scope.sym, gensym.anon())
case id: NamedId => TypeParamSymbol(scope.sym, id.value)
}
}
} else {
val gensym = gensyms.global
LocalSymbol(gensym)
}
}
outline.id match {
case id: NamedId =>
outline match {
case _: DefnPackageObject => scope.enter(TermName("package"), sym)
case _ => scope.enter(id.name, sym)
}
case id: AnonId =>
()
}
outline.id.sym = sym
symtab.outlines.put(sym, outline)
symtab.envs.put(sym, env)
}
}