private def emitTpe()

in rsc/src/main/scala/rsc/scalasig/Pickle.scala [254:328]


  private def emitTpe(stpe: s.Type): Ref = {
    entries.getOrElseUpdate(TypeKey(stpe)) {
      stpe match {
        case s.NoType =>
          NoType
        case s.TypeRef(spre, ssym, stargs) =>
          val pre = spre match {
            case s.NoType => emitPre(ssym.spre)
            case stpe => emitPre(SomePre(stpe))
          }
          val sym = emitSym(ssym, RefMode)
          val targs = stargs.map(emitTpe).toList
          TypeRef(pre, sym, targs)
        case s.SingleType(spre, ssym) =>
          val pre = spre match {
            case s.NoType => emitPre(ssym.spre)
            case stpe => emitPre(SomePre(stpe))
          }
          val sym = emitSym(ssym, ModuleRefMode)
          SingleType(pre, sym)
        case s.ThisType(ssym) =>
          val sym = emitSym(ssym, RefMode)
          ThisType(sym)
        case s.SuperType(spre, ssym) =>
          // FIXME: https://github.com/twitter/rsc/issues/96
          crash(stpe)
        case s.ConstantType(sconst) =>
          val lit = emitLiteral(sconst.value.get)
          ConstantType(lit)
        case stpe @ s.StructuralType(sret, sdecls) =>
          stack.inStructuralType(stpe) { srefinement =>
            val sym = emitEmbeddedSym(srefinement, RefMode)
            val parents = {
              sret match {
                case s.NoType => List(emitTpe(s.TypeRef(s.NoType, AnyRefClass, Nil)))
                case s.WithType(sparents) => sparents.toList.map(emitTpe)
                case sparent => List(emitTpe(sparent))
              }
            }
            RefinedType(sym, parents)
          }
        case s.AnnotatedType(sannots, sret) =>
          val ret = emitTpe(sret)
          val annots = sannots.toList.map(emitAnnotInfo)
          AnnotatedType(ret, annots)
        case stpe @ s.ExistentialType(sret, sdecls) =>
          stack.inExistentialType(stpe) {
            val decls = emitScope(sdecls)
            val ret = emitTpe(sret)
            ExistentialType(ret, decls)
          }
        case s.ByNameType(sret) =>
          val pre = emitPre(ByNameClass.spre)
          val sym = emitSym(ByNameClass, RefMode)
          val targs = List(emitTpe(sret))
          TypeRef(pre, sym, targs)
        case s.RepeatedType(sret) =>
          val pre = emitPre(RepeatedClass.spre)
          val sym = emitSym(RepeatedClass, RefMode)
          val targs = List(emitTpe(sret))
          TypeRef(pre, sym, targs)
        case stpe @ s.UniversalType(stparams, sret) =>
          stparams.infos.foreach(sinfo => mtab(sinfo.symbol) = sinfo)
          val slambdaRefinement = Transients.slambdaRefinement(stpe)
          val List(slambda) = slambdaRefinement.declarations.infos
          mtab(slambda.symbol) = slambda
          emitTpe(slambdaRefinement)
          val tparams = emitScope(stparams)
          val ret = emitTpe(sret)
          PolyType(ret, tparams)
        case _ =>
          crash(stpe)
      }
    }
  }