private def parents()

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
  }