in rsc/src/main/scala/rsc/outline/Scheduler.scala [459:511]
private def parents(env: Env, tree: DefnTemplate): Env = {
val buf = mutable.ListBuffer[Tpt]()
tree.parents.foreach(parent => buf.append(parent.tpt))
tree match {
case tree if tree.hasCase =>
buf.append(TptId("Product").withSym(ProductClass))
buf.append(TptId("Serializable").withSym(SerializableClass))
case tree if tree.hasEnum =>
val id = TptId("Enum").withSym(EnumClass)
val ref = tree.id.asInstanceOf[TptId]
buf.prepend(TptParameterize(id, List(ref)))
case tree if tree.hasAnnotationInterface =>
buf.append(TptId("Annotation").withSym(JavaAnnotationClass))
case tree: DefnObject =>
val companionClass = symtab.outlines.get(tree.id.sym.companionClass)
companionClass match {
case Some(caseClass: DefnClass) if caseClass.hasCase =>
if (tree.isSynthetic && !caseClass.hasAbstract) {
val desugaredParamss = symtab.desugars.paramss(caseClass.primaryCtor.get)
(caseClass.tparams, desugaredParamss) match {
case (Nil, List(params)) if params.length <= 22 =>
val sym = AbstractFunctionClass(params.length)
val core = TptId(sym.desc.value).withSym(sym)
val paramTpts = params.map(_.tpt.get.dupe)
val caseClassRef = caseClass.id
val parent = TptParameterize(core, paramTpts :+ caseClassRef)
buf.append(parent)
case _ =>
()
}
}
val parent = TptId("Serializable").withSym(SerializableClass)
buf.append(parent)
case _ =>
()
}
case _ =>
()
}
if (buf.isEmpty) {
env.lang match {
case ScalaLanguage | UnknownLanguage =>
buf.append(TptId("AnyRef").withSym(AnyRefClass))
case JavaLanguage =>
buf.append(TptId("Object").withSym(ObjectClass))
}
}
val parents = buf.result
symtab.desugars.parents.put(tree, parents)
parents.foreach(parent(env, _))
env
}